Browse Source

前台覆盖后台代码

newMaster
1747191978@qq.com 4 months ago
parent
commit
2d3220ef8b
  1. 3
      acupuncture-后台/package.json
  2. 17
      acupuncture-后台/src/api/followupFile.js
  3. 146
      acupuncture-后台/src/api/indexCom.js
  4. 2
      acupuncture-后台/src/assets/styles/common.css
  5. 5
      acupuncture-后台/src/main.js
  6. 4
      acupuncture-后台/src/router/index.js
  7. 4
      acupuncture-后台/src/store/modules/permission.js
  8. 33
      acupuncture-后台/src/utils/request.js
  9. 113
      acupuncture-后台/src/views/followFile/index.vue
  10. 685
      acupuncture-后台/src/views/followFile/subjects.vue
  11. 986
      acupuncture-后台/src/views/followFile/work.vue
  12. 1323
      acupuncture-后台/src/views/index.vue
  13. 404
      acupuncture-后台/src/views/indexCom/JM.vue
  14. 383
      acupuncture-后台/src/views/indexCom/XGZL.vue
  15. 224
      acupuncture-后台/src/views/indexCom/follow.vue
  16. 939
      acupuncture-后台/src/views/indexCom/index.js
  17. 325
      acupuncture-后台/src/views/indexCom/patient.vue
  18. 179
      acupuncture-后台/src/views/indexCom/query.vue
  19. 60
      acupuncture-后台/src/views/login.vue
  20. 3109
      acupuncture-后台/src/views/medicalFile/index.vue
  21. 1180
      acupuncture-后台/src/views/patientFile/index.vue

3
acupuncture-后台/package.json

@ -40,7 +40,7 @@
"axios": "0.28.1", "axios": "0.28.1",
"clipboard": "2.0.8", "clipboard": "2.0.8",
"core-js": "3.37.1", "core-js": "3.37.1",
"echarts": "5.4.0", "echarts": "^5.4.0",
"element-ui": "^2.15.14", "element-ui": "^2.15.14",
"file-saver": "2.0.5", "file-saver": "2.0.5",
"fuse.js": "6.4.3", "fuse.js": "6.4.3",
@ -48,6 +48,7 @@
"js-beautify": "1.13.0", "js-beautify": "1.13.0",
"js-cookie": "3.0.1", "js-cookie": "3.0.1",
"jsencrypt": "3.0.0-rc.1", "jsencrypt": "3.0.0-rc.1",
"moment": "^2.30.1",
"nprogress": "0.2.0", "nprogress": "0.2.0",
"quill": "2.0.2", "quill": "2.0.2",
"screenfull": "5.0.2", "screenfull": "5.0.2",

17
acupuncture-后台/src/api/followupFile.js

@ -1,5 +1,12 @@
import request from "@/utils/request"; import request from "@/utils/request";
// 公共队列
export function commonQueue(data) {
return request({
url: "/followup/commonQueue",
method: "post",
data: data,
});
}
// 随访队列 // 随访队列
export function followupQuery(data) { export function followupQuery(data) {
return request({ return request({
@ -73,3 +80,11 @@ export function followPatient(data) {
data: data, data: data,
}); });
} }
// 修改随访状态
export function followStatus(data) {
return request({
url: "/followup/status",
method: "post",
data: data,
});
}

146
acupuncture-后台/src/api/indexCom.js

@ -0,0 +1,146 @@
import request from "@/utils/request";
// 患者统计 - 饼状
export function queryPatient(data) {
return request({
url: "/qualityControl/home/queryPatient",
method: "post",
data: data,
});
}
// 患者统计 - 柱状图
export function queryByDatePatient(data) {
return request({
url: "/qualityControl/home/queryByDatePatient",
method: "post",
data: data,
});
}
// 静脉溶栓率 - 统计
export function queryJmrs(data) {
return request({
url: "/qualityControl/home/queryJmrs",
method: "post",
data: data,
});
}
// 静脉溶栓率 - 数据对比
// 静脉溶栓率 - DNT
export function queryDntResult(data) {
return request({
url: "/qualityControl/home/queryDntResult",
method: "post",
data: data,
});
}
// 静脉溶栓率 - Sich
export function querySichResult(data) {
return request({
url: "/qualityControl/home/querySichResult",
method: "post",
data: data,
});
}
// 血管治疗 - DPT
export function queryDptResult(data) {
return request({
url: "/qualityControl/home/queryDptResult",
method: "post",
data: data,
});
}
// 血管治疗 - Rpt
export function queryRptResult(data) {
return request({
url: "/qualityControl/home/queryRptResult",
method: "post",
data: data,
});
}
// 血管治疗 - SJDB
// export function selectXgzl(data) {
// return request({
// url: "/qualityControl/home/selectXgzl",
// method: "post",
// data: data,
// });
// }
export function dataComparison(data) {
return request({
url: "/qualityControl/home/selectXgzl",
method: "post",
data: data,
});
}
// 血管治疗统计
export function queryXgzlLv(data) {
return request({
url: "/qualityControl/home/queryXgzlLv",
method: "post",
data: data,
});
}
// 大屏急救数量统计
export function queryPatientList(data) {
return request({
url: "/qualityControl/home/queryPatientList",
method: "post",
data: data,
});
}
// 大屏急救时长分析
export function queryFirstAidTime(data) {
return request({
url: "/qualityControl/home/queryFirstAidTime",
method: "post",
data: data,
});
}
// 大屏智慧平车面板数据
export function queryData(data) {
return request({
url: "/qualityControl/home/queryData",
method: "post",
data: data,
});
}
// 患者信息
export function patientTotal(data) {
return request({
url: "/statistics/patientTotal",
method: "post",
data: data,
});
}
// 诊疗信息
export function zlInfo(data) {
return request({
url: "/statistics/zlInfo",
method: "post",
data: data,
});
}
// 治疗类型
export function zlType(data) {
return request({
url: "/statistics/zlType",
method: "post",
data: data,
});
}
// 随访分布
export function sffb(data) {
return request({
url: "/statistics/sffb",
method: "post",
data: data,
});
}
export function sftj(data) {
return request({
url: "/statistics/sftj",
method: "post",
data: data,
});
}

2
acupuncture-后台/src/assets/styles/common.css

@ -73,7 +73,7 @@
display: none; display: none;
} }
>>>.el-dialog__body{ >>>.el-dialog__body{
padding: 0px 20px 0px 20px; padding: 20px;
} }
/* .popup >>> .popupAdd2 .popupleft { /* .popup >>> .popupAdd2 .popupleft {
width: 55px; width: 55px;

5
acupuncture-后台/src/main.js

@ -12,7 +12,8 @@ import store from './store'
import router from './router' import router from './router'
import directive from './directive' // directive import directive from './directive' // directive
import plugins from './plugins' // plugins import plugins from './plugins' // plugins
import { download } from '@/utils/request' import { download, download1} from '@/utils/request'
import moment from 'moment';
import './assets/icons' // icon import './assets/icons' // icon
import './permission' // permission control import './permission' // permission control
@ -47,7 +48,9 @@ Vue.prototype.addDateRange = addDateRange
Vue.prototype.selectDictLabel = selectDictLabel Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictLabels = selectDictLabels Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.download = download Vue.prototype.download = download
Vue.prototype.download1 = download1
Vue.prototype.handleTree = handleTree Vue.prototype.handleTree = handleTree
Vue.prototype.$moment = moment
// 全局组件挂载 // 全局组件挂载
Vue.component('DictTag', DictTag) Vue.component('DictTag', DictTag)

4
acupuncture-后台/src/router/index.js

@ -77,12 +77,12 @@ export const constantRoutes = [
{ {
path: "/patientFile", path: "/patientFile",
component: Layout, component: Layout,
redirect: "index", redirect: "patientFile",
children: [ children: [
{ {
path: "/patientIndex", path: "/patientIndex",
component: () => import("@/views/patientFile/index"), component: () => import("@/views/patientFile/index"),
name: "Index", name: "patientIndex",
meta: { title: "患者档案", icon: "dashboard", }, meta: { title: "患者档案", icon: "dashboard", },
}, },
], ],

4
acupuncture-后台/src/store/modules/permission.js

@ -34,8 +34,8 @@ const permission = {
return new Promise((resolve) => { return new Promise((resolve) => {
// 向后端请求路由数据 // 向后端请求路由数据
getRouters().then((res) => { getRouters().then((res) => {
const sdata = JSON.parse(JSON.stringify(res.data)); const sdata = JSON.parse(JSON.stringify([]));
const rdata = JSON.parse(JSON.stringify(res.data)); const rdata = JSON.parse(JSON.stringify([]));
const sidebarRoutes = filterAsyncRouter(sdata); const sidebarRoutes = filterAsyncRouter(sdata);
const rewriteRoutes = filterAsyncRouter(rdata, false, true); const rewriteRoutes = filterAsyncRouter(rdata, false, true);
const asyncRoutes = filterDynamicRoutes(dynamicRoutes); const asyncRoutes = filterDynamicRoutes(dynamicRoutes);

33
acupuncture-后台/src/utils/request.js

@ -148,5 +148,38 @@ export function download(url, params, filename, config) {
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}) })
} }
// 通用下载方法
export function download1(url, params, filename, config) {
downloadLoadingInstance = Loading.service({
text: "正在下载数据,请稍候",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)",
});
return service
.post(url, params, {
headers: { "Content-Type": "application/json;charset=utf-8" },
responseType: "blob",
})
.then(async (data) => {
const isBlob = blobValidate(data);
if (isBlob) {
const blob = new Blob([data]);
saveAs(blob, filename);
} else {
const resText = await data.text();
const rspObj = JSON.parse(resText);
const errMsg =
errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
Message.error(errMsg);
}
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
Message.error("下载文件出现错误,请联系管理员!");
downloadLoadingInstance.close();
});
}
export default service export default service

113
acupuncture-后台/src/views/followFile/index.vue

@ -70,6 +70,7 @@
align="center" align="center"
prop="name" prop="name"
min-width="130" min-width="130"
fixed
/> />
<el-table-column <el-table-column
label="随访方式" label="随访方式"
@ -110,6 +111,27 @@
show-overflow-tooltip show-overflow-tooltip
min-width="100" min-width="100"
/> />
<el-table-column
label="总月数"
align="center"
prop="followupMonth"
show-overflow-tooltip
min-width="100"
/>
<el-table-column
label="临近提醒时间(天)"
align="center"
prop="remindTime"
show-overflow-tooltip
min-width="130"
/>
<el-table-column
label="窗口期"
align="center"
prop="followWindowAdys"
show-overflow-tooltip
min-width="100"
/>
<el-table-column <el-table-column
label="状态" label="状态"
align="center" align="center"
@ -118,14 +140,25 @@
min-width="100" min-width="100"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.status == 0" style="color: red">禁用</span> <span v-if="scope.row.status == 0" style="color: #F56C6C">禁用</span>
<span v-if="scope.row.status == 1" style="color: green">启用</span> <span v-else style="color: #67C23A">启用</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column
label="类型"
align="center"
show-overflow-tooltip
min-width="100"
>
<template slot-scope="scope">
<span v-if="scope.row.type == 1">公共队列</span>
<span v-else-if="scope.row.status == 1" style="color: #67C23A">本院队列</span>
</template>
</el-table-column>
<el-table-column <el-table-column
label="创建人/创建时间" label="创建人/创建时间"
align="center" align="center"
min-width="130" min-width="140"
fixed="right" fixed="right"
> >
<template slot-scope="scope"> <template slot-scope="scope">
@ -142,6 +175,7 @@
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
:disabled="scope.row.type == 1"
>修改</el-button >修改</el-button
> >
<el-button <el-button
@ -149,6 +183,7 @@
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
:disabled="scope.row.type == 1"
>删除</el-button >删除</el-button
> >
</template> </template>
@ -176,7 +211,7 @@
ref="form" ref="form"
:model="form" :model="form"
:rules="rules" :rules="rules"
label-width="90px" label-width="130px"
> >
<el-form-item label="队列名称" prop="name"> <el-form-item label="队列名称" prop="name">
<el-input v-model="form.name" placeholder="请输入" /> <el-input v-model="form.name" placeholder="请输入" />
@ -212,6 +247,12 @@
<el-form-item label="总月数" prop="followupMonth"> <el-form-item label="总月数" prop="followupMonth">
<el-input v-model="form.followupMonth" placeholder="请输入" /> <el-input v-model="form.followupMonth" placeholder="请输入" />
</el-form-item> </el-form-item>
<el-form-item label="临近提醒时间(天)" prop="remindTime">
<el-input v-model="form.remindTime" placeholder="请输入" />
</el-form-item>
<el-form-item label="窗口期" prop="followWindowAdys">
<el-input v-model="form.followWindowAdys" placeholder="请输入" />
</el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio :label="1">启用</el-radio> <el-radio :label="1">启用</el-radio>
@ -247,6 +288,7 @@ import {
followupAdd, followupAdd,
followupUpd, followupUpd,
followupDel, followupDel,
commonQueue
} from "@/api/followupFile"; } from "@/api/followupFile";
export default { export default {
name: "Notice", name: "Notice",
@ -257,29 +299,33 @@ export default {
openCron: false, openCron: false,
// //
expression: "", expression: "",
idCardType: [ idCardType: [{
{ label: "身份证",
label: "身份证", value: 0,
value: 0, },
}, {
{ label: "护照或外国人永居证",
label: "护照或外国人永居证", value: 1,
value: 1, },
}, {
{ label: "港澳居民来往内地通行",
label: "港澳居民来往内地通行", value: 2,
value: 2, },
}, {
{ label: "台湾居民来往大陆通行证",
label: "台湾居民来往大陆通行证", value: 3,
value: 3, },
}, {
label: "其他",
value: 4,
},
], ],
idCardTypeValue: { idCardTypeValue: {
0: "身份证", 0: "身份证",
1: "护照或外国人永居证", 1: "护照或外国人永居证",
2: "港澳居民来往内地通行", 2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证", 3: "台湾居民来往大陆通行证",
4: "其他",
}, },
loading: false, // loading: false, //
ids: [], // ids: [], //
@ -317,6 +363,18 @@ export default {
frequency: [ frequency: [
{ required: true, message: "随访频次不能为空", trigger: "blur" }, { required: true, message: "随访频次不能为空", trigger: "blur" },
], ],
followupMonth: [
{ required: true, message: "总月数不能为空", trigger: "blur" },
],
followWindowAdys: [
{ required: true, message: "窗口期不能为空", trigger: "blur" },
],
remindTime: [
{ required: true, message: "临近提醒时间不能为空", trigger: "blur" },
],
frequency: [
{ required: true, message: "随访频次不能为空", trigger: "blur" },
],
status: [{ required: true, message: "状态不能为空", trigger: "blur" }], status: [{ required: true, message: "状态不能为空", trigger: "blur" }],
}, },
}; };
@ -334,11 +392,16 @@ export default {
crontabFill(value) { crontabFill(value) {
this.form.frequency = value; this.form.frequency = value;
}, },
/** 查询公告列表 */ /** 查询公告列表 */
getList() { getList() {
this.loading = true; this.loading = true;
followupQuery(this.queryParams).then((res) => { followupQuery(this.queryParams).then((res) => {
let commonQueue = JSON.parse(localStorage.getItem('commonQueue'))
this.listDat = res.data.list; this.listDat = res.data.list;
commonQueue?.forEach(i=>{
this.listDat.unshift(i)
})
this.total = res.data.total; this.total = res.data.total;
this.loading = false; this.loading = false;
}); });

685
acupuncture-后台/src/views/followFile/subjects.vue

@ -1,397 +1,326 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
:model="queryParams" label-width="68px">
ref="queryForm" <el-form-item label="随访队列" prop="queueId">
size="small" <el-select v-model="queryParams.param.queueId" clearable placeholder="请选择">
:inline="true" <el-option v-for="item in followupList" :key="item.id" :label="item.name" :value="item.id">
v-show="showSearch" </el-option>
label-width="68px" </el-select>
> </el-form-item>
<el-form-item label="随访队列" prop="queueId"> <el-form-item label="" prop="queueId">
<el-select v-model="queryParams.param.queueId" placeholder="请选择"> <el-checkbox-group v-model="haveQueue">
<el-option <el-checkbox >未参加队列人员</el-checkbox>
v-for="item in followupList" </el-checkbox-group>
:key="item.id" </el-form-item>
:label="item.name" <el-form-item>
:value="item.id" <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-option> 重置
</el-select> </el-button>
</el-form-item> </el-form-item>
<el-form-item> </el-form>
<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>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<right-toolbar <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
:showSearch.sync="showSearch" </el-row>
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table <el-table v-loading="loading" :data="listDat" @selection-change="handleSelectionChange" max-height="600">
v-loading="loading" <el-table-column type="selection" width="55" align="center" />
:data="listDat" <el-table-column label="姓名" align="center" prop="name" width="100" fixed />
@selection-change="handleSelectionChange" <el-table-column fixed label="性别" align="center" prop="gender" show-overflow-tooltip min-width="100">
max-height="600" <template slot-scope="scope">
> <span v-if="scope.row.gender == 0"></span>
<el-table-column type="selection" width="55" align="center" /> <span v-if="scope.row.gender == 1"></span>
<el-table-column label="姓名" align="center" prop="name" width="100" /> </template>
<el-table-column </el-table-column>
label="性别"
align="center"
prop="gender"
show-overflow-tooltip
width="100"
>
<template slot-scope="scope">
<span v-if="scope.row.gender == 0"></span>
<span v-if="scope.row.gender == 1"></span>
</template>
</el-table-column>
<el-table-column <el-table-column fixed label="出生日期" align="center" prop="birthDate" show-overflow-tooltip min-width="150">
label="出生日期" <template slot-scope="scope">
align="center" {{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}
prop="birthDate" </template>
show-overflow-tooltip </el-table-column>
width="150" <el-table-column label="民族" align="center" prop="ethnicity" show-overflow-tooltip min-width="100" />
> <el-table-column label="受教育年限" align="center" prop="educationYears" show-overflow-tooltip min-width="100" />
<template slot-scope="scope"> <el-table-column label="手机号码" align="center" prop="phone" show-overflow-tooltip min-width="150" />
{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }} <el-table-column label="证件类型" align="center" prop="idCardType" show-overflow-tooltip min-width="200">
</template> <template slot-scope="scope">
</el-table-column> {{ idCardTypeValue[scope.row.idCardType] }}
<el-table-column </template>
label="民族" </el-table-column>
align="center" <el-table-column label="证件号码" align="center" prop="idCard" show-overflow-tooltip min-width="180" />
prop="ethnicity" <el-table-column fixed="right" label="随访队列" align="center" prop="queueList" show-overflow-tooltip
show-overflow-tooltip min-width="180">
width="100" <template slot-scope="scope">
/> <div v-if="scope.row.queueList && scope.row.queueList.length">
<el-table-column {{ scope.row.queueList.map((i) => i.queueName).join(",") }}
label="受教育年限" </div>
align="center" </template>
prop="educationYears" </el-table-column>
show-overflow-tooltip <el-table-column label="创建人/创建时间" align="center" width="140" fixed="right">
width="100" <template slot-scope="scope">
/> <div>{{ scope.row.createBy }}</div>
<el-table-column <span>{{
label="手机号码"
align="center"
prop="phone"
show-overflow-tooltip
width="150"
/>
<el-table-column
label="证件类型"
align="center"
prop="idCardType"
show-overflow-tooltip
width="200"
>
<template slot-scope="scope">
{{ idCardTypeValue[scope.row.idCardType] }}
</template>
</el-table-column>
<el-table-column
label="证件号码"
align="center"
prop="idCard"
show-overflow-tooltip
width="180"
/>
<el-table-column
fixed="right"
label="随访队列"
align="center"
prop="queueList"
show-overflow-tooltip
width="180"
>
<template slot-scope="scope">
<div v-if="scope.row.queueList && scope.row.queueList.length">
{{ scope.row.queueList.map((i) => i.queueName).join(",") }}
</div>
</template>
</el-table-column>
<el-table-column
label="创建人/创建时间"
align="center"
width="130"
fixed="right"
>
<template slot-scope="scope">
<div>{{ scope.row.createBy }}</div>
<span>{{
parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}") parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}")
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="200"> <el-table-column fixed="right" label="操作" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button size="mini" type="text" icon="el-icon-edit"
size="mini" @click="handleUpdate(scope.row)">队列管理</el-button>
type="text" <el-button size="mini" type="text" icon="el-icon-tickets"
icon="el-icon-edit" @click="handlePatient(scope.row)">患者档案</el-button>
@click="handleUpdate(scope.row)" <el-button size="mini" type="text" icon="el-icon-notebook-2"
>队列管理</el-button @click="handleMedical(scope.row)">诊疗档案</el-button>
> </template>
<el-button </el-table-column>
size="mini" </el-table>
type="text"
icon="el-icon-tickets"
@click="handlePatient(scope.row)"
>患者档案</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-notebook-2"
@click="handleMedical(scope.row)"
>诊疗档案</el-button
>
</template>
</el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
v-show="total > 0" :limit.sync="queryParams.pageSize" @pagination="getList" />
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改公告对话框 --> <!-- 添加或修改公告对话框 -->
<el-dialog <el-dialog class="popup" :title="title" :visible.sync="open" width="780px" append-to-body>
class="popup" <el-form class="formStep" ref="form" :model="form" :rules="rules" label-width="90px">
:title="title" <el-form-item label="随访队列" prop="queueIdList">
:visible.sync="open" <el-select v-model="form.queueIdList" multiple placeholder="请选择">
width="780px" <el-option v-for="item in followupList" :key="item.id" :label="item.name" :value="item.id">
append-to-body </el-option>
> </el-select>
<el-form </el-form-item>
class="formStep" </el-form>
ref="form" <div slot="footer" class="dialog-footer">
:model="form" <el-button type="primary" @click="submitForm"> </el-button>
:rules="rules" <el-button @click="cancel"> </el-button>
label-width="90px" </div>
> </el-dialog>
<el-form-item label="随访队列" prop="queueIdList"> </div>
<el-select v-model="form.queueIdList" multiple placeholder="请选择">
<el-option
v-for="item in followupList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
import { queryPatient, followupQuery, updPatient } from "@/api/followupFile"; import {
export default { queryPatient,
name: "Notice", followupQuery,
data() { updPatient
return { } from "@/api/followupFile";
fileList: [], export default {
idCardType: [ name: "Notice",
{ data() {
label: "身份证", return {
value: 0, fileList: [],
}, idCardType: [{
{ label: "身份证",
label: "护照或外国人永居证", value: 0,
value: 1, },
}, {
{ label: "护照或外国人永居证",
label: "港澳居民来往内地通行", value: 1,
value: 2, },
}, {
{ label: "港澳居民来往内地通行",
label: "台湾居民来往大陆通行证", value: 2,
value: 3, },
}, {
], label: "台湾居民来往大陆通行证",
idCardTypeValue: { value: 3,
0: "身份证", },
1: "护照或外国人永居证", {
2: "港澳居民来往内地通行", label: "其他",
3: "台湾居民来往大陆通行证", value: 4,
}, },
loading: false, // ],
ids: [], // idCardTypeValue: {
single: true, // 0: "身份证",
multiple: true, // 1: "护照或外国人永居证",
showSearch: true, // 2: "港澳居民来往内地通行",
total: 0, // 3: "台湾居民来往大陆通行证",
listDat: [{}], // 4: "其他",
title: "", // },
open: false, // loading: false, //
importOpen: false, // ids: [], //
// single: true, //
queryParams: { multiple: true, //
pageNum: 1, showSearch: true, //
pageSize: 10, total: 0, //
param: {}, listDat: [{}], //
}, title: "", //
formDisabled: false, open: false, //
importform: {}, importOpen: false, //
// //
form: {}, queryParams: {
// pageNum: 1,
rules: { pageSize: 10,
queueIdList: [ param: {
{ required: true, message: "随访队列不能为空", trigger: "change" }, queueId: ''
], },
}, },
followupList: [], // 访 haveQueue:'',
}; formDisabled: false,
}, importform: {},
created() { //
this.getList(); form: {},
this.getFollowupQuery(); //
}, rules: {
methods: { queueIdList: [{
// 访 required: true,
getFollowupQuery() { message: "随访队列不能为空",
followupQuery({ trigger: "change"
pageNum: -1, }, ],
param: {}, },
}).then((res) => { followupList: [], // 访
this.followupList = res.data.list; };
}); },
}, created() {
this.getList();
this.getFollowupQuery();
},
methods: {
// 访
getFollowupQuery() {
followupQuery({
pageNum: -1,
param: {
status: 1
},
}).then((res) => {
this.followupList = res.data.list;
let commonQueue = JSON.parse(localStorage.getItem('commonQueue'))
commonQueue?.forEach(i => {
this.followupList.unshift(i)
})
});
},
/** 查询公告列表 */ /** 查询公告列表 */
getList() { getList() {
this.loading = true; this.loading = true;
queryPatient(this.queryParams).then((res) => { queryPatient(this.queryParams).then((res) => {
this.listDat = res.data.list; this.listDat = res.data.list;
this.total = res.data.total; this.total = res.data.total;
this.loading = false; this.loading = false;
}); });
}, },
// //
cancel() { cancel() {
this.open = false; this.open = false;
this.reset(); this.reset();
}, },
// //
reset() { reset() {
this.form = {}; this.form = {};
this.resetForm("form"); this.resetForm("form");
}, },
/** 搜索按钮操作 */ /** 搜索按钮操作 */
handleQuery() { handleQuery() {
this.queryParams.pageNum = 1; this.queryParams.param.haveQueue = ''
this.getList(); if(this.haveQueue){
}, this.queryParams.param.haveQueue = 0
/** 重置按钮操作 */ }
resetQuery() { this.queryParams.pageNum = 1;
this.resetForm("queryForm"); this.getList();
this.handleQuery(); },
}, /** 重置按钮操作 */
// resetQuery() {
handleSelectionChange(selection) { this.queryParams = {
this.ids = selection.map((item) => item.id); param: {
this.single = selection.length != 1; queueId: ''
this.multiple = !selection.length; },
}, },
/** 修改按钮操作 */ this.haveQueue = ''
handleUpdate(row) { this.handleQuery();
this.open = true; },
this.title = "队列管理"; //
let queueList = row.queueList.map((item) => item.queueId); handleSelectionChange(selection) {
this.form = JSON.parse( this.ids = selection.map((item) => item.id);
JSON.stringify({ this.single = selection.length != 1;
...row, this.multiple = !selection.length;
patientId: row.id, },
queueIdList: queueList, /** 修改按钮操作 */
}) handleUpdate(row) {
); this.open = true;
}, this.title = "队列管理";
/** 跳转患者档案 */ let queueList = row.queueList?.map((item) => item.queueId) || [];
handlePatient(row) {}, this.form = JSON.parse(
/** 诊疗档案 */ JSON.stringify({
handleMedical(row) {}, ...row,
/** 提交按钮 */ patientId: row.id,
submitForm: function () { queueIdList: queueList,
this.$refs["form"].validate((valid) => { })
if (valid) { );
updPatient(this.form).then((response) => { },
this.$modal.msgSuccess("修改成功"); /** 跳转患者档案 */
this.open = false; handlePatient(row) {
this.getList(); this.$router.push({
}); path: `/patientIndex?idCard=${row.idCard}`
} })
}); },
}, /** 诊疗档案 */
handleMedical(row) {
this.$router.push({
path: `/medicalIndex?idCard=${row.idCard}`
})
},
/** 提交按钮 */
submitForm: function() {
this.$refs["form"].validate((valid) => {
if (valid) {
updPatient(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
}
});
},
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const idList = row.id ? [row.id] : this.ids; const idList = row.id ? [row.id] : this.ids;
this.$modal this.$modal
.confirm("是否确认删除当前选择的数据?") .confirm("是否确认删除当前选择的数据?")
.then(function () { .then(function() {
return patientDel({ idList: idList }); return patientDel({
}) idList: idList
.then(() => { });
this.getList(); })
this.$modal.msgSuccess("删除成功"); .then(() => {
}) this.getList();
.catch(() => {}); this.$modal.msgSuccess("删除成功");
}, })
/** 导出按钮操作 */ .catch(() => {});
handleExport() { },
this.download( /** 导出按钮操作 */
"system/user/export", handleExport() {
{ this.download(
...this.queryParams.params, "system/user/export", {
}, ...this.queryParams.params,
`患者档案.xlsx` },
); `患者档案.xlsx`
}, );
/** 导入按钮操作 */ },
handleImport() { /** 导入按钮操作 */
this.upload.title = "用户导入"; handleImport() {
this.upload.open = true; this.upload.title = "用户导入";
}, this.upload.open = true;
}, },
}; },
};
</script> </script>
<style scoped src="@/assets/styles/common.css"></style> <style scoped src="@/assets/styles/common.css"></style>
<style scoped> <style scoped>
.form-item-age { .form-item-age {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.form-item-age span {
margin: 0 10px; .form-item-age span {
} margin: 0 10px;
.form-item-age >>> .el-input { }
width: 100px;
} .form-item-age>>>.el-input {
width: 100px;
}
</style> </style>
<!-- >>> .el-input__inner { <!-- >>> .el-input__inner {
padding: 0 15px !important; padding: 0 15px !important;

986
acupuncture-后台/src/views/followFile/work.vue

File diff suppressed because it is too large

1323
acupuncture-后台/src/views/index.vue

File diff suppressed because it is too large

404
acupuncture-后台/src/views/indexCom/JM.vue

@ -0,0 +1,404 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">病种排名</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="diagnose" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">体系分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="system" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">体质分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="physique" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">体态评估TAPS</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="posture" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">失眠评估PHQ-9</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="agrypnia" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">焦虑HAMD-24</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="anxiety" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import {
zlInfo
} from "@/api/indexCom.js";
import {
diagnoseEcharts,
systemEcharts,
physiqueEcharts,
postureEcharts,
agrypniaEcharts,
anxietyEcharts,
} from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
loading: false,
diagnoseValue: null, //
systemValue: null, //
physiqueValue: null, //
postureValue: null, //
agrypniaValue: null, //
anxietyValue: null, //
//
systemObj: {
yxfpz: "隐形肥胖型", //
zfgdx: "脂肪过多型", //
fpx: "肥胖型", //
jrbzx: "肌肉不足型", //
jkjcx: "健康匀称型", //
czjrx: "超重肌肉型", //
xsx: "消瘦型", //
dzfx: "低脂肪型", //
ydyx: "运动员型", //
},
//
physiqueObj: {
phz: "平和质", //
qxz: "气虚质", //
yangxz: "阳虚质", //
yinxz: "阴虚质", //
tsz: "痰湿质", //湿
srz: "湿热质", //湿
xyz: "血瘀质", //
qyz: "气郁质", //
tlz: "特禀质", //
},
};
},
created() {
// this.Linepatient();
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
await zlInfo(this.queryParams).then((res) => {
const {
jlfb,
smfb,
sort,
ttfb,
txfb,
zytz
} = res.data;
//
this.diagnoseValue = sort.sort((a, b) => a.total - b.total);
this.handleDiagnose();
//
this.systemValue = [];
delete txfb.total;
for (let key in txfb) {
let data = {
name: this.systemObj[key],
value: txfb[key],
};
this.systemValue.push(data);
}
this.handleSystem();
//
this.physiqueValue = [];
delete zytz.total;
for (let key in zytz) {
let data = {
name: this.physiqueObj[key],
value: zytz[key],
};
this.physiqueValue.push(data);
}
this.handlePhysique();
//
this.postureValue = [{
value: ttfb.score1,
name: "1分",
},
{
value: ttfb.score2,
name: "2分",
},
{
value: ttfb.score3,
name: "3分",
},
{
value: ttfb.score4,
name: "4分",
},
{
value: ttfb.score5,
name: "5分",
},
];
this.handlePosture();
// PHQ-9
this.agrypniaValue = [];
for (let key in smfb) {
this.agrypniaValue.push(smfb[key]);
}
this.handleAgrypnia();
//
this.anxietyValue = [];
for (let key in jlfb) {
this.anxietyValue.push(jlfb[key]);
}
this.handleAnxiety();
});
this.loading = false;
} catch (e) {}
},
//
handleDiagnose() {
diagnoseEcharts.series[0].data = this.diagnoseValue?.map((item) => {
return item.total;
});
diagnoseEcharts.yAxis.data = this.diagnoseValue?.map((item) => {
return item.type;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("diagnose"), null, {
height: 300,
});
myChart.setOption(diagnoseEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleSystem() {
systemEcharts.series[0].data = this.systemValue?.map((item) => {
return item.value;
});
systemEcharts.xAxis.data = this.systemValue?.map((item) => {
return item.name;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("system"), null, {
height: 300,
});
myChart.setOption(systemEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handlePhysique() {
physiqueEcharts.series[0].data = this.physiqueValue?.map((item) => {
return item.value;
});
physiqueEcharts.xAxis.data = this.physiqueValue?.map((item) => {
return item.name;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("physique"), null, {
height: 300,
});
myChart.setOption(physiqueEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handlePosture() {
postureEcharts.series[0].data = this.postureValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("posture"), null, {
height: 300,
});
myChart.setOption(postureEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
handleAgrypnia() {
agrypniaEcharts.series[0].data = this.agrypniaValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("agrypnia"), null, {
height: 300,
});
myChart.setOption(agrypniaEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleAnxiety() {
anxietyEcharts.series[0].data = this.anxietyValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("anxiety"), null, {
height: 300,
});
myChart.setOption(anxietyEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
getRenew() {
this.handleDiagnose();
this.handleSystem();
this.handlePhysique();
this.handlePosture();
this.handleAgrypnia();
this.handleAnxiety();
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>>.el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
.>>>.el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>>.el-radio__input {
display: none;
}
>>>.el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

383
acupuncture-后台/src/views/indexCom/XGZL.vue

@ -0,0 +1,383 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗类型分布</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #91CC75"></span>
中西医结合
</div>
<span class="dian" style="background: #5470C6"></span>
纯中医
</div>
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="healType" style="width: 100%"></div>
</div>
</el-card>
</div>
<!-- <div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">病种方法分布</span>
<div class="dis"></div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="diseaseMethod" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1;">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">病种穴位分布</span>
<div class="dis">
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="acupoint" style="width: 100%"></div>
</div>
</el-card>
</div> -->
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗效果</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #5C7BD9"></span>
治愈
</div>
<div class="dian-box dis">
<span class="dian" style="background: #91CC75"></span>
显效
</div>
<div class="dian-box dis">
<span class="dian" style="background: #FAC858"></span>
好转
</div>
<div class="dian-box dis">
<span class="dian" style="background: #EE6666"></span>
无效
</div>
</div>
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="effect" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">诊疗费用分布</span>
<div class="dis">
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="cost" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
<!-- <div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">治疗效果</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #5C7BD9"></span>
治愈
</div>
<div class="dian-box dis">
<span class="dian" style="background: #91CC75"></span>
显效
</div>
<div class="dian-box dis">
<span class="dian" style="background: #FAC858"></span>
好转
</div>
<div class="dian-box dis">
<span class="dian" style="background: #EE6666"></span>
无效
</div>
</div>
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="effect" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">诊疗费用分布</span>
<div class="dis">
</div>
</div>
<div style="height: 300px" v-loading="loading">
<div id="cost" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div> -->
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import {
zlType
} from "@/api/indexCom.js";
import {
healTypeEcharts,
diseaseMethodEcharts,
effectEcharts,
costEcharts
} from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
loading: false,
healTypeValue: null, //
diseaseMethod: null, //
effectValue: null, //
costValue: null, //
effectObj: {
"zy": "治愈", //
"xx": "显效", //
"hz": "好转", //
"wx": "无效" //
}
};
},
created() {
// this.Linepatient();
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
await zlType(this.queryParams).then((res) => {
const {
bzfffb,
bzxwfb,
zlfy,
zllxtj,
zlxwfb
} = res.data;
//
this.healTypeValue = [{
value: zllxtj.zxyjh,
name: "中西医结合",
},
{
value: zllxtj.czy,
name: "纯中医",
},
]
this.handleHealType();
//
// let diseaseMethod = []
// let index = 0
// for(let i in bzfffb){
// for(let k in bzfffb[i]){
// console.log(bzfffb[i][k])
// }
// index ++
// }
// this.handleDiseaseMethod()
//
this.effectValue = [{
name: '治愈',
value: zlxwfb.zy
},
{
name: '显效',
value: zlxwfb.xx
},
{
name: '好转',
value: zlxwfb.hz
},
{
name: '无效',
value: zlxwfb.wx
}
]
this.handleEffect()
//
this.costValue = [zlfy.score1, zlfy.score2, zlfy.score3, zlfy.score4, zlfy.score5]
this.handleCost()
});
this.loading = false;
} catch (e) {}
},
//
handleHealType() {
healTypeEcharts.series[0].data = this.healTypeValue
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("healType"), null, {
height: 300,
});
myChart.setOption(healTypeEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleDiseaseMethod() {
// diseaseMethodEcharts.series[0].data = this.diseaseMethod
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("diseaseMethod"), null, {
height: 300,
});
myChart.setOption(diseaseMethodEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleEffect() {
effectEcharts.series[0].data = this.effectValue
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("effect"), null, {
height: 300,
});
myChart.setOption(effectEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleCost() {
costEcharts.series[0].data = this.costValue
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("cost"), null, {
height: 300,
});
myChart.setOption(costEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.handleHealType();
this.handleEffect();
this.handleCost()
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>>.el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
.>>>.el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>>.el-radio__input {
display: none;
}
>>>.el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

224
acupuncture-后台/src/views/indexCom/follow.vue

@ -0,0 +1,224 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1;margin-right: 20px;">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">随访队列分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="follow" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1;">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">失访原因分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="lossFollow" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import {
sffb,
sftj
} from "@/api/indexCom.js";
import {
followEcharts,
lossFollowEcharts
} from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
loading: false,
followValue: [], //
lossFollowValue: [], //
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
};
},
created() {
// this.Linepatient()
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
this.followValue = {}
await sffb(this.queryParams).then((res) => {
res.data.forEach(i => {
let data = [i.dsf, i.ljsf, i.cqsf, i.zc]
this.followValue[i.queueName] = data
})
this.handleFollow()
});
await sftj(this.queryParams).then((res) => {
this.lossFollowValue = res.data
this.handleLossFollow()
});
this.loading = false;
} catch (e) {
}
},
//
handleFollow() {
followEcharts.series = []
for (let key in this.followValue) {
let series = {
name: key,
data: this.followValue[key],
type: "bar",
barMaxWidth: 24, //
itemStyle: {
normal: {
// []
barBorderRadius: [50, 50, 0, 0],
},
},
}
followEcharts.series.push(series)
}
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("follow"), null, {
height: 300,
});
myChart.setOption(followEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
// 访
handleLossFollow() {
lossFollowEcharts.series[0].data = this.lossFollowValue?.map((item) => {
return item.num;
});
lossFollowEcharts.xAxis.data = this.lossFollowValue?.map((item) => {
return item.reason;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("lossFollow"), null, {
height: 300,
});
myChart.setOption(lossFollowEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.handleFollow();
this.handleLossFollow()
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>>.el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
.>>>.el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>>.el-radio__input {
display: none;
}
>>>.el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

939
acupuncture-后台/src/views/indexCom/index.js

@ -0,0 +1,939 @@
import * as echarts from "echarts";
// -------- 患者信息统计 --------
// 患者总数
export const HZXX = {
tooltip: {
trigger: "item",
},
title: {
text: "100",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#4f8bff", "#ffcd6c", "#00d1a1", "#a794fe"],
graphic: {
type: "text",
left: "center",
top: "56%",
style: {
text: "患者总数",
color: "#70798C",
textAlign: "center",
fill: "#999999",
fontSize: 18,
width: "50px",
},
},
series: [
{
type: "pie",
radius: ["60%", "80%"],
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 患者性别
export const gende = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#4F8BFF", "#FE4943"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal:{
show:true,
position:'inner',
formatter: '{b}:{c}个',
textStyle:{
color:'#fff'
}
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 年龄分布
export const ageEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["<40岁","41-50岁","51-60岁","61-70岁","71-80岁",">80岁",],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
color: function (params)
{
var colorList = ['#FF9966', '#66B3FF', '#99FF99','#FFCC66','#FF6699','#CCCCCC'];
return colorList[params.dataIndex]
},
},
},
},
],
};
// 病种分布
export const diseaseEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["<40岁","41-50岁","51-60岁","61-70岁","71-80岁",">80岁",],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// -------- 诊疗信息统计 --------
// 病种
export const diagnoseEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
grid: {
top: "12%",
left: "1%",
right: "14%",
bottom: "0%",
containLabel: true,
},
yAxis: {
type: "category",
data: [],
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
},
],
};
// 体系
export const systemEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: [],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// 体质
export const physiqueEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: [],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// 体态
export const postureEcharts = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#4f8bff", "#ffcd6c", "#00d1a1", "#a794fe","#EE6666"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal:{
show:true,
position:'inner',
formatter: '{b}:{c}个',
textStyle:{
color:'#fff'
}
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 失眠
export const agrypniaEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ['0~4分', '5~9分', '10~14分','15~19分','20~27分'],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// 焦虑度
export const anxietyEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ['<8分', '8~20分','21~35分','>35分'],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// -------- 治疗类型 --------
// 治疗类型
export const healTypeEcharts = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#91CC75", "#5470C6"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal:{
show:true,
position:'inner',
formatter: '{b}:{c}个',
textStyle:{
color:'#fff'
}
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 病种方法
export const diseaseMethodEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ['肥胖症', '失眠症','其他'],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量1:",
data: [1,2],
type: "bar",
barMaxWidth: 24, //柱图宽度
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
{
name: "数量2:",
data: [1,3],
type: "bar",
barMaxWidth: 24, //柱图宽度
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// 治疗效果
export const effectEcharts = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#5C7BD9", "#91CC75",'#FAC858','#EE6666'],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
normal:{
show:true,
position:'inner',
formatter: '{b}:{c}个',
textStyle:{
color:'#fff'
}
},
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 诊疗费
export const costEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ['<300元','300 ~ 900元','900 ~ 2000元','2000 ~ 5000元','>5000元'],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// -------- 随访 --------
export const followEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ['待随访','临近随访','超期随访','正常随访'],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
],
};
export const lossFollowEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ['<300元','300 ~ 900元','900 ~ 2000元','2000 ~ 5000元','>5000元'],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "数量:",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
}
],
};

325
acupuncture-后台/src/views/indexCom/patient.vue

@ -0,0 +1,325 @@
<template>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">患者总数</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="patienty" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1;margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">性别数量</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
</div>
<span class="dian" style="background: #fe4943"></span>
</div>
</div>
</div>
<!-- 性别统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="gender" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">年龄分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="age" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1;">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">既往病种分布</span>
<div class="dis">
<!-- <div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
</div>
<span class="dian" style="background: #ffcd6c"></span>
</div> -->
</div>
</div>
<!-- 既往病种分布 -->
<div style="height: 300px" v-loading="loading">
<div id="disease" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import {
patientTotal,
queryByDatePatient
} from "@/api/indexCom.js";
import {
HZXX,
HZXXSJFX,
gende,
ageEcharts,
diseaseEcharts
} from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
loading: false,
HZXXvalue: null, //
gendeValue: null, //
ageValue: null, //
diseaseValue: null, //
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
jwbzObj: {
"gxy": "高血压", //
"nxgb": "脑血管病", //
"exzl": "恶性肿瘤", //
"gxb": "冠心病", //
"jsjb": "精神疾病", //
"whsezcky": "胃和十二指肠溃疡", //
"fpz": "肥胖症", //
"gzssz": "骨质疏松症", //
"ycxXtxjb": "遗传性、先天性疾病", //
"tnb": "糖尿病", //尿
"mxfxjb": "慢性肺系疾病", //
"gzxz": "高脂血症", //
"gzjb": "肝脏疾病", //
"gmxjb": "过敏性疾病", //
"gjy": "关节炎", //
"tf": "痛风", //
"sySb": "肾炎、肾病", //
"other": "其他" //
}
};
},
created() {
// this.Linepatient()
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
await patientTotal(this.queryParams).then((res) => {
//
this.HZXXvalue = [{
value: res.data.totalPatients,
name: "患者总数"
}, ];
//
this.gendeValue = [{
value: res.data.gender.male,
name: "男"
},
{
value: res.data.gender.female,
name: "女"
}
];
//
let ageValue = res.data.age
this.ageValue = [ageValue.num1, ageValue.num2, ageValue.num2, ageValue.num4, ageValue
.num5, ageValue.num6
]
//
let diseaseValue = res.data.jwbz
this.diseaseValue = []
for (let key in diseaseValue) {
let data = {
name: this.jwbzObj[key],
value: diseaseValue[key]
}
this.diseaseValue.push(data)
}
this.Linepatient(); //
this.handleAge(); //
this.columnar(); //
this.handleDisease(); //
});
this.loading = false;
} catch (e) {}
},
//
Linepatient() {
HZXX.title.text = this.HZXXvalue[0].value;
HZXX.series[0].data = this.HZXXvalue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("patienty"), null, {
height: 300,
});
myChart.setOption(HZXX, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
columnar() {
gende.series[0].data = this.gendeValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("gender"), null, {
height: 300,
});
myChart.setOption(gende, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleAge() {
ageEcharts.series[0].data = this.ageValue
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("age"), null, {
height: 300,
});
myChart.setOption(ageEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
handleDisease() {
diseaseEcharts.series[0].data = this.diseaseValue?.map((item) => {
return item.value;
});
diseaseEcharts.xAxis.data = this.diseaseValue?.map((item) => {
return item.name;
});
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("disease"), null, {
height: 300,
});
myChart.setOption(diseaseEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.Linepatient(); //
this.handleAge(); //
this.columnar(); //
this.handleDisease(); //
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>>.el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
.>>>.el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>>.el-radio__input {
display: none;
}
>>>.el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

179
acupuncture-后台/src/views/indexCom/query.vue

@ -0,0 +1,179 @@
<template>
<div class="app-container">
<div class="title1">
<span class="title-bor"></span>
{{ title }}
</div>
<div>
<div>
<!-- <el-radio-group
v-model="radioValue"
size="small"
style="height: 36px"
@change="radioChange"
>
<el-radio label="0" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="1" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="2" border style="margin: 0 20px 0 0"></el-radio>
<el-radio label="3" border style="margin: 0 20px 0 0"></el-radio>
</el-radio-group> -->
<el-date-picker
v-model="pickerValue"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="pickerChage"
>
</el-date-picker>
</div>
</div>
</div>
</template>
<script>
// import { deviceType } from "./index.js";
// this.$store.commit('headerFun', data)
export default {
name: "Post",
props: ["title", "type"],
data() {
return {
radioValue: "1",
radioTime: [],
pickerValue: null,
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
},
],
},
};
},
created() {
console.log(this.pickerValue, 222);
},
methods: {
radioChange() {
const start = new Date();
const end = new Date();
this.timeType = 4;
if (this.radioValue == 0) {
this.timeType = 4;
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
this.radioTime = [start, end];
}
if (this.radioValue == 1) {
this.timeType = 4;
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
this.radioTime = [start, end];
}
if (this.radioValue == 2) {
this.timeType = 1;
const now = new Date(); //
const nowYear = now.getFullYear(); //
const nowMonth = now.getMonth(); //
const nowDay = now.getDate(); //
const nowDayOfWeek = now.getDay(); //
const jd = Math.ceil((nowMonth + 1) / 3); //
const startDate = new Date(nowYear, (jd - 1) * 3, 1);
const endDate = new Date(nowYear, jd * 3, 0);
this.radioTime = [startDate, endDate];
}
if (this.radioValue == 3) {
this.timeType = 1;
end.setTime(start.getTime());
start.setTime(start.getTime() - 3600 * 1000 * 24 * 365);
this.radioTime = [start, end];
}
this.$emit(
"radio-change",
this.pickerValue || this.radioTime,
this.type,
this.timeType
);
},
pickerChage() {
if (!this.pickerValue) {
this.radioChange();
}
console.log(this.pickerValue, 111);
this.radioTime = [];
this.timeType = 4;
if (this.radioValue == 0) {
this.timeType = 4;
}
if (this.radioValue == 1) {
this.timeType = 4;
}
if (this.radioValue == 2) {
this.timeType = 1;
}
if (this.radioValue == 3) {
this.timeType = 1;
}
this.$emit("picker-change", this.pickerValue, this.type, this.timeType);
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title1 {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>

60
acupuncture-后台/src/views/login.vue

@ -88,27 +88,41 @@
import { getCodeImg } from "@/api/login"; import { getCodeImg } from "@/api/login";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt"; import { encrypt, decrypt } from "@/utils/jsencrypt";
import { commonQueue } from "@/api/followupFile";
export default { export default {
name: "Login", name: "Login",
data() { data() {
return { return {
codeUrl: "", codeUrl: "",
loginForm: { loginForm: {
username: "admin", username: "",
password: "admin123", password: "",
rememberMe: false, rememberMe: false,
code: "", code: "",
uuid: "", uuid: "",
}, },
loginRules: { loginRules: {
username: [ username: [
{ required: true, trigger: "blur", message: "请输入您的账号" }, {
required: true,
trigger: "blur",
message: "请输入您的账号",
},
], ],
password: [ password: [
{ required: true, trigger: "blur", message: "请输入您的密码" }, {
required: true,
trigger: "blur",
message: "请输入您的密码",
},
],
code: [
{
required: true,
trigger: "change",
message: "请输入验证码",
},
], ],
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
}, },
loading: false, loading: false,
// //
@ -157,7 +171,9 @@ export default {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
Cookies.set("username", this.loginForm.username, { expires: 30 }); Cookies.set("username", this.loginForm.username, {
expires: 30,
});
Cookies.set("password", encrypt(this.loginForm.password), { Cookies.set("password", encrypt(this.loginForm.password), {
expires: 30, expires: 30,
}); });
@ -172,7 +188,12 @@ export default {
this.$store this.$store
.dispatch("Login", this.loginForm) .dispatch("Login", this.loginForm)
.then(() => { .then(() => {
this.$router.push({ path: this.redirect || "/" }).catch(() => {}); this.$router
.push({
path: this.redirect || "/",
})
.catch(() => {});
this.getCommonQueue();
}) })
.catch(() => { .catch(() => {
this.loading = false; this.loading = false;
@ -183,6 +204,20 @@ export default {
} }
}); });
}, },
//
getCommonQueue() {
commonQueue({
pageNum: -1,
param: {
status: 1,
},
}).then((res) => {
res.data.list.forEach((i) => {
i.type = 1;
});
localStorage.setItem("commonQueue", JSON.stringify(res.data.list));
});
},
}, },
}; };
</script> </script>
@ -196,6 +231,7 @@ export default {
background-image: url("../assets/images/login-background.jpg"); background-image: url("../assets/images/login-background.jpg");
background-size: cover; background-size: cover;
} }
.title { .title {
margin: 0px auto 30px auto; margin: 0px auto 30px auto;
text-align: center; text-align: center;
@ -207,32 +243,39 @@ export default {
background: #ffffff; background: #ffffff;
width: 400px; width: 400px;
padding: 25px 25px 5px 25px; padding: 25px 25px 5px 25px;
.el-input { .el-input {
height: 38px; height: 38px;
input { input {
height: 38px; height: 38px;
} }
} }
.input-icon { .input-icon {
height: 39px; height: 39px;
width: 14px; width: 14px;
margin-left: 2px; margin-left: 2px;
} }
} }
.login-tip { .login-tip {
font-size: 13px; font-size: 13px;
text-align: center; text-align: center;
color: #bfbfbf; color: #bfbfbf;
} }
.login-code { .login-code {
width: 33%; width: 33%;
height: 38px; height: 38px;
float: right; float: right;
img { img {
cursor: pointer; cursor: pointer;
vertical-align: middle; vertical-align: middle;
} }
} }
.el-login-footer { .el-login-footer {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
@ -245,6 +288,7 @@ export default {
font-size: 12px; font-size: 12px;
letter-spacing: 1px; letter-spacing: 1px;
} }
.login-code-img { .login-code-img {
height: 38px; height: 38px;
} }

3109
acupuncture-后台/src/views/medicalFile/index.vue

File diff suppressed because it is too large

1180
acupuncture-后台/src/views/patientFile/index.vue

File diff suppressed because it is too large
Loading…
Cancel
Save