Newer
Older
smart-metering-front / src / views / measure / train / trainLogAdd.vue
MrTan on 23 Dec 2022 15 KB 新建页样式修改增加校验
<script lang="ts" setup name="PlanAdd">
import type { FormInstance } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { IOptions } from './plan_interface'
import userListDialog from './components/userListDialog.vue'
import useUserStore from '@/store/modules/user.ts'
import {
  getListDetail,
  getListLogAdd,
  getListLogDetail,
  getListUpdate,
  getPlanIdList,
} from '@/api/system/plan'

const props = defineProps({
  infoId: {
    type: String,
    default: '',
  },
  buttonType: {
    type: String,
    default: '',
  },
})
const emit = defineEmits(['close'])
const { name } = useUserStore()
const ruleFormRef = ref<FormInstance>()
const formInline = ref({
  improveMethod: '',
  logNo: '',
  preparer: name || '',
  problems: '',
  planId: '',
  remark: '',
  trainAddress: '',
  trainContent: '',
  trainEffect: '',
  trainHour: '',
  trainName: '',
  trainNumber: '',
  trainPerson: '',
  trainStaffList: [],
  trainTime: '',
})
// 主管部门下拉框
const options = ref<IOptions[]>([])
const dialogVisible = ref(false)
// 下面列表用的
const trainList = ref([])
const columns = [
  // { text: '学员名称', value: 'name' },
  { text: '单位名称', value: 'company' },
  { text: '技术职称', value: 'technologyJob' },
  { text: '签到时间', value: 'signTime' },
  { text: '考核结果', value: 'examResult' },
]
// 校验规则
const rules = ref({
  logNo: [{ required: true, message: '编号不能为空', trigger: 'blur' }],
  preparer: [{ required: true, message: '填表人不能为空', trigger: 'blur' }],
  planId: [{ required: true, message: '计划编号必选', trigger: 'blur' }],
  trainName: [{ required: true, message: '培训名称不能为空', trigger: 'blur' }],
  trainPerson: [{ required: true, message: '培训对象不能为空', trigger: 'blur' }],
  trainNumber: [{ required: true, message: '培训人数不能为空', trigger: 'blur' }],
  trainHour: [{ required: true, message: '培训学时不能为空', trigger: 'blur' }],
  trainTime: [{ required: true, message: '培训时间不能为空', trigger: 'blur' }],
  trainAddress: [{ required: true, message: '培训地点不能为空', trigger: 'blur' }],
  trainEffect: [{ required: true, message: '培训效果不能为空', trigger: 'blur' }],
  problems: [{ required: true, message: '存在问题不能为空', trigger: 'blur' }],
  improveMethod: [{ required: true, message: '改进措施不能为空', trigger: 'blur' }],
}) // 表单验证规则
const userListRef = ref()
const addPersonList = ref({
  company: '',
  examResult: '',
  name: '',
  remark: '',
  signTime: '',
  technologyJob: '',
  planId: 0,
  staffId: 0,
})
const SelectionList = ref([])
const ListDetail = ref([])
// 控制是否显示输入框开关
const isNameShow = ref(true)
// 获取到组织信息
const getDept = () => {
  const params = {
    createTime: '',
    deptId: 0,
    director: '',
    effectiveCompany: '',
    trainTime: '',
  }
  getPlanIdList(params).then((response) => {
    options.value = response.data
  })
}
getDept()
const close = () => {
  emit('close')
}
const addRoow = () => {
  if (formInline.value.planId === '') {
    return ElMessage.warning('还未选择计划编号')
  }
  const object = {
    company: '',
    examResult: '',
    name: '',
    remark: '',
    signTime: '',
    technologyJob: '',
    planId: 0,
    staffId: 0,
    isNameShow: false,
  }
  trainList.value.push(object)
}
// 点击关闭
const handleClose = () => {
  dialogVisible.value = false
}
// 选择人员编号
const selectChange = (e: any) => {
  const id = options.value.filter(item => item.id === e)[0].id
  getListDetail({ id }).then((res) => {
    ListDetail.value = res.data.trainStaffList
    res.data.preparer = name
    formInline.value = { ...res.data }
    formInline.value.planId = e
  })
}
// 删除行
const deleteList = () => {
  trainList.value = trainList.value.filter(
    (item) => {
      return !SelectionList.value.includes(item)
    },
  )
}
const handleSelectionChange = (e: any) => {
  SelectionList.value = e
}
const addPersonListChange = (e: any) => {
  addPersonList.value = ListDetail.value.filter(item => item.staffId === e)[0]
}
if (props.infoId && props.infoId !== '') {
  getListLogDetail({ id: props.infoId }).then((res) => {
    formInline.value = res.data
    trainList.value = formInline.value.trainStaffList
  })
}
// 双击表格中默认显示的name
const dblclickName = (row: object) => {
  row.isNameShow = true
}
const getAddList = async (formEl: FormInstance | undefined, buttonType: string) => {
  if (buttonType === '提交' && props.buttonType !== '编辑') {
    if (!formEl) { return }
    await formEl.validate((valid, fields) => {
      if (valid) {
        ElMessageBox.confirm(
    `确认${buttonType}吗?`,
    '提示',
    {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    },
        ).then(() => {
          getListLogAdd(formInline.value).then((res) => {
            if (res.code === 200) {
              close()
            }
          })
        })
      }
    })
  }
  else if (buttonType === '提交' && props.buttonType === '编辑') {
    formInline.value.trainStaffList = trainList.value
    formInline.value.trainStaffList.map((item) => {
      delete item.updateTime
      delete item.createTime
    })
    formInline.value.id = props.infoId
    getListUpdate(formInline.value).then((res) => {
      if (res.code === 200) {
        close()
      }
    })
  }
  else {
    // 打印
    const printObj = ref({
      id: 'print', // 需要打印元素的id
      popTitle: '证书报告模板', // 打印配置页上方的标题
      extraHead: '', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割
      preview: false, // 是否启动预览模式,默认是false
      standard: '',
      extarCss: '',
    })
  }
}
const listIndex = ref(0)
// 选择人员
const selectPerson = (index: number) => {
  userListRef.value.initDialog()
  listIndex.value = index
}
// 选择完负责人的函数
const confirmPerson = (object: object) => {
  if (!trainList.value.includes(object)) {
    trainList.value[listIndex.value] = object
  }
  else {
    ElMessage.warning('该学员已经存在')
    trainList.value.splice(listIndex.value, 1)
  }
}
</script>

<template>
  <app-container>
    <detail-page :title="`培训记录-${buttonType}`">
      <template #btns>
        <el-button
          v-if=" buttonType !== '详情'"
          type="primary"
          @click="getAddList(ruleFormRef, '提交')"
        >
          提交
        </el-button>
        <el-button v-if=" buttonType === '详情'" v-print="printObj" type="primary" @click="getAddList(ruleFormRef, '打印')">
          打印
        </el-button>
        <el-button v-if=" buttonType === '详情'" type="primary" @click="buttonType = '编辑'">
          编辑
        </el-button>
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <el-form
        ref="ruleFormRef"
        :model="formInline"
        class="demo-form-inline"
        label-position="right"
        label-width="100"
        :rules="rules"
      >
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="编号:" prop="logNo">
              <el-input
                v-model="formInline.logNo"
                :placeholder="buttonType === '详情' ? '无' : '请输入编号'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="填表人:" prop="preparer">
              <el-input
                v-model="formInline.preparer"
                :placeholder="buttonType === '详情' ? '无' : '请输入填表人'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <span v-if="infoId === ''">
              <el-form-item label="计划编号:" prop="planId">
                <el-select
                  v-model="formInline.planId"
                  clearable
                  placeholder="计划编号"
                  size="default"
                  :disabled="buttonType === '详情'"
                  @change="selectChange"
                >
                  <el-option
                    v-for="item in options"
                    :key="item.id"
                    :label="item.planName"
                    :value="item.id"
                  />
                </el-select>
              </el-form-item>
            </span>
          </el-col>
          <el-col :span="6">
            <el-form-item label="培训名称:" prop="trainName">
              <el-input
                v-model="formInline.trainName"
                :placeholder="buttonType === '详情' ? '无' : '请输入培训名称'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="培训对象:" prop="trainPerson">
              <el-input
                v-model="formInline.trainPerson"
                :placeholder="buttonType === '详情' ? '无' : '请输入培训对象'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="培训人数:" prop="trainNumber">
              <el-input
                v-model="formInline.trainNumber"
                :placeholder="buttonType === '详情' ? '无' : '请输入培训人数'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="培训学时:" prop="trainHour">
              <el-input
                v-model="formInline.trainHour"
                :placeholder="buttonType === '详情' ? '无' : '请输入培训学时'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="培训时间:" prop="trainTime">
              <el-date-picker
                v-model="formInline.trainTime"
                type="datetime"
                placeholder="培训时间"
                format="YYYY/MM/DD HH:mm:ss"
                value-format="YYYY-MM-DD h:m:s"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="培训地点:" prop="trainAddress">
              <el-input
                v-model="formInline.trainAddress"
                :placeholder="buttonType === '详情' ? '无' : '请输入培训地点'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="培训效果:" prop="trainEffect">
              <el-input
                v-model="formInline.trainEffect"
                :placeholder="buttonType === '详情' ? '无' : '请输入培训效果'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="存在问题:" prop="problems">
              <el-input
                v-model="formInline.problems"
                :placeholder="buttonType === '详情' ? '无' : '请输入存在问题'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="改进措施:" prop="improveMethod">
              <el-input
                v-model="formInline.improveMethod"
                :placeholder="buttonType === '详情' ? '无' : '请输入改进措施'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="备注:">
              <el-input
                v-model="formInline.remark"
                :placeholder="buttonType === '详情' ? '无' : '请输入备注'"
                :disabled="buttonType === '详情'"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-page>
    <detail-block title="人员信息">
      <template #btns>
        <el-button v-if="buttonType !== '详情'" type="info" :disabled="buttonType === '详情'" @click="deleteList">
          删除行
        </el-button>
        <el-button v-if="buttonType !== '详情'" type="primary" :disabled="buttonType === '详情'" @click="addRoow">
          增加行
        </el-button>
      </template>
      <el-table
        :data="trainList"
        border
        style="width: 100%;"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" />
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column align="center" label="学员名称">
          <template #default="scope">
            <span v-show="!scope.row.isNameShow" style="color: gray;" @dblclick="dblclickName(scope.row)">{{ scope.row.name || '双击选择' }}</span>
            <el-input v-show="scope.row.isNameShow" v-model="scope.row.name" placeholder="请选择" class="input">
              <template #append>
                <el-button size="small" :disabled="buttonType === '详情'" @click="selectPerson(scope.$index)">
                  选择
                </el-button>
              </template>
            </el-input>
          </template>
        </el-table-column>
        <el-table-column v-for="(item, index) in columns" :key="index" align="center" :label="item.text" :prop="item.value" />
      </el-table>
    </detail-block>
  </app-container>
  <!-- 选择用户列表组件 -->
  <user-list-dialog ref="userListRef" :list="formInline.trainStaffList" @add="confirmPerson" />
</template>

<style lang="scss" scoped>
.top-info {
  width: 100%;
  height: 50px;
  padding-right: 10px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-radius: 10px;
  background-color: #fff;

  .title {
    width: 75%;
    text-align: center;
  }
}

.info-content {
  margin-top: 10px;
  padding: 30px;
  border-radius: 10px;
  background-color: #fff;

  .info-dizhi {
    margin-right: 155px;
  }
}

.input-width .el-input {
  width: 30vw;
}

.table-top {
  margin-top: 10px;
  padding: 5px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-radius: 10px;
  background-color: #fff;

  .table-top-title {
    width: 60vw;
    text-align: center;
  }
}

.dialog-button {
  margin-left: 50%;
  transform: translateX(-50%);
}
</style>