init
This commit is contained in:
2025-06-27 17:42:38 +08:00
commit bd6402478b
5317 changed files with 785994 additions and 0 deletions
+135
View File
@@ -0,0 +1,135 @@
<template>
<div class="anxiety-container">
<div class="anxiety-title">
<div class="time" @click="handleTime">{{ timePicker.currentDate[0] }}-{{ timePicker.currentDate[1] }} </div>
<van-popup v-model:show="show" position="bottom">
<van-date-picker
v-model="timePicker.currentDate"
title="选择年月"
:max-date="timePicker.maxDate"
:columns-type="timePicker.columnsType"
@confirm="handleConfirm"
@cancel="handleCancel"
/>
</van-popup>
</div>
<div class="anxiety-list">
<template v-if="historylist.length > 0">
<div v-for="(item, index) in historylist" :key="index" @click="handleItem(item)">
<div class="name">
<span>{{ item.assessName }}</span>
<span>{{ item.assessDate }}</span>
</div>
</div>
</template>
<Empty v-else />
</div>
</div>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import moment from 'moment/moment';
import { healthHistoryApi } from './health';
import { useRoute, useRouter } from 'vue-router';
import Empty from '/@/components/Empty.vue';
const route = useRoute();
const router = useRouter();
const timePicker = ref({
currentDate: ['2021', '01'],
maxDate: new Date(),
columnsType: ['year', 'month'],
});
const show = ref(false);
const historylist = ref([]);
onMounted(() => {
const [yyyy, mm, dd] = moment(new Date()).format('YYYY-MM-DD').split('-');
timePicker.value.currentDate = [yyyy, mm];
getList();
});
function getList() {
healthHistoryApi({
templateNo: route.query.templateNo,
date: timePicker.value.currentDate.join('-'),
}).then((res: any) => {
historylist.value = res.data;
});
}
function handleTime() {
show.value = true;
}
function handleConfirm(value: any) {
let date = value.selectedValues;
timePicker.value.currentDate = date;
show.value = false;
getList();
}
function handleCancel() {
show.value = false;
}
function handleItem(data: object) {
router.push({
path: '/anxiety-result',
query: {
templateNo: data.templateNo,
resultId: data.id,
templateName: data.assessName,
history: true,
},
});
}
</script>
<style scoped lang="less">
@import '../../assets/less/index';
.anxiety-container {
background-color: @card-gray;
.anxiety-title {
height: 40px;
background-color: @card-fff;
display: flex;
align-items: center;
justify-content: flex-end;
.time {
padding-right: 40px;
position: relative;
&:after {
content: '';
width: 0;
height: 0;
border-top: 7px solid #4c4c4c;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
position: absolute;
top: 8px;
left: 65px;
}
}
}
.anxiety-list {
margin-top: 10px;
height: calc(100vh - 50px);
overflow-y: auto;
.times {
padding: 10px;
}
.name {
padding: 14px;
border-top: 1px solid #e0e0e0;
background-color: @card-fff;
display: flex;
justify-content: space-between;
}
}
}
</style>
+210
View File
@@ -0,0 +1,210 @@
<template>
<div class="result-con">
<div :class="templateNo === '500' ? 'result-tag' : 'depressed-tag'">
<div class="score">
<span>{{ anxietyRes.result.conclusionInfo.resultNumber }}</span
><span></span>
</div>
<div class="title">
<div>{{ anxietyRes.result.conclusionInfo.resultLevelStr }}</div>
<div>{{ anxietyRes.result.conclusionInfo.resultDesc }}</div>
</div>
<div class="time">
<span>{{ anxietyRes.result.conclusionInfo.date }}</span>
<span @click="hanleHistory">历史测评</span>
</div>
</div>
<div class="coninter">
<div class="cognition">
<div class="title">{{ templateNo == '400' ? '抑郁认知' : '焦虑认知' }}</div>
<div class="anxiety-con">
<div v-for="(item, index) in anxietyRes.cognition" :key="index">{{ item }}</div>
</div>
</div>
<div class="recommendation">
<div class="title">建议</div>
<div class="anxiety-con">
<div v-for="(item, index) in anxietyRes.proposalTips" :key="index">{{ index > 0 ? index + '、' : '' }}{{ item }}</div>
</div>
</div>
</div>
<div class="btn" v-if="!route.query.history" @click="hanldeAgein">再测一次</div>
</div>
</template>
<script setup lang="ts">
import { get } from '/@/views/mobile/api/api';
import subjectUrl from './subjectType';
import { ref } from 'vue';
import { useRoute, useRouter } from 'vue-router';
const router = useRouter();
const route = useRoute();
const templateNo = ref('400');
const anxietyRes = ref({
result: {},
cognition: [],
proposalTips: [],
});
handleGetRestule();
function handleGetRestule() {
templateNo.value = route.query.templateNo;
let params = { resultId: route.query.resultId };
let findItem = subjectUrl.getSubject.find((e) => e.templateNo === templateNo.value);
if (findItem !== undefined) {
get(findItem.url, params).then((res) => {
handleResult(res);
});
}
}
function handleResult(res: any) {
if (res.code === 200) {
let { tips, suggest } = res.data.conclusionInfo;
anxietyRes.value.result = res.data;
anxietyRes.value.cognition = tips;
anxietyRes.value.proposalTips = suggest;
}
}
function hanleHistory() {
router.push({
path: '/anxiety-history',
query: {
templateNo: templateNo.value,
templateName: route.query.templateName + '记录',
},
});
}
function hanldeAgein() {
router.push({
path: '/health-subject',
query: {
templateNo: templateNo.value,
templateName: route.query.templateName,
},
});
}
</script>
<style scoped lang="less">
.result-con {
overflow: hidden;
.result-tag {
padding: 18px;
background-color: rgba(245, 127, 56, 0.2);
position: relative;
.score {
position: absolute;
top: 0;
right: -15px;
background-color: #f57f38;
width: 110px;
height: 50px;
text-align: center;
line-height: 50px;
border-bottom-left-radius: 50px 50px;
border-bottom-right-radius: 50px 50px;
color: #fff;
}
.title {
color: #f57f38;
div {
&:nth-of-type(1) {
font-weight: bold;
font-size: 18px;
}
&:nth-of-type(2) {
width: 80%;
padding: 4px 0;
}
}
}
.time {
display: flex;
justify-content: space-between;
padding-top: 10px;
span {
&:nth-of-type(1) {
color: #999999;
}
&:nth-of-type(2) {
color: #3390ff;
}
}
}
}
.depressed-tag {
padding: 18px;
background-color: rgba(31, 145, 242, 0.2);
position: relative;
.score {
position: absolute;
top: 0;
right: -15px;
background-color: #1f91f2;
width: 110px;
height: 50px;
text-align: center;
line-height: 50px;
border-bottom-left-radius: 50px 50px;
border-bottom-right-radius: 50px 50px;
color: #fff;
}
.title {
color: #1f91f2;
div {
&:nth-of-type(1) {
font-weight: bold;
font-size: 18px;
}
&:nth-of-type(2) {
width: 80%;
padding: 4px 0;
}
}
}
.time {
display: flex;
justify-content: space-between;
padding-top: 10px;
span {
color: #1f91f2;
}
}
}
.coninter {
height: calc(100vh - 210px);
overflow-x: auto;
padding: 18px;
.title {
padding: 10px;
position: relative;
font-weight: bold;
font-size: 16px;
&:after {
content: '';
position: absolute;
left: 0;
top: 30%;
width: 3px;
height: 15px;
background-color: #21bebe;
border-radius: 2px;
}
}
.anxiety-con {
color: #333333;
line-height: 30px;
}
}
.btn {
margin: 10px auto;
width: 80%;
height: 40px;
line-height: 40px;
text-align: center;
background-color: #ffffff;
border: 1px solid #999999;
border-radius: 40px;
}
}
</style>
+104
View File
@@ -0,0 +1,104 @@
<template>
<div class="history-container">
<div class="history-title">
<div class="time" @click="handleTime">{{ timePicker.currentDate[0] }}-{{ timePicker.currentDate[1] }}</div>
<van-popup v-model:show="show" position="bottom">
<van-date-picker
v-model="timePicker.currentDate"
title="选择年月"
:max-date="timePicker.maxDate"
:columns-type="timePicker.columnsType"
@confirm="handleConfirm"
@cancel="handleCancel"
/>
</van-popup>
</div>
<div class="history-list">
<Crad v-if="healthList.length > 0" :list="healthList" />
<Empty :url="interveneEmpty" :imageSize="[250, 200]" v-else />
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { useRoute } from 'vue-router';
import Crad from '/@/views/health/components/Crad.vue';
import { healthHistoryApi } from './health';
import moment from 'moment';
import Empty from '/@/components/Empty.vue';
import interveneEmpty from '/@/assets/images/interveneEmpty.png';
const route = useRoute();
const timePicker = ref({
currentDate: [],
maxDate: new Date(),
columnsType: ['year', 'month'],
});
const show = ref(false);
const healthList = ref([]);
onMounted(() => {
const [yyyy, mm, dd] = moment(new Date()).format('YYYY-MM-DD').split('-');
timePicker.value.currentDate = [yyyy, mm];
getList();
});
function getList() {
healthHistoryApi({
templateNo: route.query.templateNo,
date: timePicker.value.currentDate.join('-'),
}).then((res: any) => {
healthList.value = res.data;
});
}
function handleTime() {
show.value = true;
}
function handleConfirm(value: any) {
let date = value.selectedValues;
timePicker.value.currentDate = date;
show.value = false;
getList();
}
function handleCancel() {
show.value = false;
}
</script>
<style scoped lang="less">
@import '../../assets/less/index';
.history-container {
background-color: @card-gray;
.history-title {
height: 40px;
background-color: @card-fff;
display: flex;
align-items: center;
justify-content: flex-end;
.time {
padding-right: 40px;
position: relative;
&:after {
content: '';
width: 0;
height: 0;
border-top: 7px solid #4c4c4c;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
position: absolute;
top: 8px;
left: 65px;
}
}
}
.history-list {
padding: 0 18px;
height: calc(100vh - 40px);
}
.no-data {
height: calc(100vh - 40px);
display: flex;
padding-top: 30%;
justify-content: center;
color: #999999;
}
}
</style>
+178
View File
@@ -0,0 +1,178 @@
<template>
<div class="health-subject">
<div class="health-item" v-for="(health, index) in healthList" :key="index">
<div class="health-status">
<div
v-if="health.assessLevel !== null"
class="status"
:class="typeStatus[health.assessLevel] ? typeStatus[health.assessLevel].class : ''"
>
{{ typeStatus[health.assessLevel] ? typeStatus[health.assessLevel].text : '' }}
</div>
<div class="time">{{ health.assessDate }}</div>
</div>
<div class="health-title">{{ health.templateName }}</div>
<div class="health-context">{{ health.assessDes }}</div>
<div class="health-btn">
<div class="btn history-btn" @click="handleOpen(0, health.templateNo, health.templateName + '记录')">历史测评</div>
<div class="btn start-testing" @click="handleOpen(1, health.templateNo, health.templateName)">开始测评</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { healthListApi } from './health';
import { newPageParams, openPage } from '/@/hooks/openPage';
import { useRoute } from 'vue-router';
const route = useRoute();
const typeStatus = {
'0': {
text: '正常',
class: 'normal-status',
},
'1': {
text: '低危',
class: 'low-status',
},
'2': {
text: '中危',
class: 'center-status',
},
'3': {
text: '中高危',
class: 'high-status',
},
'4': {
text: '高危',
class: 'high-status',
},
};
let healthList = ref([]);
onMounted(() => {
getList();
});
function getList() {
healthListApi({
module: route.query.type,
}).then((res: any) => {
healthList.value = res.data.templates;
});
}
function handleOpen(type: number, templateNo: number, templateName: string) {
let url = '';
let params = {
path: '',
query: { templateNo, templateName },
};
switch (type) {
case 0:
// 历史记录
if (templateNo === 500 || templateNo === 400) {
url = '/anxiety-history';
} else {
url = '/health-history';
}
break;
case 1:
// 测评
url = '/health-subject';
break;
}
params.path = url;
openPage(url, newPageParams(params.query));
}
</script>
<style scoped lang="less">
@import '../../assets/less/index';
.health-subject {
height: 100vh;
background-color: @card-gray;
padding: 0 20px;
overflow-y: auto;
.health-item {
margin: 15px 0;
padding: 10px 20px;
background-color: #ffffff;
border-radius: 12px;
.health-status {
display: flex;
justify-content: space-between;
.status {
position: relative;
top: -10px;
left: 0;
padding: 1px 6px;
border-radius: 0 0 5px 5px;
background-color: #999999;
color: #ffffff;
}
.normal-status {
background-color: #52c41a;
color: #ffffff;
}
.low-status {
background-color: #fadb14;
color: #333333;
}
.center-status {
background-color: #d48806;
}
.high-status {
background-color: #ed2a26;
}
.time {
color: #999999;
}
}
.health-title {
padding-top: 10px;
font-size: 16px;
font-weight: bold;
color: #333333;
}
.health-context {
color: rgba(51, 51, 51, 0.8);
}
.health-btn {
padding: 10px 0 5px 0;
display: flex;
justify-content: flex-end;
.btn {
width: 90px;
height: 30px;
text-align: center;
line-height: 30px;
border-radius: 15px;
margin: 0 5px;
}
.history-btn {
border: 1px solid #999999;
color: #333333;
}
.precise-btn {
border: 1px solid #999999;
color: #333333;
}
.start-testing {
background: #21bebd;
color: #ffffff;
}
}
}
}
</style>
+311
View File
@@ -0,0 +1,311 @@
<template>
<div class="vaccine">
<div
id="header-clew"
class="header-clew"
:class="templateNo === '500' ? 'depressed' : 'anxious'"
v-if="templateNo === '500' || templateNo === '400'"
>
{{ templateNo === '500' ? depressedTips : anxiousTips }}
</div>
<div class="vaccine-subject" :style="questionHeight">
<div class="subject-item" v-for="(subject, index) in subjectList" :key="index">
<template v-if="subject.showStatus">
<div class="subject-title">{{ index + 1 }}{{ subject.qsDes }}</div>
<div class="subject-options" v-if="subject.qsType === 1">
<van-radio-group
@change="(e) => handleRadio(e, index)"
v-model="subject.answer"
v-for="(option, optionIndex) in subject.answerList"
:key="optionIndex"
shape="dot"
>
<van-radio class="subject-radio" :name="option.answerDesc">
{{ option.answerDesc }}
</van-radio>
</van-radio-group>
</div>
<template v-if="subject.qsType === 4">
<div class="subject-input">
<van-field type="number" v-model="subject.answer" @blur="changeInpput(subject.answer, index)" />
</div>
</template>
</template>
</div>
</div>
<div class="vaccine-button">
<div class="button-text" @click="submit">提交</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { questionApi } from './health';
import { post } from '/@/views/mobile/api/api';
import subjectUrl from './subjectType';
import { showFailToast, showSuccessToast, showToast } from 'vant';
import { newPageParams } from '/@/hooks/openPage';
import { useLoading } from '/@/utils/compUtils';
const route = useRoute();
const router = useRouter();
const subjectList = ref([]);
const templateNo = ref<any>('');
const questionHeight = ref('');
const templateName = ref('');
const depressedTips =
'测评指导:请仔细阅读每一条目,然后根据最近两个星期以内你的实际感受,选择一个与你的情况最符合的答案。请不要有所顾忌,应该根据自己的真实体验和实际情况来回答,不要花费太多时间去思考,应顺其自然,根据第一印象做出判断';
const anxiousTips = '测评指导:根据过去的两周的状况,请您回答是否存在下列描述的状况及频率。';
const { loadingSpinner, loadingClose } = useLoading();
onMounted(() => {
getQuestion();
templateNo.value = route.query.templateNo;
setTimeout(() => {
if (templateNo.value === '400' || templateNo.value === '500') {
getTips();
} else {
questionHeight.value = 'height: calc(100vh - 60px)';
}
});
});
function changeInpput(value: string, index: number) {
if (Number(value) < 0) {
showToast('不能输入负数');
subjectList.value[index].answer = '';
}
}
function getTips() {
let element = document.getElementById('header-clew').getBoundingClientRect();
let allHeight = element.height + 60;
questionHeight.value = `height: calc(100vh - ${allHeight}px)`;
}
function getQuestion() {
questionApi({
templateNo: route.query.templateNo,
}).then((res: any) => {
subjectList.value = res.data.qsClassList[0].qsList;
templateName.value = res.data.templateName;
});
}
//传入答案选项对象判断是否有跳题
function _hasNext(ans: { nextQsNo: string }) {
return ans.nextQsNo !== '-1' && ans.nextQsNo !== '0';
}
// 跳题
function handleRadio(value: any, index: number) {
let queList: any[] = subjectList.value;
queList[index].answer = value;
let changeMap = new Map();
let options: any = subjectList.value[index];
// 根据选项重置radios选中内容
if (options.answerList.length > 0) {
options.answerList.map((ansItem: { answerDesc?: any; checked?: any; nextQsNo: any }) => {
if (ansItem.answerDesc === value) {
if (_hasNext(ansItem)) {
const nextQs = queList.find((qs) => qs.qsNo === ansItem.nextQsNo);
changeMap.set(nextQs, true);
}
} else {
if (_hasNext(ansItem)) {
const nextQs = queList.find((qs) => qs.qsNo === ansItem.nextQsNo);
if (changeMap.get(nextQs) !== true) {
changeMap.set(nextQs, false);
}
}
}
});
changeMap.forEach((status, qs) => {
_changeShowStatus(qs, status);
});
}
}
//传入问题对象,修改显示状态和跳题状态
function _changeShowStatus(qs: any, showStatus: boolean) {
if (!qs) {
return;
}
if (showStatus) {
qs.showStatus = true;
} else {
qs.answer = null;
qs.showStatus = false;
qs.answerList.forEach((ans: { checked?: any; nextQsNo: any }) => {
ans.checked = null;
if (_hasNext(ans)) {
_changeShowStatus(
subjectList.value.find((qsItem: any) => qsItem.qsNo === ans.nextQsNo),
false
);
}
});
}
}
// 提交
function submit() {
let status = true;
let queList: any[] = subjectList.value;
for (let i = 0; i < queList.length; i++) {
if (queList[i].answer === null && queList[i].showStatus) {
status = false;
break;
}
}
if (status) {
let listRes: { answer: any; qsNo: any }[] = [];
queList.map((item: any) => {
if (item.showStatus) {
listRes.push({
answer: item.answer,
qsNo: item.qsNo,
});
}
});
let params = {
templateNo: templateNo.value,
qsList: listRes,
};
let findItem = subjectUrl.submitSubject.find((e) => e.templateNo === templateNo.value);
if (findItem !== undefined) {
loadingSpinner();
post(findItem.url, params).then((res) => {
result(res);
});
}
} else {
showFailToast({
message: '请填写完再提交',
forbidClick: true,
});
}
}
function result(res: any) {
let url = '';
if (res.code === 200) {
loadingClose();
showSuccessToast('提交成功');
if (templateNo.value === '400' || templateNo.value === '500') {
url = '/anxiety-result';
} else {
url = '/disease-assessment-result';
}
// setTimeout 解决在iosAPP加载页面空白问题
setTimeout(() => {
router.replace({
path: url,
query: newPageParams({
resultId: res.data.resultId,
templateNo: templateNo.value,
templateName: route.query.templateName,
}),
});
}, 0);
} else {
loadingClose();
showFailToast({
message: res.msg,
forbidClick: true,
});
}
}
</script>
<style scoped lang="less">
@import '../../assets/less/index';
.vaccine {
height: 100vh;
background-color: @card-gray;
:deep(.van-radio__icon--checked .van-icon) {
background-color: #21bebe;
border: none;
}
.vaccine-title {
height: 40px;
display: flex;
align-items: self-end;
padding: 5px 0;
overflow-y: scroll;
background-color: @card-fff;
}
.header-clew {
padding: 20px;
}
/* 抑郁 */
.depressed {
background-color: rgba(243, 101, 16, 0.2);
color: #f36510;
}
/* 焦虑 */
.anxious {
background-color: rgba(31, 145, 242, 0.2);
color: #1f91f2;
}
.vaccine-subject {
padding: 20px;
//height: calc(100vh - 60px);
overflow-y: auto;
width: 100%;
background-color: @card-fff;
overflow-y: auto;
}
:deep(.van-cell) {
padding: 0;
}
:deep(.van-radio__icon--checked) {
border-color: #21bebe;
}
:deep(.van-radio__icon--checked.van-radio__icon--dot .van-radio__icon--dot__icon) {
background-color: #21bebe;
}
.subject-input {
border-bottom: 1px solid #e0e0e0;
padding: 0 0 5px 5px;
}
.subject-item {
margin: 10px 0;
.subject-title {
padding: 10px 0 10px 5px;
position: relative;
&:after {
content: '*';
position: absolute;
left: 0;
top: 5px;
color: #fd1805;
}
}
.subject-radio {
margin: 14px 0;
}
}
.vaccine-button {
background-color: @card-fff;
height: 60px;
display: flex;
align-items: center;
.button-text {
height: 40px;
flex: 1;
.flex-center();
margin: 0 10%;
.footerButton();
}
}
}
</style>
+161
View File
@@ -0,0 +1,161 @@
<template>
<div class="health-subject">
<div class="health-item" v-for="(health, index) in list" :key="index" @click="handleItem(health)">
<div class="health-status">
<div class="status" :class="helathClass(health.assessLevel)">{{ healthStatus(health.assessLevel) }} </div>
<div class="time">{{ health.assessDate }}</div>
</div>
<div class="health-title">{{ health.assessName }}</div>
<div class="health-context">{{ health.assessDes }}</div>
<div class="health-btn" v-if="buttonText">
<div
class="btn"
v-for="(item, index) in buttonText"
:key="index"
:class="item.class"
v-show="item.show"
@click="handleOpen(item.url)"
>{{ item.text }}</div
>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps } from 'vue';
import { useRouter } from 'vue-router';
const router = useRouter();
const props = defineProps(['list', 'buttonText']);
function handleOpen(url: string) {
router.push({ path: url });
}
function healthStatus(data: any) {
switch (data) {
case 0:
return '正常';
case 1:
return '低危';
case 2:
return '中危';
case 3:
return '中高危';
case 4:
return '高危';
}
}
function helathClass(data: any) {
switch (data) {
case 0:
return 'normal-status';
case 1:
return 'low-status';
case 2:
return 'center-status';
case 3:
return 'high-status';
case 4:
return 'high-status';
}
}
function handleItem(data: object) {
router.push({
path: '/disease-assessment-result',
query: {
templateNo: data.templateNo,
resultId: data.id,
templateName: data.assessName,
history: true,
},
});
}
</script>
<style scoped lang="less">
.health-subject {
height: calc(100vh - 150px);
.health-item {
margin: 15px 0;
padding: 10px 20px;
background-color: #ffffff;
border-radius: 12px;
.health-status {
display: flex;
justify-content: space-between;
.status {
position: relative;
top: -10px;
left: 0;
padding: 1px 6px;
border-radius: 0 0 5px 5px;
background-color: #999999;
color: #ffffff;
}
.normal-status {
background-color: #52C41A;
color: #ffffff;
}
.low-status {
background-color: #fadb14;
color: #333333;
}
.center-status {
background-color: #d48806;
}
.high-status {
background-color: #ed2a26;
}
.time {
color: #999999;
}
}
.health-title {
padding-top: 10px;
font-size: 16px;
font-weight: bold;
color: #333333;
}
.health-context {
color: rgba(51, 51, 51, 0.8);
}
.health-btn {
padding: 10px 0 5px 0;
display: flex;
justify-content: flex-end;
.btn {
width: 90px;
height: 30px;
text-align: center;
line-height: 30px;
border-radius: 15px;
margin: 0 5px;
}
.history-btn {
border: 1px solid #999999;
color: #333333;
}
.precise-btn {
border: 1px solid #999999;
color: #333333;
}
.start-testing {
background: #21bebd;
color: #ffffff;
}
}
}
}
</style>
@@ -0,0 +1,64 @@
<template>
<div class="health-nav">
<div
v-for="(item, index) in titleList"
:class="item[column.value] === checkTitle ? 'title-selected-item' : 'title-item'"
@click="handleChange(item[column.value])"
:key="index"
>{{ item[column.name] }}
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';
const emit = defineEmits(['change']);
const props = defineProps({
titleList: Array,
checkTitle: String,
column: Object,
});
function handleChange(templateNo: number) {
emit('change', templateNo);
}
</script>
<style scoped lang="less">
::-webkit-scrollbar-thumb {
background: #b8e909;
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
background: #ffffff;
}
.health-nav {
height: 40px;
display: flex;
align-items: self-end;
padding: 5px 0;
overflow-y: scroll;
background-color: #ffffff;
.title-selected-item {
padding: 0 20px;
position: relative;
color: #333333;
white-space:nowrap;
&:before {
content: '';
position: absolute;
left: 34%;
bottom: -5px;
width: 34%;
height: 3px;
background: linear-gradient(270deg, #21BEBE 0%, #26E0E0 100%);
border-radius: 2px;
}
}
.title-item {
white-space:nowrap;
padding: 0 20px;
position: relative;
color: #999999;
}
}
</style>
@@ -0,0 +1,80 @@
<template>
<div class="vaccine-subject">
<div class="subject-item" v-for="(subject, index) in subjectList" :key="index">
<template v-if="subject.qsVis">
<div class="subject-title">{{ index + 1 }}{{ subject.qsDes }}</div>
<div class="subject-options" v-if="subject.qsType === 1">
<van-radio-group
@change="(e) => handleRadio(e, index)"
v-model="subject.answer"
v-for="(option, optionIndex) in subject.answerList"
:key="optionIndex"
shape="dot"
>
<van-radio class="subject-radio" :name="option.answerNo">{{ option.answerDesc }}</van-radio>
</van-radio-group>
</div>
<template v-if="subject.qsType === 4">
<div class="subject-input">
<van-field v-model="subject.answer" />
</div>
</template>
</template>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, defineExpose, defineEmits } from 'vue';
const props = defineProps(['subjectList']);
const emit = defineEmits(['changeRadio']);
function handleRadio(val: any, index: number) {
props.subjectList[index].answer = val;
if(props.subjectList[index].qsNo === 'vaccine_get_HPV'){
emit('changeRadio',props.subjectList[index],val)
}
}
function changeSubject() {
return props.subjectList;
}
defineExpose({
changeSubject,
});
</script>
<style scoped lang="less">
.vaccine-subject {
height: 100%;
overflow-y: auto;
:deep(.van-cell) {
padding: 0;
}
:deep(.van-radio__icon--checked) {
border-color: #21bebe;
}
:deep(.van-radio__icon--checked.van-radio__icon--dot .van-radio__icon--dot__icon) {
background-color: #21bebe;
}
.subject-input {
border-bottom: 1px solid #e0e0e0;
padding: 0 0 5px 5px;
}
.subject-item {
margin: 10px 0;
.subject-title {
padding: 10px 0 10px 5px;
position: relative;
&:after {
content: '*';
position: absolute;
left: 0;
top: 5px;
color: #fd1805;
}
}
.subject-radio {
margin: 14px 0;
}
}
}
</style>
+47
View File
@@ -0,0 +1,47 @@
import { get } from '/@/views/mobile/api/api';
const prefix: string = import.meta.env.VITE_GLOB_APP_PREFIX || '';
// 评估列表
export const healthListApi = (params: any) => get(`${prefix}/rest/health-survey/assess/template/listNew`, params);
// 评估记录
export const healthHistoryApi = (params: any) => get(`${prefix}/rest/health-survey/assess/record`, params);
// 获取问卷
export const questionApi = (params: any) => get(`${prefix}/rest/health-survey/assess/questionnaire`, params);
/*
* @title 心理 —— 自诊自判
* @content 焦虑、抑郁
* @mode 采油9厂
* @templateNo 焦虑 500、 抑郁 400
* */
/*
* @title 膳食 —— 慢病预警
* @content 代谢综合征、高血压、糖尿病
* @mode 采油6、12模型
* @templateNo 采油6 代谢综合征 301、高血压 701、糖尿病 10
* @templateNo 采油12 代谢综合征 901、高血压 902、糖尿病 903
* */
/*
* @title 癌症 —— 行为引导
* @content 肺癌、肝癌、胃癌、肠癌
* @mode 采气 1模型
* @templateNo 肺癌 10005 、肝癌 10006、胃癌 10007、肠癌 10004
* */
/*
* @title 癌症 —— 信号预判
* @content 肝癌、胃癌
* @mode 采气9模型
* @templateNo 肝癌 810 、胃癌 800
* */
/*
* @title 糖尿病 —— 信号预警
* @content 糖尿病
* @mode 采油2糖尿病模型
* @templateNo 805
* */
+406
View File
@@ -0,0 +1,406 @@
const prefix: string = import.meta.env.VITE_GLOB_APP_PREFIX || '';
// 健康评估获取题与提交提的接口
const subjectUrl = {
getSubject: [
{
templateNo: '200',
url: prefix + '/rest/health-survey/assess/ashd/getResult',
method: 'get',
name: '动脉硬化',
},
{
templateNo: '100',
url: prefix + '/rest/health-survey/assess/coronary-heart-disease/getResult',
method: 'get',
name: '冠心病',
},
{
templateNo: '600',
url: prefix + '/rest/health-survey/assess/obese/getResult',
method: 'get',
name: '肥胖',
},
{
templateNo: '300',
url: prefix + '/rest/health-survey/assess/metabolic/getResult',
method: 'get',
name: '代谢综合症',
},
{
templateNo: '9',
url: prefix + '/rest/health-survey/assess/diabetes/basics-getResult',
method: 'get',
name: '糖尿病',
},
{
templateNo: '700',
url: prefix + '/rest/health-survey/assess/hypertension/getResult',
method: 'get',
name: '高血压',
},
{
templateNo: '4',
url: prefix + '/rest/health-survey/assess/lung-cancer/getResult',
method: 'get',
name: '肺癌',
},
{
templateNo: '5',
url: prefix + '/rest/health-survey/assess/liver-cancer/getResult',
method: 'get',
name: '肝癌',
},
{
templateNo: '7',
url: prefix + '/rest/health-survey/assess/colorectal-cancer/getResult',
method: 'get',
name: '直结肠癌',
},
{
templateNo: '6',
url: prefix + '/rest/health-survey/assess/gastric-cancer/getResult',
method: 'get',
name: '胃癌',
},
{
templateNo: '8',
url: prefix + '/rest/health-survey/assess/cervical-cancer/getResult',
method: 'get',
name: '宫颈癌',
},
{
templateNo: '11',
url: prefix + '/rest/health-survey/assess/stroke/getResult',
method: 'get',
name: '脑卒中',
},
{
templateNo: '400',
url: prefix + '/rest/health-survey/assess/depression/getResult',
method: 'get',
name: '抑郁',
},
{
templateNo: '500',
url: prefix + '/rest/health-survey/assess/anxiety/getResult',
method: 'get',
name: '焦虑',
},
{
templateNo: '101',
url: prefix + '/rest/health-survey/assess/coronary-heart-disease/two/getResult',
method: 'get',
name: '冠心病二次',
},
{
templateNo: '900',
url: prefix + '/rest/health-survey/assess/coronary-heart-disease/twelve/getResult',
method: 'get',
name: '冠心病十二厂',
},
{
templateNo: '301',
url: prefix + '/rest/health-survey/assess/metabolic/two/getResult',
method: 'get',
name: '代谢综合征二次',
},
{
templateNo: '901',
url: prefix + '/rest/health-survey/assess/metabolic/twelve/getResult',
method: 'get',
name: '代谢综合征十二厂',
},
{
templateNo: '903',
url: prefix + '/rest/health-survey/assess/diabetes/twelve/getResult',
method: 'get',
name: '糖尿病十二厂',
},
{
templateNo: '805',
url: prefix + '/rest/health-survey/assess/diabetes/two/getResult',
method: 'get',
name: '糖尿病二厂三多一少',
},
{
templateNo: '10',
url: prefix + '/rest/health-survey/assess/diabetes/twelve/getResult',
method: 'get',
name: '糖尿病二次评估',
},
{
templateNo: '801',
url: prefix + '/rest/health-survey/assess/blood-glucose/nine/getResult',
method: 'get',
name: '空腹血糖',
},
{
templateNo: '701',
url: prefix + '/rest/health-survey/assess/hypertension/getSecondaryResult',
method: 'get',
name: '高血压二次评估',
},
{
templateNo: '902',
url: prefix + '/rest/health-survey/assess/hypertension/twelve/getResult',
method: 'get',
name: '高血压十二厂',
},
{
templateNo: '10006',
url: prefix + '/rest/health-survey/assess/liver-cancer/one/getResult',
method: 'get',
name: '肝癌一厂',
},
{
templateNo: '802',
url: prefix + '/rest/health-survey/assess/liver-cancer/two/getResult',
method: 'get',
name: '肝癌二厂',
},
{
templateNo: '10004',
url: prefix + '/rest/health-survey/assess/colorectal-cancer/one/getResult',
method: 'get',
name: '直结肠癌一厂',
},
{
templateNo: '10007',
url: prefix + '/rest/health-survey/assess/gastric-cancer/one/getResult',
method: 'get',
name: '胃癌一厂',
},
{
templateNo: '804',
url: prefix + '/rest/health-survey/assess/gastric-cancer/two/getResult',
method: 'get',
name: '胃癌二厂',
},
{
templateNo: '800',
url: prefix + '/rest/health-survey/assess/gastric-cancer/nine/getResult',
method: 'get',
name: '胃癌九厂',
},
{
templateNo: '803',
url: prefix + '/rest/health-survey/assess/cervical-cancer/two/getResult',
method: 'get',
name: '宫颈癌二厂',
},
{
templateNo: '10005',
url: prefix + '/rest/health-survey/assess/lung-cancer/one/getResult',
method: 'get',
name: '肺癌一厂',
},
{
templateNo: '810',
url: prefix + '/rest/health-survey/assess/liver-cancer/nine/getResult',
method: 'get',
name: '肝癌九厂',
},
],
submitSubject: [
{
templateNo: '200',
url: prefix + '/rest/health-survey/assess/ashd/submit',
method: 'post',
name: '动脉硬化',
},
{
templateNo: '100',
url: prefix + '/rest/health-survey/assess/coronary-heart-disease/submit',
method: 'post',
name: '冠心病',
},
{
templateNo: '600',
url: prefix + '/rest/health-survey/assess/obese/submit',
method: 'post',
name: '肥胖',
},
{
templateNo: '300',
url: prefix + '/rest/health-survey/assess/metabolic/submit',
method: 'post',
name: '代谢综合症',
},
{
templateNo: '9',
url: prefix + '/rest/health-survey/assess/diabetes/basics-submit',
method: 'post',
name: '糖尿病',
},
{
templateNo: '700',
url: prefix + '/rest/health-survey/assess/hypertension/submit',
method: 'post',
name: '高血压',
},
{
templateNo: '4',
url: prefix + '/rest/health-survey/assess/lung-cancer/submit',
method: 'post',
name: '肺癌',
},
{
templateNo: '5',
url: prefix + '/rest/health-survey/assess/liver-cancer/submit',
method: 'post',
name: '肝癌',
},
{
templateNo: '7',
url: prefix + '/rest/health-survey/assess/colorectal-cancer/submit',
method: 'post',
name: '直结肠癌',
},
{
templateNo: '6',
url: prefix + '/rest/health-survey/assess/gastric-cancer/submit',
method: 'post',
name: '胃癌',
},
{
templateNo: '8',
url: prefix + '/rest/health-survey/assess/cervical-cancer/submit',
method: 'post',
name: '宫颈癌',
},
{
templateNo: '11',
url: prefix + '/rest/health-survey/assess/stroke/submit',
method: 'post',
name: '脑卒中',
},
{
templateNo: '400',
url: prefix + '/rest/health-survey/assess/depression/submit',
method: 'post',
name: '抑郁',
},
{
templateNo: '500',
url: prefix + '/rest/health-survey/assess/anxiety/submit',
method: 'post',
name: '焦虑',
},
{
templateNo: '101',
url: prefix + '/rest/health-survey/assess/coronary-heart-disease/two/submit',
method: 'post',
name: '冠心病二次',
},
{
templateNo: '900',
url: prefix + '/rest/health-survey/assess/coronary-heart-disease/twelve/submit',
method: 'post',
name: '冠心病十二厂',
},
{
templateNo: '301',
url: prefix + '/rest/health-survey/assess/metabolic/two/submit',
method: 'post',
name: '代谢综合征二次',
},
{
templateNo: '901',
url: prefix + '/rest/health-survey/assess/metabolic/twelve/submit',
method: 'post',
name: '代谢综合征十二厂',
},
{
templateNo: '903',
url: prefix + '/rest/health-survey/assess/diabetes/twelve/submit',
method: 'post',
name: '糖尿病十二厂',
},
{
templateNo: '805',
url: prefix + '/rest/health-survey/assess/diabetes/two/submit',
method: 'post',
name: '糖尿病二厂三多一少',
},
{
templateNo: '10',
url: prefix + '/rest/health-survey/assess/diabetes/accurate-submit',
method: 'post',
name: '糖尿病二次评估',
},
{
templateNo: '801',
url: prefix + '/rest/health-survey/assess/blood-glucose/nine/submit',
method: 'post',
name: '空腹血糖',
},
{
templateNo: '701',
url: prefix + '/rest/health-survey/assess/hypertension/secondarySubmit',
method: 'post',
name: '高血压二次评估',
},
{
templateNo: '902',
url: prefix + '/rest/health-survey/assess/hypertension/twelve/submit',
method: 'post',
name: '高血压十二厂',
},
{
templateNo: '10006',
url: prefix + '/rest/health-survey/assess/liver-cancer/one/submit',
method: 'post',
name: '肝癌一厂',
},
{
templateNo: '802',
url: prefix + '/rest/health-survey/assess/liver-cancer/two/submit',
method: 'post',
name: '肝癌二厂',
},
{
templateNo: '10004',
url: prefix + '/rest/health-survey/assess/colorectal-cancer/one/submit',
method: 'post',
name: '直结肠癌一厂',
},
{
templateNo: '10007',
url: prefix + '/rest/health-survey/assess/gastric-cancer/one/submit',
method: 'post',
name: '胃癌一厂',
},
{
templateNo: '804',
url: prefix + '/rest/health-survey/assess/gastric-cancer/two/submit',
method: 'post',
name: '胃癌二厂',
},
{
templateNo: '800',
url: prefix + '/rest/health-survey/assess/gastric-cancer/nine/submit',
method: 'post',
name: '胃癌九厂',
},
{
templateNo: '803',
url: prefix + '/rest/health-survey/assess/cervical-cancer/two/submit',
method: 'post',
name: '宫颈癌二厂',
},
{
templateNo: '10005',
url: prefix + '/rest/health-survey/assess/lung-cancer/one/submit',
method: 'post',
name: '肺癌一厂',
},
{
templateNo: '810',
url: prefix + '/rest/health-survey/assess/liver-cancer/nine/submit',
method: 'post',
name: '肝癌九厂',
},
],
};
export default subjectUrl;