ZaiZai 1 年之前
父節點
當前提交
48d2c7c593
共有 3 個文件被更改,包括 267 次插入254 次删除
  1. 32 0
      src/api/modules/project/tree.js
  2. 4 1
      src/views/project/list/adjust-excel.vue
  3. 231 253
      src/views/project/list/adjust-excel/set-e-visa.vue

+ 32 - 0
src/api/modules/project/tree.js

@@ -121,4 +121,36 @@ export default {
             params: form,
         })
     },
+    //电签 -- 获取电签信息
+    async getSignDetail(form = {}) {
+        return HcApi({
+            url: '/api/blade-manager/textdictinfo/detail',
+            method: 'get',
+            params: form,
+        })
+    },
+    //电签 -- 修改电签信息
+    async updateDetail(form = {}) {
+        return HcApi({
+            url: '/api/blade-manager/textdictinfo/update',
+            method: 'post',
+            data: form,
+        })
+    },
+    //电签 -- 获取数据
+    async getSigList(form = {}) {
+        return HcApi({
+            url: '/api/blade-manager/textdictinfo/page',
+            method: 'get',
+            params: form,
+        })
+    },
+    //电签 -- 获取预览数据
+    async getPriwbsPdf(pkeyId) {
+        return HcApi({
+            url: '/api/blade-manager/exceltab/get-priwbs-pdf',
+            method: 'get',
+            params: { pkeyId },
+        })
+    },
 }

+ 4 - 1
src/views/project/list/adjust-excel.vue

@@ -98,9 +98,12 @@ const excelClick = async (item) => {
     for (let i = 0; i < keys.length; i++) {
         obj[keys[i]] = await getAttribute(dom, keys[i])
     }
-    //设置输入框
     if (tabsKey.value === 'tab1') {
+        //设置输入框
         setInputRef.value?.setDomData(obj)
+    } else if (tabsKey.value === 'tab2') {
+        //电签
+        setEVisaRef.value?.setDomData(obj)
     }
 }
 

+ 231 - 253
src/views/project/list/adjust-excel/set-e-visa.vue

@@ -1,8 +1,8 @@
 <template>
     <div class="hc-project-list-adjust-excel-set-e-visa">
         <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="left" label-width="auto">
-            <el-form-item label="元素坐标:" prop="name">
-                <el-input v-model="formModel.name" placeholder="请点击左侧表单" disabled />
+            <el-form-item label="元素坐标:" prop="colName">
+                <el-input v-model="formModel.colName" placeholder="请点击左侧表单" disabled />
             </el-form-item>
             <el-form-item label="证书类型:" prop="type">
                 <el-select v-model="formModel.type" filterable block placeholder="请选择证书类型" @change="signTypeChang">
@@ -10,35 +10,31 @@
                     <el-option label="企业证书" :value="6" />
                 </el-select>
             </el-form-item>
-            <template v-if="formModel.type === 2">
-                <el-form-item label="所属方:" prop="roleType">
-                    <el-select v-model="formModel.roleType" filterable block placeholder="请选择所属方" @change="getRoleData">
-                        <el-option v-for="item in roleType" :key="item.value" :label="item.label" :value="item.value" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="签字角色:" prop="sigRoleId">
-                    <el-select v-model="formModel.sigRoleId" filterable block placeholder="请选择签字角色">
-                        <el-option v-for="item in roleData" :key="item.value" :label="item.label" :value="item.value" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="签字时间:">
-                    <el-checkbox v-model="formModel.timeState" :true-value="1" :false-value="2">是否需要获取签字时间</el-checkbox>
-                </el-form-item>
-                <el-form-item v-if="formModel.timeState === 1" label="时间元素:" prop="timeName" class="time-name-form-item">
-                    <el-input v-model="formModel.timeName" placeholder="请点击后,再在左边选择元素" @focus="timeElementFocus">
-                        <template #append>
-                            <el-button type="primary" :disabled="!isTimeElement" @click="timeElementFinish">完成</el-button>
-                        </template>
-                    </el-input>
-                </el-form-item>
-            </template>
-            <template v-else>
-                <el-form-item label="签章类型:" prop="sigRoleId">
-                    <el-select v-model="formModel.sigRoleId" filterable block placeholder="请选择签章类型">
-                        <el-option v-for="item in signData" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
-                    </el-select>
-                </el-form-item>
-            </template>
+            <el-form-item v-if="formModel.type === 2" label="所属方:" prop="roleType">
+                <el-select v-model="formModel.roleType" filterable block placeholder="请选择所属方" @change="getRoleData">
+                    <el-option v-for="item in roleType" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+            </el-form-item>
+            <el-form-item v-if="formModel.type === 2" label="签字角色:" prop="sigRoleId">
+                <el-select v-model="formModel.sigRoleId" :disabled="isNullES(formModel.roleType)" filterable block placeholder="请选择签字角色">
+                    <el-option v-for="item in roleData" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+            </el-form-item>
+            <el-form-item v-if="formModel.type === 2" label="签字时间:">
+                <el-checkbox v-model="formModel.timeState" :true-value="1" :false-value="2">是否需要获取签字时间</el-checkbox>
+            </el-form-item>
+            <el-form-item v-if="formModel.timeState === 1" label="时间元素:" prop="timeName" class="time-name-form-item">
+                <el-input v-model="formModel.timeName" placeholder="请点击后,再在左边选择元素" @focus="timeElementFocus">
+                    <template #append>
+                        <el-button type="primary" :disabled="!isTimeElement" @click="timeElementFinish">完成</el-button>
+                    </template>
+                </el-input>
+            </el-form-item>
+            <el-form-item v-if="formModel.type === 6" label="签章类型:" prop="sigRoleId">
+                <el-select v-model="formModel.sigRoleId" filterable block placeholder="请选择签章类型">
+                    <el-option v-for="item in signData" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
+                </el-select>
+            </el-form-item>
             <el-form-item label="偏移位X:" prop="pyzbx">
                 <el-input v-model="formModel.pyzbx" type="number" placeholder="横坐标,负代表左移,正代表右移,偏移量50大概等于一厘米" />
             </el-form-item>
@@ -46,32 +42,30 @@
                 <el-input v-model="formModel.pyzby" type="number" placeholder="纵坐标,负代表下移,正代表上移,偏移量50大概等于一厘米" />
             </el-form-item>
         </el-form>
-        <hc-card-item v-if="['select', 'radio', 'checkbox', 'selectBox'].indexOf(formModel.textId) !== -1" title="相关数据:">
+        <div class="action-btn-box mb-40px mt-10px text-center">
+            <el-button v-if="isEditMode" type="success" @click="saveListClick">保存数据</el-button>
+            <el-button v-if="isEditMode" type="info" style="margin-left: 50px" @click="cancelListClick">取消</el-button>
+            <el-button v-else type="primary" @click="addToListClick">添加到列表</el-button>
+            <el-button type="warning" style="margin-left: 50px" @click="getPriwbsPdf">预览表</el-button>
+        </div>
+        <hc-card-item title="已配数据:">
             <template #extra>
-                <el-button type="primary" size="small" @click="addTableData">新增</el-button>
+                <el-button type="primary" size="small" :loading="submitLoading" @click="dialogSubmit">保存入库</el-button>
             </template>
-            <hc-table :column="tableColumn" :datas="tableData" :is-current-row="false">
-                <template #dictValue="{ row }">
-                    <hc-table-input v-model="row.dictValue" />
-                </template>
-                <template #action="{ index }">
-                    <el-link type="danger" @click="rowDelClick(index)">删除</el-link>
+            <hc-table :column="tableColumn" :datas="tableData" :is-current-row="false" :is-index="false">
+                <template #action="{ row, index }">
+                    <el-link v-if="row.isEditMode" type="success" @click="saveListClick">保存</el-link>
+                    <el-link v-else type="primary" @click="rowEditClick(row, index)">编辑</el-link>
+                    <el-link type="danger" @click="rowDelClick(row, index)">删除</el-link>
                 </template>
             </hc-table>
         </hc-card-item>
-        <div class="action-btn-box mt-30px text-center">
-            <el-button type="primary" :loading="submitLoading" @click="dialogSubmit">
-                <hc-icon name="save" />
-                <span>保存设置</span>
-            </el-button>
-        </div>
     </div>
 </template>
 
 <script setup>
 import { onMounted, ref, watch } from 'vue'
-import { deepClone, formValidate, getArrValue, getObjValue, isNullES } from 'js-fast-way'
-import { getDictionaryData } from '~uti/tools'
+import { deepClone, formValidate, getArrValue, getObjValue, isNullES, newWindow } from 'js-fast-way'
 import mainApi from '~api/project/tree'
 
 const props = defineProps({
@@ -88,13 +82,28 @@ const emit = defineEmits(['finish'])
 const dataInfo = ref(props.info)
 watch(() => props.info, (data) => {
     dataInfo.value = getObjValue(data)
-}, { immediate: true, deep: true })
+}, { deep: true })
 
 //渲染完成
 onMounted(() => {
+    getSigList()
     getRoleTypeData()
+    formModel.value = { type: 2, pyzbx: 0, pyzby: 0, timeState: 2 }
 })
 
+//获取数据
+const getSigList = async () => {
+    const { pkeyId, excelId } = dataInfo.value
+    const { data } = await mainApi.getSigList({
+        current: 0,
+        size: 99999,
+        type: 2,
+        tabId: pkeyId,
+        excelId: excelId,
+    })
+    tableData.value = getArrValue(data?.records)
+}
+
 //获取所属方
 const roleType = ref([])
 const getRoleTypeData = async () => {
@@ -140,237 +149,206 @@ const timeElementFinish = () => {
     isTimeElement.value = false
 }
 
-
-//年月日,时分秒
-const yearList = [{ label:'年', value:'YYYY', sort: 1 }, { label:'月', value:'MM', sort: 2 }, { label:'日', value:'DD', sort: 3 }]
-const timeList = [{ label:'时', value:'HH', sort: 4 }, { label:'分', value:'mm', sort: 5 }, { label:'秒', value:'ss', sort: 6 }]
-
 //基础表单
 const formRef = ref(null)
-const formModel = ref({
-    date: ['YYYY', 'MM', 'DD'],
-    divide_y: '文本',
-    time: ['HH', 'mm', 'ss'],
-    divide_h: '文本',
-    divide_c: '至',
-})
+const formModel = ref({})
 const formRules = {
-    name: { required: true, trigger: 'blur', message: '请先获取元素坐标' },
-    textId: { required: true, trigger: 'blur', message: '请选择文本格式' },
-    //date: { required: true, trigger: 'blur', message: '请选择日期格式' },
-    divide_y: { required: true, trigger: 'blur', message: '请选择日期分割' },
-    //time: { required: true, trigger: 'blur', message: '请选择时间格式' },
-    divide_h: { required: true, trigger: 'blur', message: '请选择时间分割' },
-    divide_c: { required: true, trigger: 'blur', message: '请选择中间分隔符' },
+    colName: {
+        validator: (rule, value, callback) => {
+            if (isNullES(value)) {
+                callback(new Error('请先获取元素坐标'))
+            } else if (value === '警告') {
+                callback(new Error('警告框不能配置电签'))
+            } else {
+                callback()
+            }
+        },
+        required: true,
+        trigger: 'change',
+    },
+    type: { required: true, trigger: 'change', message: '请选择证书类型' },
+    roleType: { required: true, trigger: 'change', message: '请选择所属方' },
+    sigRoleId: {
+        validator: (rule, value, callback) => {
+            const { type } = formModel.value
+            if (type === 2 && isNullES(value)) {
+                callback(new Error('请选择签字角色'))
+            } else if (type === 6 && isNullES(value)) {
+                callback(new Error('请选择签章类型'))
+            } else {
+                callback()
+            }
+        },
+        required: true,
+        trigger: 'change',
+    },
+    timeName: {
+        validator: (rule, value, callback) => {
+            const { timeState } = formModel.value
+            if (timeState === 1 && isNullES(value)) {
+                callback(new Error('请选择时间元素'))
+            } else {
+                callback()
+            }
+        },
+        required: true,
+        trigger: 'change',
+    },
 }
 
 //数据表格
 const tableColumn = [
-    { key: 'dictValue', name: '默认值' },
-    { key: 'action', name: '操作', align: 'center', width: 70 },
+    { key: 'colName', name: '元素位置' },
+    { key: 'sigRoleName', name: '签字岗位' },
+    { key: 'timeName', name: '签字时间' },
+    { key: 'pyzbx', name: '偏移X' },
+    { key: 'pyzby', name: '偏移Y' },
+    { key: 'action', name: '操作', align: 'center', width: 100, fixed: 'right' },
 ]
-const tableData = ref([{}])
+const tableData = ref([])
 
-//新增数据
-const addTableData = () => {
-    tableData.value.push({})
+//编辑数据
+const isEditMode = ref(false)
+const rowEditClick = async (row, index) => {
+    if (isEditMode.value) {
+        window.$message.warning('当前已有数据在编辑,请先完成或取消')
+        return
+    }
+    let sigRoleId = '', rowType = 2
+    if (isNullES(row.id)) {
+        const obj = deepClone(row)
+        rowType = obj.type
+        sigRoleId = obj.sigRoleId
+        formModel.value = deepClone(row)
+        formModel.value.isIndex = index
+    } else {
+        const { pkeyId } = dataInfo.value
+        const { data } = await mainApi.getSignDetail({
+            id: row.id,
+            tabId: pkeyId,
+        })
+        const res = getObjValue(data)
+        const obj = deepClone(res)
+        obj.roleType = obj.parentRoleId
+        rowType = res.type
+        sigRoleId = res.sigRoleId
+        formModel.value = obj
+        formModel.value.isIndex = index
+    }
+    if (rowType === 2) {
+        await getRoleTypeData()
+        await getRoleData()
+    } else {
+        await getSignData()
+    }
+    formModel.value.sigRoleId = sigRoleId
+    row.isEditMode = true
+    isEditMode.value = true
 }
 
-//删除数据
-const rowDelClick = (index) => {
-    tableData.value.splice(index, 1)
+//取消修改
+const cancelListClick = () => {
+    const { isIndex } = formModel.value
+    tableData.value[isIndex].isEditMode = false
+    formModel.value = { type: 2, pyzbx: 0, pyzby: 0, timeState: 2 }
+    isEditMode.value = false
 }
 
-//提交
-const submitLoading = ref(false)
-const dialogSubmit = async () => {
+//统一验证
+const formValidatorData = async () => {
     const isForm = await formValidate(formRef.value)
     if (!isForm) return false
-    submitLoading.value = true
     const form = deepClone(formModel.value)
-    //如果日期存在
-    if (form.textId === 'date' || form.textId === 'daterange') {
-        if (form.date.length <= 0 && form.time.length <= 0) {
-            window.$message.warning('日期或时间,至少要选择一个')
-            submitLoading.value = false
-            return
-        }
-        let dateFormat = []
-        if (!isNullES(form.date) && form.date.length > 0) {
-            if (form.date.indexOf('YYYY') !== -1) {
-                dateFormat.push({ name: '年', value: 'YYYY' })
-            }
-            if (form.date.indexOf('MM') !== -1) {
-                dateFormat.push({ name: '月', value: 'MM' })
-            }
-            if (form.date.indexOf('DD') !== -1) {
-                dateFormat.push({ name: '日', value: 'DD' })
-            }
-        }
-        if (!isNullES(form.time) && form.time.length > 0) {
-            if (form.time.indexOf('HH') !== -1) {
-                dateFormat.push({ name: '时', value: 'HH' })
-            }
-            if (form.time.indexOf('mm') !== -1) {
-                dateFormat.push({ name: '分', value: 'mm' })
-            }
-            if (form.time.indexOf('ss') !== -1) {
-                dateFormat.push({ name: '秒', value: 'ss' })
-            }
-        }
-        if (!isNullES(form.date) && !isNullES(form.time)) {
-            if (!isNullES(form.divide_y)) {
-                dateFormat.push({ name: 'divide_y', value: form.divide_y })
-            }
-            if (!isNullES(form.divide_h)) {
-                dateFormat.push({ name: 'divide_h', value: form.divide_h })
-            }
-            if (!isNullES(form.divide_c)) {
-                dateFormat.push({ name: 'divide_c', value: form.divide_c })
-            }
-        }
-        if (dateFormat.length > 0) {
-            form.dateFormat = dateFormat
+    const table = tableData.value
+    //已配数据
+    let isValidator = true
+    for (let i = 0; i < table.length; i++) {
+        // 位置只能添加一个
+        if (table[i].colName === form.colName) {
+            window.$message.warning('位置只能配置一个电签')
+            isValidator = form
+            break
         }
     }
-    //下拉框等数组数据
-    if (['select', 'radio', 'checkbox', 'selectBox'].indexOf(form.textId) !== -1) {
-        if (tableData.value.length <= 0) {
-            window.$message.warning('请先新增要选择的数据')
-            submitLoading.value = false
-            return
-        }
-        form.textInfo = tableData.value
+    if (!isValidator) return false
+    //获取签字角色
+    let sigRoleName = ''
+    if (form.type === 2) {
+        const info = roleData.value.find(item=> item.value === form.sigRoleId)
+        sigRoleName = isNullES(info) ? '' : info.label || ''
+    } else if (form.type === 6) {
+        const info = signData.value.find(item=> item.dictKey === form.sigRoleId)
+        sigRoleName = isNullES(info) ? '' : info.dictValue || ''
     }
-    const { isRes } = await mainApi.saveTextInfo([form])
+    formModel.value.sigRoleName = sigRoleName
+    formModel.value.timeState = form.timeState || 2
+    return true
+}
+
+//添加到列表
+const addToListClick = async () => {
+    const isForm = await formValidatorData()
+    if (!isForm) return false
+    const form = deepClone(formModel.value)
+    tableData.value.push(form)
+    formModel.value = { type: 2, pyzbx: 0, pyzby: 0, timeState: 2 }
+}
+
+//保存数据
+const saveListClick = async () => {
+    const isForm = await formValidatorData()
+    if (!isForm) return false
+    const form = deepClone(formModel.value)
+    form.isEditMode = false
+    tableData.value[form.isIndex] = form
+    formModel.value = { type: 2, pyzbx: 0, pyzby: 0, timeState: 2 }
+    isEditMode.value = false
+}
+
+//删除数据
+const rowDelClick = (row, index) => {
+    tableData.value.splice(index, 1)
+}
+
+//预览pdf
+const getPriwbsPdf = async () => {
+    const { pkeyId } = dataInfo.value
+    const { data } = await mainApi.getPriwbsPdf(pkeyId)
+    if (isNullES(data)) {
+        window.$message.warning('暂无预览数据')
+        return
+    }
+    newWindow(data)
+}
+
+//提交
+const submitLoading = ref(false)
+const dialogSubmit = async () => {
+    const table = tableData.value
+    if (table.length <= 0) {
+        window.$message.warning('请先添加数据')
+        return
+    }
+    //submitLoading.value = true
+    const { pkeyId } = dataInfo.value
+    console.log(table)
+    /*const { isRes } = await mainApi.saveTextInfo([form])
     submitLoading.value = false
     if (!isRes) return
     window.$message.success('操作成功')
-    emit('finish')
+    emit('finish')*/
 }
 
 //设置dom数据
-const typeObj = {
-    text: 'input',
-    select: 'select',
-    multiple_select: 'selectBox',
-    textarea: 'textarea',
-    checkbox_group: 'checkbox',
-    form_checkbox: 'checkbox',
-    checkbox: 'checkbox',
-    radio_group: 'radio',
-    radio: 'radio',
-    date: 'date',
-    time: 'date',
-    datetime: 'date',
-    datetimerange: 'daterange',
-    dap_site_data: 'searchSelect',
-    strength_search: 'strengthSearch',
-    upload: 'img',
-    echart: 'echart',
-}
 const setDomData = (item) => {
-    const type = typeObj[item.type]
-    const { pkeyId } = dataInfo.value
-    formModel.value = {
-        name: item.text,
-        key: item.key,
-        type: '1',
-        trIndex: item.tr,
-        tdIndex: item.td,
-        textId: type,
-        tableId: pkeyId,
-    }
-    let newArr = []
-    if (type === 'selectBox' || type === 'select' || type === 'radio') {
-        //获取多选相关的数据
-        const dom = item?.zdom?.target
-        const child = dom.querySelectorAll('.hc-table-form-components-box')
-        for (let i = 0; i < child.length; i++) {
-            const val = child[i]?.getAttribute('data-label')
-            newArr.push({ dictValue: val })
-        }
-    } else if (type === 'checkbox') {
-        //获取多选框数据
-        const objs = isNullES(item.objs) ? [] : JSON.parse(item.objs)
-        for (let i = 0; i < objs.length; i++) {
-            newArr.push({ dictValue: objs[i].name })
-        }
-    }
-    tableData.value = newArr
-    if (type === 'date' || type === 'daterange') {
-        //分割日期时间
-        const arr = item?.format?.split(' ')
-        //移除空值
-        const dateTimes = arr.filter(item => {
-            return !isNullES(item)
-        })
-        //取相关数据
-        let date = '', time = ''
-        if (dateTimes.length >= 2) {
-            date = dateTimes[0]
-            time = dateTimes[1]
-        } else {
-            //要判断下,是日期还是时间
-            if (dateTimes[0].indexOf('Y') !== -1 || dateTimes[0].indexOf('y') !== -1) {
-                date = dateTimes[0]
-            } else if (dateTimes[0].indexOf('D') !== -1 || dateTimes[0].indexOf('d') !== -1) {
-                date = dateTimes[0]
-            } else if (dateTimes[0].indexOf('H') !== -1 || dateTimes[0].indexOf('h') !== -1) {
-                time = dateTimes[0]
-            } else if (dateTimes[0].indexOf('S') !== -1 || dateTimes[0].indexOf('s') !== -1) {
-                time = dateTimes[0]
-            }
-        }
-        //日期类型 YYYY年MM月DD日 YYYY-MM-DD  HH:mm:ss
-        let dates = [], times = []
-        if (!isNullES(date)) {
-            if (date.indexOf('Y') !== -1 || date.indexOf('y') !== -1) {
-                dates.push('YYYY')
-            }
-            if (date.indexOf('M') !== -1 || date.indexOf('m') !== -1) {
-                dates.push('MM')
-            }
-            if (date.indexOf('D') !== -1 || date.indexOf('d') !== -1) {
-                dates.push('DD')
-            }
-            //分隔符
-            if (date.indexOf('年') !== -1 || date.indexOf('月') !== -1 || date.indexOf('日') !== -1) {
-                formModel.value.divide_y = '文本'
-            } else if (date.indexOf('-') !== -1) {
-                formModel.value.divide_y = '-'
-            } else if (date.indexOf('/') !== -1) {
-                formModel.value.divide_y = '/'
-            } else {
-                formModel.value.divide_y = '文本'
-            }
-        }
-        if (!isNullES(time)) {
-            if (time.indexOf('H') !== -1 || time.indexOf('h') !== -1) {
-                times.push('HH')
-            }
-            if (time.indexOf('M') !== -1 || time.indexOf('m') !== -1) {
-                times.push('mm')
-            }
-            if (time.indexOf('S') !== -1 || time.indexOf('s') !== -1) {
-                times.push('ss')
-            }
-            //分隔符
-            if (time.indexOf('时') !== -1 || time.indexOf('分') !== -1 || time.indexOf('秒') !== -1) {
-                formModel.value.divide_h = '文本'
-            } else if (time.indexOf(':') !== -1) {
-                formModel.value.divide_h = ':'
-            } else if (time.indexOf('/') !== -1) {
-                formModel.value.divide_h = '/'
-            } else {
-                formModel.value.divide_h = '文本'
-            }
-        }
-        formModel.value.date = dates
-        formModel.value.time = times
-        if (type === 'daterange') {
-            formModel.value.divide_c = item.range || '文本'
-        }
+    if (isTimeElement.value) {
+        formModel.value.timeName = item.text
+        formModel.value.timeColKey = item.key
+    } else {
+        const { pkeyId } = dataInfo.value
+        formModel.value.colName = item.text
+        formModel.value.colKey = item.key
+        formModel.value.tabId = pkeyId
     }
 }