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

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

@ -1,5 +1,12 @@
import request from "@/utils/request";
// 公共队列
export function commonQueue(data) {
return request({
url: "/followup/commonQueue",
method: "post",
data: data,
});
}
// 随访队列
export function followupQuery(data) {
return request({
@ -73,3 +80,11 @@ export function followPatient(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;
}
>>>.el-dialog__body{
padding: 0px 20px 0px 20px;
padding: 20px;
}
/* .popup >>> .popupAdd2 .popupleft {
width: 55px;

5
acupuncture-后台/src/main.js

@ -12,7 +12,8 @@ import store from './store'
import router from './router'
import directive from './directive' // directive
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 './permission' // permission control
@ -47,7 +48,9 @@ Vue.prototype.addDateRange = addDateRange
Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.download = download
Vue.prototype.download1 = download1
Vue.prototype.handleTree = handleTree
Vue.prototype.$moment = moment
// 全局组件挂载
Vue.component('DictTag', DictTag)

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

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

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

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

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

@ -148,5 +148,38 @@ export function download(url, params, filename, config) {
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

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

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

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

@ -1,397 +1,326 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="随访队列" prop="queueId">
<el-select v-model="queryParams.param.queueId" 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-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="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
label-width="68px">
<el-form-item label="随访队列" prop="queueId">
<el-select v-model="queryParams.param.queueId" clearable 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-item label="" prop="queueId">
<el-checkbox-group v-model="haveQueue">
<el-checkbox >未参加队列人员</el-checkbox>
</el-checkbox-group>
</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>
<el-row :gutter="10" class="mb8">
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-row :gutter="10" class="mb8">
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="listDat"
@selection-change="handleSelectionChange"
max-height="600"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="姓名" align="center" prop="name" width="100" />
<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 v-loading="loading" :data="listDat" @selection-change="handleSelectionChange" max-height="600">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="姓名" align="center" prop="name" width="100" fixed />
<el-table-column fixed label="性别" align="center" prop="gender" show-overflow-tooltip min-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
label="出生日期"
align="center"
prop="birthDate"
show-overflow-tooltip
width="150"
>
<template slot-scope="scope">
{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}
</template>
</el-table-column>
<el-table-column
label="民族"
align="center"
prop="ethnicity"
show-overflow-tooltip
width="100"
/>
<el-table-column
label="受教育年限"
align="center"
prop="educationYears"
show-overflow-tooltip
width="100"
/>
<el-table-column
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>{{
<el-table-column fixed label="出生日期" align="center" prop="birthDate" show-overflow-tooltip min-width="150">
<template slot-scope="scope">
{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}
</template>
</el-table-column>
<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" />
<el-table-column label="手机号码" align="center" prop="phone" show-overflow-tooltip min-width="150" />
<el-table-column label="证件类型" align="center" prop="idCardType" show-overflow-tooltip min-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 min-width="180" />
<el-table-column fixed="right" label="随访队列" align="center" prop="queueList" show-overflow-tooltip
min-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="140" fixed="right">
<template slot-scope="scope">
<div>{{ scope.row.createBy }}</div>
<span>{{
parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}")
}}</span>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="200">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>队列管理</el-button
>
<el-button
size="mini"
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>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="200">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit"
@click="handleUpdate(scope.row)">队列管理</el-button>
<el-button size="mini" 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
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改公告对话框 -->
<el-dialog
class="popup"
:title="title"
:visible.sync="open"
width="780px"
append-to-body
>
<el-form
class="formStep"
ref="form"
:model="form"
:rules="rules"
label-width="90px"
>
<el-form-item label="随访队列" prop="queueIdList">
<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>
<!-- 添加或修改公告对话框 -->
<el-dialog class="popup" :title="title" :visible.sync="open" width="780px" append-to-body>
<el-form class="formStep" ref="form" :model="form" :rules="rules" label-width="90px">
<el-form-item label="随访队列" prop="queueIdList">
<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>
<script>
import { queryPatient, followupQuery, updPatient } from "@/api/followupFile";
export default {
name: "Notice",
data() {
return {
fileList: [],
idCardType: [
{
label: "身份证",
value: 0,
},
{
label: "护照或外国人永居证",
value: 1,
},
{
label: "港澳居民来往内地通行",
value: 2,
},
{
label: "台湾居民来往大陆通行证",
value: 3,
},
],
idCardTypeValue: {
0: "身份证",
1: "护照或外国人永居证",
2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证",
},
loading: false, //
ids: [], //
single: true, //
multiple: true, //
showSearch: true, //
total: 0, //
listDat: [{}], //
title: "", //
open: false, //
importOpen: false, //
//
queryParams: {
pageNum: 1,
pageSize: 10,
param: {},
},
formDisabled: false,
importform: {},
//
form: {},
//
rules: {
queueIdList: [
{ required: true, message: "随访队列不能为空", trigger: "change" },
],
},
followupList: [], // 访
};
},
created() {
this.getList();
this.getFollowupQuery();
},
methods: {
// 访
getFollowupQuery() {
followupQuery({
pageNum: -1,
param: {},
}).then((res) => {
this.followupList = res.data.list;
});
},
import {
queryPatient,
followupQuery,
updPatient
} from "@/api/followupFile";
export default {
name: "Notice",
data() {
return {
fileList: [],
idCardType: [{
label: "身份证",
value: 0,
},
{
label: "护照或外国人永居证",
value: 1,
},
{
label: "港澳居民来往内地通行",
value: 2,
},
{
label: "台湾居民来往大陆通行证",
value: 3,
},
{
label: "其他",
value: 4,
},
],
idCardTypeValue: {
0: "身份证",
1: "护照或外国人永居证",
2: "港澳居民来往内地通行",
3: "台湾居民来往大陆通行证",
4: "其他",
},
loading: false, //
ids: [], //
single: true, //
multiple: true, //
showSearch: true, //
total: 0, //
listDat: [{}], //
title: "", //
open: false, //
importOpen: false, //
//
queryParams: {
pageNum: 1,
pageSize: 10,
param: {
queueId: ''
},
},
haveQueue:'',
formDisabled: false,
importform: {},
//
form: {},
//
rules: {
queueIdList: [{
required: true,
message: "随访队列不能为空",
trigger: "change"
}, ],
},
followupList: [], // 访
};
},
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() {
this.loading = true;
queryPatient(this.queryParams).then((res) => {
this.listDat = res.data.list;
this.total = res.data.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 修改按钮操作 */
handleUpdate(row) {
this.open = true;
this.title = "队列管理";
let queueList = row.queueList.map((item) => item.queueId);
this.form = JSON.parse(
JSON.stringify({
...row,
patientId: row.id,
queueIdList: queueList,
})
);
},
/** 跳转患者档案 */
handlePatient(row) {},
/** 诊疗档案 */
handleMedical(row) {},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate((valid) => {
if (valid) {
updPatient(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
}
});
},
/** 查询公告列表 */
getList() {
this.loading = true;
queryPatient(this.queryParams).then((res) => {
this.listDat = res.data.list;
this.total = res.data.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.param.haveQueue = ''
if(this.haveQueue){
this.queryParams.param.haveQueue = 0
}
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
param: {
queueId: ''
},
},
this.haveQueue = ''
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 修改按钮操作 */
handleUpdate(row) {
this.open = true;
this.title = "队列管理";
let queueList = row.queueList?.map((item) => item.queueId) || [];
this.form = JSON.parse(
JSON.stringify({
...row,
patientId: row.id,
queueIdList: queueList,
})
);
},
/** 跳转患者档案 */
handlePatient(row) {
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) {
const idList = row.id ? [row.id] : this.ids;
this.$modal
.confirm("是否确认删除当前选择的数据?")
.then(function () {
return patientDel({ idList: idList });
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"system/user/export",
{
...this.queryParams.params,
},
`患者档案.xlsx`
);
},
/** 导入按钮操作 */
handleImport() {
this.upload.title = "用户导入";
this.upload.open = true;
},
},
};
/** 删除按钮操作 */
handleDelete(row) {
const idList = row.id ? [row.id] : this.ids;
this.$modal
.confirm("是否确认删除当前选择的数据?")
.then(function() {
return patientDel({
idList: idList
});
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"system/user/export", {
...this.queryParams.params,
},
`患者档案.xlsx`
);
},
/** 导入按钮操作 */
handleImport() {
this.upload.title = "用户导入";
this.upload.open = true;
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
.form-item-age {
display: flex;
align-items: center;
}
.form-item-age span {
margin: 0 10px;
}
.form-item-age >>> .el-input {
width: 100px;
}
.form-item-age {
display: flex;
align-items: center;
}
.form-item-age span {
margin: 0 10px;
}
.form-item-age>>>.el-input {
width: 100px;
}
</style>
<!-- >>> .el-input__inner {
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 Cookies from "js-cookie";
import { encrypt, decrypt } from "@/utils/jsencrypt";
import { commonQueue } from "@/api/followupFile";
export default {
name: "Login",
data() {
return {
codeUrl: "",
loginForm: {
username: "admin",
password: "admin123",
username: "",
password: "",
rememberMe: false,
code: "",
uuid: "",
},
loginRules: {
username: [
{ required: true, trigger: "blur", message: "请输入您的账号" },
{
required: true,
trigger: "blur",
message: "请输入您的账号",
},
],
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,
//
@ -157,7 +171,9 @@ export default {
if (valid) {
this.loading = true;
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), {
expires: 30,
});
@ -172,7 +188,12 @@ export default {
this.$store
.dispatch("Login", this.loginForm)
.then(() => {
this.$router.push({ path: this.redirect || "/" }).catch(() => {});
this.$router
.push({
path: this.redirect || "/",
})
.catch(() => {});
this.getCommonQueue();
})
.catch(() => {
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>
@ -196,6 +231,7 @@ export default {
background-image: url("../assets/images/login-background.jpg");
background-size: cover;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
@ -207,32 +243,39 @@ export default {
background: #ffffff;
width: 400px;
padding: 25px 25px 5px 25px;
.el-input {
height: 38px;
input {
height: 38px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
}
}
.login-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.login-code {
width: 33%;
height: 38px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-login-footer {
height: 40px;
line-height: 40px;
@ -245,6 +288,7 @@ export default {
font-size: 12px;
letter-spacing: 1px;
}
.login-code-img {
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