Newer
Older
Nanping_sponge_GCYPG / src / views / preassess / evaluation / operate.vue
@liyingjing liyingjing on 25 Oct 2023 8 KB 工程预评估
<template>
  <el-dialog
    class="dialog"
    v-model="visible"
    :title="`${opts.text}项目工程预评估`"
    :close-on-click-modal="false"
    width="70%"
    :before-close="close"
  >
    <el-card class="box-card">
      <template #header>
        <div class="card-header">
          <span>项目目标</span>
        </div>
      </template>
      <el-form class="form" ref="targetForm" :model="form">
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="建设工程:" prop="projectNo">
              <el-select
                v-model="form.projectNo"
                placeholder="建设工程"
                v-if="opts.type === 'add'"
              >
                <el-option
                  v-for="item in list"
                  :label="item.projectName"
                  :value="item.projectNo"
                  :key="item.projectNo"
                  @click="selectChange(item)"
                />
              </el-select>
              <span v-else>{{ form.projectName }}</span>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="工程类型:" prop="engineeringType">
              <span>{{ findText('sponge_engineering_type', form.engineeringType) }}</span>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="建设分区:" prop="drainagePartition">
              <span>{{ findText('drainage_partition', form.drainagePartition) }}</span>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="建设类型:" prop="buildCategory">
              <span>{{ findText('build_category', form.buildCategory) }}</span>
            </el-form-item></el-col>
          <el-col :span="8">
            <el-form-item label="年径流总量控制率%,≥:" prop="targetAnnualRunoffTotalControlRate">
              <span>{{ form.targetAnnualRunoffTotalControlRate }}</span>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="年径流污染控制率%,≥:" prop="targetAnnualRunoffPollutionControlRate">
              <span>{{ form.targetAnnualRunoffPollutionControlRate }}</span>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="8">
            <el-form-item label="调蓄量是否达标:" prop="storageCapacityStandards">
              <el-tag
                v-if="standardMap.get(form.storageCapacityStandards)?.text"
                :type="standardMap.get(form.storageCapacityStandards)?.type"
              >{{ standardMap.get(form.storageCapacityStandards)?.text }}</el-tag>
              <span v-else></span>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="污染去除率是否达标:" prop="pollutionRemovalStandards">
              <el-tag
                v-if="standardMap.get(form.pollutionRemovalStandards)?.text"
                :type="standardMap.get(form.pollutionRemovalStandards)?.type"
              >{{ standardMap.get(form.pollutionRemovalStandards)?.text }}</el-tag>
              <span v-else></span>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </el-card>
    <!-- 详情显示 -->
    <div class="tabs" v-if="isSelect">
      <el-tabs
        v-model="active"
        type="border-card"
      >
        <el-tab-pane label="控制项" :name="0">
          <Control
            ref="controlRef"
            :key="form.projectNo"
            :project-info="form"
            :id="id"
            :opts="opts"
          />
        </el-tab-pane>
        <el-tab-pane label="评分项" :name="1">
          <Mark
            ref="markRef"
            :key="form.projectNo"
            :project-info="form"
            :id="id"
            :opts="opts"
          />
        </el-tab-pane>
      </el-tabs>
    </div>
    <template #footer v-if="isSelect && opts.type !== 'view'">
      <div class="dialog-footer">
        <div class="btns">
          <el-button type="primary" @click="submit">保存</el-button>
          <el-button type="primary" v-show="form.rowId" @click="handleOk">提交</el-button>
          <el-button @click="close">取消</el-button>
        </div>
      </div>
    </template>
  </el-dialog>
</template>

<script setup>
import { ref, reactive, onMounted, toRef, computed, nextTick } from 'vue'
import Control from './control.vue'
import Mark from './mark.vue'
import {
  getFacilitiesStandardCalcList,
  projectPreEvaluateAdd,
  projectPreEvaluateDetails,
  projectPreEvaluateSubmit
} from '@/api/preassess/evaluation'
import { inheritAttr } from '@/utils/v3'
const { proxy } = getCurrentInstance();
const emit = defineEmits(['update:modelValue', 'close'])
const props = defineProps({
  id: {
    type: [String, Number],
    default: ''
  },
  opts: {
    type: Object,
    default: () => {}
  },
  modelValue: {
    type: Boolean,
    default: false
  }
})
const { id, opts } = props

const { build_category } = proxy.useDict("build_category")
const { drainage_partition } = proxy.useDict("drainage_partition")
const { sponge_engineering_type } = proxy.useDict("sponge_engineering_type")
const dicts = {
  build_category,
  drainage_partition,
  sponge_engineering_type
}
const findText = (prop, type) => {
  const item = dicts[prop].value.find(it => it.value === type)
  return item?.label || ''
}
const isShowDialog = toRef(props, 'modelValue')
const visible = computed({
  get() {
    return isShowDialog.value
  },
  set(value) {
    emit('update:modelValue', value)
  }
})

const form = reactive({
  id: '',
  rowId: id,
  projectNo: '',
  projectName: '',
  buildCategory: '',
  engineeringType: '',
  drainagePartition: '',
  targetAnnualRunoffTotalControlRate: '',
  targetAnnualRunoffPollutionControlRate: '',
  storageCapacityStandards: '',
  pollutionRemovalStandards: '',
})
const active = ref(0)
const list = ref([])

const standardMap = new Map([
  [0, { text: '否', type: 'danger' }],
  [1, { text: '是', type: 'success' }]
])

const isSelect = ref(false)
const isSubmit = ref(false)

const close = () => {
  visible.value = false
  emit('close', {
    type: opts.type,
    isSubmit: isSubmit.value
  })
}

const submit = async () => {
  console.log('submit!!!')
  const params = {
    id: form.rowId,
    calcId: form.id,
    projectNo: form.projectNo,
    evaluateAssessControllerItemSaveRequestList: proxy.$refs.controlRef.treeData,
    evaluateAssessGradeItemSaveRequestList: proxy.$refs.markRef.treeData
  }
  const res = await projectPreEvaluateAdd(params)
  if(res?.code !== 200) return
  if(!form.rowId) form.rowId = res.data
  isSubmit.value = true
  proxy.$modal.msgSuccess('操作成功')
}

const handleOk = async () => {
  const formData = new FormData()
  formData.append('id', form.rowId)
  const res = await projectPreEvaluateSubmit(formData)
  if(res?.code !== 200) return
  isSubmit.value = true
  proxy.$modal.msgSuccess('操作成功')
  close()
}

const selectChange = (item) => {
  isSelect.value = true
  inheritAttr(item, form)
  active.value = 0
}

const getList = async () => {
  const res = await getFacilitiesStandardCalcList({ status: '2' })
  if(res?.code !== 200) return
  list.value = res.data
}

const getDetail = async () => {
  const res = await projectPreEvaluateDetails(id)
  if(res?.code !== 200) return
  console.log(res)
  const projectInfo = list.value.find(item => item.projectNo === res.data.projectNo)
  selectChange(projectInfo)
  nextTick(() => {
    proxy.$refs.controlRef.getDetail(res.data.evaluateAssessControllerItemSaveRequestList)
    proxy.$refs.markRef.getDetail(res.data.evaluateAssessGradeItemSaveRequestList)
  })
}

onMounted(async () => {
  await getList()
  if(id) getDetail()
})
</script>

<style lang="scss" scoped>
.box-card {
  .card-header {
    font-weight: 700;
    font-size: 18px;
  }

  ::v-deep(.form) {
    .el-form-item {
      margin-bottom: 5px;
    }
  }
}
.tabs {
  margin-top: 20px;
  ::v-deep(.el-tabs) {
    border-radius: 4px;
    box-shadow: 0px 0px 12px rgba(0, 0, 0, .12);
    border: 1px solid #e4e7ed;
    .el-tabs__header {
      background-color: #fff !important;
      font-size: 18px;
      .el-tabs__item {
        height: 48px !important;
        line-height: 48px !important;
        font-size: 16px;
      }
    }
  }
}
</style>