Newer
Older
xc-business-system / src / views / system / baseInfo / templateRegister / detail.vue
dutingting on 28 Jun 20 KB bug修复、细节功能优化
<!-- 文件模板注册管理详情 -->
<script lang="ts" setup name="SystemTemplateRegisterDetail">
import { ref } from 'vue'
import { ElLoading, ElMessage } from 'element-plus'
import dayjs from 'dayjs'
import type { IForm } from './templateRegister-interface'
import selectModuleNameDialog from './dialog/selectModuleNameDialog.vue'
import selectFileTemplateDialog from './dialog/selectFileTemplateDialog.vue'
import selectSealDialog from './dialog/selectSealDialog.vue'
import { getUserList } from '@/api/system/user'
import useUserStore from '@/store/modules/user'
import { useCheckList } from '@/commonMethods/useCheckList'
import { addTemplateRegisterList, getInfo, updateTemplateRegisterList } from '@/api/system/baseInfoTemplateRegister'
// import type { IOptions } from '@/views/device/standardEquipment/standard_interface'
const user = useUserStore() // 用户信息
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 字典
const $router = useRouter() // 关闭页面使用
const $route = useRoute() // 路由参数
const pageType = ref('add') // 页面类型: add, edit, detail
const infoId = ref('') // 列表id
const ruleFormRef = ref() // 表单ref
const form = ref({
  moduleName: '', // 模块名称
  moduleType: '', // 模块类型
  descn: '', // 备注描述
  createUserId: '', // 创建人id
  createUserName: '', // 创建人名称
  createTime: '', // 创建时间
  templateFileId: '', // 文件模板id
  templateFileName: '', // 文件模板名称
  objectString: '', // 是否为多字段组合--组成字段
  mergeColNames: '', // 需要合并得表头字段
  remark: '', // 备注说明
})
// 校验规则
const formRules = ref({
  moduleName: [{ required: true, message: '模块名称不能为空', trigger: ['blur', 'change'] }],
  // templateFileName: [{ required: true, message: '文件模板不能为空', trigger: ['blur', 'change'] }],
})
const isMulti = ref(false) // 是否多选

// -------------------------------------------字典------------------------------------------
const approvalFlagList = [
  {
    id: '1',
    name: '是',
    value: '1',
  },
  {
    id: '0',
    name: '否',
    value: '0',
  },
]
const userList = ref<{ [key: string]: string }[]>([]) // 用户列表

// 获取字典值
async function getDict() {
  // 获取用户列表
  getUserList({ offset: 1, limit: 999999 }).then((res: any) => {
    userList.value = res.data.rows
  })
}
// ----------------------------------路由参数--------------------------------------------
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  console.log(pageType.value)

  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}

// ----------------------------------------------选择模块名称--------------------------------------
const selectModuleNameDialogRef = ref()
// 点击选择模块名称
const selectModuleTypeName = () => {
  selectModuleNameDialogRef.value.initDialog()
}
// 确定选择模块名称
const confirmSelectModuleName = (val: any) => {
  form.value.moduleName = val[0].moduleName
  form.value.moduleType = val[0].moduleTypeName
}

// ----------------------------------------------选择文件模板------------------------------------
const selectFileTemplateDialogRef = ref()
// 点击选择文件模板
const selectFileTemplate = () => {
  selectFileTemplateDialogRef.value.initDialog()
}
// 确定选择文件模板
const confirmSelectFileTemplate = (val: any) => {
  form.value.templateFileId = val[0].id // 文件模板id
  form.value.templateFileName = val[0].templateName // 文件模板名称
}

// -------------------------------------------电子签章-------------------------------------------
const selectSealDialogRef = ref()
const sealList = ref([]) as any // 电子签章表格数据
const checkoutSealList = ref([]) as any
const sealColumn = [
  { text: '电子签章编号', value: 'sealNo', align: 'center', required: false },
  { text: '电子签章名称', value: 'sealName', align: 'center', required: false },
  { text: '审批人名称', value: 'approverName', align: 'center', required: false },
  { text: '图形', value: 'minioFileUrl', align: 'center', required: false },
  { text: '关键字名称', value: 'keywords', align: 'center', required: false },
]
// 多选
const handleSelectionSealChange = (e: any) => {
  checkoutSealList.value = e
}
// 批量增加电子签章
const multiAdd = () => {
  selectSealDialogRef.value.initDialog()
}
// 点击删除行
const delRow = () => {
  if (checkoutSealList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  else {
    checkoutSealList.value.forEach((item: any) => {
      sealList.value.forEach((element: any, index: number) => {
        if (element.id === item.id) {
          sealList.value.splice(index, 1)
        }
      })
    })
  }
}
// 确定选择电子签章
const confirmselectSeal = (val: any) => {
  console.log(val)

  val.forEach((item: any) => {
    // 只添加列表里不存在的
    const index = sealList.value.findIndex((i: any) => item.id === i.id)
    if (index === -1) {
      const param = {
        sealNo: item.sealNo, // 印章编号
        sealName: item.sealName, // 印章名称
        minioFileName: item.minioFileName,
        minioFileUrl: item.minioFileUrl, // 印章图片
        id: item.id, // id
        keywords: '', // 模板中关键字名称
        approverName: item.approverName, // 审批人名称
      }
      sealList.value.push(param)
    }
  })
}

// ------------------------------------------图片配置-------------------------------------------
const imageList = ref([]) as any // 图片配置列表
const checkoutImageList = ref([]) as any // 选中图片配置列表
const imageColumn = [
  { text: '字段', value: 'filedName', required: true, align: 'center' },
  { text: '文档中的关键字', value: 'docName', required: true, align: 'center' },
  { text: '表位置', value: 'tableIndex', required: true, align: 'center' },
  { text: '行位置', value: 'rowIndex', required: true, align: 'center' },
  { text: '列位置', value: 'colIndex', required: true, align: 'center' },
  { text: '行宽(合并行数)', value: 'rowSpan', required: true, align: 'center' },
  { text: '列宽(合并列数)', value: 'colSpan', required: true, align: 'center' },
  { text: '审批标志', value: 'approvalFlag', required: true, align: 'center' },
]
// 点击增加行
const addRowImageConfig = () => {
  if (useCheckList(imageList.value, imageColumn, '图片配置')) {
    imageList.value.push({
      filedName: '', // 文件名称
      tableIndex: '', // 表位置
      rowIndex: '', // 行位置
      colIndex: '', // 列位置
      rowSpan: '', // 行宽(合并行数)
      colSpan: '', // 列宽(合并列数)
      approvalFlag: '', // 审批标志
      docName: '', // 文档中的关键字
    })
  }
}

const handleSelectionImageChange = (e: any) => {
  checkoutImageList.value = e
}

const delRowImageConfig = () => {
  if (checkoutImageList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  imageList.value = imageList.value.filter((item: any) => {
    return !checkoutImageList.value.includes(item)
  })
}

// ------------------------------------------json字段展示-------------------------------------------
const jsonList = ref([]) as any // json字段展示列表
const checkoutJsonList = ref([]) as any // 选中json字段展示列表
const jsonColumn = [
  { text: '字段名称', value: 'filedName', required: true, align: 'center' },
  { text: '字典名称', value: 'code', required: true, align: 'center' },
]
// 点击增加行
const addRowJson = () => {
  if (useCheckList(jsonList.value, jsonColumn, 'json字段展示')) {
    jsonList.value.push({
      filedName: '', // 文件名称
      tableIndex: '', // 表位置
      rowIndex: '', // 行位置
      colIndex: '', // 列位置
      rowSpan: '', // 行宽(合并行数)
      colSpan: '', // 列宽(合并列数)
    })
  }
}

const handleSelectionJsonChange = (e: any) => {
  checkoutJsonList.value = e
}

const delRowJson = () => {
  if (checkoutJsonList.value.length <= 0) {
    ElMessage({
      message: '请选中要删除的行',
      type: 'warning',
    })
  }
  jsonList.value = jsonList.value.filter((item: any) => {
    return !checkoutJsonList.value.includes(item)
  })
}
// -------------------------------------------按钮----------------------------------------------
// 关闭新增页面的回调
const close = () => {
  $router.back()
}

// 点击编辑按钮
const edit = () => {
  pageType.value = 'edit'
}

// 保存
const save = () => {
  ruleFormRef.value!.validate((valid: boolean) => {
    if (valid) {
      const loading = ElLoading.service({
        lock: true,
        background: 'rgba(255, 255, 255, 0.8)',
      })
      const params = {
        ...form.value,
        id: infoId.value,
        createTime: '', // 创建时间
        signImageResponseList: sealList.value, // 签章列表
        moduleFieldConfigList: {
          imageJson: JSON.stringify(imageList.value),
          mergeColNames: form.value.mergeColNames,
          objectString: form.value.objectString,
          dictJson: JSON.stringify(jsonList.value),
          remark: form.value.remark,
        },
      }
      // 新建
      if (pageType.value === 'add') { // 新建
        addTemplateRegisterList(params).then((res) => {
          ElMessage.success('保存成功')
          pageType.value = 'detail'
          loading.close()
        }).catch(() => {
          loading.close()
        })
      }
      // 保存
      else if (pageType.value === 'edit') { // 编辑
        updateTemplateRegisterList(params).then((res) => {
          ElMessage.success('保存成功')
          pageType.value = 'detail'
          loading.close()
        }).catch(() => {
          loading.close()
        })
      }
    }
    else {
      console.log('表单校验不通过')
    }
  })
}

// -------------------------------------------获取详情信息--------------------------------------------------
// 获取详情信息
const fetchInfo = () => {
  const loading = ElLoading.service({
    lock: true,
    background: 'rgba(255, 255, 255, 0.8)',
  })
  getInfo({ id: infoId.value }).then((res) => {
    form.value = res.data
    sealList.value = res.data.signImageResponseList || [] // 印章列表
    if (res.data.moduleFieldConfigList.length) {
      imageList.value = res.data.moduleFieldConfigList[0].imageJson ? JSON.parse(res.data.moduleFieldConfigList[0].imageJson) : [] // 图片配置
      form.value.mergeColNames = res.data.moduleFieldConfigList[0].mergeColNames
      form.value.objectString = res.data.moduleFieldConfigList[0].objectString
      form.value.remark = res.data.moduleFieldConfigList[0].remark
      jsonList.value = res.data.moduleFieldConfigList[0].dictJson ? JSON.parse(res.data.moduleFieldConfigList[0].dictJson) : [] // json配置
    }
    loading.close()
  })
}

onMounted(async () => {
  form.value.createUserId = user.id// 创建人id
  form.value.createUserName = user.name // 创建人
  form.value.createTime = dayjs().format('YYYY-MM-DD HH-mm:ss')// 创建时间
  getDict().then(() => {
    if (pageType.value !== 'add') {
      fetchInfo()
    }
  })
})
</script>

<template>
  <app-container>
    <detail-page :title="`文件模板注册管理-${textMap[pageType]}`">
      <template #btns>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="save">
          保存
        </el-button>
        <el-button v-if="pageType === 'detail'" type="primary" @click="edit">
          编辑
        </el-button>
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <el-form
        ref="ruleFormRef"
        :model="form"
        label-width="120"
        label-position="right"
        :rules="formRules"
      >
        <el-row :gutter="24">
          <!-- <el-col :span="6">
            <el-form-item label="创建人:">
              <el-input v-model="form.createUserName" disabled />
            </el-form-item>
          </el-col> -->
          <el-col :span="6">
            <el-form-item label="创建时间:">
              <el-date-picker
                v-model="form.createTime"
                type="datetime"
                format="YYYY-MM-DD HH:mm:ss"
                value-format="YYYY-MM-DD HH:mm:ss"
                disabled
                class="full-width-input"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="模块名称:" prop="moduleName">
              <el-input
                v-model.trim="form.moduleName"
                :placeholder="pageType === 'detail' ? '' : '请选择模块名称'"
                disabled
              >
                <template #append>
                  <el-button size="small" @click="selectModuleTypeName">
                    选择
                  </el-button>
                </template>
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="模块类型" prop="moduleType">
              <el-input
                v-model.trim="form.moduleType"
                :placeholder="pageType === 'detail' ? '' : '请输入模块类型'"
                disabled
                class="full-width-input"
              />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="文件模板:" prop="templateFileName">
              <el-input
                v-model.trim="form.templateFileName"
                :placeholder="pageType === 'detail' ? '' : '请选择文件模板'"
                disabled
              >
                <template #append>
                  <el-button size="small" @click="selectFileTemplate">
                    选择
                  </el-button>
                </template>
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="备注描述:" prop="descn">
              <el-input
                v-model="form.descn"
                class="full-width-input"
                :placeholder="pageType === 'detail' ? ' ' : '请输入备注描述'"
                autosize
                type="textarea"
                :disabled="pageType === 'detail'"
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-page>
    <detail-block title="电子签章">
      <template #btns>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="multiAdd">
          批量添加
        </el-button>
        <el-button v-if="pageType !== 'detail'" type="info" @click="delRow">
          删除行
        </el-button>
      </template>
      <el-table
        :data="sealList"
        border
        style="width: 100%;"
        max-height="600"
        @selection-change="handleSelectionSealChange"
      >
        <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
        <el-table-column align="center" label="序号" width="80" type="index" />
        <el-table-column
          v-for="item in sealColumn"
          :key="item.value"
          :prop="item.value"
          :label="item.text"
          align="center"
        >
          <template #header>
            <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
          </template>
          <template #default="scope">
            <el-input
              v-if="item.value === 'keywords' && pageType !== 'detail'"
              v-model="scope.row[item.value]"
              placeholder="请输入关键字名称"
            />
            <!-- <show-photo v-if="item.value === 'minioFileUrl'" :minio-file-name="scope.row[item.value]" /> -->
            <el-image v-if="item.value === 'minioFileUrl'" :preview-src-list="[scope.row[item.value]]" :src="scope.row[item.value]" />
            <span v-if="item.value !== 'minioFileUrl' && pageType === 'detail'">{{ scope.row[item.value] }}</span>
          </template>
        </el-table-column>
      </el-table>
    </detail-block>

    <detail-block title="自定义配置">
      <detail-block title="是否进行图片配置">
        <template v-if="pageType !== 'detail'" #btns>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="addRowImageConfig">
            增加行
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="info" @click="delRowImageConfig">
            删除行
          </el-button>
        </template>
        <el-table
          :data="imageList"
          border
          style="width: 100%;"
          max-height="600"
          @selection-change="handleSelectionImageChange"
        >
          <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
          <el-table-column align="center" label="序号" width="80" type="index" />
          <el-table-column
            v-for="item in imageColumn"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            align="center"
          >
            <template #header>
              <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
            </template>
            <template #default="scope">
              <el-input
                v-if="pageType !== 'detail' && item.value !== 'approvalFlag'"
                v-model="scope.row[item.value]"
                placeholder="请输入"
              />
              <el-select
                v-if="pageType !== 'detail' && item.value === 'approvalFlag'"
                v-model="scope.row[item.value]"
                clearable
                :placeholder="pageType === 'detail' ? '' : '请选择审批标志'"
                size="default"
                :disabled="pageType === 'detail'"
                class="full-width-input"
              >
                <el-option
                  v-for="item in approvalFlagList"
                  :key="item.id"
                  :label="item.name"
                  :value="item.value"
                />
              </el-select>
              <span v-if="pageType === 'detail' && item.value !== 'approvalFlag'">{{ scope.row[item.value] }}</span>
              <span v-if="pageType === 'detail' && item.value === 'approvalFlag'">{{ scope.row[item.value] === '1' ? '是' : scope.row[item.value] === '0' ? '否' : '未知' }}</span>
            </template>
          </el-table-column>
        </el-table>
      </detail-block>
      <div style="display: flex;align-items: center;padding: 10px;">
        <span style="color: #936266;">需要合并的表头字段</span>
        <el-input v-model="form.mergeColNames" type="textarea" autosize style="flex: 1;margin-left: 10px;" placeholder="请输入" />
      </div>
      <detail-block title="是否进行字典json展示">
        <template v-if="pageType !== 'detail'" #btns>
          <el-button v-if="pageType !== 'detail'" type="primary" @click="addRowJson">
            增加行
          </el-button>
          <el-button v-if="pageType !== 'detail'" type="info" @click="delRowJson">
            删除行
          </el-button>
        </template>
        <el-table
          :data="jsonList"
          border
          style="width: 100%;"
          max-height="600"
          @selection-change="handleSelectionJsonChange"
        >
          <el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
          <el-table-column align="center" label="序号" width="80" type="index" />
          <el-table-column
            v-for="item in jsonColumn"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            align="center"
          >
            <template #header>
              <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
            </template>
            <template #default="scope">
              <el-input
                v-if="pageType !== 'detail'"
                v-model="scope.row[item.value]"
                placeholder="请输入"
              />
              <span v-else>{{ scope.row[item.value] }}</span>
            </template>
          </el-table-column>
        </el-table>
      </detail-block>
      <div style="display: flex;align-items: center;padding: 10px;">
        <span style="color: #936266;">组合字段</span>
        <el-input v-model="form.objectString" type="textarea" autosize style="flex: 1;margin-left: 10px;" placeholder="请输入" />
      </div>
      <div style="display: flex;align-items: center;padding: 10px;">
        <span style="color: #936266;">备注说明</span>
        <el-input v-model="form.remark" type="textarea" autosize style="flex: 1;margin-left: 10px;" placeholder="请输入" />
      </div>
    </detail-block>
    <select-seal-dialog ref="selectSealDialogRef" @confirm="confirmselectSeal" />
    <select-file-template-dialog ref="selectFileTemplateDialogRef" @confirm="confirmSelectFileTemplate" />
    <select-module-name-dialog ref="selectModuleNameDialogRef" @confirm="confirmSelectModuleName" />
  </app-container>
</template>