• liang's avatar
    init · dad95e78
    liang authored
    dad95e78
index.vue 8.19 KB
<template>
  <div class="dental-tab">
    <div class="header">
      <el-form>
        <span style="margin-right: 10px" v-if="item.label">{{
          item.label || ""
        }}</span>
      </el-form>
    </div>
    <div class="dental-tab-content" v-if="list.length > 0">
      <el-form ref="form" :model="formUp" :disabled="dentalDisabled">
        <div
          class="flex dental-box"
          v-for="(row, rowIndex) in list"
          :key="rowIndex"
        >
          <div :class="row.twoCell ? 'dental-title2' : 'dental-title1'">
            <span>{{ row.title }}</span>
          </div>
          <div
            v-for="(t, index) in 14"
            class="flex"
            :key="index"
            :style="{
              marginLeft: index === 7 ? '20px' : '',
              width: '60px',
              flexWrap: 'wrap',
            }"
          >
            <div
              :style="{ width: row.width || '60px' }"
              :class="(cellIndex + 1) % 3 === 0 ? 'pieces' : ''"
              v-for="(cell, cellIndex) in row.cellNo || 1"
              :key="cellIndex"
            >
              <form-item-self
                :form="formUp"
                :item="{ ...row.item, prop: index + row.item.prop + cellIndex }"
                style="margin: 0"
                hidden-label
              ></form-item-self>
            </div>
          </div>
        </div>
      </el-form>
      <div class="line flex dental-box">
        <div class="dental-title1"></div>
        <div
          v-for="(t, index) in 7"
          :key="index"
          :style="{
            width: '60px',
            textAlign: 'center',
            lineHeight: '32px',
          }"
        >
          {{ 7 - index }}
        </div>
        <div style="margin-left: 20px" class="flex">
          <div
            v-for="(t, index) in 7"
            :key="index"
            :style="{
              width: '60px',
              textAlign: 'center',
              lineHeight: '32px',
            }"
          >
            {{ index + 1 }}
          </div>
        </div>
      </div>
      <el-form ref="form" :model="formDown" :disabled="dentalDisabled">
        <div
          class="flex dental-box"
          v-for="(row, rowIndex) in deepClone(list).reverse()"
          :key="rowIndex"
        >
          <div :class="row.twoCell ? 'dental-title2' : 'dental-title1'">
            <span>{{ row.title }}</span>
          </div>
          <div
            v-for="(t, index) in 14"
            class="flex"
            :key="index"
            :style="{
              marginLeft: index === 7 ? '20px' : '',
              width: '60px',
              flexWrap: 'wrap',
            }"
          >
            <div
              :style="{ width: row.width || '60px' }"
              v-for="(cell, cellIndex) in row.cellNo || 1"
              :class="(cellIndex + 1) % 3 === 0 ? 'pieces' : ''"
              :key="cellIndex"
            >
              <form-item-self
                :form="formDown"
                :item="{ ...row.item, prop: index + row.item.prop + cellIndex }"
                style="margin: 0"
                hidden-label
              ></form-item-self>
            </div>
          </div>
        </div>
      </el-form>
    </div>
  </div>
</template>
<script>
/**
 * @description 九院牙周病大表格
 */

import { isObject } from "@/utils/validate"
import FormItemSelf from "./FormItemSelf.vue"
const field = ["formDown", "formUp"]

export default {
  components: { FormItemSelf },
  name: "DentalTabForm",
  inject: {
    vwForm: {
      default: "",
    },
  },
  props: {
    disabled: {
      type: Boolean,
      default: false,
    },
    item: {
      type: Object,
      default: () => {
        return {}
      },
    },
    value: {
      type: Object,
      default: () => {
        return {}
      },
    },
  },
  data() {
    return {
      show: true,
      formDown: {},
      formUp: {},
      list: [
        {
          title: "松动度",
          item: {
            type: "input",
            notClearable: true,
            prop: "mobility",
          },
        },
        {
          title: "根分叉",
          item: {
            type: "input",
            notClearable: true,
            prop: "FI",
          },
        },
        {
          title: "PLI",
          item: {
            type: "input",
            notClearable: true,
            prop: "PLI",
          },
        },
        {
          title: "GI",
          item: {
            type: "input",
            notClearable: true,
            prop: "GI",
          },
        },
        {
          title: "BOP",
          cellNo: 6,
          width: "20px",
          twoCell: true,
          item: {
            type: "input",
            notClearable: true,
            prop: "BOP",
          },
        },
        {
          title: "CAL",
          cellNo: 6,
          width: "20px",
          twoCell: true,
          item: {
            type: "number",
            prop: "CAL",
            notClearable: true,
            blur: this.getAverageCAL,
          },
        },
        {
          title: "GM",
          cellNo: 6,
          width: "20px",
          twoCell: true,
          item: {
            type: "number",
            prop: "GM",
          },
        },
        {
          title: "PD",
          cellNo: 6,
          width: "20px",
          twoCell: true,
          item: {
            type: "number",
            prop: "PD",
            blur: this.getAveragePD,
          },
        },
      ],
      nativeValue: null,
    }
  },
  computed: {
    dentalDisabled() {
      return this.disabled || (this.vwForm || {}).disabled
    },
  },
  methods: {
    getAveragePD() {
      const averagePD = this.getAverage("PD")
      this.$emit("change", "PJTZSD", averagePD)
    },
    getAverageCAL() {
      const averageCAL = this.getAverage("CAL")
      this.$emit("change", "PJFZSS", averageCAL)
    },
    getAverage(key) {
      let total = 0
      let fillNum = 0
      for (let k in this.formUp) {
        if (k.includes(key) && this.formUp[k] > 0) {
          total += this.formUp[k]
          fillNum++
        }
      }
      for (let k in this.formDown) {
        if (k.includes(key) && this.formDown[k] > 0) {
          total += this.formDown[k]
          fillNum++
        }
      }
      return fillNum > 0 ? Math.round((total / fillNum) * 100) / 100 : ""
    },

    resetDentalForm() {
      // this.formDown = {}
      // this.formUp = {}
      // this.$set(this.value, "formDown", this.formDown)
      // this.$set(this.value, "formUp", this.formUp)
    },
    setValue() {
      if (!isObject(this.value) || this.nativeValue === this.value) {
        this.$emit("input", {})
        return
      }
      field.forEach((k) => {
        if (!this.value.hasOwnProperty(k)) {
          this[k] = {}
          this.value[k] = this[k]
        } else {
          this[k] = this.value[k]
        }
      })
      for (let key in this.value) {
        if (!field.find((_) => _ === key)) {
          delete this.$delete(this.value, key)
        }
      }
    },
    init() {
      const value = {
        formDown: this.formDown,
        formUp: this.formUp,
      }
      this.$emit("input", value)
      this.$nextTick(() => {
        this.$watch("value", () => {
          this.setValue()
        })
      })
    },
  },
  created() {
    this.nativeValue = this.value
  },
  mounted() {
    this.init()
  },
}
</script>
<style lang="scss" scoped>
.dental-tab {
  overflow: auto;
  .header {
    font-size: 16px;
  }
  .dental-tab-content {
    background-color: #fff;
    width: 960px;
    margin: 15px auto;
    ::v-deep .el-form-item {
      padding: 0 !important;
    }
  }
  .dental-box {
    .dental-title1,
    .dental-title2 {
      width: 100px;
      height: 33px;
      line-height: 32px;
      text-align: center;
      border: 1px solid #ebeef5;
      border-right-color: transparent;
      // &:first-child {
      //   border-color: #ebeef5;
      // }
    }
    .pieces {
      ::v-deep .el-input .el-input__inner {
        border-right-color: rgb(117, 114, 114);
      }
    }
    .dental-title2 {
      line-height: 66px;
      height: 66px;
    }
  }
}
::v-deep {
  .el-input__inner {
    border-radius: 0;
    // border-left-color: transparent;
    // border-right-color: transparent;
  }
}
</style>