|
@@ -23,11 +23,13 @@
|
|
|
|
|
|
<!-- 列表 -->
|
|
<!-- 列表 -->
|
|
<ContentWrap>
|
|
<ContentWrap>
|
|
- <el-table v-loading="loading" :data="list" :stripe="true" height="550">
|
|
|
|
|
|
+ <el-table v-loading="loading" :data="list" :stripe="true">
|
|
<el-table-column label="姓名(中)" align="center" prop="name_zh" fixed="left" />
|
|
<el-table-column label="姓名(中)" align="center" prop="name_zh" fixed="left" />
|
|
<el-table-column label="姓名(英)" align="center" prop="name_en" />
|
|
<el-table-column label="姓名(英)" align="center" prop="name_en" />
|
|
<el-table-column label="职位" align="center" prop="title_zh" />
|
|
<el-table-column label="职位" align="center" prop="title_zh" />
|
|
<el-table-column label="酒店/公司" align="center" prop="hotel_zh" />
|
|
<el-table-column label="酒店/公司" align="center" prop="hotel_zh" />
|
|
|
|
+ <el-table-column label="手机号码" align="center" prop="phone" />
|
|
|
|
+ <el-table-column label="固定电话" align="center" prop="mobile" />
|
|
<el-table-column label="创建日期" align="center" prop="created_at" :formatter="dateFormatter" />
|
|
<el-table-column label="创建日期" align="center" prop="created_at" :formatter="dateFormatter" />
|
|
<el-table-column label="状态" align="center" prop="status" width="80">
|
|
<el-table-column label="状态" align="center" prop="status" width="80">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
@@ -38,20 +40,14 @@
|
|
<el-table-column label="操作" align="center" fixed="right" min-width="110">
|
|
<el-table-column label="操作" align="center" fixed="right" min-width="110">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
<el-button link type="primary" @click="handleEdit(scope.row)">编辑</el-button>
|
|
<el-button link type="primary" @click="handleEdit(scope.row)">编辑</el-button>
|
|
|
|
+ <el-button link type="danger" @click="handleDelete(scope.row.id)">删除</el-button>
|
|
<el-button link :type="scope.row.status === 'active' ? 'danger': 'success'" @click="handleDisable(scope.row)">
|
|
<el-button link :type="scope.row.status === 'active' ? 'danger': 'success'" @click="handleDisable(scope.row)">
|
|
{{ scope.row.status === 'active' ? '禁用' : '启用'}}
|
|
{{ scope.row.status === 'active' ? '禁用' : '启用'}}
|
|
</el-button>
|
|
</el-button>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-table>
|
|
- <!-- 分页 -->
|
|
|
|
- <Pagination
|
|
|
|
- v-if="total"
|
|
|
|
- :total="total"
|
|
|
|
- v-model:page="queryParams.pageNo"
|
|
|
|
- v-model:limit="queryParams.pageSize"
|
|
|
|
- @pagination="getList"
|
|
|
|
- />
|
|
|
|
|
|
+
|
|
<!-- 上传 -->
|
|
<!-- 上传 -->
|
|
<Dialog title="名片解析" v-model="openUploadImg" width="500" @close="handleCancel">
|
|
<Dialog title="名片解析" v-model="openUploadImg" width="500" @close="handleCancel">
|
|
<UploadImg
|
|
<UploadImg
|
|
@@ -68,6 +64,7 @@
|
|
<el-button @click="handleCancel">取 消</el-button>
|
|
<el-button @click="handleCancel">取 消</el-button>
|
|
</template>
|
|
</template>
|
|
</Dialog>
|
|
</Dialog>
|
|
|
|
+
|
|
<!-- 解析回显 -->
|
|
<!-- 解析回显 -->
|
|
<Dialog title="名片解析" v-model="showAnalysisTable" width="80%">
|
|
<Dialog title="名片解析" v-model="showAnalysisTable" width="80%">
|
|
<div class="analysisInfoBox">
|
|
<div class="analysisInfoBox">
|
|
@@ -131,8 +128,8 @@
|
|
</el-row>
|
|
</el-row>
|
|
<el-row :gutter="10">
|
|
<el-row :gutter="10">
|
|
<el-col :span="24">
|
|
<el-col :span="24">
|
|
- <el-form-item label="居住地" prop="address">
|
|
|
|
- <el-input v-model="formQuery.address" placeholder="请输入当前居住地址" />
|
|
|
|
|
|
+ <el-form-item label="居住地" prop="residence">
|
|
|
|
+ <el-input v-model="formQuery.residence" placeholder="请输入当前居住地址" />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-col>
|
|
</el-row>
|
|
</el-row>
|
|
@@ -234,33 +231,38 @@
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-col>
|
|
</el-col>
|
|
</el-row>
|
|
</el-row>
|
|
- <el-row>
|
|
|
|
|
|
+ <el-row v-if="formType === 'edit'">
|
|
<div class="m-title">系统信息</div>
|
|
<div class="m-title">系统信息</div>
|
|
</el-row>
|
|
</el-row>
|
|
- <el-form-item label="状态">
|
|
|
|
- <el-tag :type="itemData.status === 'active' ? 'success' : 'info'">{{ itemData.status === 'active' ? '已启用' : '已禁用' }}</el-tag>
|
|
|
|
|
|
+ <el-form-item v-if="formType === 'edit'" label="状态">
|
|
|
|
+ <el-tag v-if="itemData.status" :type="itemData.status === 'active' ? 'success' : 'danger'">
|
|
|
|
+ {{ itemData.status === 'active' ? '已启用' : '已禁用' }}
|
|
|
|
+ </el-tag>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="创建时间">
|
|
|
|
- <el-tag v-if="itemData.created_at" type="info" effect="light">{{ itemData.created_at }}</el-tag>
|
|
|
|
|
|
+ <el-form-item label="创建时间" v-if="formType === 'edit'">
|
|
|
|
+ <el-tag v-if="itemData.created_at" type="primary" effect="light">{{ itemData.created_at }}</el-tag>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="更新时间">
|
|
|
|
- <el-tag v-if="itemData.updated_at" type="info" effect="light">{{ itemData.updated_at }}</el-tag>
|
|
|
|
|
|
+ <el-form-item label="更新时间" v-if="formType === 'edit'">
|
|
|
|
+ <el-tag v-if="itemData.updated_at" type="primary" effect="light">{{ itemData.updated_at }}</el-tag>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<template #footer>
|
|
<template #footer>
|
|
- <el-button @click="handleSave" type="success" :disabled="analysisLoading">更 新</el-button>
|
|
|
|
|
|
+ <el-button @click="handleSave" type="success" :disabled="analysisLoading">保 存</el-button>
|
|
<el-button @click="showAnalysisTable = false">取 消</el-button>
|
|
<el-button @click="showAnalysisTable = false">取 消</el-button>
|
|
</template>
|
|
</template>
|
|
</Dialog>
|
|
</Dialog>
|
|
</ContentWrap>
|
|
</ContentWrap>
|
|
|
|
+
|
|
|
|
+ <MergeForm ref="mergeFormRef" @refresh="getList" />
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
import { dateFormatter } from '@/utils/formatTime'
|
|
import { dateFormatter } from '@/utils/formatTime'
|
|
import { talentLabelingApi } from '@/api/menduner/system/talentMap/labeling'
|
|
import { talentLabelingApi } from '@/api/menduner/system/talentMap/labeling'
|
|
import { Delete, Plus } from '@element-plus/icons-vue'
|
|
import { Delete, Plus } from '@element-plus/icons-vue'
|
|
|
|
+import MergeForm from '../../components/merge.vue'
|
|
|
|
|
|
/** 人才地图 列表 */
|
|
/** 人才地图 列表 */
|
|
defineOptions({ name: 'TalentMapCard' })
|
|
defineOptions({ name: 'TalentMapCard' })
|
|
@@ -272,8 +274,6 @@ const loading = ref(false) // 列表的加载中
|
|
const list = ref([]) // 列表的数据
|
|
const list = ref([]) // 列表的数据
|
|
const total = ref(0) // 列表的总页数
|
|
const total = ref(0) // 列表的总页数
|
|
const queryParams = reactive({
|
|
const queryParams = reactive({
|
|
- pageNo: 1,
|
|
|
|
- pageSize: 10,
|
|
|
|
name: undefined,
|
|
name: undefined,
|
|
})
|
|
})
|
|
const queryFormRef = ref() // 搜索的表单
|
|
const queryFormRef = ref() // 搜索的表单
|
|
@@ -284,8 +284,7 @@ const getList = async () => {
|
|
try {
|
|
try {
|
|
list.value = []
|
|
list.value = []
|
|
const data = await talentLabelingApi.getCardList()
|
|
const data = await talentLabelingApi.getCardList()
|
|
- list.value = data || []
|
|
|
|
- // total.value = total || []
|
|
|
|
|
|
+ list.value = data ? data.reverse() : []
|
|
} finally {
|
|
} finally {
|
|
loading.value = false
|
|
loading.value = false
|
|
}
|
|
}
|
|
@@ -293,11 +292,10 @@ const getList = async () => {
|
|
|
|
|
|
/** 搜索按钮操作 */
|
|
/** 搜索按钮操作 */
|
|
const handleQuery = (type) => {
|
|
const handleQuery = (type) => {
|
|
- if (type === 'search') {
|
|
|
|
- message.warning('搜索正在建设中...')
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
- queryParams.pageNo = 1
|
|
|
|
|
|
+ // if (type === 'search') {
|
|
|
|
+ // message.warning('搜索正在建设中...')
|
|
|
|
+ // return
|
|
|
|
+ // }
|
|
getList()
|
|
getList()
|
|
}
|
|
}
|
|
|
|
|
|
@@ -316,9 +314,25 @@ const dealData = (item) => {
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/** 删除按钮操作 */
|
|
|
|
+const handleDelete = async (id) => {
|
|
|
|
+ try {
|
|
|
|
+ // 删除的二次确认
|
|
|
|
+ await message.delConfirm()
|
|
|
|
+ // 发起删除
|
|
|
|
+ await talentLabelingApi.deleteBusinessCard(id)
|
|
|
|
+ message.success(t('common.delSuccess'))
|
|
|
|
+ // 刷新列表
|
|
|
|
+ setTimeout(async () => {
|
|
|
|
+ await getList()
|
|
|
|
+ }, 0)
|
|
|
|
+ } catch {}
|
|
|
|
+}
|
|
|
|
+
|
|
/** 编辑 */
|
|
/** 编辑 */
|
|
const { push } = useRouter()
|
|
const { push } = useRouter()
|
|
const handleEdit = async (item) => {
|
|
const handleEdit = async (item) => {
|
|
|
|
+ formType.value = 'edit'
|
|
dealData(item)
|
|
dealData(item)
|
|
file.value = null
|
|
file.value = null
|
|
filePath.value = null
|
|
filePath.value = null
|
|
@@ -359,7 +373,6 @@ const handleDisable = async (item) => {
|
|
}
|
|
}
|
|
|
|
|
|
const formQuery = ref({
|
|
const formQuery = ref({
|
|
- id: undefined,
|
|
|
|
name_zh: undefined,
|
|
name_zh: undefined,
|
|
name_en: undefined,
|
|
name_en: undefined,
|
|
title_zh: undefined,
|
|
title_zh: undefined,
|
|
@@ -379,11 +392,12 @@ const formQuery = ref({
|
|
postal_code_zh: undefined,
|
|
postal_code_zh: undefined,
|
|
postal_code_en: undefined,
|
|
postal_code_en: undefined,
|
|
birthday: undefined,
|
|
birthday: undefined,
|
|
- address: undefined,
|
|
|
|
|
|
+ residence: undefined,
|
|
})
|
|
})
|
|
const careerTrajectory = ref([{ company_name: null, position: null, current_date: null }])
|
|
const careerTrajectory = ref([{ company_name: null, position: null, current_date: null }])
|
|
|
|
|
|
const file = ref(null)
|
|
const file = ref(null)
|
|
|
|
+const uploadFile = ref(null)
|
|
const uploadChange = (raw) => {
|
|
const uploadChange = (raw) => {
|
|
file.value = raw
|
|
file.value = raw
|
|
}
|
|
}
|
|
@@ -400,24 +414,38 @@ const removeCareer = (index) => {
|
|
// 更新
|
|
// 更新
|
|
const showAnalysisTable = ref(false)
|
|
const showAnalysisTable = ref(false)
|
|
const formLoading = ref(false)
|
|
const formLoading = ref(false)
|
|
|
|
+const formType = ref('')
|
|
const formRef = ref() // 表单 Ref
|
|
const formRef = ref() // 表单 Ref
|
|
|
|
+const mergeFormRef = ref() // 合并表单 Ref
|
|
const handleSave = async () => {
|
|
const handleSave = async () => {
|
|
- if (!itemData.value.id) {
|
|
|
|
- message.warning('ID获取异常')
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
try {
|
|
try {
|
|
formLoading.value = true
|
|
formLoading.value = true
|
|
formQuery.value.career_path = careerTrajectory
|
|
formQuery.value.career_path = careerTrajectory
|
|
Object.assign(itemData.value, formQuery.value)
|
|
Object.assign(itemData.value, formQuery.value)
|
|
- await talentLabelingApi.updateBusinessCard(itemData.value, itemData.value.id)
|
|
|
|
|
|
+
|
|
|
|
+ let result = {}
|
|
|
|
+
|
|
|
|
+ if (formType.value === 'create') {
|
|
|
|
+ uploadFile.value.append('card_data', JSON.stringify(itemData.value))
|
|
|
|
+ result = await talentLabelingApi.createBusinessCard(uploadFile.value)
|
|
|
|
+ message.success('新增成功')
|
|
|
|
+
|
|
|
|
+ if (result.code === 202 || result.message.includes('疑似重复')) {
|
|
|
|
+ if (!result.data?.main_card?.id) return
|
|
|
|
+ message.notifyWarning('发现与当前名片的疑似数据,请处理')
|
|
|
|
+ mergeFormRef.value.open(result.data?.main_card?.id)
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ await talentLabelingApi.updateBusinessCard(itemData.value, itemData.value.id)
|
|
|
|
+ message.success('更新成功')
|
|
|
|
+ }
|
|
showAnalysisTable.value = false
|
|
showAnalysisTable.value = false
|
|
- message.success('更新成功!')
|
|
|
|
// 刷新列表
|
|
// 刷新列表
|
|
getList()
|
|
getList()
|
|
} catch (error) {
|
|
} catch (error) {
|
|
console.log('更新失败', error)
|
|
console.log('更新失败', error)
|
|
} finally {
|
|
} finally {
|
|
|
|
+ uploadFile.value = null
|
|
formLoading.value = false
|
|
formLoading.value = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -441,12 +469,13 @@ const handleAnalysis = async () => {
|
|
try {
|
|
try {
|
|
analysisLoading.value = true
|
|
analysisLoading.value = true
|
|
// 开始解析
|
|
// 开始解析
|
|
- const query = new FormData()
|
|
|
|
- query.append('image', file.value)
|
|
|
|
|
|
+ uploadFile.value = new FormData()
|
|
|
|
+ uploadFile.value.append('image', file.value)
|
|
message.warning('正在解析...')
|
|
message.warning('正在解析...')
|
|
|
|
+
|
|
const index = createAnalysisNum.value
|
|
const index = createAnalysisNum.value
|
|
- const res = await talentLabelingApi.businessCardParse(query)
|
|
|
|
- console.log('编号->', index, createAnalysisNum.value)
|
|
|
|
|
|
+ const res = await talentLabelingApi.businessCardParse(uploadFile.value)
|
|
|
|
+
|
|
if (index !== createAnalysisNum.value || !openUploadImg.value) return // 不是最新的名片解析数据(用户在解析完成前已重新上传)或用户已取消解析
|
|
if (index !== createAnalysisNum.value || !openUploadImg.value) return // 不是最新的名片解析数据(用户在解析完成前已重新上传)或用户已取消解析
|
|
dealData(res?.data || res)
|
|
dealData(res?.data || res)
|
|
openUploadImg.value = false
|
|
openUploadImg.value = false
|
|
@@ -454,6 +483,7 @@ const handleAnalysis = async () => {
|
|
message.success('名片解析成功')
|
|
message.success('名片解析成功')
|
|
} catch (error) {
|
|
} catch (error) {
|
|
console.log('解析失败', error)
|
|
console.log('解析失败', error)
|
|
|
|
+ uploadFile.value = null
|
|
} finally {
|
|
} finally {
|
|
analysisLoading.value = false
|
|
analysisLoading.value = false
|
|
}
|
|
}
|
|
@@ -463,6 +493,7 @@ const handleAnalysis = async () => {
|
|
const openUploadImg = ref(false)
|
|
const openUploadImg = ref(false)
|
|
const createAnalysisNum = ref(0)
|
|
const createAnalysisNum = ref(0)
|
|
const handleAdd = () => {
|
|
const handleAdd = () => {
|
|
|
|
+ formType.value = 'create'
|
|
file.value = null
|
|
file.value = null
|
|
filePath.value = null
|
|
filePath.value = null
|
|
analysisLoading.value = false
|
|
analysisLoading.value = false
|