<template> <van-form ref="form"> <div class="first-title"> <span class="font-semibold">随访信息</span> <div class="btn-title">引入数据</div> </div> <!-- 随访方式 --> <div class="label-title mt-2" required>随访方式</div> <van-field v-model="form.visitWayName" isLink readonly placeholder="请选择" :rules="rules.visitWayName" @click="showVisitWay = true" class="form-input" /> <van-popup v-model:show="showVisitWay" position="bottom"> <div class="p-4" style="height: 100%"> <div class="flex justify-between items-center mb-4 pop-title"> <div class="greyColor" @click="showVisitWay = false">取消</div> <div>随访方式(单选)</div> <div></div> </div> <div style="height: 80%; overflow: auto"> <CheckBtn clearable column-1 :options="store.getDict('CP00052')" v-model:value="form.visitWay" :fieldNames="{ text: 'name', value: 'value' }" @change="visitWayChange" /> </div> </div> </van-popup> <!-- 症状 --> <div class="label-title mt-2" required>症状</div> <van-field v-model="form.symptomName" isLink readonly placeholder="请选择" :rules="rules.symptomName" @click="showSymptom = true" class="form-input" /> <van-popup v-model:show="showSymptom" position="bottom"> <div class="p-4" style="height: 100%"> <div class="flex justify-between items-center mb-4 pop-title"> <div class="greyColor" @click="showSymptom = false">取消</div> <div>症状(可多选)</div> <div class="blueColor" @click="symptomConfirm">确定</div> </div> <div style="height: 80%; overflow: auto"> <CheckBtn multiple column-2 :options="store.getDict('CP00059')" v-model:value="form.symptom" :fieldNames="{ text: 'name', value: 'value' }" @change="form.symptom = checkboxReject(form.symptom, [1])" /> </div> </div> </van-popup> <template v-if="(form.symptom || []).includes(99)"> <div class="label-title mt-2">其他症状</div> <van-field v-model="form.symptomOther" placeholder="请填写其他症状" class="form-input" /> </template> <!-- 血压 --> <div class="flex items-center justify-between tip-box mt-2 mb-2"> <div class="label-title" required>血压</div> <BloodPressurePanel :pressureObj="pressureObj" /> </div> <table class="w-full mb-2"> <tr class="sub-text"> <td>收缩压(SBP)</td> <td style="width: 1em"></td> <td>舒张压(DBP)</td> </tr> <tr> <td class="flex items-center"> <van-field v-model="form.signSystolicPressure" placeholder="60~300,整数" :rules="rules.signSystolicPressure" class="form-input" > <template #extra> <span>mmHg</span> </template> </van-field> </td> <td class="text-center"> <span class="divide">/</span> </td> <td class="flex items-center"> <van-field v-model="form.signDiastolicPressure" placeholder="30~300,整数" :rules="rules.signDiastolicPressure" class="form-input" > <template #extra> <span>mmHg</span> </template> </van-field> </td> </tr> </table> <BloodPressureBt :pressureObj="pressureObj" @getValue="setPressure">开始测量</BloodPressureBt> <div class="tip">提示:点击“开始测量”按钮后将自动启动血压计设备,请勿再重复点击设备“开始/停止”按钮。</div> <!-- 身高 --> <div class="label-title mt-2" required>身高</div> <van-field v-model="form.signHeight" placeholder="10~300,1位小数" :rules="rules.signHeight" class="form-input" > <template #extra> <span>cm</span> </template> </van-field> <!-- 体重 --> <div class="label-title mt-2" required>体重</div> <van-field v-model="form.signWeight" placeholder="20~500,2位小数" :rules="rules.signWeight" class="form-input" > <template #extra> <span>kg</span> </template> </van-field> <!-- BMI --> <div class="label-title mt-2">BMI(体质指数)</div> <van-field readonly v-model="form.signBmi" placeholder="-" class="form-input" > <template #extra> <span>kg/m²</span> </template> </van-field> <!-- 腰围 --> <div class="label-title mt-2" required>腰围</div> <van-field v-model="form.signWaistline" placeholder="10~150,1位小数" :rules="rules.signWaistline" class="form-input" > <template #extra> <span>cm</span> </template> </van-field> <!-- 足背动脉搏动 --> <div class="label-title mt-2" required>足背动脉搏动</div> <van-field v-model="form.signArteryPulsationName" isLink readonly placeholder="请选择" :rules="rules.signArteryPulsationName" @click="showSignArteryPulsation = true" class="form-input" /> <van-popup v-model:show="showSignArteryPulsation" position="bottom"> <div class="p-4" style="height: 100%"> <div class="flex justify-between items-center mb-4 pop-title"> <div class="greyColor" @click="showSignArteryPulsation = false">取消</div> <div>随访方式(单选)</div> <div></div> </div> <div style="height: 80%; overflow: auto"> <CheckBtn clearable column-1 :options="store.getDict('CP00065')" v-model:value="form.signArteryPulsation" :fieldNames="{ text: 'name', value: 'value' }" @change="signArteryPulsationChange" /> </div> </div> </van-popup> <!-- 其他体征 --> <div class="label-title mt-2">其他</div> <van-field type="textarea" v-model="form.signOther" :maxlength="120" placeholder="如有其他体征情况请填写在此处,限120个字" class="form-input" /> <!-- 吸烟 --> <div class="label-title mt-2" required>吸烟</div> <div class="bg-fa"> <div class="label-title" required style="color: #262626; font-size: 14px">是否正在吸烟</div> <van-field :rules="rules.isSmoking" style="padding: 0"> <template #input> <van-radio-group v-model="form.isSmoking" shape="dot" direction="horizontal" class="doc-radio-group-now" > <van-radio v-for="item in store.getDict('CP00066')" :key="item.value" :name="item.value" label-position="left" style="width: 100%" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> </div> <div v-if="form.isSmoking === 1" class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">您大约从几岁起开始养成每天或基本每天都吸烟的习惯</div> <van-field v-model="form.startSmokeAge" placeholder="2~100,整数" :rules="rules.startSmokeAge" class="card-input" > <template #extra> <span>岁</span> </template> </van-field> </div> <div v-if="form.isSmoking === 1 || form.isSmoking === 2" class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">您最近7天是否吸烟</div> <van-field style="padding: 0"> <template #input> <van-radio-group v-model="form.lastSevenSmoke" shape="dot" direction="horizontal" class="doc-radio-group-now" > <van-radio v-for="item in store.getDict('DC00001')" :key="item.value" :name="item.value" label-position="left" style="width: 48%" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> </div> <div v-if="form.isSmoking === 1 || form.isSmoking === 2" class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">日吸烟量</div> <van-field v-model="form.daySmoking" placeholder="0~100,整数" :rules="rules.daySmoking" class="card-input" > <template #extra> <span>支</span> </template> </van-field> </div> <div v-if="form.isSmoking === 1 || form.isSmoking === 2" class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">目标日吸烟量</div> <van-field v-model="form.goalDaySmoking" placeholder="0~100,整数" :rules="rules.goalDaySmoking" class="card-input" > <template #extra> <span>支</span> </template> </van-field> </div> <!-- 饮酒 --> <div class="label-title mt-2" required>饮酒</div> <div class="bg-fa"> <div class="label-title" required style="color: #262626; font-size: 14px">是否正在饮酒</div> <van-field :rules="rules.isDrink" style="padding: 0"> <template #input> <van-radio-group v-model="form.isDrink" shape="dot" direction="horizontal" class="doc-radio-group-now" > <van-radio v-for="item in store.getDict('CP00068')" :key="item.value" :name="item.value" label-position="left" style="width: 100%" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> </div> <div v-if="form.isDrink === 1" class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">饮酒频率</div> <van-field style="padding: 0"> <template #input> <van-radio-group v-model="form.drinkCondition" shape="dot" direction="horizontal" class="doc-radio-group-now" > <van-radio v-for="item in store.getDict('CP00069')" :key="item.value" :name="item.value" label-position="left" style="width: 100%" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> </div> <div v-if="form.isDrink === 1 || form.isDrink === 2" class="flex mt-2"> <div class="bg-fa"> <div class="label-title" style="color: #262626; font-size: 14px">日饮酒量</div> <van-field v-model="form.dayDrink" placeholder="0~3000,整数" :rules="rules.dayDrink" class="card-input" > <template #extra> <span>ml</span> </template> </van-field> </div> <div class="bg-fa ml-2"> <div class="label-title" style="color: #262626; font-size: 14px">目标日饮酒量</div> <van-field v-model="form.goalDayDrink" placeholder="0~3000,整数" :rules="rules.goalDayDrink" class="card-input" > <template #extra> <span>ml</span> </template> </van-field> </div> </div> <div v-if="form.isDrink === 1 || form.isDrink === 2" class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">饮酒种类</div> <van-field label="白酒" v-model="form.drinkLiquor" placeholder="0~3000,整数" :rules="rules.drinkLiquor" class="card-input" label-width="36px" label-class="label-mr" > <template #extra> <span>ml/日</span> </template> </van-field> <van-field label="啤酒" v-model="form.drinkBeer" placeholder="0~3000,整数" :rules="rules.drinkBeer" class="card-input mt-2" label-width="36px" label-class="label-mr" > <template #extra> <span>ml/日</span> </template> </van-field> <van-field label="红酒" v-model="form.drinkRed" placeholder="0~3000,整数" :rules="rules.drinkRed" class="card-input mt-2" label-width="36px" label-class="label-mr" > <template #extra> <span>ml/日</span> </template> </van-field> <van-field label="黄酒" v-model="form.drinkYellow" placeholder="0~3000,整数" :rules="rules.drinkYellow" class="card-input mt-2" label-width="36px" label-class="label-mr" > <template #extra> <span>ml/日</span> </template> </van-field> <van-field label="其他" v-model="form.drinkOther" placeholder="0~3000,整数" :rules="rules.drinkOther" class="card-input mt-2" label-width="36px" label-class="label-mr" > <template #extra> <span>ml/日</span> </template> </van-field> </div> <!-- 运动 --> <div class="label-title mt-2" required>运动</div> <div class="bg-fa"> <div class="label-title" required style="color: #262626; font-size: 14px">有无规律活动</div> <van-field :rules="rules.regularExercise" style="padding: 0"> <template #input> <van-radio-group v-model="form.regularExercise" shape="dot" direction="horizontal" class="doc-radio-group-now" > <van-radio v-for="item in store.getDict('DC00069')" :key="item.value" :name="item.value" label-position="left" style="width: 48%" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> </div> <div v-if="form.regularExercise === 1" class="bg-fa mt-2"> <div class="label-title" required style="color: #262626; font-size: 14px">运动强度</div> <van-field :rules="rules.exerciseStrength" style="padding: 0"> <template #input> <van-radio-group v-model="form.exerciseStrength" shape="dot" direction="horizontal" class="doc-radio-group-now" > <van-radio v-for="item in store.getDict('CP00070')" :key="item.value" :name="item.value" label-position="left" style="width: 48%" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> </div> <div class="bg-fa mt-2"> <div class="label-title" required style="color: #262626; font-size: 14px">目前运动情况</div> <div class="flex"> <van-field v-model="form.nowExerciseWeek" placeholder="0~50,整数" :rules="rules.nowExerciseWeek" class="card-input" > <template #extra> <span>次/周</span> </template> </van-field> <van-field v-model="form.nowExerciseMinute" placeholder="0~500,整数" :rules="rules.nowExerciseMinute" class="card-input ml-2" > <template #extra> <span>分钟/次</span> </template> </van-field> </div> </div> <div class="bg-fa mt-2"> <div class="label-title" required style="color: #262626; font-size: 14px">目标运动情况</div> <div class="flex"> <van-field v-model="form.targetExerciseWeek" placeholder="0~50,整数" :rules="rules.targetExerciseWeek" class="card-input" > <template #extra> <span>次/周</span> </template> </van-field> <van-field v-model="form.targetExerciseMinute" placeholder="0~500,整数" :rules="rules.targetExerciseMinute" class="card-input ml-2" > <template #extra> <span>分钟/次</span> </template> </van-field> </div> </div> <!-- 主食 --> <div class="label-title mt-2" required>主食</div> <van-field v-model="form.staplFood" placeholder="0~5000,整数" :rules="rules.staplFood" class="form-input" > <template #extra> <span>克/天</span> </template> </van-field> <!-- 目标主食 --> <div class="label-title mt-2" required>目标主食</div> <van-field v-model="form.targetStaplFood" placeholder="0~5000,整数" :rules="rules.targetStaplFood" class="form-input" > <template #extra> <span>克/天</span> </template> </van-field> <!-- 心理调整 --> <div class="label-title mt-2" required>心理调整</div> <van-field :rules="rules.psychologicalRecovery" style="padding: 0"> <template #input> <van-radio-group v-model="form.psychologicalRecovery" shape="dot" direction="horizontal" class="w-full doc-radio-group" > <van-radio v-for="item in store.getDict('CP00072')" :key="item.value" :name="item.value" label-position="left" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <!-- 遵医行为 --> <div class="label-title mt-2" required>遵医行为</div> <van-field :rules="rules.doctorAdvice" style="padding: 0"> <template #input> <van-radio-group v-model="form.doctorAdvice" shape="dot" direction="horizontal" class="w-full doc-radio-group" > <van-radio v-for="item in store.getDict('CP00072')" :key="item.value" :name="item.value" label-position="left" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <!-- 辅助检查 --> <div class="label-title mt-2" required>辅助检查</div> <div class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">空腹静脉血糖值</div> <van-field v-model="form.emptyBloodGlucose" placeholder="0~50,2位小数" :rules="rules.emptyBloodGlucose" class="card-input" > <template #extra> <span>mmol/L</span> </template> </van-field> </div> <div class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">空腹及2小时胰岛素/C肽</div> <van-field label="空腹胰岛素" v-model="form.emptyInsulin" placeholder="0~10000,整数" :rules="rules.emptyInsulin" class="card-input" > <template #extra> <span>mU/L</span> </template> </van-field> <van-field label="空腹C肽" v-model="form.emptyPeptide" placeholder="0~10000,整数" :rules="rules.emptyPeptide" class="card-input mt-2" > <template #extra> <span>pmol/L</span> </template> </van-field> <van-field label="餐后2小时胰岛素" v-model="form.afterInsulin" placeholder="0~10000,整数" :rules="rules.afterInsulin" class="card-input mt-2" > <template #extra> <span>mU/L</span> </template> </van-field> <van-field label="餐后2小时C肽" v-model="form.afterPeptide" placeholder="0~10000,整数" :rules="rules.afterPeptide" class="card-input mt-2" > <template #extra> <span>pmol/L</span> </template> </van-field> </div> <Inspect ref="inspectRef" :form="form" :diseaseInfo="diseaseInfo"></Inspect> <!-- 服药依从性 --> <div class="label-title mt-2" required>服药依从性</div> <van-field :rules="rules.medicationCompliance" style="padding: 0"> <template #input> <van-radio-group v-model="form.medicationCompliance" shape="dot" direction="horizontal" class="w-full doc-radio-group" > <van-radio v-for="item in store.getDict('CP00080')" :key="item.value" :name="item.value" label-position="left" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <!-- 药物不良反应 --> <div class="label-title mt-2" required>药物不良反应</div> <van-field :rules="rules.drugsAdverse" style="padding: 0"> <template #input> <van-radio-group v-model="form.drugsAdverse" shape="dot" direction="horizontal" class="w-full doc-radio-group" > <van-radio v-for="item in store.getDict('DC00069')" :key="item.value" :name="item.value" label-position="left" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <div v-if="form.drugsAdverse === 1" class="bg-fa mt-2"> <div class="label-title" style="color: #262626; font-size: 14px">不良反应</div> <van-field type="textarea" v-model="form.drugsAdverseOther" :maxlength="120" placeholder="请填写具体描述哪种药物,何种不良反应,限120字" class="card-input" /> </div> <!-- 低血糖反应 --> <div class="label-title mt-2" required>低血糖反应</div> <van-field :rules="rules.glycopeniaReaction" style="padding: 0"> <template #input> <van-radio-group v-model="form.glycopeniaReaction" shape="dot" direction="horizontal" class="w-full doc-radio-group" > <van-radio v-for="item in store.getDict('CP00114')" :key="item.value" :name="item.value" label-position="left" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <!-- 此次随访分类 --> <div class="label-title mt-2" required>此次随访分类</div> <van-field :rules="rules.visitType" style="padding: 0"> <template #input> <van-radio-group v-model="form.visitType" shape="dot" direction="horizontal" class="w-full doc-radio-group" > <van-radio v-for="item in store.getDict('CP00085')" :key="item.value" :name="item.value" label-position="left" style="width: 48%" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <!-- 目前诊断 --> <div class="label-title mt-2" required>目前诊断</div> <van-field v-model="form.currentDiagnosisName" isLink readonly placeholder="请选择" :rules="rules.currentDiagnosisName" @click="showCurrentDiagnosis = true" class="form-input" /> <van-popup v-model:show="showCurrentDiagnosis" position="bottom"> <div class="p-4" style="height: 100%"> <div class="flex justify-between items-center mb-4 pop-title"> <div class="greyColor" @click="showCurrentDiagnosis = false">取消</div> <div>目前诊断(可多选)</div> <div class="blueColor" @click="currentDiagnosisConfirm">确定</div> </div> <div style="height: 80%; overflow: auto"> <CheckBtn multiple column-2 :options="store.getDict('CP00086')" v-model:value="form.currentDiagnosis" :fieldNames="{ text: 'name', value: 'value' }" /> </div> </div> </van-popup> <!-- 治疗方案 --> <TreatmentPlan ref="treatmentPlan" :form="form"></TreatmentPlan> <!-- 胰岛素 --> <div class="label-title mt-2" required>胰岛素</div> <van-field v-model="form.insulinTypeName" isLink readonly placeholder="请选择" :rules="rules.insulinTypeName" @click="showInsulinType = true" class="form-input" /> <van-popup v-model:show="showInsulinType" position="bottom"> <div class="p-4" style="height: 100%"> <div class="flex justify-between items-center mb-4 pop-title"> <div class="greyColor" @click="showInsulinType = false">取消</div> <div>随访方式(单选)</div> <div></div> </div> <div style="height: 80%; overflow: auto"> <CheckBtn clearable column-2 :options="store.getDict('CP00121')" v-model:value="form.insulinType" :fieldNames="{ text: 'name', value: 'value' }" @change="insulinTypeChange" /> </div> </div> </van-popup> <van-field v-if="form.insulinType === 99" v-model="form.insulinTypeOther" placeholder="其他胰岛素种类" class="form-input mt-2" /> <div class="bg-fa mt-2"> <div class="label-title" style="font-size: 14px; color: #262626">用法</div> <van-field style="padding: 0"> <template #input> <van-radio-group v-model="form.insulinUsage" shape="dot" direction="horizontal" class="doc-radio-group-now" > <van-radio v-for="item in store.getDict('CP00122')" :key="item.value" :name="item.value" label-position="left" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <van-field v-if="form.insulinUsage === 9" v-model="form.insulinTypeOther" placeholder="其他用法" class="card-input mt-2" /> </div> <!-- <div class="bg-fa mt-2"> <div class="label-title" style="font-size: 14px; color: #262626">用量</div> <van-field style="padding: 0"> <template #input> <van-checkbox-group v-model="form.insulinDosage" shape="square" direction="horizontal" class="doc-checkbox-group" > <van-checkbox v-for="item in insulinDosage" :key="item.value" :name="item.checked" label-position="left" style="width: 48%" > {{ item.name }} </van-checkbox> </van-checkbox-group> </template> </van-field> <template v-for="item in insulinDosage"> <van-field v-if="item.checked" :label="item.name" v-model="item.dosage" placeholder="请输入" class="card-input mt-2" > <template #extra> <span>IU</span> </template> </van-field> </template> </div> --> <!-- 转诊 --> <div class="label-title mt-2" required>转诊</div> <van-field :rules="rules.isReferral" style="padding: 0"> <template #input> <van-radio-group v-model="form.isReferral" shape="dot" direction="horizontal" class="w-full doc-radio-group" > <van-radio v-for="item in store.getDict('DC00069')" :key="item.value" :name="item.value" label-position="left" > {{ item.name }} </van-radio> </van-radio-group> </template> </van-field> <div v-if="form.isReferral === 1" class="bg-fa mt-2"> <div style="background-color: #fff; padding: 8px; border-radius: 8px"> <div style="color: #262626; font-size: 14px">转诊原因</div> <van-field type="textarea" v-model="form.referralReason" :maxlength="120" placeholder="请填写具体描述转诊原因,限120字" class="form-input mt-2" /> </div> <div style="background-color: #fff; padding: 8px; border-radius: 8px" class="mt-2"> <div style="color: #262626; font-size: 14px">转诊机构</div> <van-field v-model="form.referralUnitName" is-link readonly placeholder="请选择" @click="showReferralUnit = true" class="form-input mt-2" /> <DocUnit v-model:show="showReferralUnit" v-model:value="form.referralUnitId" :valueName="form?.referralUnitName" @change="referralUnitChange" /> </div> <div style="background-color: #fff; padding: 8px; border-radius: 8px" class="mt-2"> <div style="color: #262626; font-size: 14px">转诊科室</div> <van-field v-model="form.referralOfficeName" is-link readonly placeholder="请选择" @click="showReferralOffice = true" class="form-input mt-2" /> <DocOffice v-model:show="showReferralOffice" v-model:value="form.referralOfficeId" :unitId="form.referralUnitId" @change="referralOfficeChange" /> </div> </div> <!-- 现场随访照片 --> <div class="label-title mt-2">现场随访照片</div> <DocImageUpload :imageData="form.visitImageList" @change="(ids, option) => form.visitImage = ids" :maxLength="8" /> <!-- 下次随访日期 --> <div class="label-title mt-2" required>下次随访日期</div> <van-field v-model="form.nextVisitDate" isLink readonly placeholder="请选择" :rules="rules.nextVisitDate" @click="showNextVisitDate = true" class="form-input" /> <van-popup v-model:show="showNextVisitDate" position="bottom"> <van-date-picker v-model="form._nextVisitDate" :min-date="nextVisitDateRange.min" :max-date="nextVisitDateRange.max" @confirm="nextVisitDateConfirm" @cancel="showNextVisitDate = false" /> </van-popup> <!-- 随访日期 --> <div class="label-title mt-2">随访日期</div> <van-field v-model="form.visitDate" isLink readonly placeholder="请选择" :rules="rules.visitDate" @click="showVisitDate = true" class="form-input" /> <van-popup v-model:show="showVisitDate" position="bottom"> <van-date-picker v-model="form._visitDate" :min-date="visitDateRange.min" :max-date="visitDateRange.max" @confirm="visitDateConfirm" @cancel="showVisitDate = false" /> </van-popup> <!-- 随访单位 --> <div class="label-title mt-2">随访单位</div> <van-field v-model="form.visitUnitName" is-link readonly placeholder="请选择" @click="showVisitUnit = true" class="form-input mt-2" /> <DocUnit v-model:show="showVisitUnit" v-model:value="form.visitUnitId" :valueName="form?.visitUnitName" @change="visitUnitChange" /> <!-- 随访科室 --> <div class="label-title mt-2">随访科室</div> <van-field v-model="form.visitOfficeName" is-link readonly placeholder="请选择" @click="showVisitOffice = true" class="form-input mt-2" /> <DocOffice v-model:show="showVisitOffice" v-model:value="form.visitOfficeId" :unitId="form.visitUnitId" @change="visitOfficeChange" /> <!-- 随访医生 --> <div class="label-title mt-2">随访医生</div> <van-field v-model="form.visitDoctorName" is-link readonly placeholder="请选择" @click="showVisitDoctor = true" class="form-input mt-2" /> <DocOfficeDoctor v-model:show="showVisitDoctor" :allowClear="false" v-model:value="form.visitDoctorId" :unitId="form.visitUnitId" :officeId="form.visitOfficeId" @change="(option) => { form.visitDoctorName = option.staffName }" /> </van-form> </template> <script> import { useStore } from '@/doctor/store' import CheckBtn from '@/doctor/components/checkBtn/CheckBtn.vue' import { checkboxReject, calculateBMI, fetchDataHandle } from '@/utils/common' import { getDiabetesForm } from '@/api/doctor/separateFU' import BloodPressurePanel from '@/doctor/components/bloodPressure/BloodPressurePanel.vue' import BloodPressureBt from '@/doctor/components/bloodPressure/BloodPressureBt.vue' import DocUnit from '@/doctor/components/docUnit/DocUnit.vue' import DocOffice from '@/doctor/components/docOffice/DocOffice.vue' import DocOfficeDoctor from '@/doctor/components/docOfficeDoctor/DocOfficeDoctor.vue' import DocImageUpload from '@/doctor/components/docImageUpload/DocImageUpload.vue' import Inspect from '../../components/Inspect.vue' import TreatmentPlan from '../../components/TreatmentPlan.vue' import dayjs from 'dayjs' export default { components: { CheckBtn, BloodPressurePanel, BloodPressureBt, DocUnit, DocOffice, DocOfficeDoctor, DocImageUpload, Inspect, TreatmentPlan }, inject: ['pressureObj'], props: { diseaseInfo: { type: Object, default: () => {} } }, data() { return { store: useStore(), form: {}, rules: { visitWayName: [ { required: true, message: '请选择随访方式' } ], symptomName: [ { required: true, message: '请选择症状' } ], signSystolicPressure: [ { required: true, message: '请填写收缩压' } ], signDiastolicPressure: [ { required: true, message: '请填写舒张压' } ], signHeight: [ { required: true, message: '请填写身高' }, { validator: (value, rule) => { let res = true const regex = /^\d+(\.\d{1})?$/ if (value && !(regex.test(value) && Number(value) >= 10 && Number(value) <= 300)) { res = false } return res }, message: `请输入10到300之间的数字,允许一位小数` } ], signWeight: [ { required: true, message: '请填写体重' }, { validator: (value, rule) => { let res = true const regex = /^\d+(\.\d{1,2})?$/ if (value && !(regex.test(value) && Number(value) >= 20 && Number(value) <= 500)) { res = false } return res }, message: `请输入20到500之间的数字,允许两位小数` } ], signWaistline: [ { required: true, message: '请填写腰围' }, { validator: (value, rule) => { let res = true const regex = /^\d+(\.\d{1})?$/ if (value && !(regex.test(value) && Number(value) >= 10 && Number(value) <= 150)) { res = false } return res }, message: `请输入10到150之间的数字,允许一位小数` } ], signArteryPulsationName: [ { required: true, message: '请选择足背动脉搏动' } ], isSmoking: [ { required: true, message: '请选择' } ], startSmokeAge: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 2 && Number(value) <= 100)) { res = false } return res }, message: `请输入2到100之间的整数` } ], daySmoking: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 100)) { res = false } return res }, message: `请输入0到100之间的整数` } ], goalDaySmoking: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 100)) { res = false } return res }, message: `请输入0到100之间的整数` } ], isDrink: [ { required: true, message: '请选择' } ], dayDrink: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 3000)) { res = false } return res }, message: `请输入0到3000之间的整数` } ], goalDayDrink: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 3000)) { res = false } return res }, message: `请输入0到3000之间的整数` } ], drinkLiquor: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 3000)) { res = false } return res }, message: `请输入0到3000之间的整数` } ], drinkBeer: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 3000)) { res = false } return res }, message: `请输入0到3000之间的整数` } ], drinkRed: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 3000)) { res = false } return res }, message: `请输入0到3000之间的整数` } ], drinkYellow: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 3000)) { res = false } return res }, message: `请输入0到3000之间的整数` } ], drinkOther: [ { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 3000)) { res = false } return res }, message: `请输入0到3000之间的整数` } ], regularExercise: [ { required: true, message: '请选择' } ], exerciseStrength: [ { required: true, message: '请选择' } ], nowExerciseWeek: [ { required: true, message: '请输入' }, { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 50)) { res = false } return res }, message: `请输入0到50之间的整数` } ], nowExerciseMinute: [ { required: true, message: '请输入' }, { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 500)) { res = false } return res }, message: `请输入0到500之间的整数` } ], targetExerciseWeek: [ { required: true, message: '请输入' }, { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 50)) { res = false } return res }, message: `请输入0到50之间的整数` } ], targetExerciseMinute: [ { required: true, message: '请输入' }, { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 500)) { res = false } return res }, message: `请输入0到500之间的整数` } ], staplFood: [ { required: true, message: '请输入' }, { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 5000)) { res = false } return res }, message: `请输入0到5000之间的整数` } ], targetStaplFood: [ { required: true, message: '请输入' }, { validator: (value, rule) => { let res = true const regex = /^\d+$/ if (value && !(regex.test(value) && Number(value) >= 0 && Number(value) <= 5000)) { res = false } return res }, message: `请输入0到5000之间的整数` } ], psychologicalRecovery: [ { required: true, message: '请选择' } ], doctorAdvice: [ { required: true, message: '请选择' } ], medicationCompliance: [ { required: true, message: '请选择' } ], drugsAdverse: [ { required: true, message: '请选择' } ], glycopeniaReaction: [ { required: true, message: '请选择' } ], visitType: [ { required: true, message: '请选择' } ], currentDiagnosisName: [ { required: true, message: '请选择' } ], isReferral: [ { required: true, message: '请选择' } ], nextVisitDate: [ { required: true, message: '请选择' } ] }, showVisitWay: false, showSymptom: false, showSignArteryPulsation: false, showCurrentDiagnosis: false, showReferralUnit: false, showReferralOffice: false, showNextVisitDate: false, nextVisitDateRange: { min: undefined, max: undefined }, showVisitDate: false, visitDateRange: { min: undefined, max: undefined }, showVisitUnit: false, showVisitOffice: false, showVisitDoctor: false, showInsulinType: false, // insulinDosage: [] } }, computed: { authInfo() { return this.store.authInfo } }, created() { this.getInfo() }, methods: { checkboxReject, calculateBMI, visitWayChange() { this.store.getDict('CP00052').forEach(item => { if (item.value === this.form.visitWay) { this.form.visitWayName = item.name } }) this.showVisitWay = false }, symptomConfirm() { let list = [] this.store.getDict('CP00059').forEach(item => { let selected = this.form.symptom.filter(e => e === item.value) if (selected && selected.length) { list.push(item.name) } }) this.form.symptomName = list.join() this.showSymptom = false }, setPressure(val) { if (!val) return this.form.signSystolicPressure = val.systolicPressure this.form.signDiastolicPressure = val.diastolicPressure }, signArteryPulsationChange() { this.store.getDict('CP00065').forEach(item => { if (item.value === this.form.signArteryPulsation) { this.form.signArteryPulsationName = item.name } }) this.showSignArteryPulsation = false }, currentDiagnosisConfirm() { let list = [] this.store.getDict('CP00086').forEach(item => { let selected = this.form.currentDiagnosis.filter(e => e === item.value) if (selected && selected.length) { list.push(item.name) } }) this.form.currentDiagnosisName = list.join() this.showCurrentDiagnosis = false }, insulinTypeChange() { this.store.getDict('CP00121').forEach(item => { if (item.value === this.form.insulinType) { this.form.insulinTypeName = item.name } }) this.showInsulinType = false }, referralUnitChange(option = {}) { this.form.referralUnitName = option.unitName this.form.referralOfficeId = undefined this.form.referralOfficeName = undefined }, referralOfficeChange(option = {}) { this.form.referralOfficeName = option.officeName }, nextVisitDateConfirm({ selectedValues }) { this.form.nextVisitDate = selectedValues.join('-') this.showNextVisitDate = false }, visitDateConfirm({ selectedValues }) { this.form.visitDate = selectedValues.join('-') this.showVisitDate = false }, visitUnitChange(option = {}) { this.form.visitUnitName = option.unitName this.form.visitOfficeId = undefined this.form.visitOfficeName = undefined this.form.visitDoctorId = undefined this.form.visitDoctorName = undefined }, visitOfficeChange(option = {}) { this.form.visitOfficeName = option.officeName this.form.visitDoctorId = undefined this.form.visitDoctorName = undefined }, submit() { return new Promise((resolve, reject) => { this.$refs.form.validate().then(() => { const form = fetchDataHandle(this.form, { symptom: 'arrToStr', currentDiagnosis: 'arrToStr', auxiliaryExamination: 'arrToStr' }) resolve(form) }).catch(e => { }) }) }, getInfo() { let { id } = this.$route.query if (id) { getDiabetesForm({ id }).then(res => { const form = fetchDataHandle(res.data, { symptom: 'strToArrNum', currentDiagnosis: 'strToArrNum', auxiliaryExamination: 'strToArrNum' }) this.form = form // 下次随访日期 this.form._nextVisitDate = this.form.nextVisitDate.split('-') // 随访日期 this.form._visitDate = this.form.visitDate.split('-') }) } else { // 随访日期 this.form.visitDate = dayjs().format('YYYY-MM-DD') // 随访单位 this.form.visitUnitId = this.authInfo.unitId this.form.visitUnitName = this.authInfo.unitName // 随访科室 this.form.visitOfficeId = this.authInfo.officeId this.form.visitOfficeName = this.authInfo.officeName // 随访医生 this.form.visitDoctorId = this.authInfo.relationId this.form.visitDoctorName = this.authInfo.nickName // this.insulinDosage = this.store.getDict('CP00123') // console.log(this.insulinDosage) } } }, watch: { 'form.signHeight': { handler() { this.form.signBmi = this.calculateBMI(this.form.signHeight, this.form.signWeight) } }, 'form.signWeight': { handler() { this.form.signBmi = this.calculateBMI(this.form.signHeight, this.form.signWeight) } }, } } </script> <style lang="less" scoped> .first-title { display: flex; align-items: center; .btn-title { background-color: #F0F3FF; color: #607FF0; border-radius: 9999px; padding: 4px 16px; margin-left: 8px; } } .label-title { font-size: 13px; color: #595959; font-weight: 500; margin-bottom: 8px; &[required] { &::after { content: '*'; color: #FF4D4F; font-weight: bold; margin-left: 4px; } } } .form-input { background-color: #FAFAFA; padding: 8px 12px; border-radius: 8px; } :deep(.van-cell:after) { border-bottom: 0px; } :deep(.van-popup) { height: 50% !important; } .pop-title { color: #262626; font-size: 16px; font-weight: 600; } .greyColor { color: var(--van-text-color-2); font-weight: 400; } .blueColor { color: #607FF0; font-weight: 500; } .sub-text { color: #595959; font-size: 13px; font-weight: 400; padding-bottom: 8px; } .tip { color: #FA8C16; font-size: 12px; margin-top: 8px; line-height: 16px; } .bg-fa { background-color: #FAFAFA; padding: 8px; border-radius: 8px; } .doc-radio-group-now { column-gap: 10px; row-gap: 8px; background-color: #FAFAFA; width: 100%; .van-radio { background-color: #FFFFFF; padding: 8px 12px; border-radius: 8px; justify-content: space-between; margin-right: 0; flex-grow: 1; } } .card-input { padding: 8px 12px; border-radius: 8px; } :deep(.van-field) { border-radius: .08rem; .van-field__label { width: auto; } } .doc-checkbox-group { column-gap: 10px; row-gap: 8px; background-color: #FAFAFA; width: 100%; .van-checkbox { background-color: #FFFFFF; padding: 8px 12px; border-radius: 8px; justify-content: space-between; margin-right: 0; flex-grow: 1; } } </style>