WXL (wul)
16 小时以前 a9d2b856e0f6be6475319c2dc36bf405c2f908fc
src/views/patient/archives/childHealth/detail.vue
@@ -3,9 +3,18 @@
    <template v-if="archive">
      <div class="action-bar">
        <el-button @click="$router.go(-1)" icon="el-icon-back">返回</el-button>
        <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit">{{ editing ? '保存' : '编辑' }}</el-button>
        <el-tag :type="subTypeTag(archive.subType)" style="margin-left:12px">{{ archive.subTypeLabel }}</el-tag>
        <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit">
          {{ editing ? '保存' : '编辑' }}
        </el-button>
        <el-button v-if="archive.closeStatus != 1" type="danger" plain icon="el-icon-circle-close" @click="handleCloseCase">结案</el-button>
        <el-tag :type="archive.closeStatus == 1 ? 'info' : 'success'" style="margin-left:12px">
          {{ archive.closeStatus == 1 ? '已结案' : '未结案' }}
        </el-tag>
        <el-tag :type="subTypeTag(archive.subType)" style="margin-left:8px">{{ archive.subTypeLabel }}</el-tag>
      </div>
      <el-tabs v-model="mainTab" type="border-card">
        <el-tab-pane label="档案详情" name="detail">
      <!-- 患者基本信息 -->
      <el-card class="info-card" shadow="never">
@@ -19,7 +28,6 @@
        <el-row :gutter="20" style="margin-top:10px">
          <el-col :span="6"><InfoField label="科室" :value="archive.deptname" /></el-col>
          <el-col :span="6"><InfoField label="诊断" :value="archive.diagname" /></el-col>
          <el-col :span="6"><InfoField label="主治医生" :value="archive.drname" /></el-col>
          <el-col :span="6"><InfoField label="来源" :value="sourceLabel" /></el-col>
        </el-row>
      </el-card>
@@ -27,43 +35,54 @@
      <!-- 家长信息 -->
      <el-card class="info-card" shadow="never" style="margin-top:14px">
        <div slot="header" class="card-header"><span>家长/监护人信息</span></div>
        <el-form :model="parentInfo" label-width="110px" size="small" :disabled="!editing">
        <el-row :gutter="20">
          <el-col :span="6">
            <InfoField label="家长姓名" :value="parentInfo.parentName" :editing="editing" v-model="parentInfo.parentName" />
          </el-col>
          <el-col :span="6">
            <InfoField label="与儿童关系" :value="relationLabel" :editing="editing" type="select" :options="relationOptions" @change="v => parentInfo.relation = v" />
          </el-col>
          <el-col :span="6">
            <InfoField label="联系电话" :value="parentInfo.parentPhone" :editing="editing" v-model="parentInfo.parentPhone" />
          </el-col>
          <el-col :span="6">
            <InfoField label="身份证号" :value="parentInfo.parentIdCard" :editing="editing" v-model="parentInfo.parentIdCard" />
          </el-col>
            <el-col :span="8"><el-form-item label="家长姓名"><el-input v-model="parentInfo.parentName" class="w-sm" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="与儿童关系">
              <el-select v-model="parentInfo.relation" class="w-sm">
                <el-option v-for="o in relationOptions" :key="o.value" :label="o.label" :value="o.value" />
              </el-select>
            </el-form-item></el-col>
            <el-col :span="8"><el-form-item label="联系电话"><el-input v-model="parentInfo.parentPhone" class="w-sm" /></el-form-item></el-col>
        </el-row>
        <el-row :gutter="20" style="margin-top:10px">
          <el-col :span="12">
            <InfoField label="联系地址" :value="parentInfo.address" :editing="editing" v-model="parentInfo.address" />
          </el-col>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="身份证号"><el-input v-model="parentInfo.parentIdCard" class="w-md" /></el-form-item></el-col>
            <el-col :span="16"><el-form-item label="联系地址"><el-input v-model="parentInfo.address" class="w-full" /></el-form-item></el-col>
        </el-row>
        </el-form>
      </el-card>
      <!-- 档案基本信息 -->
      <!-- 档案信息(可编辑) -->
      <el-card class="info-card" shadow="never" style="margin-top:14px">
        <div slot="header" class="card-header">
          <span>档案基本信息</span>
          <span>档案信息</span>
          <span class="header-sub">{{ archive.createTime ? archive.createTime.substring(0,10) : '-' }} 建档</span>
        </div>
        <el-form :model="archive" label-width="110px" size="small" :disabled="!editing">
        <el-row :gutter="20">
          <el-col :span="8"><InfoField label="建档类型" :value="archive.subTypeLabel" /></el-col>
          <el-col :span="8"><InfoField label="建档医生" :value="archive.archiveForm.doctorName" :editing="editing" v-model="archive.archiveForm.doctorName" /></el-col>
          <el-col :span="8"><InfoField label="建档时间" :value="archive.createTime" /></el-col>
            <el-col :span="8"><el-form-item label="出生日期"><el-date-picker v-model="archive.birthday" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="出生体重"><el-input v-model="archive.birthWeight" class="w-xs" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="出生孕周"><el-input v-model="archive.gestationalWeek" class="w-xs" /></el-form-item></el-col>
        </el-row>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="诊断日期"><el-date-picker v-model="archive.diagnosisDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="主治医生"><el-input v-model="archive.attendingDoctor" class="w-sm" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="经管医生"><el-input v-model="archive.managingDoctor" class="w-sm" /></el-form-item></el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="登记人员"><el-input v-model="archive.registrant" class="w-sm" /></el-form-item></el-col>
          </el-row>
        </el-form>
      </el-card>
      <!-- 高危儿专案 → 可编辑表格 -->
      <el-card v-if="archive.subType === 'highRisk'" class="info-card" shadow="never" style="margin-top:14px">
        <div slot="header" class="card-header"><span>高危儿专案管理</span></div>
        <el-form :model="archive" label-width="110px" size="small" :disabled="!editing" inline>
          <el-form-item label="高危儿分类"><el-input v-model="archive.highRiskCategory" class="w-md" /></el-form-item>
          <el-form-item label="高危儿名称"><el-input v-model="archive.highRiskName" class="w-lg" /></el-form-item>
          <el-form-item label="拟随访日期"><el-date-picker v-model="archive.followupDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item>
        </el-form>
        <el-tabs v-model="activeTab" type="border-card">
          <el-tab-pane label="生长发育监测" name="growth">
            <EditableTable :data.sync="growthData" :editing="editing" :columns="growthColumns" />
@@ -80,6 +99,9 @@
      <!-- 营养性疾病专案 → 可编辑表格 -->
      <el-card v-if="archive.subType === 'nutrition'" class="info-card" shadow="never" style="margin-top:14px">
        <div slot="header" class="card-header"><span>营养性疾病专案管理</span></div>
        <el-form :model="archive" label-width="130px" size="small" :disabled="!editing" inline>
          <el-form-item label="营养性疾病名称"><el-input v-model="archive.nutritionName" class="w-lg" /></el-form-item>
        </el-form>
        <el-tabs v-model="activeTab" type="border-card">
          <el-tab-pane label="体格测量" name="measure">
            <EditableTable :data.sync="measureData" :editing="editing" :columns="measureColumns" />
@@ -96,23 +118,26 @@
      <!-- 学习困难专案 → 单一表单 -->
      <el-card v-if="archive.subType === 'learning'" class="info-card" shadow="never" style="margin-top:14px">
        <div slot="header" class="card-header"><span>学习困难专案管理</span></div>
        <el-form :model="archive" label-width="110px" size="small" :disabled="!editing" inline>
          <el-form-item label="预约情况"><el-input v-model="archive.appointmentStatus" class="w-lg" /></el-form-item>
        </el-form>
        <el-form :model="form" label-width="130px" size="small" :disabled="!editing">
          <el-divider content-position="left">学习能力评估</el-divider>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.assessDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="测评工具"><el-input v-model="form.testName" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.assessDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="测评工具"><el-input v-model="form.testName" class="w-sm" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="智商(IQ)"><el-input-number v-model="form.iq" :min="40" :max="160" /></el-form-item></el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="阅读能力"><el-select v-model="form.reading" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="书写能力"><el-select v-model="form.writing" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="计算能力"><el-select v-model="form.math" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="阅读能力"><el-select v-model="form.reading" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="书写能力"><el-select v-model="form.writing" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="计算能力"><el-select v-model="form.math" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col>
          </el-row>
          <el-form-item label="综合结论"><el-input v-model="form.result" type="textarea" :rows="2" /></el-form-item>
          <el-divider content-position="left">行为评估</el-divider>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.behaviorDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.behaviorDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
            <el-col :span="4"><el-form-item label="注意力"><el-input-number v-model="form.attention" :min="0" :max="36" /></el-form-item></el-col>
            <el-col :span="4"><el-form-item label="多动"><el-input-number v-model="form.hyperactivity" :min="0" :max="36" /></el-form-item></el-col>
            <el-col :span="4"><el-form-item label="冲动"><el-input-number v-model="form.impulsivity" :min="0" :max="36" /></el-form-item></el-col>
@@ -120,22 +145,29 @@
          </el-row>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="总分"><el-input-number v-model="form.totalScore" disabled /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="评价"><el-select v-model="form.evaluation" style="width:100%"><el-option label="正常范围" value="正常范围" /><el-option label="轻度异常" value="轻度异常" /><el-option label="中度异常" value="中度异常" /></el-select></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="评价"><el-select v-model="form.evaluation" class="w-sm"><el-option label="正常范围" value="正常范围" /><el-option label="轻度异常" value="轻度异常" /><el-option label="中度异常" value="中度异常" /></el-select></el-form-item></el-col>
          </el-row>
          <el-divider content-position="left">干预训练记录</el-divider>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="训练日期"><el-date-picker v-model="form.trainDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="训练类型"><el-input v-model="form.trainingType" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="训练日期"><el-date-picker v-model="form.trainDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="训练类型"><el-input v-model="form.trainingType" class="w-sm" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="时长(分钟)"><el-input-number v-model="form.duration" :min="10" :max="120" /></el-form-item></el-col>
          </el-row>
          <el-form-item label="训练内容"><el-input v-model="form.trainContent" type="textarea" :rows="2" /></el-form-item>
          <el-row :gutter="20">
            <el-col :span="8"><el-form-item label="训练师"><el-input v-model="form.trainer" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="进展"><el-select v-model="form.progress" style="width:100%"><el-option label="良好" value="良好" /><el-option label="一般" value="一般" /><el-option label="缓慢" value="缓慢" /></el-select></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="训练师"><el-input v-model="form.trainer" class="w-sm" /></el-form-item></el-col>
            <el-col :span="8"><el-form-item label="进展"><el-select v-model="form.progress" class="w-sm"><el-option label="良好" value="良好" /><el-option label="一般" value="一般" /><el-option label="缓慢" value="缓慢" /></el-select></el-form-item></el-col>
          </el-row>
        </el-form>
      </el-card>
        </el-tab-pane>
        <el-tab-pane label="服务记录" name="service">
          <ServiceRecords :patid="archive.patid" />
        </el-tab-pane>
      </el-tabs>
    </template>
    <div v-else class="empty-wrap">档案不存在或已删除</div>
  </div>
@@ -144,13 +176,15 @@
<script>
import EditableTable from "../components/EditableTable.vue";
import InfoField from "./InfoField.vue";
import ServiceRecords from "../components/ServiceRecords.vue";
import { loadArchives, saveArchives } from "../types";
export default {
  name: "ChildHealthArchiveDetail",
  components: { EditableTable, InfoField },
  components: { EditableTable, InfoField, ServiceRecords },
  data() {
    return {
      loading: false, archive: null, editing: false, activeTab: "growth",
      loading: false, archive: null, editing: true, activeTab: "growth", mainTab: "detail",
      relationOptions: [
        { label:"父亲", value:"father" },{ label:"母亲", value:"mother" },{ label:"祖父", value:"grandfather" },{ label:"祖母", value:"grandmother" },{ label:"其他", value:"other" },
      ],
@@ -203,21 +237,17 @@
      const map = { standalone:"独立建档", outpatient:"门诊记录", inpatient:"在院记录" };
      return map[this.archive?.sourcePage] || this.archive?.sourcePage || "-";
    },
    relationLabel() {
      const r = this.relationOptions.find(o => o.value === (this.archive?.parentInfo?.relation));
      return r ? r.label : "-";
    },
  },
  created() {
    const id = this.$route.query.id;
    if (id) this.loadArchive(id);
    if (id) this.loadArchive(id, this.$route.query.edit == 1);
  },
  methods: {
    loadArchive(id) {
    loadArchive(id, autoEdit) {
      this.loading = true;
      const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
      this.archive = all.find(item => item.id === id) || null;
      this.archive = loadArchives().find((item) => item.id === id) || null;
      if (this.archive) {
        if (!this.archive.parentInfo) this.archive.parentInfo = {};
        if (this.archive.subType === 'highRisk') {
          this.activeTab = "growth";
          this.growthData = this.archive.growthData || getDefaultGrowthData();
@@ -232,6 +262,7 @@
          Object.assign(this.form, this.archive.archiveForm.learningData);
        }
      }
      if (autoEdit) this.editing = true;
      this.loading = false;
    },
    toggleEdit() {
@@ -251,13 +282,24 @@
          this.archive.planData = JSON.parse(JSON.stringify(this.planData));
        }
        this.archive.updateTime = new Date().toISOString().replace("T"," ").substring(0,19);
        const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
        const all = loadArchives();
        const idx = all.findIndex(item => item.id === this.archive.id);
        if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
        localStorage.setItem("patientArchives", JSON.stringify(all));
        saveArchives(all);
        this.$message.success("保存成功");
      }
      this.editing = !this.editing;
    },
    handleCloseCase() {
      this.$modal.confirm("确认将该档案结案?").then(() => {
        this.archive.closeStatus = 1;
        this.archive.updateTime = new Date().toISOString().replace("T"," ").substring(0,19);
        const all = loadArchives();
        const idx = all.findIndex(item => item.id === this.archive.id);
        if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
        saveArchives(all);
        this.$message.success("已结案");
      }).catch(() => {});
    },
    subTypeTag(type) { const m={highRisk:"danger",nutrition:"warning",learning:"info"}; return m[type]||""; },
  },
@@ -297,6 +339,13 @@
</script>
<style lang="scss" scoped>
// 输入框宽度(按字段长短区分)
.w-xs { width: 90px; }
.w-sm { width: 150px; }
.w-md { width: 200px; }
.w-lg { width: 280px; }
.w-full { width: 100%; }
.action-bar { margin-bottom: 16px; }
.info-card { margin-bottom: 0; }
.card-header { display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: 600; }