8
0
ZaiZai 1 жил өмнө
parent
commit
7dd10254b2

+ 2 - 0
src/components/index.js

@@ -3,6 +3,7 @@ import HcCharts from './echarts/echarts.vue'
 import HcMenuIcon from './menu-icon/menu-icon.vue'
 import HcIconInput from './icon-input/icon-input.vue'
 import HcSearchInput from './search-input/search-input.vue'
+import HcRelatedProject from './related-project/related-project.vue'
 
 //注册全局组件
 export const setupComponents = (App) => {
@@ -13,4 +14,5 @@ export const setupComponents = (App) => {
     App.component('HcMenuIcon', HcMenuIcon)
     App.component('HcIconInput', HcIconInput)
     App.component('HcSearchInput', HcSearchInput)
+    App.component('HcRelatedProject', HcRelatedProject)
 }

+ 175 - 0
src/components/related-project/related-project.vue

@@ -0,0 +1,175 @@
+<template>
+    <div class="hc-related-project-box">
+        <div class="add-btn" @click="addFormList">
+            <i class="i-iconoir-plus" />
+            <span class="ml-[1px]">添加项目</span>
+        </div>
+        <div v-for="(item, index) in formList" :key="index" class="hc-form-list">
+            <el-row :gutter="20">
+                <el-col :span="8">
+                    <el-select v-model="item.projectId" filterable block @change="projectChange($event, index)">
+                        <el-option v-for="(items) in projectList" :key="items.id" :label="items.projectName" :value="items.id" />
+                    </el-select>
+                </el-col>
+                <el-col :span="8">
+                    <el-select v-model="item.contractId" filterable block @change="contractChange($event, index)">
+                        <template v-for="(items) in projectList[item.projectIndex]?.contractInfoList" :key="items.id">
+                            <el-option :label="items.contractName" :value="items.id" />
+                        </template>
+                    </el-select>
+                </el-col>
+                <el-col :span="6">
+                    <el-select v-model="item.roleId" filterable block @change="roleChange($event, index)">
+                        <el-option v-for="(items) in roleList" :key="items.id" :label="items.roleName" :value="items.id" />
+                    </el-select>
+                </el-col>
+                <el-col :span="2">
+                    <el-button hc-btn type="danger" @click="delFormList(index)">删除</el-button>
+                </el-col>
+            </el-row>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { arrIndex, deepClone, getArrValue, isNullES } from 'js-fast-way'
+import { onMounted, ref } from 'vue'
+import mainApi from '~api/certificate/list'
+
+defineOptions({
+    name: 'HcRelatedProject',
+})
+
+//双向绑定
+// eslint-disable-next-line no-undef
+const queryValue = defineModel('modelValue', {
+    default: '',
+})
+
+//初始变量
+const formList = ref([])
+const formValue = ref([])
+
+//渲染完成
+onMounted(() => {
+    getDataApi()
+})
+
+const getDataApi = async () => {
+    await getProjectAndContract()
+    await getRoleData()
+    await setInitData()
+}
+
+//项目列表
+const projectList = ref([])
+const getProjectAndContract = async () => {
+    const { data } = await mainApi.queryProjectAndContract()
+    projectList.value = getArrValue(data)
+}
+
+//获取角色方
+const roleList = ref([])
+const getRoleData = async () => {
+    const { data } = await mainApi.queryRole()
+    roleList.value = getArrValue(data)
+}
+
+//添加项目
+const addFormList = () => {
+    formList.value.push({ projectId: '', projectIndex: -1, contractId: '', contractIndex: -1, roleId: '' })
+}
+
+//设置初始数据
+const setInitData = async () => {
+    const val = queryValue.value
+    if (isNullES(val)) return
+    const arr = val.split(','), project = projectList.value
+    let newFormArr = []
+    for (let i = 0; i < arr.length; i++) {
+        const items = arr[i].split('-')
+        const projectIndex = arrIndex(project, 'id', items[0])
+        const contractArr = getArrValue(project[projectIndex]?.contractInfoList)
+        const contractIndex = arrIndex(contractArr, 'id', items[1])
+        newFormArr.push({
+            projectId: items[0],
+            projectIndex: projectIndex,
+            contractId: items[1],
+            contractIndex: contractIndex,
+            roleId: items[2],
+        })
+    }
+    formList.value = newFormArr
+    formValue.value = arr
+}
+
+//项目选择
+const projectChange = (id, index) => {
+    const pindex = arrIndex(projectList.value, 'id', id)
+    formList.value[index].projectIndex = pindex ?? -1
+    formList.value[index].contractIndex = null
+    formList.value[index].contractId = null
+}
+
+//合同段选择
+const contractChange = (id, index) => {
+    const contractList = projectList.value[formList.value[index].projectIndex]?.contractInfoList ?? []
+    const cindex = arrIndex(contractList, 'id', id)
+    formList.value[index].contractIndex = cindex ?? -1
+}
+
+//角色被选择
+const roleChange = (id, index) => {
+    const form = deepClone(formList.value[index])
+    const testValue = `${form.projectId}-${form.contractId}-${id}`
+    const testIndex = formValue.value.indexOf(testValue)
+    if (testIndex === -1) {
+        formValue.value.push(testValue)
+        queryValue.value = formValue.value.join(',')
+    } else if (testIndex !== index) {
+        window.$message.error('关联的项目参见方不可重复')
+        formList.value[index].roleId = null
+    }
+}
+
+//删除当前项目
+const delFormList = (index) => {
+    const list = deepClone(formList.value)
+    list.splice(index, 1)
+    formList.value = list
+}
+</script>
+
+<style scoped lang="scss">
+.hc-related-project-box {
+    position: relative;
+    color: #606266;
+    font-size: 14px;
+    padding: 0 12px;
+    min-height: 32px;
+    width: 100%;
+    border-radius: 4px;
+    border: 1px solid #dddfe6;
+    cursor: pointer;
+    user-select: none;
+    transition: border 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+    &:hover {
+        border-color: var(--el-color-primary);
+    }
+    .add-btn {
+        position: relative;
+        display: flex;
+        align-items: center;
+        i {
+            font-size: 18px;
+        }
+    }
+    .add-btn + .hc-form-list {
+        margin-top: 10px;
+    }
+    .hc-form-list {
+        position: relative;
+        margin-bottom: 10px;
+    }
+}
+</style>

+ 63 - 6
src/views/certificate/modules/list/form.vue

@@ -1,5 +1,5 @@
 <template>
-    <hc-new-card :title="rowItem.id ? '编辑证书' : '新增证书'">
+    <hc-new-card :title="rowItem.id ? '编辑证书' : '新增证书'" scrollbar>
         <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" label-width="auto">
             <el-row :gutter="20">
                 <el-col :span="formModel.certificateType !== 1 && Number(formModel.company) === 3 ? 24 : 16 ">
@@ -90,12 +90,17 @@
                         <hc-form-upload type="preview" num="1" :src="formModel.signatureFileUrl" @upload="signatureFileUpload" @change="signatureFileChange" />
                     </el-form-item>
                 </el-col>
+                <el-col v-if="formModel.certificateType === 2" :span="24">
+                    <el-form-item label="关联项目:" prop="projectContractRole">
+                        <hc-related-project v-model="formModel.projectContractRole" />
+                    </el-form-item>
+                </el-col>
             </el-row>
         </el-form>
         <template #action>
             <div class="hc-flex-center">
                 <el-button hc-btn class="mr-4" @click="cancelClick">取消</el-button>
-                <el-button hc-btn type="primary">提交</el-button>
+                <el-button hc-btn type="primary" :loading="submitLoading" @click="submitClick">提交</el-button>
             </div>
         </template>
 
@@ -107,9 +112,8 @@
 <script setup>
 import { nextTick, onMounted, ref } from 'vue'
 import { getHeader } from 'hc-vue3-ui'
-import { getArrValue, getObjValue, isNullES } from 'js-fast-way'
-import { getDictionaryData } from '~uti/tools'
-import adminApi from '~api/certificate/admin'
+import { deepClone, formValidate, getArrValue, getObjValue, isNullES } from 'js-fast-way'
+import { getDictionaryData, reloadPage } from '~uti/tools'
 import mainApi from '~api/certificate/list'
 
 const props = defineProps({
@@ -143,7 +147,12 @@ const getDataApi = () => {
 //获取数据详情
 const getDetailData = async (id) => {
     const { data } = await mainApi.detail(id)
-    formModel.value = getObjValue(data)
+    const res = getObjValue(data)
+    if (res.certificateType !== 1) {
+        res.company = res.certificateType === 2 ? 2 : res.certificateType === 3 ? 3 : 2
+        res.certificateType = 2
+    }
+    formModel.value = res
 }
 
 //获取当前系统下所有用户
@@ -228,6 +237,26 @@ const formRules = {
         trigger: 'blur',
         message: '请上传签名体文件',
     },
+    company: {
+        required: true,
+        trigger: 'blur',
+        message: '请选择签字公司',
+    },
+    enterpriseUnifiedCode: {
+        required: true,
+        trigger: 'blur',
+        message: '请输入企业统一社会信用代码',
+    },
+    pfxType: {
+        required: true,
+        trigger: 'blur',
+        message: '请选择签章类型',
+    },
+    projectContractRole: {
+        required: true,
+        trigger: 'blur',
+        message: '请选择关联项目',
+    },
 }
 
 //切换类型
@@ -289,6 +318,34 @@ const uploadSuccess = ({ echoParams, resData }) => {
     uploadRef.value?.setModalShow(false)
 }
 
+//提交数据
+const submitLoading = ref(false)
+const submitClick = async () => {
+    const formRes = await formValidate(formRef.value)
+    if (!formRes) return false
+    submitLoading.value = true
+    //处理数据
+    const form = deepClone(formModel.value)
+    form.enterpriseUnifiedCode = ''
+    if (form.certificateType === 2 && Number(form.company) === 3) {
+         form.certificateType = 3
+    }
+    //id不存在,则新增
+    let res = {}
+    if (isNullES(form.id)) {
+        res = await mainApi.add(form)
+    } else {
+        res = await mainApi.update(form)
+    }
+    const { error, code, msg } = res
+    submitLoading.value = false
+    if (!error && code === 200) {
+        cancelClick()
+        window?.$message?.success('操作成功')
+    } else {
+        window?.$message?.error(msg ?? '操作失败')
+    }
+}
 
 //取消关闭
 const cancelClick = () => {