<template>
  <div class="form-wrap">
    <!--渲染不同的模块表单-->
    <template v-for="(item, index) in addComponents">
      <div v-if="canRender">
        <div v-if="item.showModule" class="content-box">
          <div v-if="!item.hideTitle" class="title">
            {{ item.title
            }}<span class="gray-tip" v-if="item.disabled"
              ><i class="el-icon-warning-outline" style="margin-right: 5px"></i
              >获得居民授权才可进行此项填写</span
            >
          </div>
          <el-form
            :ref="'form' + index"
            :id="'form' + index"
            :model="item.formObject"
            size="medium"
            label-position="left"
            class="form"
          >
            <FormScale
              :dataSource="item.dataSource"
              :form="item.formObject"
              :ruleNew="item.ruleNew"
              :class="item.className"
            />
          </el-form>
          <ChoseMedication
            v-if="dialogFormVisible"
            @closeDialog="closeDialog"
            @setMedication="setMedication"
          />
        </div>
      </div>
    </template>
  </div>
</template>

<script>
import { $on, $off, $once, $emit } from '../../../../../utils/gogocodeTransfer'
import {
  getDomain,
  getScaleModels,
  getScaleDetail,
  postScale,
  updateScalesStatus,
  submitScale,
  getScaleModels2,
} from '@/utils/followup/followapis'

// 量表 template
import FormScale from '@/components/followup/form/index'
import ChoseMedication from '@/views/followup/record-manage/dialog/chose-medication'
// 量表模块数据模型

// 糖尿病
import diabetesSourseBaseInfo from '../models/diabetes/diabetesSourseBaseInfo'
import diabetesSourseSymptom from '../models/diabetes/diabetesSourseSymptom'
import diabetesSourseSign from '../models/diabetes/diabetesSourseSign'
import diabetesSourseLifeMode from '../models/diabetes/diabetesSourseLifeMode'
import diabetesSourseAuxiliary from '../models/diabetes/diabetesSourseAuxiliary'
import diabetesSourseOther from '../models/diabetes/diabetesSourseOther'
import diabetesSourseMedicationUse from '../models/diabetes/diabetesSourseMedicationUse'
import diabetesSourseReferral from '../models/diabetes/diabetesSourseReferral'
import diabetesSourseSignature from '../models/diabetes/diabetesSourseSignature'

export default {
  data() {
    return {
      domain: '', //通过接口获取白名单域名
      needRule: true, //是否动态开启验证
      showModule: true, //是否隐藏表单模块
      canRender: true,
      valid: false,
      validList: [],
      moduleList: [], //模块列表
      planPatientsTimesId: '',
      scaleNo: '',
      doctorId: '',
      planTimesId: '',
      addComponents: [], //所需要展示的模块
      addComponentsSourceList: [],
      formData: {}, //整个表单对象
      dialogFormVisible: false, //是否显示添加用药情况dialog
      medication: [], // 用药情况
      type2Obj: {},
    }
  },
  components: {
    FormScale,
    ChoseMedication,
  },
  props: {
    scaleType: String, //病种类型
    checkStart: Boolean,
    saveWay: Number,
    showBtn: String,
  },
  watch: {
    checkStart(val) {
      if (val) {
        this.validList = []
        for (let i = 0; i < this.addComponents.length; i++) {
          let formName = this.addComponents[i].formName
          // 将每个模块的fornName对应后台的表名放到表单对象
          this.formData[formName] = this.addComponents[i].formObject

          this.$nextTick(() => {
            // saveWay=1是提交，进行校验，2是暂存，不需要校验，直接发送请求
            if (this.saveWay == 1) {
              if (this.$refs['form' + i].length > 0) {
                this.$refs['form' + i][0].validate((valid) => {
                  this.validList.push(valid)
                })
              }
            }
          })
        }

        this.$nextTick(() => {
          // saveWay=1是提交，进行校验，2是暂存，不需要校验，直接发送请求
          if (this.saveWay == 1) {
            for (let k = 0; k < this.validList.length; k++) {
              if (!this.validList[k]) {
                $emit(this, 'checkEnd', false)
                this.valid = false
                this.$nextTick(() => {
                  // 如果表单未完善，跳转到该表单模块
                  document.querySelector(`#form${k}`).scrollIntoView(true)
                })
                return
              } else {
                // 校验内容是否全部填写
                this.valid = true
              }
            }
            if (this.valid) {
              this.dataSubmit(() => {
                updateScalesStatus({
                  fuPlanPatientTimesId: this.planPatientsTimesId,
                  planTimesId: this.planTimesId,
                  resourceId: this.scaleNo,
                })
              })
            }
            $emit(this, 'checkEnd', false)
          } else {
            this.dataSubmit()
          }
        })
      }
    },
    showModule(val) {
      this.addComponents.forEach((item, index) => {
        if (index >= 3) {
          this.addComponents[index].showModule = val
        }
      })
    },
  },
  created() {
    this.planPatientsTimesId = this.$route.query.planPatientsTimesId
    this.scaleNo = this.$route.query.scaleNo
    this.doctorId = this.$route.query.doctorId
    this.planTimesId = this.$route.query.planTimesId
    // 获取量表类型
    this.initScaleType()
    // 获取白名单域名
    this.getWhiteDomain()
  },
  methods: {
    // 获取量表类型
    initScaleType() {
      this.addComponentsSourceList = [
        {
          name: 'diabetesSourseBaseInfo',
          formObject: {},
          showModule: true,
          formName: 'h_s_001',
          className: 'obj-form-title',
          dataSource: diabetesSourseBaseInfo(this),
          hideTitle: true,
          title: '基本信息',
        },
        {
          name: 'diabetesSourseSymptom',
          formObject: {},
          showModule: true,
          formName: 'diabetes_001',
          className: 'obj-form-title',
          dataSource: diabetesSourseSymptom(this),
          hideTitle: false,
          title: '症状',
        },
        {
          name: 'diabetesSourseSign',
          formObject: { bmi: 0, nextBmi: 0 },
          showModule: true,
          formName: 'diabetes_002',
          className: 'obj-form-title',
          dataSource: diabetesSourseSign(this),
          hideTitle: false,
          title: '体征',
        },
        {
          name: 'diabetesSourseLifeMode',
          formObject: {},
          showModule: true,
          formName: 'diabetes_003',
          className: 'obj-form-title',
          dataSource: diabetesSourseLifeMode(this),
          hideTitle: false,
          title: '生活方式指导',
        },
        {
          name: 'diabetesSourseAuxiliary',
          formObject: {
            glycosylatedHemoglobinPercent: '',
            glycosylatedHemoglobinDate: '',
          },
          showModule: true,
          formName: 'diabetes_004',
          className: 'obj-form-title',
          dataSource: diabetesSourseAuxiliary(this),
          hideTitle: false,
          title: '辅助检查',
        },
        {
          name: 'diabetesSourseOther',
          formObject: {},
          showModule: true,
          formName: 'diabetes_005',
          className: 'obj-form-title',
          dataSource: diabetesSourseOther(this),
          hideTitle: true,
          title: '其他',
        },
        {
          name: 'diabetesSourseMedicationUse',
          formObject: { arrList: this.medication },
          showModule: true,
          formName: 'h_s_002',
          className: 'obj-form-title',
          dataSource: diabetesSourseMedicationUse(this),
          hideTitle: false,
          title: '用药情况',
        },
        {
          name: 'diabetesSourseReferral',
          formObject: { reason: '', mechanism: '', department: '' },
          showModule: true,
          formName: 'h_s_003',
          className: 'obj-form-title',
          dataSource: diabetesSourseReferral(this),
          hideTitle: false,
          title: '转诊',
        },
        {
          name: 'diabetesSourseSignature',
          formObject: {},
          showModule: true,
          formName: 'h_s_004',
          className: 'obj-form-title',
          dataSource: diabetesSourseSignature(this),
          hideTitle: true,
          title: '签名',
        },
      ]
    },
    // 获取白名单域名
    getWhiteDomain() {
      getDomain().then((res) => {
        if (res.code == '000000') {
          this.domain = res.data
          // 获取量表模块
          this.getFormModules()
          if (this.showBtn != '0') {
            // 获取量表详情
            this.getFormDetail()
          }
        } else {
          this.$message({
            message: res.message,
            type: 'error',
          })
        }
      })
    },
    // 动态开启验证开关
    // setRuleToTrue(index){
    //   this.addComponents[index].dataSource.forEach((item,k)=>{
    //     if(item.rules && item.rules.length > 0){
    //       if(!this.needRule){
    //         this.addComponents[index].dataSource[k].rules[0].required = true;
    //       }else{
    //         this.addComponents[index].dataSource[k].rules[0].required = false;
    //       }
    //     }
    //   })
    // },
    // 获取展示的模块
    getFormModules() {
      let para = {
        planPatientsTimesId: this.planPatientsTimesId,
      }
      // getScaleModels(this.domain,this.scaleNo).then(res=>{
      getScaleModels2(this.domain, this.scaleNo, para).then((res) => {
        if (res.code == '000000') {
          this.moduleList = res.data
          for (let i = 0; i < this.moduleList.length; i++) {
            for (let j = 0; j < this.addComponentsSourceList.length; j++) {
              // if(this.moduleList[i]==this.addComponentsSourceList[j].formName){
              if (
                this.moduleList[i].modelCode ==
                this.addComponentsSourceList[j].formName
              ) {
                // this.addComponents.push(this.addComponentsSourceList[j])
                //把获取到每个模块的disabeld状态更新进将要渲染的数组
                this.addComponents.push({
                  ...this.addComponentsSourceList[j],
                  disabled: this.moduleList[i].disabled,
                })
              }
            }
          }
          /*start--根据当前模块是否获得居民权限，来判断是否可填写当前模块*/
          this.addComponents.forEach((item, index) => {
            if (item.disabled === true) {
              item.dataSource.forEach((item2, index2) => {
                // item2.disabled = true;
                this.addComponents[index].dataSource[index2].disabled = true
                if (this.addComponents[index].dataSource[index2].rules) {
                  this.addComponents[index].dataSource[
                    index2
                  ].rules[0].required = false
                }
              })
            }
          })
          console.log('糖尿病数组', this.addComponents)
          /*end--*/

          // if(this.showBtn!='0'){
          //   // 获取量表详情
          //   this.getFormDetail();
          // }
        } else {
          this.$message({
            message: res.message,
            type: 'error',
          })
        }
      })
    },
    // 处理获取用药情况详情数据
    handleModuleMedicalUseData(obj) {
      if (obj.medicineType == '1') {
        const { dosageDay, dosageNum, medicinesName, medicineType } = obj
        this.medication.push({
          dosageDay,
          dosageNum,
          medicinesName,
          medicineType,
        })
      } else if (obj.medicineType == '2') {
        const { dosageDay, dosageNum, medicinesName, medicineType } = obj
        this.type2Obj = { dosageDay, dosageNum, medicinesName, medicineType }
      }
    },
    // 获取量表详情
    getFormDetail() {
      getScaleDetail(this.domain, this.planPatientsTimesId, this.scaleNo).then(
        (res) => {
          this.formData = res.data
          let keysList = Object.keys(this.formData)
          if (keysList.length > 0) {
            this.medication = []
            for (let i = 0; i < this.addComponents.length; i++) {
              let formName = this.addComponents[i].formName
              // let type2Obj = {};
              //对用药情况模块的数据做特殊处理
              if (this.formData[formName] && formName == 'h_s_002') {
                let getDataHS002 = this.formData[formName]
                if (Array.isArray(getDataHS002)) {
                  getDataHS002.forEach((item, index) => {
                    this.handleModuleMedicalUseData(item)
                  })
                } else {
                  // 如果是对象，则为一条数据
                  this.handleModuleMedicalUseData(getDataHS002)
                }
                this.addComponents[i].formObject = {
                  arrList: this.medication,
                  ...this.type2Obj,
                }
              } else if (
                this.formData[formName] &&
                formName == 'diabetes_001'
              ) {
                //对症状模块做处理
                this.addComponents[i].formObject = this.formData[formName]
                let symptom = this.formData[formName].symptom
                this.addComponents[i].formObject.symptom = JSON.parse(
                  symptom || '[]'
                )
              } else {
                this.addComponents[i].formObject = this.formData[formName]
              }

              // 量表字段回显，会触发change校验，所以这里拿到数据渲染页面后，重置验证
              if (this.$refs['form' + i].length > 0) {
                this.$refs['form' + i][0].resetFields()
              }
            }
            this.canRender = true
            this.$forceUpdate()
          }
        }
      )
    },
    // 提交量表
    dataSubmit(callback) {
      //        if(this.valid){
      // console.log(this.formData)
      this.formData.doctorId = parseFloat(this.doctorId)
      this.formData.saveWay = parseFloat(this.saveWay)
      this.formData.planPatientsTimesId = parseFloat(this.planPatientsTimesId)
      this.formData.scaleNo = this.scaleNo
      this.formData.isLine = 2
      this.formData.diabetes_001.symptom = JSON.stringify(
        this.formData.diabetes_001.symptom
      )
      let arrNew = []
      arrNew.push({
        medicineType: '2',
        medicinesName: this.formData.h_s_002.medicinesName,
        dosageDay: this.formData.h_s_002.dosageDay,
        dosageNum: this.formData.h_s_002.dosageNum,
      })
      this.medication = [...this.medication, ...arrNew]
      this.formData.h_s_002 = this.medication
      //判断是否放开敏感字段
      let hasDisabled = false
      this.addComponents.forEach((item, index) => {
        if (item.disabled === true) {
          hasDisabled = true
        }
      })
      postScale(this.domain, this.formData).then((res) => {
        if (res.code == '000000') {
          // let doMsg = (this.saveWay==1) ? '提交成功' : '保存成功';
          // let doMsg = (this.saveWay==1 && hasDisabled === true) ? '非敏感信息提交成功' : '保存成功';
          let doMsg = ''
          if (this.saveWay == 1) {
            if (hasDisabled === true) {
              doMsg = '非敏感信息提交成功'
            } else {
              doMsg = '提交成功'
            }
          } else {
            doMsg = '保存成功'
          }
          this.$message({
            message: doMsg,
            type: 'success',
          })
          if (callback) {
            callback()
          }
          setTimeout(() => {
            this.$router.push({
              path: '/followup/record-manage/record-list',
            })
          }, 1000)
        } else {
          let doMsg = this.saveWay == 1 ? '提交失败，请重试' : '保存失败'
          this.$message({
            message: doMsg,
            type: 'error',
          })
        }
      })
      //        }
      //        this.$emit('checkEnd',false);
    },
    closeDialog(val) {
      this.dialogFormVisible = val
    },
    setMedication(val) {
      this.medication.push({ ...val, medicineType: '1' })
    },
  },
  emits: ['checkEnd'],
}
</script>

<style lang="scss" scoped>
.form-wrap {
  .content-box {
    .title {
      line-height: 60px;
      height: 60px;
      font-weight: bold;
      font-size: 18px;
      border-bottom: 1px dashed #ccc;
      .gray-tip {
        color: #8c8c8c;
        margin-left: 20px;
        font-size: 16px;
      }
    }
  }
}
</style>
