Newer
Older
smart-metering-front / src / views / business / lab / environmental / environmentalAdd.vue
<!-- 环境记录单详情 -->
<script lang="ts" setup name="EnvironmentalList">
import type { FormInstance } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import dayjs from 'dayjs'
import type { IEnvironmentalDetail, IRoomNumber } from './environmentalList_interface'
import { getTypeSelect } from '@/api/system/price'
import { getEnvironmentRecordAdd, getEnvironmentRecordDetail, getEnvironmentRecordUpdate } from '@/api/business/lab/environmentRecord'
import useUserStore from '@/store/modules/user'
const { proxy } = getCurrentInstance() as any
const infoId = ref('') // id
const { name, id } = useUserStore() // 用户名、id
const pageType = ref('add') // 页面类型: add,edit, detail
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
} // 字典
// 从路由中获取页面类型参数
const $route = useRoute()
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}
// 表单
const formInline = ref<IEnvironmentalDetail>({
  environmentCode: '', // 环境记录单编号
  roomNumber: '', // 房间编号
  recorder: name || '', // 用户名
  temperature: '', // 温度
  humidity: '', // 湿度
  outputVoltage: '', // 输出电压
  zeroGroundVoltage: '', // 零地电压
  remark: '', // 备注
  recordTime: dayjs(`${new Date()}`).format('YYYY-MM-DD hh:mm:ss'), // 记录时间
  createUser: id || '', // 记录人id
  createTime: '', // 创建时间
  id: '', // 主键
  updateTime: '', // 更新时间
})
const ruleFormRef = ref<FormInstance>() // 表单ref

// 房间号模拟下拉框数据
const selectionList = ref<IRoomNumber[]>([])
// 获取下拉框数据
getTypeSelect('roomNumber').then((res) => {
  selectionList.value = res.data
})

// 校验规则
const rules = ref({
  roomNumber: [{ required: true, message: '房间号必填', trigger: ['blur', 'change'] }],
  recorder: [{ required: true, message: '记录人必填', trigger: ['blur', 'change'] }],
  recordTime: [{ required: true, message: '记录时间必填', trigger: ['blur', 'change'] }],
  humidity: [{ required: true, message: '湿度(%)必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '湿度(%)只能为数字', trigger: ['blur', 'change'] },
  ],
  temperature: [{ required: true, message: '温度(℃)必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '温度(℃)只能为数字', trigger: ['blur', 'change'] },
  ],
  outputVoltage: [{ required: true, message: '输出电压(V)必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '输出电压(V)只能为数字', trigger: ['blur', 'change'] },
  ],
  zeroGroundVoltage: [{ required: true, message: '零地电压(V)必填', trigger: ['blur', 'change'] },
    { pattern: /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/, message: '零地电压(V)只能为数字', trigger: ['blur', 'change'] },
  ],
}) // 表单验证规则

// 初始化router
const $router = useRouter()
// 关闭新增页面的回调
const close = () => {
  $router.back()
}

// 获取详情信息
if (infoId.value && infoId.value !== '') {
  getEnvironmentRecordDetail({ id: infoId.value }).then((res) => {
    if (res.code === 200) {
      formInline.value = res.data
    }
  })
}
// 点击保存
const saveForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      ElMessageBox.confirm('确认保存吗?', '提示', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning',
      }).then(() => {
        // 新增
        if (pageType.value === 'add') {
          getEnvironmentRecordAdd(formInline.value).then((res) => {
            if (res.code === 200) {
              ElMessage.success('保存成功!')
              close()
            }
          })
        }
        // 编辑
        else if (pageType.value === 'edit') {
          getEnvironmentRecordUpdate(formInline.value).then((res) => {
            if (res.code === 200) {
              ElMessage.success('保存成功!')
              close()
            }
          })
        }
      })
    }
  })
}
// 打印
const printObj = ref({
  id: 'form', // 需要打印元素的id
  popTitle: '环境记录单详情', // 打印配置页上方的标题
  extraHead: '<div style="display: flex;flex-direction: column;text-align: center"><h3>环境记录单详情</h3></div>', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割
  preview: false, // 是否启动预览模式,默认是false
  standard: '',
  extarCss: '',
})
</script>

<template>
  <app-container>
    <detail-page :title="`环境记录单-${textMap[pageType]}`">
      <template #btns>
        <el-button
          v-if="proxy.hasPerm('/lab/environmentalList/add') && pageType !== 'detail'"
          type="primary"
          @click="saveForm(ruleFormRef)"
        >
          保存
        </el-button>
        <el-button
          v-if="proxy.hasPerm('/lab/environmentalList/add') && pageType === 'detail'"
          v-print="printObj"
          type="primary"
        >
          打印
        </el-button>
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <el-form
        id="form"
        ref="ruleFormRef"
        :model="formInline"
        class="demo-form-inline"
        :rules="rules"
        label-width="auto"
        label-position="right"
      >
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="记录单号:">
              <el-input
                v-model="formInline.environmentCode"
                :placeholder="pageType === 'detail' ? '无' : '系统自动生成'"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="房间号:" prop="roomNumber">
              <el-select
                v-model="formInline.roomNumber"
                clearable
                filterable
                :placeholder="pageType === 'detail' ? '无' : '请选择房间号'"
                size="default"
                :disabled="pageType === 'detail'"
              >
                <el-option
                  v-for="item in selectionList"
                  :key="item.value"
                  :label="item.name"
                  :value="item.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="记录人:" prop="recorder">
              <el-input
                v-model="formInline.recorder"
                :placeholder="pageType === 'detail' ? '无' : '请输入记录人'"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="记录时间:" prop="recordTime">
              <el-date-picker
                v-model="formInline.recordTime"
                type="datetime"
                :placeholder="pageType === 'detail' ? '无' : '请选择记录时间'"
                format="YYYY-MM-DD HH:mm:ss"
                value-format="YYYY-MM-DD HH:mm:ss"
                clearable
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="温度(℃):" prop="temperature">
              <el-input
                v-model="formInline.temperature"
                :placeholder="pageType === 'detail' ? '无' : '请输入温度(℃)'"
                :disabled="pageType === 'detail'"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="湿度(%):" prop="humidity">
              <el-input
                v-model="formInline.humidity"
                :placeholder="pageType === 'detail' ? '无' : '请输入湿度(%)'"
                :disabled="pageType === 'detail'"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="输出电压(V):" prop="outputVoltage">
              <el-input
                v-model="formInline.outputVoltage"
                :placeholder="pageType === 'detail' ? '无' : '请输入输出电压(V)'"
                :disabled="pageType === 'detail'"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="零地电压(V):" prop="zeroGroundVoltage">
              <el-input
                v-model="formInline.zeroGroundVoltage"
                :placeholder="pageType === 'detail' ? '无' : '请输入零地电压(V)'"
                :disabled="pageType === 'detail'"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-page>
  </app-container>
</template>