feat: 新增大屏功能,bug修复。

This commit is contained in:
tianyongbao
2026-06-21 09:41:27 +08:00
parent c9ea1e402b
commit 8f38ff8185
29 changed files with 4055 additions and 84 deletions

View File

@@ -11,7 +11,7 @@
</u-form-item>
<u-form-item label="类型" prop="typeName" required @click="handleType">
<view class="input-with-arrow">
<u--input v-model="form.typeName" disabled disabledColor="#ffffff" placeholder="请选择类型"
<u--input v-model="form.typeName" readonly disabledColor="#ffffff" placeholder="请选择类型"
inputAlign="left" :customStyle="getInputStyle('typeName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -26,14 +26,14 @@
</u-form-item>
<u-form-item label="开始时间" prop="startTime" required @click="selectStartTime()">
<view class="input-with-arrow">
<u--input v-model="form.startTime" disabled disabledColor="#ffffff" placeholder="请选择开始时间"
<u--input v-model="form.startTime" readonly disabledColor="#ffffff" placeholder="请选择开始时间"
inputAlign="left" :customStyle="getInputStyle('startTime')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="结束时间" prop="endTime" @click="selectEndTime()">
<view class="input-with-arrow">
<u--input v-model="form.endTime" disabled disabledColor="#ffffff" placeholder="请选择结束时间"
<u--input v-model="form.endTime" readonly disabledColor="#ffffff" placeholder="请选择结束时间"
inputAlign="left" :customStyle="getInputStyle('endTime')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -44,7 +44,7 @@
</u-form-item> -->
<u-form-item label="活动量" prop="activityVolumeName" required @click="handleActivityVolume">
<view class="input-with-arrow">
<u--input v-model="form.activityVolumeName" disabled disabledColor="#ffffff" placeholder="请选择活动量"
<u--input v-model="form.activityVolumeName" readonly disabledColor="#ffffff" placeholder="请选择活动量"
inputAlign="left" :customStyle="getInputStyle('activityVolumeName')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -7,7 +7,7 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="成员" prop="personId" required @click="showPerson = true">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择成员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择成员"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -22,14 +22,14 @@
</u-form-item>
<u-form-item label="确诊日期" prop="diagnosisDate" @click="showDatePicker = true">
<view class="input-with-arrow">
<u--input v-model="form.diagnosisDate" disabled disabledColor="#ffffff" placeholder="请选择确诊日期"
<u--input v-model="form.diagnosisDate" readonly disabledColor="#ffffff" placeholder="请选择确诊日期"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="疾病状态" prop="diseaseStatus" required @click="showStatus = true">
<view class="input-with-arrow">
<u--input v-model="form.diseaseStatusName" disabled disabledColor="#ffffff" placeholder="请选择状态"
<u--input v-model="form.diseaseStatusName" readonly disabledColor="#ffffff" placeholder="请选择状态"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -0,0 +1,886 @@
<template>
<view class="container">
<view class="detail-hero">
<view>
<view class="hero-title">{{ detail.diseaseName || '慢性疾病' }}</view>
<view class="hero-subtitle">{{ detail.personName || '--' }} · {{ formatDate(detail.diagnosisDate) }}</view>
</view>
<view class="status-tag" :class="'status-' + detail.diseaseStatus">{{ getDiseaseStatusLabel(detail.diseaseStatus) }}</view>
</view>
<view class="section">
<view class="section-title">诊断信息</view>
<view class="info-grid">
<view class="info-item">
<text class="info-label">疾病编码</text>
<text class="info-value">{{ detail.diseaseCode || '--' }}</text>
</view>
<view class="info-item">
<text class="info-label">启用状态</text>
<text class="info-value">{{ detail.isActive === 1 ? '已启用' : '已停用' }}</text>
</view>
<view class="info-item">
<text class="info-label">主治医生</text>
<text class="info-value">{{ detail.mainDoctor || '--' }}</text>
</view>
<view class="info-item">
<text class="info-label">就诊医院</text>
<text class="info-value">{{ detail.hospital || '--' }}</text>
</view>
<view class="info-item">
<text class="info-label">科室</text>
<text class="info-value">{{ detail.department || '--' }}</text>
</view>
</view>
<view class="long-field">
<text class="info-label">诊断结果</text>
<text class="long-value">{{ detail.notes || '--' }}</text>
</view>
<view class="long-field">
<text class="info-label">备注</text>
<text class="long-value">{{ detail.remark || '--' }}</text>
</view>
</view>
<view class="section">
<view class="section-title section-title-row">
<text>关联用药计划</text>
<view class="mini-action" @click="createMedicationPlan">
<uni-icons type="plusempty" size="14" color="#667eea"></uni-icons>
<text>创建</text>
</view>
</view>
<view v-if="planList.length === 0" class="empty-box">暂无关联用药计划</view>
<view v-for="item in planList" :key="item.id" class="plan-card">
<view class="plan-header">
<text class="plan-name">{{ item.planName || item.medicineName || '用药计划' }}</text>
<text class="plan-status">{{ getPlanStatusLabel(item.status) }}</text>
</view>
<view class="plan-row">
<text>药品</text>
<text>{{ item.medicineName || '--' }}</text>
</view>
<view class="plan-row">
<text>剂量</text>
<text>{{ item.dosagePerTime || '--' }} {{ item.dosageUnit || '' }}</text>
</view>
<view class="plan-row">
<text>周期</text>
<text>{{ formatDate(item.startDate) }} {{ item.endDate ? formatDate(item.endDate) : '长期' }}</text>
</view>
<view class="plan-row" v-if="item.timeSlots">
<text>时间</text>
<text>{{ parseTimeSlots(item.timeSlots).join('、') || '--' }}</text>
</view>
</view>
</view>
<view class="section">
<view class="section-title section-title-row">
<text>指标监测</text>
<view class="mini-action" @click="openIndicatorForm()">
<uni-icons type="plusempty" size="14" color="#667eea"></uni-icons>
<text>新增</text>
</view>
</view>
<view v-if="indicatorList.length === 0" class="empty-box">暂无指标监测记录</view>
<view v-for="item in indicatorList" :key="item.id" class="record-card">
<view class="record-header">
<view>
<text class="record-name">{{ item.indicatorName || '--' }}</text>
<text class="record-time">{{ formatDateTime(item.measureTime) }}</text>
</view>
<text class="record-status" :class="'indicator-status-' + item.status">{{ getIndicatorStatusLabel(item.status) }}</text>
</view>
<view class="metric-value">{{ item.indicatorValue ?? '--' }} <text>{{ item.indicatorUnit || '' }}</text></view>
<view class="plan-row">
<text>目标范围</text>
<text>{{ item.targetMin ?? '--' }} - {{ item.targetMax ?? '--' }}</text>
</view>
<view class="record-note" v-if="item.notes">{{ item.notes }}</view>
<view class="card-actions">
<text @click="openIndicatorForm(item)">编辑</text>
<text class="danger" @click="removeIndicator(item)">删除</text>
</view>
</view>
</view>
<view class="section">
<view class="section-title section-title-row">
<text>复诊随访</text>
<view class="mini-action" @click="openFollowUpForm()">
<uni-icons type="plusempty" size="14" color="#667eea"></uni-icons>
<text>新增</text>
</view>
</view>
<view v-if="followUpList.length === 0" class="empty-box">暂无复诊随访记录</view>
<view v-for="item in followUpList" :key="item.id" class="record-card">
<view class="record-header">
<view>
<text class="record-name">{{ getFollowUpTypeLabel(item.followUpType) }}</text>
<text class="record-time">{{ formatDate(item.followUpDate) }}</text>
</view>
<text class="record-status" :class="'follow-status-' + item.status">{{ getFollowUpStatusLabel(item.status) }}</text>
</view>
<view class="plan-row">
<text>医院科室</text>
<text>{{ item.hospital || '--' }} / {{ item.department || '--' }}</text>
</view>
<view class="plan-row">
<text>医生</text>
<text>{{ item.doctor || '--' }}</text>
</view>
<view class="plan-row">
<text>下次日期</text>
<text>{{ formatDate(item.nextFollowUpDate) }}</text>
</view>
<view class="record-note" v-if="item.checkItems">项目{{ item.checkItems }}</view>
<view class="record-note" v-if="item.result">结果{{ item.result }}</view>
<view class="record-note" v-if="item.notes">{{ item.notes }}</view>
<view class="card-actions">
<text @click="openFollowUpForm(item)">编辑</text>
<text class="danger" @click="removeFollowUp(item)">删除</text>
</view>
</view>
</view>
<view class="section">
<view class="section-title">状态历史</view>
<view v-if="statusHistoryList.length === 0" class="empty-box">暂无状态变更历史</view>
<view v-for="item in statusHistoryList" :key="item.id" class="history-card">
<view class="history-title">
<text>{{ getDiseaseStatusLabel(item.oldStatus) }}</text>
<text>调整为</text>
<text>{{ getDiseaseStatusLabel(item.newStatus) }}</text>
</view>
<view class="history-time">{{ formatDateTime(item.changeTime) }}</view>
<view class="record-note">{{ item.reason || '档案状态调整' }}</view>
<view class="record-note" v-if="item.treatmentAdvice">建议{{ item.treatmentAdvice }}</view>
</view>
</view>
<u-popup :show="indicatorPopupShow" mode="bottom" round="20" @close="indicatorPopupShow = false">
<view class="popup-panel">
<view class="popup-title">{{ indicatorForm.id ? '编辑指标监测' : '新增指标监测' }}</view>
<u--form labelPosition="left" :model="indicatorForm" ref="indicatorFormRef" label-width="160rpx">
<u-form-item label="指标类型" @click="showIndicatorType = true">
<view class="input-with-arrow">
<u--input v-model="indicatorForm.indicatorName" readonly disabledColor="#ffffff" placeholder="请选择指标类型" :customStyle="inputStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="指标名称">
<u--input v-model="indicatorForm.indicatorName" placeholder="请输入指标名称" :customStyle="inputStyle"></u--input>
</u-form-item>
<u-form-item label="测量时间" @click="openDatePicker('indicatorTime')">
<view class="input-with-arrow">
<u--input v-model="indicatorForm.measureTime" readonly disabledColor="#ffffff" placeholder="请选择测量时间" :customStyle="inputStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="指标值">
<view class="inline-inputs">
<u--input v-model="indicatorForm.indicatorValue" type="digit" placeholder="数值" :customStyle="inputStyle"></u--input>
<u--input v-model="indicatorForm.indicatorUnit" placeholder="单位" :customStyle="inputStyle"></u--input>
</view>
</u-form-item>
<u-form-item label="目标范围">
<view class="inline-inputs">
<u--input v-model="indicatorForm.targetMin" type="digit" placeholder="下限" :customStyle="inputStyle"></u--input>
<u--input v-model="indicatorForm.targetMax" type="digit" placeholder="上限" :customStyle="inputStyle"></u--input>
</view>
</u-form-item>
<u-form-item label="状态" @click="showIndicatorStatus = true">
<view class="input-with-arrow">
<u--input :modelValue="getIndicatorStatusLabel(indicatorForm.status)" readonly disabledColor="#ffffff" placeholder="请选择状态" :customStyle="inputStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="说明">
<u--textarea v-model="indicatorForm.notes" placeholder="请输入说明"></u--textarea>
</u-form-item>
</u--form>
<view class="popup-actions">
<u-button text="取消" @click="indicatorPopupShow = false"></u-button>
<u-button type="primary" text="保存" @click="submitIndicator"></u-button>
</view>
</view>
</u-popup>
<u-popup :show="followUpPopupShow" mode="bottom" round="20" @close="followUpPopupShow = false">
<view class="popup-panel">
<view class="popup-title">{{ followUpForm.id ? '编辑复诊随访' : '新增复诊随访' }}</view>
<u--form labelPosition="left" :model="followUpForm" ref="followUpFormRef" label-width="160rpx">
<u-form-item label="类型" @click="showFollowType = true">
<view class="input-with-arrow">
<u--input :modelValue="getFollowUpTypeLabel(followUpForm.followUpType)" readonly disabledColor="#ffffff" placeholder="请选择类型" :customStyle="inputStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="日期" @click="openDatePicker('followUpDate')">
<view class="input-with-arrow">
<u--input v-model="followUpForm.followUpDate" readonly disabledColor="#ffffff" placeholder="请选择日期" :customStyle="inputStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="医院">
<u--input v-model="followUpForm.hospital" placeholder="请输入医院" :customStyle="inputStyle"></u--input>
</u-form-item>
<u-form-item label="科室/医生">
<view class="inline-inputs">
<u--input v-model="followUpForm.department" placeholder="科室" :customStyle="inputStyle"></u--input>
<u--input v-model="followUpForm.doctor" placeholder="医生" :customStyle="inputStyle"></u--input>
</view>
</u-form-item>
<u-form-item label="复查项目">
<u--textarea v-model="followUpForm.checkItems" placeholder="请输入复查项目"></u--textarea>
</u-form-item>
<u-form-item label="结果">
<u--textarea v-model="followUpForm.result" placeholder="请输入结果"></u--textarea>
</u-form-item>
<u-form-item label="下次日期" @click="openDatePicker('nextFollowUpDate')">
<view class="input-with-arrow">
<u--input v-model="followUpForm.nextFollowUpDate" readonly disabledColor="#ffffff" placeholder="请选择下次日期" :customStyle="inputStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="状态" @click="showFollowStatus = true">
<view class="input-with-arrow">
<u--input :modelValue="getFollowUpStatusLabel(followUpForm.status)" readonly disabledColor="#ffffff" placeholder="请选择状态" :customStyle="inputStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="说明">
<u--textarea v-model="followUpForm.notes" placeholder="请输入说明"></u--textarea>
</u-form-item>
</u--form>
<view class="popup-actions">
<u-button text="取消" @click="followUpPopupShow = false"></u-button>
<u-button type="primary" text="保存" @click="submitFollowUp"></u-button>
</view>
</view>
</u-popup>
<u-picker itemHeight="88" :show="showIndicatorType" :columns="indicatorTypeColumns" keyName="label" @confirm="indicatorTypeConfirm" @cancel="showIndicatorType = false"></u-picker>
<u-picker itemHeight="88" :show="showIndicatorStatus" :columns="indicatorStatusColumns" keyName="label" @confirm="indicatorStatusConfirm" @cancel="showIndicatorStatus = false"></u-picker>
<u-picker itemHeight="88" :show="showFollowType" :columns="followTypeColumns" keyName="label" @confirm="followTypeConfirm" @cancel="showFollowType = false"></u-picker>
<u-picker itemHeight="88" :show="showFollowStatus" :columns="followStatusColumns" keyName="label" @confirm="followStatusConfirm" @cancel="showFollowStatus = false"></u-picker>
<u-datetime-picker :show="showDatePicker" v-model="datePickerValue" :mode="datePickerMode" @confirm="datePickerConfirm" @cancel="showDatePicker = false" @close="showDatePicker = false"></u-datetime-picker>
</view>
</template>
<script setup>
import { getChronicDisease } from '@/api/health/chronicDisease'
import { listMedicationPlan } from '@/api/health/medicationPlan'
import { listIndicator, addIndicator, updateIndicator, delIndicator, listFollowUp, addFollowUp, updateFollowUp, delFollowUp, listStatusHistory } from '@/api/health/chronicDiseaseManage'
import { onLoad } from '@dcloudio/uni-app'
import dayjs from 'dayjs'
import { computed, ref } from 'vue'
const detail = ref({})
const planList = ref([])
const indicatorList = ref([])
const followUpList = ref([])
const statusHistoryList = ref([])
const indicatorPopupShow = ref(false)
const followUpPopupShow = ref(false)
const showIndicatorType = ref(false)
const showIndicatorStatus = ref(false)
const showFollowType = ref(false)
const showFollowStatus = ref(false)
const showDatePicker = ref(false)
const datePickerTarget = ref('')
const datePickerValue = ref(Number(new Date()))
const indicatorForm = ref({})
const followUpForm = ref({})
const inputStyle = {
background: '#ffffff',
border: '2rpx solid #dcdfe6',
borderRadius: '8rpx',
padding: '0 20rpx',
height: '68rpx',
boxSizing: 'border-box'
}
const indicatorTypes = [
{ value: 'blood_pressure_systolic', label: '收缩压', unit: 'mmHg' },
{ value: 'blood_pressure_diastolic', label: '舒张压', unit: 'mmHg' },
{ value: 'heart_rate', label: '心率', unit: '次/分' },
{ value: 'fasting_glucose', label: '空腹血糖', unit: 'mmol/L' },
{ value: 'postprandial_glucose', label: '餐后血糖', unit: 'mmol/L' },
{ value: 'weight', label: '体重', unit: 'kg' },
{ value: 'uric_acid', label: '尿酸', unit: 'umol/L' },
{ value: 'custom', label: '自定义', unit: '' }
]
const indicatorStatuses = [
{ value: 1, label: '正常' },
{ value: 2, label: '偏高' },
{ value: 3, label: '偏低' },
{ value: 4, label: '需关注' }
]
const followTypes = [
{ value: 1, label: '复诊' },
{ value: 2, label: '复查' },
{ value: 3, label: '随访' }
]
const followStatuses = [
{ value: 1, label: '待完成' },
{ value: 2, label: '已完成' },
{ value: 3, label: '已过期' }
]
const indicatorTypeColumns = ref([indicatorTypes])
const indicatorStatusColumns = ref([indicatorStatuses])
const followTypeColumns = ref([followTypes])
const followStatusColumns = ref([followStatuses])
const datePickerMode = computed(() => datePickerTarget.value === 'indicatorTime' ? 'datetime' : 'date')
onLoad((option) => {
if (!option.id) {
uni.showToast({ title: '缺少慢病档案', icon: 'none' })
return
}
loadDetail(option.id)
})
function loadDetail(id) {
uni.showLoading({ title: '加载中' })
Promise.all([
getChronicDisease(id),
listMedicationPlan({ pageNum: 1, pageSize: 1000, chronicDiseaseId: id }),
listIndicator({ pageNum: 1, pageSize: 1000, chronicDiseaseId: id }),
listFollowUp({ pageNum: 1, pageSize: 1000, chronicDiseaseId: id }),
listStatusHistory({ pageNum: 1, pageSize: 1000, chronicDiseaseId: id })
]).then(([detailRes, planRes, indicatorRes, followUpRes, historyRes]) => {
detail.value = detailRes.data || {}
planList.value = planRes.rows || []
indicatorList.value = indicatorRes.rows || []
followUpList.value = followUpRes.rows || []
statusHistoryList.value = historyRes.rows || []
}).finally(() => {
uni.hideLoading()
})
}
function reloadManageData() {
if (!detail.value.id) return
Promise.all([
listIndicator({ pageNum: 1, pageSize: 1000, chronicDiseaseId: detail.value.id }),
listFollowUp({ pageNum: 1, pageSize: 1000, chronicDiseaseId: detail.value.id }),
listStatusHistory({ pageNum: 1, pageSize: 1000, chronicDiseaseId: detail.value.id })
]).then(([indicatorRes, followUpRes, historyRes]) => {
indicatorList.value = indicatorRes.rows || []
followUpList.value = followUpRes.rows || []
statusHistoryList.value = historyRes.rows || []
})
}
function getDiseaseStatusLabel(s) {
const map = { 1: '稳定', 2: '需关注', 3: '急性期' }
return map[s] || '未知'
}
function getPlanStatusLabel(s) {
const map = { 1: '进行中', 2: '已暂停', 3: '已结束' }
return map[s] || '未知'
}
function getIndicatorStatusLabel(s) {
const item = indicatorStatuses.find(status => status.value === Number(s))
return item ? item.label : '未知'
}
function getFollowUpTypeLabel(s) {
const item = followTypes.find(type => type.value === Number(s))
return item ? item.label : '未知'
}
function getFollowUpStatusLabel(s) {
const item = followStatuses.find(status => status.value === Number(s))
return item ? item.label : '未知'
}
function formatDate(date) {
if (!date) return '--'
if (Array.isArray(date)) return `${date[0]}-${String(date[1]).padStart(2, '0')}-${String(date[2]).padStart(2, '0')}`
if (typeof date === 'string') return date.substring(0, 10)
return '--'
}
function formatDateTime(datetime) {
if (!datetime) return '--'
if (typeof datetime === 'string') return datetime.replace('T', ' ').substring(0, 16)
return '--'
}
function nowDateTime() {
return dayjs().format('YYYY-MM-DD HH:mm:ss')
}
function nowDate() {
return dayjs().format('YYYY-MM-DD')
}
function parseTimeSlots(timeSlots) {
if (!timeSlots) return []
try {
return typeof timeSlots === 'string' ? JSON.parse(timeSlots) : timeSlots
} catch (e) {
return []
}
}
function createMedicationPlan() {
if (!detail.value.id || !detail.value.personId) {
uni.showToast({ title: '档案信息不完整', icon: 'none' })
return
}
uni.navigateTo({
url: `/pages/health/medicationPlan/addEdit?personId=${detail.value.personId}&chronicDiseaseId=${detail.value.id}&diseaseName=${encodeURIComponent(detail.value.diseaseName || '')}`
})
}
function openDatePicker(target) {
datePickerTarget.value = target
if (target === 'indicatorTime' && indicatorForm.value.measureTime) {
datePickerValue.value = new Date(indicatorForm.value.measureTime.replace(/-/g, '/')).getTime()
} else if (target === 'followUpDate' && followUpForm.value.followUpDate) {
datePickerValue.value = new Date(followUpForm.value.followUpDate.replace(/-/g, '/')).getTime()
} else if (target === 'nextFollowUpDate' && followUpForm.value.nextFollowUpDate) {
datePickerValue.value = new Date(followUpForm.value.nextFollowUpDate.replace(/-/g, '/')).getTime()
} else {
datePickerValue.value = Number(new Date())
}
showDatePicker.value = true
}
function datePickerConfirm(e) {
if (datePickerTarget.value === 'indicatorTime') {
indicatorForm.value.measureTime = dayjs(e.value).format('YYYY-MM-DD HH:mm:ss')
} else if (datePickerTarget.value === 'followUpDate') {
followUpForm.value.followUpDate = dayjs(e.value).format('YYYY-MM-DD')
} else if (datePickerTarget.value === 'nextFollowUpDate') {
followUpForm.value.nextFollowUpDate = dayjs(e.value).format('YYYY-MM-DD')
}
showDatePicker.value = false
}
function openIndicatorForm(row) {
if (row && row.id) {
indicatorForm.value = { ...row }
} else {
indicatorForm.value = {
id: null,
chronicDiseaseId: detail.value.id,
personId: detail.value.personId,
indicatorType: 'blood_pressure_systolic',
indicatorName: '收缩压',
measureTime: nowDateTime(),
indicatorValue: null,
indicatorUnit: 'mmHg',
targetMin: null,
targetMax: null,
status: 1,
notes: null
}
}
indicatorPopupShow.value = true
}
function indicatorTypeConfirm(e) {
const item = e.value[0]
indicatorForm.value.indicatorType = item.value
if (item.value !== 'custom') {
indicatorForm.value.indicatorName = item.label
indicatorForm.value.indicatorUnit = item.unit
}
showIndicatorType.value = false
}
function indicatorStatusConfirm(e) {
indicatorForm.value.status = e.value[0].value
showIndicatorStatus.value = false
}
function submitIndicator() {
if (!indicatorForm.value.indicatorName || indicatorForm.value.indicatorValue === null || indicatorForm.value.indicatorValue === '') {
uni.showToast({ title: '请填写指标名称和数值', icon: 'none' })
return
}
const submitData = { ...indicatorForm.value }
;['indicatorValue', 'targetMin', 'targetMax'].forEach(key => {
if (submitData[key] !== null && submitData[key] !== '') {
submitData[key] = Number(submitData[key])
} else {
submitData[key] = null
}
})
const request = submitData.id ? updateIndicator : addIndicator
request(submitData).then(() => {
uni.showToast({ title: '保存成功', icon: 'success' })
indicatorPopupShow.value = false
reloadManageData()
})
}
function removeIndicator(row) {
uni.showModal({
title: '删除指标',
content: '确认删除该指标记录吗?',
success: (res) => {
if (!res.confirm) return
delIndicator(row.id).then(() => {
uni.showToast({ title: '删除成功', icon: 'success' })
reloadManageData()
})
}
})
}
function openFollowUpForm(row) {
if (row && row.id) {
followUpForm.value = { ...row, followUpDate: formatDate(row.followUpDate), nextFollowUpDate: row.nextFollowUpDate ? formatDate(row.nextFollowUpDate) : null }
} else {
followUpForm.value = {
id: null,
chronicDiseaseId: detail.value.id,
personId: detail.value.personId,
followUpType: 1,
followUpDate: nowDate(),
hospital: detail.value.hospital || null,
department: detail.value.department || null,
doctor: detail.value.mainDoctor || null,
checkItems: null,
result: null,
nextFollowUpDate: null,
status: 1,
notes: null
}
}
followUpPopupShow.value = true
}
function followTypeConfirm(e) {
followUpForm.value.followUpType = e.value[0].value
showFollowType.value = false
}
function followStatusConfirm(e) {
followUpForm.value.status = e.value[0].value
showFollowStatus.value = false
}
function submitFollowUp() {
if (!followUpForm.value.followUpDate) {
uni.showToast({ title: '请选择日期', icon: 'none' })
return
}
const request = followUpForm.value.id ? updateFollowUp : addFollowUp
request(followUpForm.value).then(() => {
uni.showToast({ title: '保存成功', icon: 'success' })
followUpPopupShow.value = false
reloadManageData()
})
}
function removeFollowUp(row) {
uni.showModal({
title: '删除随访',
content: '确认删除该复诊随访记录吗?',
success: (res) => {
if (!res.confirm) return
delFollowUp(row.id).then(() => {
uni.showToast({ title: '删除成功', icon: 'success' })
reloadManageData()
})
}
})
}
</script>
<style lang="scss" scoped>
@import '@/styles/health-common.scss';
.detail-hero {
margin: 24rpx;
padding: 28rpx;
border-radius: 16rpx;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #fff;
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
}
.hero-title {
font-size: 36rpx;
font-weight: 600;
}
.hero-subtitle {
margin-top: 10rpx;
font-size: 26rpx;
opacity: 0.9;
}
.section {
margin: 24rpx;
background: #fff;
border-radius: 16rpx;
overflow: hidden;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
}
.section-title {
padding: 18rpx 24rpx;
font-size: 30rpx;
font-weight: 600;
color: #333;
border-bottom: 1rpx solid #f0f0f0;
}
.section-title-row {
display: flex;
align-items: center;
justify-content: space-between;
}
.mini-action {
display: flex;
align-items: center;
gap: 6rpx;
color: #667eea;
font-size: 26rpx;
}
.info-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20rpx;
padding: 24rpx;
}
.info-item,
.long-field {
display: flex;
flex-direction: column;
gap: 8rpx;
}
.long-field {
padding: 0 24rpx 24rpx;
}
.info-label {
font-size: 24rpx;
color: #909399;
}
.info-value,
.long-value {
font-size: 28rpx;
color: #333;
line-height: 1.5;
word-break: break-word;
}
.empty-box {
padding: 40rpx 24rpx;
text-align: center;
color: #909399;
font-size: 28rpx;
}
.plan-card {
margin: 24rpx;
padding: 22rpx;
border: 1rpx solid #edf0f7;
border-radius: 12rpx;
}
.plan-header,
.plan-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
}
.plan-header {
margin-bottom: 16rpx;
}
.plan-name {
font-size: 30rpx;
font-weight: 600;
color: #333;
}
.plan-status {
font-size: 24rpx;
color: #667eea;
}
.plan-row {
padding: 8rpx 0;
font-size: 26rpx;
color: #606266;
}
.record-card,
.history-card {
margin: 24rpx;
padding: 22rpx;
border: 1rpx solid #edf0f7;
border-radius: 12rpx;
background: #fff;
}
.record-header {
display: flex;
justify-content: space-between;
gap: 20rpx;
margin-bottom: 16rpx;
}
.record-name {
display: block;
font-size: 30rpx;
font-weight: 600;
color: #333;
line-height: 1.4;
}
.record-time {
display: block;
margin-top: 4rpx;
font-size: 24rpx;
color: #909399;
}
.record-status {
flex-shrink: 0;
height: 42rpx;
line-height: 42rpx;
padding: 0 16rpx;
border-radius: 21rpx;
font-size: 24rpx;
color: #667eea;
background: rgba(102, 126, 234, 0.1);
}
.indicator-status-2,
.follow-status-1 {
color: #e6a23c;
background: rgba(230, 162, 60, 0.12);
}
.indicator-status-4,
.follow-status-3 {
color: #f56c6c;
background: rgba(245, 108, 108, 0.12);
}
.indicator-status-1,
.follow-status-2 {
color: #67c23a;
background: rgba(103, 194, 58, 0.12);
}
.metric-value {
margin-bottom: 12rpx;
font-size: 42rpx;
font-weight: 700;
color: #303133;
}
.metric-value text {
margin-left: 8rpx;
font-size: 24rpx;
font-weight: 400;
color: #909399;
}
.record-note {
margin-top: 10rpx;
font-size: 26rpx;
color: #606266;
line-height: 1.5;
word-break: break-word;
}
.card-actions {
display: flex;
justify-content: flex-end;
gap: 28rpx;
margin-top: 18rpx;
font-size: 26rpx;
color: #667eea;
}
.card-actions .danger {
color: #f56c6c;
}
.history-title {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 12rpx;
font-size: 28rpx;
color: #333;
font-weight: 600;
}
.history-time {
margin-top: 8rpx;
font-size: 24rpx;
color: #909399;
}
.popup-panel {
max-height: 86vh;
padding: 24rpx;
background: #fff;
overflow-y: auto;
}
.popup-title {
padding: 8rpx 0 24rpx;
font-size: 32rpx;
font-weight: 600;
color: #333;
text-align: center;
}
.input-with-arrow {
position: relative;
width: 100%;
}
.arrow-icon {
position: absolute;
right: 18rpx;
top: 50%;
transform: translateY(-50%);
color: #c0c4cc;
font-size: 20rpx;
pointer-events: none;
}
.inline-inputs {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12rpx;
width: 100%;
}
.popup-actions {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20rpx;
padding-top: 24rpx;
}
</style>

View File

@@ -52,7 +52,7 @@
</u-sticky>
<u-list @scrolltolower="loadmore" :spaceHeight="116" lowerThreshold="100">
<u-list-item v-for="(item, index) in listData" :key="index">
<view class="list-item">
<view class="list-item" @click="enterDetails(item)">
<view class="item-header">
<view class="card-name-section">
<view class="card-icon">
@@ -228,6 +228,11 @@ function handleEdit(item) {
isShow.value = true
}
function enterDetails(item) {
uni.navigateTo({ url: `/pages/health/chronicDisease/details?id=${item.id}` })
isShow.value = true
}
function handleDelete(item) {
uni.showModal({
title: '确认删除',

View File

@@ -7,14 +7,14 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="人员姓名" prop="personName" required @click="handlePerson">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="getInputStyle('personName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="健康档案" prop="healthRecordName" required @click="handHealthRecord">
<view class="input-with-arrow">
<u--input v-model="form.healthRecordName" disabled disabledColor="#ffffff" placeholder="请选择健康档案"
<u--input v-model="form.healthRecordName" readonly disabledColor="#ffffff" placeholder="请选择健康档案"
inputAlign="left" :customStyle="getInputStyle('healthRecordName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -25,7 +25,7 @@
</u-form-item>
<u-form-item label="就医类型" prop="typeName" required @click="handleType">
<view class="input-with-arrow">
<u--input v-model="form.typeName" disabled disabledColor="#ffffff" placeholder="请选择就医类型"
<u--input v-model="form.typeName" readonly disabledColor="#ffffff" placeholder="请选择就医类型"
inputAlign="left" :customStyle="getInputStyle('typeName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -40,7 +40,7 @@
</u-form-item>
<u-form-item label="就诊时间" prop="visitingTime" required @click="selectDate">
<view class="input-with-arrow">
<u--input v-model="form.visitingTime" disabled disabledColor="#ffffff" placeholder="请选择就诊时间" inputAlign="left" :customStyle="getInputStyle('visitingTime')"></u--input>
<u--input v-model="form.visitingTime" readonly disabledColor="#ffffff" placeholder="请选择就诊时间" inputAlign="left" :customStyle="getInputStyle('visitingTime')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>

View File

@@ -7,42 +7,42 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="费用类型" prop="typeName" required @click="handleType">
<view class="input-with-arrow">
<u--input v-model="form.typeName" disabled disabledColor="#ffffff" placeholder="请选择费用类型"
<u--input v-model="form.typeName" readonly disabledColor="#ffffff" placeholder="请选择费用类型"
inputAlign="left" :customStyle="getInputStyle('typeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="产生时间" prop="costTime" required @click="selectCostTime">
<view class="input-with-arrow">
<u--input v-model="form.costTime" disabled disabledColor="#ffffff" placeholder="请选择产生时间"
<u--input v-model="form.costTime" readonly disabledColor="#ffffff" placeholder="请选择产生时间"
inputAlign="left" :customStyle="getInputStyle('costTime')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item v-if="showMedicine" label="治疗类型" prop="treatTypeName" @click="handleTreatType">
<view class="input-with-arrow">
<u--input v-model="form.treatTypeName" disabled disabledColor="#ffffff" placeholder="请选择治疗类型"
<u--input v-model="form.treatTypeName" readonly disabledColor="#ffffff" placeholder="请选择治疗类型"
inputAlign="left" :customStyle="getInputStyle('treatTypeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item v-if="showMedicine" label="药品名称" prop="medicineName" @click="handleMedicine">
<view class="input-with-arrow">
<u--input v-model="form.medicineName" disabled disabledColor="#ffffff" placeholder="请选择药品名称"
<u--input v-model="form.medicineName" readonly disabledColor="#ffffff" placeholder="请选择药品名称"
inputAlign="left" :customStyle="getInputStyle('medicineName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item v-if="showCheckType" label="检查类型" prop="checkTypeName" @click="handleCheckType">
<view class="input-with-arrow">
<u--input v-model="form.checkTypeName" disabled disabledColor="#ffffff" placeholder="请选择检查类型"
<u--input v-model="form.checkTypeName" readonly disabledColor="#ffffff" placeholder="请选择检查类型"
inputAlign="left" :customStyle="getInputStyle('checkTypeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item v-if="showNursingType" label="护理治疗" prop="checkTypeName" @click="handleNursingType">
<view class="input-with-arrow">
<u--input v-model="form.checkTypeName" disabled disabledColor="#ffffff" placeholder="请选择护理治疗"
<u--input v-model="form.checkTypeName" readonly disabledColor="#ffffff" placeholder="请选择护理治疗"
inputAlign="left" :customStyle="getInputStyle('checkTypeName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -64,7 +64,7 @@
</u-form-item>
<u-form-item label="单位" prop="unitName" required @click="handleUnit">
<view class="input-with-arrow">
<u--input v-model="form.unitName" disabled disabledColor="#ffffff" placeholder="请选择单位"
<u--input v-model="form.unitName" readonly disabledColor="#ffffff" placeholder="请选择单位"
inputAlign="left" :customStyle="getInputStyle('unitName')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -7,7 +7,7 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="人员姓名" prop="personName" required @click="handlePerson">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="getInputStyle('personName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -18,34 +18,34 @@
</u-form-item>
<u-form-item label="类型" prop="typeName" required @click="handleType">
<view class="input-with-arrow">
<u--input v-model="form.typeName" disabled disabledColor="#ffffff" placeholder="请选择类型"
<u--input v-model="form.typeName" readonly disabledColor="#ffffff" placeholder="请选择类型"
inputAlign="left" :customStyle="getInputStyle('typeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="档案状态" prop="stateName" required @click="handleState">
<view class="input-with-arrow">
<u--input v-model="form.stateName" disabled disabledColor="#ffffff" placeholder="请选择档案状态"
<u--input v-model="form.stateName" readonly disabledColor="#ffffff" placeholder="请选择档案状态"
inputAlign="left" :customStyle="getInputStyle('stateName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="发生时间" prop="occurTime" required @click="selectOccurTime()">
<view class="input-with-arrow">
<u--input v-model="form.occurTime" disabled disabledColor="#ffffff" placeholder="请选择发生时间" inputAlign="left" :customStyle="getInputStyle('occurTime')"></u--input>
<u--input v-model="form.occurTime" readonly disabledColor="#ffffff" placeholder="请选择发生时间" inputAlign="left" :customStyle="getInputStyle('occurTime')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="发生原因" prop="etiologyName" required @click="handleEtiology">
<view class="input-with-arrow">
<u--input v-model="form.etiologyName" disabled disabledColor="#ffffff" placeholder="请选择发生原因"
<u--input v-model="form.etiologyName" readonly disabledColor="#ffffff" placeholder="请选择发生原因"
inputAlign="left" :customStyle="getInputStyle('etiologyName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="康复时间" prop="rehabilitationTime" @click="selectRehabilitationTime()">
<view class="input-with-arrow">
<u--input v-model="form.rehabilitationTime" disabled disabledColor="#ffffff" placeholder="请选择康复时间" inputAlign="left" :customStyle="getInputStyle('rehabilitationTime')"></u--input>
<u--input v-model="form.rehabilitationTime" readonly disabledColor="#ffffff" placeholder="请选择康复时间" inputAlign="left" :customStyle="getInputStyle('rehabilitationTime')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>

View File

@@ -0,0 +1,476 @@
<template>
<view class="details-page">
<view class="hero">
<view class="hero-icon">
<uni-icons type="folder-add-filled" size="28" color="#ffffff"></uni-icons>
</view>
<view class="hero-info">
<text class="hero-title">{{ record.name || '健康档案' }}</text>
<text class="hero-subtitle">{{ record.personName || '--' }} · {{ record.occurTime || '--' }}</text>
</view>
<view class="hero-action" @click="handleFullExport">
<uni-icons type="download" size="18" color="#667eea"></uni-icons>
<text>导出</text>
</view>
</view>
<view class="metric-grid">
<view v-for="item in metrics" :key="item.key" class="metric-card">
<text class="metric-label">{{ item.label }}</text>
<view class="metric-value">
<text>{{ item.value }}</text>
<text class="metric-unit">{{ item.unit }}</text>
</view>
</view>
</view>
<view class="section-card">
<view class="section-title">
<text>档案信息</text>
</view>
<view class="info-list">
<view class="info-row">
<text>档案状态</text>
<text>{{ dictStr(record.state, stateList) || '--' }}</text>
</view>
<view class="info-row">
<text>档案类型</text>
<text>{{ dictStr(record.type, typeList) || '--' }}</text>
</view>
<view class="info-row" v-if="record.rehabilitationTime">
<text>康复时间</text>
<text>{{ record.rehabilitationTime }}</text>
</view>
<view class="info-row" v-if="record.duration">
<text>康复周期</text>
<text>{{ record.duration }}</text>
</view>
<view class="info-row info-full" v-if="record.initialSymptoms">
<text>初期症状</text>
<text>{{ record.initialSymptoms }}</text>
</view>
<view class="info-row info-full" v-if="record.mediumTermSymptoms">
<text>中期症状</text>
<text>{{ record.mediumTermSymptoms }}</text>
</view>
<view class="info-row info-full" v-if="record.laterStageSymptoms">
<text>后期症状</text>
<text>{{ record.laterStageSymptoms }}</text>
</view>
</view>
</view>
<view class="tab-bar">
<view v-for="item in tabs" :key="item.key" :class="['tab-item', activeTab === item.key ? 'active' : '']" @click="activeTab = item.key">
<text>{{ item.label }}</text>
<text class="tab-count">{{ item.count }}</text>
</view>
</view>
<view class="record-list">
<template v-if="activeTab === 'process'">
<view v-for="item in processRecordList" :key="item.id" class="detail-item">
<view class="detail-head">
<text>过程记录</text>
<text>{{ item.recordingTime || item.createTime || '--' }}</text>
</view>
<text class="detail-content">{{ item.content || item.remark || '--' }}</text>
</view>
</template>
<template v-if="activeTab === 'doctor'">
<view v-for="item in doctorRecordList" :key="item.id" class="detail-item">
<view class="detail-head">
<text>{{ item.hospitalName || '就医记录' }}</text>
<text>{{ item.visitingTime || '--' }}</text>
</view>
<view class="detail-grid">
<text>科室{{ item.departments || '--' }}</text>
<text>医生{{ item.doctor || '--' }}</text>
<text>费用{{ item.totalCost || 0 }} </text>
</view>
<text class="detail-content" v-if="item.diagnosis">诊断{{ item.diagnosis }}</text>
<text class="detail-content" v-if="item.prescribe">医嘱{{ item.prescribe }}</text>
</view>
</template>
<template v-if="activeTab === 'temperature'">
<view v-for="item in temperatureRecordList" :key="item.id" class="detail-item">
<view class="detail-head">
<text :class="['temperature', getTemperatureClass(item.temperature)]">{{ item.temperature || '--' }}</text>
<text>{{ item.measureTime || '--' }}</text>
</view>
<text class="detail-content" v-if="item.remark">{{ item.remark }}</text>
</view>
</template>
<template v-if="activeTab === 'medicine'">
<view v-for="item in marRecordList" :key="item.id" class="detail-item">
<view class="detail-head">
<text>{{ item.name || item.medicineName || '用药记录' }}</text>
<text>{{ item.dosingTime || '--' }}</text>
</view>
<view class="detail-grid">
<text>剂量{{ item.dosage || '--' }}</text>
<text>类型{{ dictStr(item.type, marTypeList) || '--' }}</text>
</view>
<text class="detail-content" v-if="item.remark">{{ item.remark }}</text>
</view>
</template>
<u-empty v-if="currentList.length === 0 && !loading" mode="data" text="暂无数据"></u-empty>
<u-loading-icon v-if="loading" mode="semicircle" size="32"></u-loading-icon>
</view>
<suspend></suspend>
</view>
</template>
<script setup>
import { computed, ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { getRecordScreen, exportRecordFull } from '@/api/health/statisticAnalysis'
import { getDicts } from '@/api/system/dict/data.js'
const loading = ref(false)
const activeTab = ref('process')
const screenData = ref({})
const typeList = ref([])
const stateList = ref([])
const marTypeList = ref([])
const record = computed(() => screenData.value.record || {})
const summary = computed(() => screenData.value.summary || {})
const temperature = computed(() => screenData.value.temperature || {})
const processRecordList = computed(() => screenData.value.processRecordList || [])
const doctorRecordList = computed(() => screenData.value.doctorRecordList || [])
const temperatureRecordList = computed(() => screenData.value.temperatureRecordList || [])
const marRecordList = computed(() => screenData.value.marRecordList || [])
const recordId = ref(null)
const tabs = computed(() => [
{ key: 'process', label: '过程', count: processRecordList.value.length },
{ key: 'doctor', label: '就医', count: doctorRecordList.value.length },
{ key: 'temperature', label: '体温', count: temperatureRecordList.value.length },
{ key: 'medicine', label: '用药', count: marRecordList.value.length }
])
const currentList = computed(() => {
const map = {
process: processRecordList.value,
doctor: doctorRecordList.value,
temperature: temperatureRecordList.value,
medicine: marRecordList.value
}
return map[activeTab.value] || []
})
const metrics = computed(() => [
{ key: 'process', label: '过程记录', value: summary.value.processRecordCount || 0, unit: '条' },
{ key: 'doctor', label: '就医次数', value: summary.value.doctorCount || 0, unit: '次' },
{ key: 'cost', label: '就医费用', value: summary.value.doctorCost || 0, unit: '元' },
{ key: 'medicineDays', label: '用药天数', value: summary.value.marDayCount || 0, unit: '天' },
{ key: 'medicineCount', label: '用药次数', value: summary.value.marCount || 0, unit: '次' },
{ key: 'fever', label: '发烧天数', value: summary.value.feverDayCount || 0, unit: '天' },
{ key: 'maxTemp', label: '最高体温', value: temperature.value.maxTemp || 0, unit: '℃' },
{ key: 'avgTemp', label: '平均体温', value: temperature.value.averageTemp || 0, unit: '℃' }
])
function dictStr(val, arr) {
const item = arr.find((dict) => dict.dictValue === val || dict.value === val)
return item ? item.dictLabel || item.label : ''
}
function getTemperatureClass(value) {
const temp = Number(value)
if (temp >= 38.5) return 'danger'
if (temp >= 37) return 'warning'
return 'normal'
}
function loadDicts() {
getDicts('record_type').then((res) => {
typeList.value = res.data || []
})
getDicts('health_record_state').then((res) => {
stateList.value = res.data || []
})
getDicts('mar_type').then((res) => {
marTypeList.value = res.data || []
})
}
function loadDetails(id) {
loading.value = true
getRecordScreen({ recordId: id, type: '1' })
.then((res) => {
screenData.value = res.data || {}
})
.finally(() => {
loading.value = false
})
}
function handleFullExport() {
if (!recordId.value) {
return
}
uni.showLoading({ title: '正在导出' })
exportRecordFull(
{ recordId: recordId.value },
`${record.value.name || '健康档案'}_完整信息_${Date.now()}.xlsx`
).then(() => {
uni.showToast({ title: '导出成功', icon: 'success' })
}).finally(() => {
uni.hideLoading()
})
}
onLoad((options) => {
loadDicts()
if (options && options.id) {
recordId.value = options.id
loadDetails(options.id)
}
})
</script>
<style lang="scss" scoped>
.details-page {
min-height: 100vh;
padding: 24rpx;
background: #f5f7fb;
box-sizing: border-box;
}
.hero {
display: flex;
align-items: center;
gap: 18rpx;
padding: 28rpx;
border-radius: 16rpx;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #fff;
}
.hero-icon {
width: 74rpx;
height: 74rpx;
border-radius: 50%;
background: rgba(255, 255, 255, 0.22);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.hero-info {
display: flex;
flex-direction: column;
min-width: 0;
flex: 1;
}
.hero-title {
font-size: 36rpx;
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.hero-subtitle {
margin-top: 10rpx;
font-size: 24rpx;
color: rgba(255, 255, 255, 0.86);
}
.hero-action {
height: 58rpx;
padding: 0 20rpx;
border-radius: 29rpx;
background: #fff;
display: flex;
align-items: center;
gap: 8rpx;
flex-shrink: 0;
text {
color: #667eea;
font-size: 24rpx;
font-weight: 700;
}
}
.metric-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18rpx;
margin-top: 20rpx;
}
.metric-card,
.section-card,
.detail-item {
background: #fff;
border-radius: 16rpx;
box-shadow: 0 4rpx 14rpx rgba(0, 0, 0, 0.06);
}
.metric-card {
padding: 22rpx;
}
.metric-label {
color: #667085;
font-size: 24rpx;
}
.metric-value {
margin-top: 12rpx;
display: flex;
align-items: baseline;
gap: 6rpx;
text:first-child {
color: #1f2937;
font-size: 40rpx;
font-weight: 800;
}
}
.metric-unit {
color: #8a94a6;
font-size: 24rpx;
}
.section-card {
margin-top: 20rpx;
padding: 24rpx;
}
.section-title {
color: #1f2937;
font-size: 30rpx;
font-weight: 700;
}
.info-list {
margin-top: 10rpx;
}
.info-row {
display: flex;
justify-content: space-between;
gap: 20rpx;
padding: 16rpx 0;
border-bottom: 1rpx solid #eef1f6;
text:first-child {
color: #667eea;
flex-shrink: 0;
}
text:last-child {
color: #344054;
text-align: right;
}
}
.info-full {
flex-direction: column;
text:last-child {
text-align: left;
line-height: 1.55;
}
}
.tab-bar {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12rpx;
margin-top: 20rpx;
}
.tab-item {
height: 72rpx;
border-radius: 14rpx;
background: #fff;
color: #667085;
display: flex;
align-items: center;
justify-content: center;
gap: 8rpx;
font-size: 26rpx;
font-weight: 600;
&.active {
background: #667eea;
color: #fff;
}
}
.tab-count {
font-size: 22rpx;
opacity: 0.8;
}
.record-list {
margin-top: 18rpx;
padding-bottom: 40rpx;
}
.detail-item {
padding: 22rpx;
margin-bottom: 16rpx;
}
.detail-head {
display: flex;
justify-content: space-between;
gap: 16rpx;
text:first-child {
color: #1f2937;
font-size: 28rpx;
font-weight: 700;
}
text:last-child {
color: #8a94a6;
font-size: 24rpx;
flex-shrink: 0;
}
}
.detail-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12rpx;
margin-top: 16rpx;
color: #475467;
font-size: 25rpx;
}
.detail-content {
display: block;
margin-top: 16rpx;
color: #475467;
font-size: 26rpx;
line-height: 1.55;
}
.temperature {
&.normal {
color: #12b76a;
}
&.warning {
color: #f79009;
}
&.danger {
color: #f04438;
}
}
</style>

View File

@@ -94,7 +94,7 @@
<u-list @scrolltolower="loadmore" :spaceHeight="116" lowerThreshold="100">
<u-list-item v-for="(item, index) in listData" :key="index">
<view class="list-item">
<view class="list-item" @click="enterDetails(item)">
<view class="item-header">
<view class="card-name-section">
<view class="card-icon">
@@ -149,6 +149,10 @@
</view>
<view class="operate" @click.stop>
<view class="btn-detail" @click="handleFullExport(item)">
<uni-icons type="download" size="16" color="#13c2c2"></uni-icons>
<text>导出</text>
</view>
<view class="btn-edit" @click="handleEdit(item)">
<uni-icons type="compose" size="16" color="#667eea"></uni-icons>
<text>修改</text>
@@ -175,6 +179,7 @@
<script setup>
import { listHealthRecord, delHealthRecord } from '@/api/health/healthRecord'
import { exportRecordFull } from '@/api/health/statisticAnalysis'
import { listPerson } from '@/api/health/person'
import { getDicts } from '@/api/system/dict/data.js'
import { timeHandler } from '@/utils/common.ts'
@@ -397,6 +402,17 @@ function settingCancel() {
}
});
}
function handleFullExport(item) {
uni.showLoading({ title: '正在导出' })
exportRecordFull(
{ recordId: item.id },
`${item.name || '健康档案'}_完整信息_${Date.now()}.xlsx`
).then(() => {
uni.showToast({ title: '导出成功', icon: 'success' })
}).finally(() => {
uni.hideLoading()
})
}
</script>
@@ -437,4 +453,4 @@ function settingCancel() {
}
}
}
</style>
</style>

View File

@@ -7,14 +7,14 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="人员姓名" prop="personName" required @click="handlePerson">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="getInputStyle('personName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="测量时间" prop="measureTime" required @click="selectDate()">
<view class="input-with-arrow">
<u--input v-model="form.measureTime" disabled disabledColor="#ffffff" placeholder="请选择测量时间"
<u--input v-model="form.measureTime" readonly disabledColor="#ffffff" placeholder="请选择测量时间"
inputAlign="left" :customStyle="getInputStyle('measureTime')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -115,6 +115,8 @@ import auth from "@/plugins/auth"; // 建议使用auth进行鉴权操作
])
const healthStaticGridList = ref([
{ path: '/pages/health/statistic/healthScreen/index', text: '健康总览态势', icon: 'map-filled', color: 'linear-gradient(135deg, #0ea5e9 0%, #14b8a6 100%)', permission: 'health:healthRecord:list' },
{ path: '/pages/health/statistic/recordScreen/index', text: '健康档案态势', icon: 'folder-add-filled', color: 'linear-gradient(135deg, #7c3aed 0%, #ec4899 100%)', permission: 'health:healthRecord:list' },
{ path: '/pages/health/statistic/healthStatistic/index', text: '档案统计', icon: 'paperplane-filled', color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)', permission: 'health:healthRecord:list' },
{ path: '/pages/health/statistic/doctorStatistic/index', text: '就医统计', icon: 'home-filled', color: 'linear-gradient(135deg, #fc5c65 0%, #fd79a8 100%)', permission: 'health:doctorRecord:list' },
{ path: '/pages/health/statistic/marStatistic/index', text: '用药统计', icon: 'wallet-filled', color: 'linear-gradient(135deg, #fd79a8 0%, #e84393 100%)', permission: 'health:marRecord:list' },

View File

@@ -7,49 +7,49 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="人员姓名" prop="personName" required @click="handlePerson">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="getInputStyle('personName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="健康档案" prop="healthRecordName" required @click="handHealthRecord">
<view class="input-with-arrow">
<u--input v-model="form.healthRecordName" disabled disabledColor="#ffffff" placeholder="请选择健康档案"
<u--input v-model="form.healthRecordName" readonly disabledColor="#ffffff" placeholder="请选择健康档案"
inputAlign="left" :customStyle="getInputStyle('healthRecordName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="用药类型" prop="marTypeName" required @click="handleMarType">
<view class="input-with-arrow">
<u--input v-model="form.marTypeName" disabled disabledColor="#ffffff" placeholder="请选择用药类型"
<u--input v-model="form.marTypeName" readonly disabledColor="#ffffff" placeholder="请选择用药类型"
inputAlign="left" :customStyle="getInputStyle('marTypeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="药品名称" prop="medicalName" required @click="handleMedical">
<view class="input-with-arrow">
<u--input v-model="form.medicalName" disabled disabledColor="#ffffff" placeholder="请选择药品名称"
<u--input v-model="form.medicalName" readonly disabledColor="#ffffff" placeholder="请选择药品名称"
inputAlign="left" :customStyle="getInputStyle('medicalName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="药品来源" prop="resourceName" required @click="handleResource">
<view class="input-with-arrow">
<u--input v-model="form.resourceName" disabled disabledColor="#ffffff" placeholder="请选择药品来源"
<u--input v-model="form.resourceName" readonly disabledColor="#ffffff" placeholder="请选择药品来源"
inputAlign="left" :customStyle="getInputStyle('resourceName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="用药地点" prop="placeName" required @click="handlePlace">
<view class="input-with-arrow">
<u--input v-model="form.placeName" disabled disabledColor="#ffffff" placeholder="请选择用药地点"
<u--input v-model="form.placeName" readonly disabledColor="#ffffff" placeholder="请选择用药地点"
inputAlign="left" :customStyle="getInputStyle('placeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="用药时间" prop="dosingTime" required @click="selectDate()">
<view class="input-with-arrow">
<u--input v-model="form.dosingTime" disabled disabledColor="#ffffff" placeholder="请选择用药时间"
<u--input v-model="form.dosingTime" readonly disabledColor="#ffffff" placeholder="请选择用药时间"
inputAlign="left" :customStyle="getInputStyle('dosingTime')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -60,7 +60,7 @@
</u-form-item>
<u-form-item label="用药单位" prop="unitName" required @click="handleUnit">
<view class="input-with-arrow">
<u--input v-model="form.unitName" disabled disabledColor="#ffffff" placeholder="请选择用药单位"
<u--input v-model="form.unitName" readonly disabledColor="#ffffff" placeholder="请选择用药单位"
inputAlign="left" :customStyle="getInputStyle('unitName')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -11,21 +11,21 @@
</u-form-item>
<u-form-item label="人员" prop="personId" required @click="handlePersonPick">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="药品" prop="medicineId" required @click="handleMedicinePick">
<view class="input-with-arrow">
<u--input v-model="form.medicineDisplayName" disabled disabledColor="#ffffff" placeholder="请选择药品"
<u--input v-model="form.medicineDisplayName" readonly disabledColor="#ffffff" placeholder="请选择药品"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="慢性疾病" prop="chronicDiseaseId" @click="handleDiseasePick">
<view class="input-with-arrow">
<u--input v-model="form.diseaseName" disabled disabledColor="#ffffff" placeholder="请选择慢性疾病(可选)"
<u--input v-model="form.diseaseName" readonly disabledColor="#ffffff" placeholder="请选择慢性疾病(可选)"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -35,14 +35,14 @@
<u--input v-model="form.dosagePerTime" type="number" placeholder="剂量"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<view @click="handleUnitPick" style="min-width:120rpx">
<u--input v-model="form.dosageUnit" disabled disabledColor="#ffffff" placeholder="单位"
<u--input v-model="form.dosageUnit" readonly disabledColor="#ffffff" placeholder="单位"
inputAlign="center" :customStyle="inputBaseStyle"></u--input>
</view>
</view>
</u-form-item>
<u-form-item label="频次类型" prop="frequencyType" @click="handleFrequencyPick">
<view class="input-with-arrow">
<u--input v-model="form.frequencyName" disabled disabledColor="#ffffff" placeholder="请选择频次类型"
<u--input v-model="form.frequencyName" readonly disabledColor="#ffffff" placeholder="请选择频次类型"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -61,14 +61,14 @@
</u-form-item>
<u-form-item label="开始日期" prop="startDate" required @click="openDatePicker('start')">
<view class="input-with-arrow">
<u--input v-model="form.startDate" disabled disabledColor="#ffffff" placeholder="请选择开始日期"
<u--input v-model="form.startDate" readonly disabledColor="#ffffff" placeholder="请选择开始日期"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="结束日期" prop="endDate" @click="openDatePicker('end')">
<view class="input-with-arrow">
<u--input v-model="form.endDate" disabled disabledColor="#ffffff" placeholder="请选择结束日期(可选)"
<u--input v-model="form.endDate" readonly disabledColor="#ffffff" placeholder="请选择结束日期(可选)"
inputAlign="left" :customStyle="inputBaseStyle"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -184,8 +184,10 @@ onLoad((option) => {
form.value.id = option.id
title.value = '用药计划-修改'
loadDetail(option.id)
} else {
applyChronicDiseasePrefill(option)
}
loadPersonList()
loadPersonList().then(() => fillPersonName())
loadMedicineList()
loadUnitList()
})
@@ -224,8 +226,9 @@ function convertDate(date) {
}
function loadPersonList() {
listPerson({ pageNum: 1, pageSize: 100 }).then(res => {
return listPerson({ pageNum: 1, pageSize: 100 }).then(res => {
personColumns.value = [res.rows || []]
return res.rows || []
})
}
@@ -237,11 +240,42 @@ function loadMedicineList() {
}
function loadDiseaseList(personId) {
listChronicDiseaseByMember(personId).then(res => {
return listChronicDiseaseByMember(personId).then(res => {
diseaseColumns.value = [res.data || []]
return res.data || []
})
}
function applyChronicDiseasePrefill(option) {
const personId = option.personId ? Number(option.personId) : null
const chronicDiseaseId = option.chronicDiseaseId ? Number(option.chronicDiseaseId) : null
if (!personId || !chronicDiseaseId) {
return
}
const diseaseName = option.diseaseName ? decodeURIComponent(option.diseaseName) : ''
form.value.personId = personId
form.value.chronicDiseaseId = chronicDiseaseId
form.value.diseaseName = diseaseName
form.value.planName = diseaseName ? `${diseaseName}用药计划` : null
loadDiseaseList(personId).then((list) => {
const disease = list.find(item => item.id == chronicDiseaseId)
if (disease) {
form.value.diseaseName = disease.diseaseName
}
})
}
function fillPersonName() {
if (!form.value.personId || form.value.personName) {
return
}
const list = personColumns.value[0] || []
const person = list.find(item => item.id == form.value.personId)
if (person) {
form.value.personName = person.name
}
}
function loadUnitList() {
getDicts('medical_unit').then(res => {
unitColumns.value = [res.data || []]

View File

@@ -105,11 +105,11 @@
<uni-icons type="pausemini" size="16" color="#fa8c16"></uni-icons>
<text>暂停</text>
</view>
<view class="btn-edit" v-if="item.status === 3" @click="handleResume(item)">
<view class="btn-edit" v-if="item.status === 2" @click="handleResume(item)">
<uni-icons type="right" size="16" color="#52c41a"></uni-icons>
<text>恢复</text>
</view>
<view class="btn-edit" v-if="item.status !== 2" @click="handleEnd(item)">
<view class="btn-edit" v-if="item.status !== 3" @click="handleEnd(item)">
<uni-icons type="checkbox" size="16" color="#667eea"></uni-icons>
<text>结束</text>
</view>
@@ -144,8 +144,8 @@ const status = ref('loadmore')
const personList = ref([])
const statusList = ref([
{ label: '进行中', value: 1 },
{ label: '已结束', value: 2 },
{ label: '已暂停', value: 3 }
{ label: '已暂停', value: 2 },
{ label: '已结束', value: 3 }
])
const data = reactive({
@@ -179,7 +179,7 @@ function getPersonList() {
}
function getStatusLabel(s) {
const map = { 1: '进行中', 2: '已结束', 3: '已暂停' }
const map = { 1: '进行中', 2: '已暂停', 3: '已结束' }
return map[s] || '未知'
}
@@ -223,7 +223,7 @@ function loadmore() {
function getList() {
status.value = 'loading'
listMedicationPlan({ pageSize: 10, pageNum: pageNum.value, ...queryParams.value }).then(res => {
listMedicationPlan({ pageSize: 10, pageNum: pageNum.value, ...queryParams.value, keyword: queryParams.value.keys }).then(res => {
listData.value = listData.value.concat(res.rows || [])
if (listData.value.length < res.total) {
status.value = 'loadmore'
@@ -345,12 +345,12 @@ function handleDelete(item) {
color: #52c41a;
}
&.status-ended, &.status-2 {
background: rgba(144, 147, 153, 0.2);
color: #909399;
}
&.status-paused, &.status-3 {
background: rgba(250, 140, 22, 0.2);
color: #fa8c16;
}
&.status-paused, &.status-3 {
background: rgba(144, 147, 153, 0.2);
color: #909399;
}
}
</style>

View File

@@ -33,21 +33,21 @@
<u-form-item label="药品剂型" prop="dosageFormName" @click="handleDosageForm">
<view class="input-with-arrow">
<u--input v-model="form.dosageFormName" disabled disabledColor="#ffffff" placeholder="请选择药品剂型"
<u--input v-model="form.dosageFormName" readonly disabledColor="#ffffff" placeholder="请选择药品剂型"
inputAlign="left" :customStyle="getInputStyle('dosageFormName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="治疗类型" prop="treatmentTypeName" @click="handleTreatmentType">
<view class="input-with-arrow">
<u--input v-model="form.treatmentTypeName" disabled disabledColor="#ffffff" placeholder="请选择治疗类型"
<u--input v-model="form.treatmentTypeName" readonly disabledColor="#ffffff" placeholder="请选择治疗类型"
inputAlign="left" :customStyle="getInputStyle('treatmentTypeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="药品分类" prop="classificationName" @click="handleClassification">
<view class="input-with-arrow">
<u--input v-model="form.classificationName" disabled disabledColor="#ffffff" placeholder="请选择药品分类"
<u--input v-model="form.classificationName" readonly disabledColor="#ffffff" placeholder="请选择药品分类"
inputAlign="left" :customStyle="getInputStyle('classificationName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -55,14 +55,14 @@
<u-form-item label="类别" prop="categoryName" @click="handleCategory">
<view class="input-with-arrow">
<u--input v-model="form.categoryName" disabled disabledColor="#ffffff" placeholder="请选择类别"
<u--input v-model="form.categoryName" readonly disabledColor="#ffffff" placeholder="请选择类别"
inputAlign="left" :customStyle="getInputStyle('categoryName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="包装单位" prop="packageUnitName" @click="handlePackageUnit">
<view class="input-with-arrow">
<u--input v-model="form.packageUnitName" disabled disabledColor="#ffffff" placeholder="请选择包装单位"
<u--input v-model="form.packageUnitName" readonly disabledColor="#ffffff" placeholder="请选择包装单位"
inputAlign="left" :customStyle="getInputStyle('packageUnitName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -70,7 +70,7 @@
<u-form-item label="是否进口" prop="isImportName" @click="handleIsImport">
<view class="input-with-arrow">
<u--input v-model="form.isImportName" disabled disabledColor="#ffffff" placeholder="请选择是否进口"
<u--input v-model="form.isImportName" readonly disabledColor="#ffffff" placeholder="请选择是否进口"
inputAlign="left" :customStyle="getInputStyle('isImportName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -81,7 +81,7 @@
</u-form-item>
<u-form-item label="规格单位" prop="unitName" @click="handleUnit">
<view class="input-with-arrow">
<u--input v-model="form.unitName" disabled disabledColor="#ffffff" placeholder="请选择规格单位"
<u--input v-model="form.unitName" readonly disabledColor="#ffffff" placeholder="请选择规格单位"
inputAlign="left" :customStyle="getInputStyle('unitName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -92,7 +92,7 @@
</u-form-item>
<u-form-item label="含量单位" prop="contentUnitName" @click="handleContentUnit">
<view class="input-with-arrow">
<u--input v-model="form.contentUnitName" disabled disabledColor="#ffffff" placeholder="请选择含量单位"
<u--input v-model="form.contentUnitName" readonly disabledColor="#ffffff" placeholder="请选择含量单位"
inputAlign="left" :customStyle="getInputStyle('contentUnitName')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -7,14 +7,14 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="治疗类型" prop="marTypeName" @click="handleMarType">
<view class="input-with-arrow">
<u--input v-model="form.marTypeName" disabled disabledColor="#ffffff" placeholder="请选择治疗类型"
<u--input v-model="form.marTypeName" readonly disabledColor="#ffffff" placeholder="请选择治疗类型"
inputAlign="left" :customStyle="getInputStyle('marTypeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="药品名称" prop="medicineName" required @click="handleMedical">
<view class="input-with-arrow">
<u--input v-model="form.medicineName" disabled disabledColor="#ffffff" placeholder="请选择药品名称"
<u--input v-model="form.medicineName" readonly disabledColor="#ffffff" placeholder="请选择药品名称"
inputAlign="left" :customStyle="getInputStyle('medicineName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -33,33 +33,33 @@
</u-form-item>
<u-form-item label="使用状态" prop="stateName" required @click="handleState">
<view class="input-with-arrow">
<u--input v-model="form.stateName" disabled disabledColor="#ffffff" placeholder="请选择使用状态"
<u--input v-model="form.stateName" readonly disabledColor="#ffffff" placeholder="请选择使用状态"
inputAlign="left" :customStyle="getInputStyle('stateName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="购买时间" prop="purchaseDate" @click="selectDate()">
<view class="input-with-arrow">
<u--input v-model="form.purchaseDate" disabled disabledColor="#ffffff" placeholder="请选择购买时间" inputAlign="left" :customStyle="getInputStyle('purchaseDate')"></u--input>
<u--input v-model="form.purchaseDate" readonly disabledColor="#ffffff" placeholder="请选择购买时间" inputAlign="left" :customStyle="getInputStyle('purchaseDate')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="生产日期" prop="productionDate" @click="selectProductionDate()">
<view class="input-with-arrow">
<u--input v-model="form.productionDate" disabled disabledColor="#ffffff" placeholder="请选择生产日期" inputAlign="left" :customStyle="getInputStyle('productionDate')"></u--input>
<u--input v-model="form.productionDate" readonly disabledColor="#ffffff" placeholder="请选择生产日期" inputAlign="left" :customStyle="getInputStyle('productionDate')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="过期日期" prop="expiringDate" @click="selectExpiringDate()">
<view class="input-with-arrow">
<u--input v-model="form.expiringDate" disabled disabledColor="#ffffff" placeholder="请选择过期日期" inputAlign="left" :customStyle="getInputStyle('expiringDate')"></u--input>
<u--input v-model="form.expiringDate" readonly disabledColor="#ffffff" placeholder="请选择过期日期" inputAlign="left" :customStyle="getInputStyle('expiringDate')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="包装单位" prop="packageUnitName" @click="handlePackageUnit">
<view class="input-with-arrow">
<u--input v-model="form.packageUnitName" disabled disabledColor="#ffffff" placeholder="请选择包装单位"
<u--input v-model="form.packageUnitName" readonly disabledColor="#ffffff" placeholder="请选择包装单位"
inputAlign="left" :customStyle="getInputStyle('packageUnitName')"></u--input>
<text class="arrow-icon"></text>
</view>
@@ -67,7 +67,7 @@
<u-form-item label="规格单位" prop="unitName" @click="handleUnit">
<view class="input-with-arrow">
<u--input v-model="form.unitName" disabled disabledColor="#ffffff" placeholder="请选择规格单位"
<u--input v-model="form.unitName" readonly disabledColor="#ffffff" placeholder="请选择规格单位"
inputAlign="left" :customStyle="getInputStyle('unitName')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -7,14 +7,14 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="人员姓名" prop="personName" required @click="handlePerson">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="getInputStyle('personName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="吃奶时间" prop="sucklesTime" required @click="selectDate()">
<view class="input-with-arrow">
<u--input v-model="form.sucklesTime" disabled disabledColor="#ffffff" placeholder="请选择吃奶时间"
<u--input v-model="form.sucklesTime" readonly disabledColor="#ffffff" placeholder="请选择吃奶时间"
inputAlign="left" :customStyle="getInputStyle('sucklesTime')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -15,21 +15,21 @@
</u-form-item>
<u-form-item label="类型" prop="typeName" required @click="handleType">
<view class="input-with-arrow">
<u--input v-model="form.typeName" disabled disabledColor="#ffffff" placeholder="请选择类型"
<u--input v-model="form.typeName" readonly disabledColor="#ffffff" placeholder="请选择类型"
inputAlign="left" :customStyle="getInputStyle('typeName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="生日" prop="birthday" required @click="selectBirthday()">
<view class="input-with-arrow">
<u--input v-model="form.birthday" disabled disabledColor="#ffffff" placeholder="请选择生日"
<u--input v-model="form.birthday" readonly disabledColor="#ffffff" placeholder="请选择生日"
inputAlign="left" :customStyle="getInputStyle('birthday')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="性别" prop="sexName" required @click="handleSex">
<view class="input-with-arrow">
<u--input v-model="form.sexName" disabled disabledColor="#ffffff" placeholder="请选择性别"
<u--input v-model="form.sexName" readonly disabledColor="#ffffff" placeholder="请选择性别"
inputAlign="left" :customStyle="getInputStyle('sexName')"></u--input>
<text class="arrow-icon"></text>
</view>

View File

@@ -7,21 +7,21 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="人员姓名" prop="personName" required @click="handlePerson">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="getInputStyle('personName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="健康档案" prop="healthRecordName" required @click="handHealthRecord">
<view class="input-with-arrow">
<u--input v-model="form.healthRecordName" disabled disabledColor="#ffffff" placeholder="请选择健康档案"
<u--input v-model="form.healthRecordName" readonly disabledColor="#ffffff" placeholder="请选择健康档案"
inputAlign="left" :customStyle="getInputStyle('healthRecordName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="记录时间" prop="recordingTime" required @click="selectDate()">
<view class="input-with-arrow">
<u--input v-model="form.recordingTime" disabled disabledColor="#ffffff" placeholder="请选择记录时间" inputAlign="left" :customStyle="getInputStyle('recordingTime')"></u--input>
<u--input v-model="form.recordingTime" readonly disabledColor="#ffffff" placeholder="请选择记录时间" inputAlign="left" :customStyle="getInputStyle('recordingTime')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>

File diff suppressed because it is too large Load Diff

View File

@@ -33,6 +33,20 @@ import auth from "@/plugins/auth";
import { ref } from "vue";
const healthGridList = ref([
{
path: '/pages/health/statistic/healthScreen/index',
text: '健康总览态势',
icon: 'map-filled',
permission: 'health:healthRecord:list',
gradient: 'linear-gradient(135deg, #0ea5e9 0%, #14b8a6 100%)'
},
{
path: '/pages/health/statistic/recordScreen/index',
text: '健康档案态势',
icon: 'folder-add-filled',
permission: 'health:healthRecord:list',
gradient: 'linear-gradient(135deg, #7c3aed 0%, #ec4899 100%)'
},
{
path: '/pages/health/statistic/healthStatistic/index',
text: '档案统计',

File diff suppressed because it is too large Load Diff

View File

@@ -7,21 +7,21 @@
:labelStyle="{ color: '#333333', fontSize: '30rpx', marginRight: '24rpx' }">
<u-form-item label="人员姓名" prop="personName" required @click="handlePerson">
<view class="input-with-arrow">
<u--input v-model="form.personName" disabled disabledColor="#ffffff" placeholder="请选择人员"
<u--input v-model="form.personName" readonly disabledColor="#ffffff" placeholder="请选择人员"
inputAlign="left" :customStyle="getInputStyle('personName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="健康档案" prop="healthRecordName" required @click="handHealthRecord">
<view class="input-with-arrow">
<u--input v-model="form.healthRecordName" disabled disabledColor="#ffffff" placeholder="请选择健康档案"
<u--input v-model="form.healthRecordName" readonly disabledColor="#ffffff" placeholder="请选择健康档案"
inputAlign="left" :customStyle="getInputStyle('healthRecordName')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>
<u-form-item label="测量时间" prop="measureTime" required @click="selectDate()">
<view class="input-with-arrow">
<u--input v-model="form.measureTime" disabled disabledColor="#ffffff" placeholder="请选择测量时间" inputAlign="left" :customStyle="getInputStyle('measureTime')"></u--input>
<u--input v-model="form.measureTime" readonly disabledColor="#ffffff" placeholder="请选择测量时间" inputAlign="left" :customStyle="getInputStyle('measureTime')"></u--input>
<text class="arrow-icon"></text>
</view>
</u-form-item>