FollowReview.vue 8.03 KB
<template>
  <!-- 随访审核详情 -->
  <div class="follow-form">
    <div class="note">
      <slot name="note"></slot>
    </div>
    <el-header v-if="titlePosition === 'top'">
      <div class="follow-tab-top">
        <el-tabs v-model="activeTab" type="card">
          <el-tab-pane label="筛查" name="0"></el-tab-pane>
          <el-tab-pane
            v-for="(item, index) in followList"
            :key="index"
            :label="'第' + Number(index + 1) + '次随访数据'"
            :name="String(index + 1)"
          ></el-tab-pane>
        </el-tabs>
      </div>

      <div class="extra_btn">
        <slot name="button"></slot>
      </div>
    </el-header>
    <el-container>
      <el-aside width="auto" v-if="titlePosition === 'left'">
        <div class="follow-tab" ref="follow-tab">
          <el-tabs
            v-model="activeTab"
            tab-position="right"
            style="height: 200px"
          >
            <el-tab-pane label="筛查病例数据" name="0">
              <template slot="label">
                <div class="tab-label">筛查病例数据</div></template
              >
            </el-tab-pane>
            <el-tab-pane
              v-for="(item, index) in followList"
              :key="index"
              :name="String(index + 1)"
            >
              <template slot="label">
                <div class="tab-label">
                  {{ "" + Number(index + 1) + "次随访数据" }}
                </div></template
              >
            </el-tab-pane>
          </el-tabs>
        </div>
      </el-aside>
      <el-main class="transition-box" v-loading="fromLoading">
        <div class="my_form">
          <MyCustomForm
            v-show="activeTab === '0'"
            v-for="form in formTabs"
            :key="form.id"
            :form="form"
            :patientId="currentRow.patientId"
          ></MyCustomForm>
          <MyCustomForm
            v-show="activeTab !== '0'"
            v-for="form in followForms"
            :key="form.id"
            :form="form"
            ref="myForm"
            :patientId="currentRow.patientId"
            :followId="followId"
          ></MyCustomForm>
        </div>
      </el-main>
      <el-aside width="auto" class="transition-box">
        <div class="follow-list">
          <ul class="list">
            <li v-for="(item, index) in screenList" :key="index">
              <div class="time">{{ item.update_time || item.create_time }}</div>
              <div class="time">
                {{ item.update_user_name || item.create_time }}
              </div>
              <div class="time">{{ item.sub_title }}</div>
            </li>
          </ul>
        </div>
      </el-aside>
    </el-container>
  </div>
</template>

<script>
import { mapGetters } from "vuex"
import CustomForm from "@/components/FormComponents/CustomForm/index"
import MyCustomForm from "./MyCustomForm.vue"
import { getCurrentFormByType } from "@/api/coop-group.js"
import { getFollowList } from "@/api/patient"
import { getFollowRecord } from "@/api/followup"
export default {
  name: "FollowReview",
  components: {
    CustomForm,
    MyCustomForm,
  },
  provide() {
    return {
      showIndex: true,
    }
  },
  props: {
    currentRow: {},
    titlePosition: {
      type: String,
      default: "left",
      validator: function (value) {
        return ["left", "top"].includes(value)
      },
    },
  },
  data() {
    return {
      fromLoading: false,
      formTabs: [],
      followForms: [],
      activeTab: "0",
      screenList: [],
      followList: [],
    }
  },
  computed: {
    ...mapGetters({
      group: ["user/group"],
    }),
    isEmpty() {
      return this.formTabs.length
    },
    followId() {
      return (
        (this.followList[this.activeTab - 1] &&
          this.followList[this.activeTab - 1].followId) ||
        null
      )
    },
  },
  watch: {
    followId() {
      this.getLogList()
    },
    "currentRow.patientId": {
      handler(val) {
        if (val) {
          this.getCurrentFormByType()
          this.getFollowInfo()
          this.getLogList()
        }
      },
      immediate: true,
    },
    activeTab(val) {
      this.$emit("update", val == this.followList.length)
    },
  },
  methods: {
    refreshFollow() {
      const refs = this.$refs["myForm"]
      refs.map((ele) => {
        ele.getFollowDetail()
      })
    },
    getLogList() {
      const obj = {
        patientId: this.currentRow.patientId,
        followId: this.followId,
      }
      const key = obj.followId ? "followId" : "patientId"
      getFollowList({
        [key]: obj[key],
      }).then((res) => {
        if (res.code == 1) {
          this.screenList = res.data || []
        }
      })
    },
    getCurrentFormByType(type = 1) {
      this.fromLoading = true
      getCurrentFormByType({
        type,
        groupId: this.group.groupId,
      }).then((res) => {
        this.fromLoading = false
        if (res.code === 1) {
          const list = res.data.map((item, index) => {
            return {
              id: item.id,
              formId: item.formId,
              label: item.tabName,
            }
          })
          if (type === 2) {
            this.followForms = list
          } else {
            this.formTabs = list
          }
        }
      })
    },
    getFollowRecord() {
      getFollowRecord({
        patientId: this.currentRow.patientId,
      }).then((res) => {
        this.followList = res.data.filter((_) => _.followBatch > 0)
        const len = this.followList.length
        this.activeTab = String(len)
        const el = this.$refs["follow-tab"]
        if (el && len > 11) {
          setTimeout(() => {
            el.scrollTop = (len - 11) * 52
          }, 0)
        }
      })
    },
    getFollowInfo() {
      const { followBatch } = this.currentRow
      if (!followBatch) return
      this.getCurrentFormByType(2)
      this.getFollowRecord()
    },
  },
}
</script>

<style lang="scss" scoped>
.el-header {
  display: flex;
  margin-top: 20px;
  padding-right: 0;
  position: relative;
  justify-content: space-between;
}
.follow-tab-top {
  max-width: calc(100% - 200px);
  padding-left: 10px;
  ::v-deep {
    .el-tabs--card > .el-tabs__header {
      border-bottom: none;
    }

    .el-tabs--card > .el-tabs__header .el-tabs__nav {
      border: none;
    }
    .el-tabs--card > .el-tabs__header .el-tabs__item {
      min-width: 116px;
      text-align: center;
      background: #f0f1fa;
      font-size: 14px;
      border: none;
    }
    .el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
      background: #4e68ff;
      color: #fff;
    }
  }
}
.my_form {
  height: calc(100vh - 280px);
  overflow-y: auto;
}
.el-main {
  padding: 0px 20px;
}

.note {
  margin-left: 20px;
  color: red;
  padding-top: 10px;
}
.extra_btn {
  width: 180px;
}
.follow-tab {
  border-radius: 4px;
  border: 1px solid #cccccc;
  height: calc(100vh - 280px);
  overflow: overlay;
  ::v-deep {
    .tab-label {
      border-bottom: 1px solid #ccc;
      padding: 0 20px;
      height: 52px;
      line-height: 52px;
    }
    .el-tabs__header {
      margin-left: 0px;
    }
    .el-tabs__nav-wrap.is-right::after {
      width: 0px;
    }
    .el-tabs__active-bar.is-right {
      width: 3px;
    }
    .el-tabs--right {
      height: auto !important;
    }
    .tab-title {
      padding: 16px;
      background: #fafafa;
      color: #333333;
      border-bottom: 1px solid #cccccc;
    }
    .el-tabs__item {
      width: 180px;
      padding: 0;
      background: #fafafa;
      height: 52px;
      line-height: 52px;
      transition: all 1s;
    }
    .el-tabs__item.is-active {
      background: transparent;
    }
  }
}
.follow-list {
  border-radius: 4px;
  border: 1px solid #cccccc;
  height: 100%;
  background: #fafafa;
  height: calc(100vh - 280px);
  overflow-y: overlay;
  li {
    padding: 18px 22px;
    border-bottom: 1px solid #ccc;
    // cursor: pointer;
    .time {
      font-size: 14px;
      margin-bottom: 8px;
      font-family: AlibabaPuHuiTiR;
      text-align: left;
      &:first-child {
        color: #4e68ff;
      }
    }
  }
}
</style>