Newer
Older
KaiFengPC / src / views / preassess / calculate / operate.vue
@zhangdeliang zhangdeliang on 23 May 11 KB 初始化项目
<template>
  <el-dialog
    class="dialog"
    v-model="visible"
    :title="`${opts.text}达标测算`"
    :close-on-click-modal="false"
    width="70%"
    :before-close="close"
  >
    <!-- 详情显示 -->
    <div class="details" v-if="opts.type === 'view' && componentName">
      <el-tabs :model-value="active" @tab-change="tabChange">
        <el-tab-pane label="目标调蓄量" :name="0">
          <project :data="form" :disabled="true" :opts="opts" :list="list" />
          <storageCapacity ref="storageCapacityRef" :id="id" :opts="opts" :project-info="form" :disabled="true" />
        </el-tab-pane>
        <el-tab-pane label="达标测算" :name="1" v-if="status * 1 >= 1">
          <project :data="form" :disabled="true" :opts="opts" :list="list" />
          <standardMeasurement ref="standardMeasurementRef" :id="id" :opts="opts" :project-info="form" :disabled="true" :status="status" />
        </el-tab-pane>
        <el-tab-pane label="达标总览" :name="2" v-if="status * 1 >= 1">
          <overview v-if="loadoverview" ref="overviewRef" :id="id" :overview-data="overviewData" :facilityStorageCapacity="facilityStorageCapacity" />
        </el-tab-pane>
      </el-tabs>
    </div>
    <!-- 新增修改显示 -->
    <div class="editOrAdd" v-else-if="opts.type !== 'view'">
      <div class="steps">
        <el-steps :active="active" finish-status="success" align-center>
          <el-step title="目标调蓄量" :class="{ pointer: isSubmit }" @click="view('storageCapacity')" />
          <el-step title="达标测算" :class="{ pointer: isSubmit }" @click="view('standardMeasurement')" />
          <el-step title="达标总览" :class="{ pointer: isSubmit }" @click="view('overview')" />
          <el-step title="提交" />
        </el-steps>
      </div>
      <project
        :data="form"
        v-show="['storageCapacity', 'standardMeasurement'].includes(componentName)"
        :disabled="selectDisabled"
        @select-change="selectChange"
        :opts="opts"
        :list="list"
      />
      <div class="stepMain" v-if="componentName">
        <div class="storageCapacityBox" v-show="componentName === 'storageCapacity'">
          <el-button v-if="opts.type === 'edit'" class="refresh" type="primary" size="small" @click="refreshClick">同步数据模版</el-button>
          <storageCapacity
            ref="storageCapacityRef"
            :key="form.projectNo"
            :id="id"
            :opts="opts"
            :project-info="form"
            :disabled="isSubmit"
            @success="onSuccess"
            @set-computed-disabled="onSetComputedDisabled"
          />
        </div>
        <div class="standardMeasurementBox" v-show="componentName === 'standardMeasurement'">
          <standardMeasurement
            ref="standardMeasurementRef"
            :id="id"
            :opts="opts"
            :project-info="form"
            :disabled="isSubmit"
            :status="status"
            @success="onSuccess"
            @set-computed-disabled="onSetComputedDisabled"
          />
        </div>
        <div class="overviewBox" v-if="componentName === 'overview'">
          <overview ref="overviewRef" :id="id" :overview-data="overviewData" :facilityStorageCapacity="facilityStorageCapacity" @success="onSuccess" />
        </div>
      </div>
    </div>
    <template #footer v-if="componentName && !isSubmit && opts.type !== 'view'">
      <div class="dialog-footer">
        <!-- <el-button type="primary">导入</el-button> -->
        <el-button type="primary" @click="computedHandle" :disabled="computedDisabled" v-show="active < 2">计算</el-button>
        <el-button type="primary" @click="previous" v-show="active > 0">上一步</el-button>
        <el-button type="primary" @click="next" v-show="schedule[active] === 'fulfilled'">下一步</el-button>
        <el-button type="primary" @click="submit" v-show="active > 1">提交</el-button>
        <el-button @click="close">取消</el-button>
      </div>
    </template>
  </el-dialog>
</template>

<script setup>
import { ref, reactive, onMounted, toRef, computed, nextTick } from 'vue';
import project from './project.vue';
import storageCapacity from './storageCapacity.vue';
import standardMeasurement from './standardMeasurement.vue';
import overview from './overview.vue';
import { inheritAttr } from '@/utils/v3';
import { getFacilitiesStandardCalcInfo, getProjectBuildTargetConfigList, facilitiesStandardCalcSubmit } from '@/api/preassess/calculate';
const { proxy } = getCurrentInstance();
const componentNameMap = new Map([
  [0, 'storageCapacity'],
  [1, 'standardMeasurement'],
  [2, 'overview'],
]);
// 指定的动态组件
let componentName = ref('');
const emit = defineEmits(['update:modelValue', 'close']);
const props = defineProps({
  id: {
    type: [String, Number],
    default: '',
  },
  status: {
    type: String,
    default: '',
  },
  opts: {
    type: Object,
    default: () => {},
  },
  modelValue: {
    type: Boolean,
    default: false,
  },
});
const { id, opts, status } = props;
const isShowDialog = toRef(props, 'modelValue');
const visible = computed({
  get() {
    return isShowDialog.value;
  },
  set(value) {
    emit('update:modelValue', value);
  },
});

const form = reactive({
  projectNo: '',
  projectName: '',
  engineeringType: '',
  buildCategory: '',
  drainagePartition: '',
  area: '',
  annualRunoffTotalControlRate: '',
  annualRunoffPollutionControlRate: '',
  hardGroundRate: '',
  designRainfall: '',
});

const active = ref(0);

const list = ref([]);

const isSubmit = ref(false);
const schedule = reactive({
  0: 'pending',
  1: 'pending',
  2: 'pending',
});
const overviewData = ref({});
const facilityStorageCapacity = ref('')
let submitData = {};
const details = ref({});
const computedDisabled = ref(false);
const selectDisabled = computed(() => {
  return schedule[0] === 'fulfilled';
});
const loadoverview = ref(false);

const next = () => {
  if (active.value === 2) {
    active.value = 4;
  } else {
    active.value++;
    componentName.value = componentNameMap.get(active.value);
  }
};

const previous = () => {
  if (active.value === 0) return;
  if (active.value === 4) {
    active.value = 1;
  } else {
    active.value--;
  }
  componentName.value = componentNameMap.get(active.value);
};

const selectChange = item => {
  inheritAttr(item, form);
  componentName.value = componentNameMap.get(active.value);
  nextTick(() => {
    proxy.$refs.storageCapacityRef.getList();
    proxy.$refs.standardMeasurementRef.getList();
  });
};

const computedHandle = () => {
  console.log('计算当前结果');
  switch (active.value) {
    case 0:
      proxy.$refs.storageCapacityRef.submit();
      break;
    case 1:
      proxy.$refs.standardMeasurementRef.submit();
      break;
    default:
      break;
  }
};

const close = () => {
  visible.value = false;
  componentName.value = '';
  active.value = 0;
  emit('close', opts.type);
};

const onSuccess = (result = {}) => {
  if (active.value === 0) {
    schedule[0] = 'fulfilled';
    schedule[1] = 'pending';
    schedule[2] = 'pending';
    const data = proxy.$refs.storageCapacityRef.form;
    proxy.$refs.standardMeasurementRef.setFormData(data);
    proxy.$refs.standardMeasurementRef.setTable();
  } else if (active.value === 1) {
    schedule[1] = 'fulfilled';
    schedule[2] = 'pending';
    submitData = result;
    overviewData.value = result?.reasonablenessOverview || {};
    facilityStorageCapacity.value = result?.facilityStorageCapacity
  }
};

const onSetComputedDisabled = disabled => {
  computedDisabled.value = disabled;
};

const getDetailInfo = async () => {
  const res = await getFacilitiesStandardCalcInfo(id);
  console.log(res);
  if (res?.code !== 200) return;
  if (res.data.status === '0') {
    res.data.standardCalcFacilitiesPolluteRemoveSaveRequestList = [];
    for (const key in res.data) {
      if (Object.hasOwnProperty.call(res.data, key)) {
        if (
          [
            'facilityStorageCapacity',
            'storageCapacityStandards',
            'facilityStorageCapacityToAnnualRunoffTotalControlRate',
            'pollutionRemovalRate',
            'pollutionRemovalStandards',
          ].includes(key)
        ) {
          res.data[key] = '';
        }
      }
    }
  }
  details.value = res.data;
  const item = list.value.find(it => it.projectNo === res.data.projectNo);
  inheritAttr(item, form);
  componentName.value = componentNameMap.get(active.value);
  if (status === '0') {
    schedule[0] = 'fulfilled';
  } else if (status === '1') {
    schedule[0] = 'fulfilled';
    schedule[1] = 'fulfilled';
  } else if (status === '2') {
    schedule[0] = 'fulfilled';
    schedule[1] = 'fulfilled';
    schedule[2] = 'fulfilled';
  }
  submitData = res.data;
  overviewData.value = res.data?.reasonablenessOverview;
  facilityStorageCapacity.value = res.data?.facilityStorageCapacity;
  nextTick(() => {
    proxy.$refs.storageCapacityRef.getList(details.value);
    if (proxy.$refs.standardMeasurementRef) {
      proxy.$refs.standardMeasurementRef.getList(details.value);
    }
  });
};

const getList = async () => {
  const res = await getProjectBuildTargetConfigList();
  console.log(res);
  if (res?.code !== 200) return;
  list.value = res.data;
  if (opts.type === 'add' && list.value.length) {
    selectChange(list.value[0]);
  }
};

const view = name => {
  if (isSubmit.value) {
    componentName.value = name;
  }
};

const submit = async () => {
  active.value += 2;
  schedule[2] = 'fulfilled';
  isSubmit.value = true;
  const res = await facilitiesStandardCalcSubmit(submitData);
  if (res?.code !== 200) return;
  setTimeout(() => {
    close();
  }, 500);
};

const tabChange = tab => {
  active.value = tab;
  nextTick(() => {
    loadoverview.value = active.value === 2;
  });
};

const refreshClick = () => {
  proxy.$modal
    .confirm('同步数据后需要重新计算,是否同步数据?')
    .then(() => {
      proxy.$refs.storageCapacityRef.heavyLoad()
      proxy.$refs.standardMeasurementRef.heavyLoad()
      active.value = 0
      schedule[0] = 'pending'
      schedule[1] = 'pending'
      schedule[2] = 'pending'
    })
    .catch((error) => {
      console.log(error)
    })
}

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

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

  :deep(.form) {
    .el-form-item {
      margin-bottom: 5px;
    }
  }
}
.steps {
  width: 70%;
  margin: 20px auto;
  :deep(.el-step) {
    position: relative;
    .el-step__head {
      .el-step__line {
        left: 88%;
      }
    }
    .el-step__main {
      position: absolute;
      left: calc(50% + 20px);
      top: 4px;
      line-height: 1;
      .el-step__title {
        font-size: 14px;
        line-height: 1;
      }
    }

    &:nth-of-type(1) {
      .el-step__head {
        .el-step__line {
          left: 94%;
        }
      }
    }
  }
}
.pointer {
  cursor: pointer;
}
.details {
  margin-top: 20px;
  :deep(.el-tabs) {
    border-radius: 4px;
    box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);
    .el-tabs__header {
      font-size: 18px;
      .el-tabs__item {
        height: 48px !important;
        line-height: 48px !important;
        font-size: 16px;
      }
    }
  }
}
.storageCapacityBox {
  position: relative;
  .refresh {
    position: absolute;
    right: 10px;
    top: 10px;
  }
}
</style>