| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 | <template>  <CusDialog    :show="show"    :title="titleCpt"    @onClose="$emit('update:show', false)"    width="800px"    max-height="80%"    @onSubmit="onSubmit"    :loading="state.loading"  >    <div class="__cus-dialog-form">      <CusForm ref="ref_form" label-width="100px">        <div class="__cus-title_1">场景设定</div>        <el-col :span="12">          <CusFormColumn            :span="24"            required            label="预警名称"            v-model:param="state.form.name"          />          <CusFormColumn            :span="24"            required            label="预警级别"            v-model:param="state.form.level"            link="select"            :options="DictionaryStore.warningLevelList"          />          <CusFormColumn            :span="24"            required            label="预警模型"            v-model:param="state.modelDetail.name"            :disabled="true"          />        </el-col>        <el-col :span="12">          <CusFormColumn            :span="24"            label="场景描述"            v-model:param="state.form.description"            type="textarea"            :rows="6"          />        </el-col>        <div class="__cus-title_1">参数配置</div>        <div class="params-table" style="width: 100%">          <CusTable            :data="state.paramList"            :table-head="[              {value: 'name', label: '参数'},              {value: 'value', label: '值'},              {value: 'unit', label: '单位'},            ]"            :no-page="true"          >            <template #value-column-value="{scope}">              <CusFormColumn                :required="scope.row.required"                class="__cus-table-form-column"                :span="24"                v-model:param="scope.row.value"                :default-error-msg="'请输入' + scope.row.name"                link="number"                :placeholder="'推荐值:' + scope.row.recommendValue"              />            </template>          </CusTable>        </div>        <div class="__cus-title_1" v-if="state.modelDetail.areaConfig != 0 || state.modelDetail.allowAreaConfig != 0">区域配置</div>        <el-col :span="24" v-if="state.modelDetail.areaConfig != 0">          <el-row>            <CusFormColumn              label-width="140px"              :required="state.modelDetail.areaConfig == 2"              :span="20"              label="预警区域选择"              v-model:param="state.areaIds.warning"              link="select"              multiple              :options="DictionaryStore.warningAreaList.filter(v => !state.areaIds.white.includes(v.id))"              label-key="name"              value-key="id"            />            <el-col :span="4" v-if="state.areaIds.warning.length > 0">              <div class="view-area __hover" @click="onAreaMap(state.areaIds.warning)">查看区域</div>            </el-col>          </el-row>        </el-col>        <el-col :span="24" v-if="state.modelDetail.allowAreaConfig != 0">          <el-row>            <CusFormColumn              label-width="140px"              :required="state.modelDetail.allowAreaConfig == 2"              :span="20"              label="白名单区域选择"              v-model:param="state.areaIds.white"              link="select"              multiple              :options="DictionaryStore.warningAreaList.filter(v => !state.areaIds.warning.includes(v.id))"              label-key="name"              value-key="id"            />            <el-col :span="4" v-if="state.areaIds.white.length > 0">              <div class="view-area __hover" @click="onAreaMap(state.areaIds.white)">查看区域</div>            </el-col>          </el-row>        </el-col>      </CusForm>      <areaMap v-model:show="state.areaMap.show" :transfer="state.areaMap.transfer"/>    </div>  </CusDialog></template><script setup lang="ts">import {computed, getCurrentInstance, nextTick, onMounted, reactive, ref, watch} from "vue";import {useDictionaryStore} from "@/stores";import {ElMessage, ElMessageBox} from "element-plus";import areaMap from './area-map.vue'import {warnModelDetail} from "@/api/modules/web/model";import {warnAreaQueryAll} from "@/api/modules/web/area";import {warnRuleAdd, warnRuleDetail, warnRuleEdit} from "@/api/modules/web/rule";const emit = defineEmits(['update:show', 'refresh'])const {proxy} = getCurrentInstance()const DictionaryStore = useDictionaryStore()const props = defineProps({  show: {default: false},  transfer: {} })const state: any = reactive({  form: {},  loading: false,  areaIds: {    warning: [],    white: [],  },  areaMap: {    show: false,    transfer: {}  },  modelDetail: {},  paramList: [],})const ref_form = ref()const titleCpt = computed(() => {  let t = '查看预警规则'  switch (props.transfer.mode) {    case 'add': t = '新增预警规则'      break    case 'edit': t = '编辑预警规则'      break  }  return t})const onSubmit = () => {  ref_form.value.submit().then(() => {    ElMessageBox.confirm("是否提交?", "提示", {      confirmButtonText: "确定",      cancelButtonText: "取消",      type: "warning",    } as any).then(() => {      state.loading = true      const params = {        enabled: false,        ...state.form,        modelId: props.transfer.modelId,        paramList: state.paramList.map(v => ({id: v.id, value: v.value})),        areaTypeList: []      }      if (state.modelDetail.areaConfig != 0) {        state.areaIds.warning.forEach(v => {          params.areaTypeList.push({id: v, type: 1})        })      }      if (state.modelDetail.allowAreaConfig != 0) {        state.areaIds.white.forEach(v => {          params.areaTypeList.push({id: v, type: 2})        })      }      if (props.transfer.mode == 'add') {        warnRuleAdd(params).then(res => {          if (res.code == 0) {            ElMessage.success('新增成功!')            emit('update:show', false)            emit('refresh')            state.loading = false          } else {            ElMessage.error(res.msg)          }        }).catch(() => {          state.loading = false        })      } else {        warnRuleEdit(params).then(res => {          if (res.code == 0) {            ElMessage.success('编辑成功!')            emit('update:show', false)            emit('refresh')            state.loading = false          } else {            ElMessage.error(res.msg)          }        }).catch(() => {          state.loading = false        })      }    }).catch(() => {})  }).catch((e) => {    ElMessage({      message: e[0].message,      grouping: true,      type: 'warning',    })  })}const initDetail = () => {  warnRuleDetail(proxy.$util.formatGetParam({id: props.transfer.id})).then(res => {    if (res.code == 0) {      state.form = res.data      state.form.areaTypeList.forEach(v => {        if (v.type == 1) {          state.areaIds.warning.push(v.id)        } else {          state.areaIds.white.push(v.id)        }      })      initModel(state.form.modelId)    } else {      ElMessage.error(res.msg)    }  })}const initArea = () => {  warnAreaQueryAll().then(res => {    DictionaryStore.initOtherDict('warningArea', res.data.map(v => {      v.dictLabel = v.name      v.dictValue = v.id      return v    }))  })}watch(() => props.show, (n) => {  if (n) {    state.loading = true    initDictionary()    state.form = {}    state.modelDetail = {}    state.paramList = []    state.areaIds.white = []    state.areaIds.warning = []    if (props.transfer.mode !== 'add') {      initDetail()    } else {      initModel(props.transfer.modelId)    }    nextTick(() => {      ref_form.value.reset()    })  }})const initModel = (id) => {  warnModelDetail(proxy.$util.formatGetParam({id: id})).then(res => {    if (res.code == 0) {      state.modelDetail = res.data      state.paramList = state.modelDetail.paramDictList      if (props.transfer.mode != 'add') {        state.paramList.forEach(v => {          state.form.paramList.forEach(v2 => {            if (v.id == v2.id) {              v.value = v2.value            }          })        })      }      state.loading = false    } else {      ElMessage.error(res.msg)    }  })}const onAreaMap = (areas) => {  state.areaMap.transfer = {    areas: areas  }  state.areaMap.show = true}onMounted(() => {  initArea()})const initDictionary = () => {  // DictionaryStore.initDict('format_type')}</script><style lang="scss" scoped>.__cus-title_1 {  margin-bottom: 20px;}.params-table {  margin-bottom: 20px;}.view-area {  line-height: 40px;  margin-left: 20px;  font-weight: 400;  font-size: 16px;  color: #81AFFF;}</style>
 |