Newer
Older
xc-business-system / src / views / resource / environment / record / setting.vue
<!-- 环境记录单设置 -->
<script name="EnvironmentSetting" lang="ts" setup>
import { ElMessage } from 'element-plus'
import { createEditor } from '@wangeditor/editor'
import type { IEvnConfig, IListQuery, ILocation } from './record-interface'
import { batchAddConfig, delEnvConfig, getEnvConfigList } from '@/api/resource/environment'
import { useCheckList } from '@/commonMethods/useCheckList'
import { useSetAllRowReadable } from '@/commonMethods/useSetAllRowReadable'

const router = useRouter()

const listQuery = {
  id: '',
  limit: 1000,
  offset: 1,
}

const configColumns = [
  { text: '记录地点', value: 'locationName', align: 'center', required: true, width: '300' },
  { text: '记录时间', value: 'recordTimeListStr', align: 'center', required: true },
] // 表头

const envConfigList = ref<Array<IEvnConfig>>([])

// 表格被选中的行
const locationSelected = ref<IEvnConfig[]>([])

const locationList = ref<Array<ILocation>>([])

const configRecord: IEvnConfig = {
  locationId: '',
  locationName: '',
  recordTimeList: [],
  editable: true,
  pickTime1: '',
  pickTime2: '',
  pickTime3: '',
  pickTime4: '',
}

// 逻辑
const resetForm = () => {
  router.go(-1)
}

const initEnvConfig = () => {
  getEnvConfigList(listQuery).then((res) => {
    if (res.code === 200) {
      envConfigList.value = res.data.map((item: IEvnConfig) => {
        return {
          ...item,
          recordTimeListStr: item.recordTimeList.toString().replaceAll(',', '\t/\t'),
          pickTime1: item.recordTimeList.length > 0 ? item.recordTimeList[0] : '',
          pickTime2: item.recordTimeList.length > 1 ? item.recordTimeList[1] : '',
          pickTime3: item.recordTimeList.length > 2 ? item.recordTimeList[2] : '',
          pickTime4: item.recordTimeList.length > 3 ? item.recordTimeList[3] : '',
        }
      })
    }
  })
}

const containsLocation = (list: Array<IEvnConfig>, location: string) => {
  const target = list.filter(item => item.locationId === location)
  return target.length !== 0
}

const getLocationNameById = (list: Array<ILocation>, locationId: string) => {
  const target = list.filter(item => item.id === locationId)
  if (target.length > 0) {
    return target.at(0)?.locationName
  }
  else {
    return ''
  }
}

const jointRecordTime = (obj: IEvnConfig) => {
  if (obj.editable === true) {
    const arr = ref<Array<string>>([])
    if (obj.pickTime1 !== '') { arr.value.push(obj.pickTime1!) }
    if (obj.pickTime2 !== '') { arr.value.push(obj.pickTime2!) }
    if (obj.pickTime3 !== '') { arr.value.push(obj.pickTime3!) }
    if (obj.pickTime4 !== '') { arr.value.push(obj.pickTime4!) }

    return arr
  }
  else {
    return obj.recordTimeList
  }
}

const jointRecordTimeStr = (obj: IEvnConfig) => {
  if (obj.editable === true) {
    const str = ref<string>('')
    if (obj.pickTime1 !== '') { str.value += obj.pickTime1 }
    if (obj.pickTime2 !== '') { str.value += obj.pickTime2 }
    if (obj.pickTime3 !== '') { str.value += obj.pickTime3 }
    if (obj.pickTime4 !== '') { str.value += obj.pickTime4 }

    return str
  }
  else {
    return obj.recordTimeList.toString().replaceAll(',', '\t/\t')
  }
}

const addEditableRow = () => {
  // 判断是否已经有选择过的地点
  locationList.value = locationList.value.map(opts => ({
    ...opts,
    disabled: containsLocation(envConfigList.value, opts.id),
  }))

  //
  envConfigList.value = envConfigList.value.map((item: any) => ({
    ...item,
    locationName: getLocationNameById(locationList.value, item.locationId),
    recordTimeList: jointRecordTime(item),
    recordTimeListStr: jointRecordTimeStr(item),
  }))

  if (useCheckList(envConfigList.value, configColumns, '配置项')) {
    // useSetAllRowReadable(envConfigList.value)
    envConfigList.value.push({ ...configRecord })
  }
}

const saveForm = () => {
  envConfigList.value = envConfigList.value.map((item: any) => ({
    ...item,
    locationName: getLocationNameById(locationList.value, item.locationId),
    recordTimeList: jointRecordTime(item),
    recordTimeListStr: jointRecordTimeStr(item),
  }))

  // 校验数据
  if (useCheckList(envConfigList.value, configColumns, '配置项')) {
    // 筛选需要保存的记录
    const configToSave = ref<Array<IEvnConfig>>([])
    configToSave.value = envConfigList.value.filter((item) => { return item.editable === true })

    // 批量保存
    batchAddConfig(configToSave.value).then((res) => {
      if (res.code === 200) {
        ElMessage.success('环境记录单配置保存成功')
        initEnvConfig()
      }
      else {
        ElMessage.error(`环境记录单配置项保存失败:${res.message}`)
      }
    })
  }
}

const delConfigByLocation = async () => {
  if (locationSelected.value.length === 0) {
    ElMessage.warning('请至少选择一行')
    return
  }

  // 前端界面删除
  envConfigList.value = envConfigList.value.filter(item => locationSelected.value.includes(item) === false)

  // 逐个调用后端接口进行删除
  const locationIdsSelected = ref<string[]>([])
  locationIdsSelected.value = locationSelected.value.map(item => item.locationId)
  locationIdsSelected.value = locationIdsSelected.value.filter(item => item !== '')
  if (locationIdsSelected.value.length > 0) {
    let recDeleted = 0
    await Promise.all(locationIdsSelected.value.map(async (locationId) => {
      await delEnvConfig({ id: locationId }).then((res) => {
        if (res.code !== 200) {
          ElMessage.error(`删除环境记录单配置失败:${res.message}`)
        }
        else {
          recDeleted++
        }
      })
    }))

    if (recDeleted === locationIdsSelected.value.length) {
      ElMessage.success('删除环境记录单配置成功')
    }

    initEnvConfig()
  }
}

const locationMultiSelect = (e: any) => {
  locationSelected.value = e
}

onMounted(() => {
  initEnvConfig()
  locationList.value = JSON.parse(sessionStorage.getItem('envlocationList')!)
})
</script>

<template>
  <app-container>
    <detail-page title="环境记录单(设置)" style="margin-bottom: 20px;">
      <template #btns>
        <el-button type="primary" @click="saveForm()">
          保存
        </el-button>
        <el-button type="info" @click="resetForm()">
          关闭
        </el-button>
      </template>
    </detail-page>

    <el-form ref="configFormRef" label-position="right" label-width="110px" border stripe>
      <table-container title="">
        <template #btns-right>
          <el-button type="primary" @click="addEditableRow">
            增加行
          </el-button>
          <el-button type="info" @click="delConfigByLocation">
            删除行
          </el-button>
        </template>

        <!-- 表格区域 -->
        <el-table :data="envConfigList" border style="width: 100%;" @selection-change="locationMultiSelect">
          <el-table-column type="selection" align="center" width="38" />
          <el-table-column align="center" label="序号" width="55" type="index" />
          <el-table-column
            v-for="item in configColumns"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            :width="item.width"
            align="center"
          >
            <template #header>
              <span>{{ item.text }}</span>
            </template>
            <template #default="scope">
              <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>

              <el-select v-else-if="item.value === 'locationName'" v-model="scope.row.locationId" style="width: 100%;" placeholder="请选择记录地点">
                <el-option v-for="loca in locationList" :key="loca.id" :label="loca.locationName" :value="loca.id" :disabled="loca.disabled" />
              </el-select>

              <template v-else-if="item.value === 'recordTimeListStr'">
                <el-time-picker v-model="scope.row.pickTime1" style="width: 25%; padding: 0 5px;" value-format="HH:mm:ss" :default-value="new Date(0, 0, 0, 8, 0, 0)" />
                <el-time-picker v-model="scope.row.pickTime2" style="width: 25%; padding: 0 5px;" value-format="HH:mm:ss" :default-value="new Date(0, 0, 0, 10, 0, 0)" />
                <el-time-picker v-model="scope.row.pickTime3" style="width: 25%; padding: 0 5px;" value-format="HH:mm:ss" :default-value="new Date(0, 0, 0, 14, 0, 0)" />
                <el-time-picker v-model="scope.row.pickTime4" style="width: 25%; padding: 0 5px;" value-format="HH:mm:ss" :default-value="new Date(0, 0, 0, 16, 0, 0)" />
              </template>

              <el-input v-else v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input" />
            </template>
          </el-table-column>
        </el-table>
      </table-container>
    </el-form>
  </app-container>
</template>