Xiao_123 1 тиждень тому
батько
коміт
a84eb56205

+ 8 - 89
src/views/menduner/system/talentMap/components/merge.vue

@@ -1,25 +1,25 @@
 <template>
-	<Dialog title="人才对比" v-model="dialogVisible" class="!wh-full">
+	<Dialog title="人才重复记录对比" v-model="dialogVisible" class="!w-95%">
 		<el-row :gutter="10">
 			<el-col :span="12">
-				<el-card>
+				<el-card class="!h-100%">
 					<template #header>
 						<CardTitle title="当前记录" />
 					</template>
+					<div class="text-right">
+						<el-button type="primary" size="small" class="mb-10px" @click="submitForm('keep_main')">保留此记录</el-button>
+					</div>
 					<infoForm :data="currentData" />
 				</el-card>
 			</el-col>
 			<el-col :span="12">
-				<el-card class="position-relative">
+				<el-card class="position-relative !h-100%">
 					<template #header>
 						<CardTitle title="重复记录" />
 					</template>
-					<infoForm :data="activeThumbnail">
+					<infoForm :data="activeThumbnail" :class="{'mb-140px': thumbnails && thumbnails.length && thumbnails[0].length > 1 }">
 						<template #header>
-							<el-button type="primary" size="small" class="mb-10px" @click="submitForm('merge_to_suspected')">点击合并到此记录</el-button>
-						</template>
-						<template #thumbnail>
-							<div v-if="thumbnails && thumbnails.length && thumbnails[0].length > 1" class="!h-140px"></div>
+							<el-button type="primary" size="small" class="mb-10px" @click="submitForm('merge_to_suspected')">合并到此记录</el-button>
 						</template>
 					</infoForm>
 					<!-- 缩略图 -->
@@ -50,8 +50,6 @@
 		</el-row>
 
 		<template #footer>
-      <el-button @click="submitForm('keep_main')" type="primary">新记录提交</el-button>
-      <el-button @click="submitForm('ignore')" type="success">忽略(标记为已处理)</el-button>
       <el-button @click="dialogVisible = false">取 消</el-button>
     </template>
   </Dialog>
@@ -93,85 +91,6 @@ const handleSwitch = (item, index, index1) => {
 }
 
 // 打开弹窗
-const arr = [
-		{
-			"created_at": "2025-05-20 16:56:02",
-			"hotel_en": "DoubleTree by Hilton Shenzhen Bay",
-			"hotel_zh": "深圳湾希尔顿逸林酒店",
-			"id": 1,
-			"mobile": "+86 138 2336 0328,+86 755 8822 9888",
-			"name_en": "Waters Hong",
-			"name_zh": "洪松1",
-			"title_en": "General Manager",
-			"title_zh": "总经理"
-		},
-		{
-			"created_at": "2025-05-20 16:56:02",
-			"hotel_en": "DoubleTree by Hilton Shenzhen Bay",
-			"hotel_zh": "深圳湾希尔顿逸林酒店",
-			"id": 2,
-			"mobile": "+86 138 2336 0328,+86 755 8822 9888",
-			"name_en": "Waters Hong",
-			"name_zh": "洪松2",
-			"title_en": "General Manager",
-			"title_zh": "总经理"
-		},
-		{
-			"created_at": "2025-05-20 16:56:02",
-			"hotel_en": "DoubleTree by Hilton Shenzhen Bay",
-			"hotel_zh": "深圳湾希尔顿逸林酒店",
-			"id": 3,
-			"mobile": "+86 138 2336 0328,+86 755 8822 9888",
-			"name_en": "Waters Hong",
-			"name_zh": "洪松3",
-			"title_en": "General Manager",
-			"title_zh": "总经理"
-		},
-		{
-			"created_at": "2025-05-20 16:56:02",
-			"hotel_en": "DoubleTree by Hilton Shenzhen Bay",
-			"hotel_zh": "深圳湾希尔顿逸林酒店",
-			"id": 4,
-			"mobile": "+86 138 2336 0328,+86 755 8822 9888",
-			"name_en": "Waters Hong",
-			"name_zh": "洪松4",
-			"title_en": "General Manager",
-			"title_zh": "总经理"
-		},
-		{
-			"created_at": "2025-05-20 16:56:02",
-			"hotel_en": "DoubleTree by Hilton Shenzhen Bay",
-			"hotel_zh": "深圳湾希尔顿逸林酒店",
-			"id": 5,
-			"mobile": "+86 138 2336 0328,+86 755 8822 9888",
-			"name_en": "Waters Hong",
-			"name_zh": "洪松5",
-			"title_en": "General Manager",
-			"title_zh": "总经理"
-		},
-		{
-			"created_at": "2025-05-20 16:56:02",
-			"hotel_en": "DoubleTree by Hilton Shenzhen Bay",
-			"hotel_zh": "深圳湾希尔顿逸林酒店",
-			"id": 6,
-			"mobile": "+86 138 2336 0328,+86 755 8822 9888",
-			"name_en": "Waters Hong",
-			"name_zh": "洪松6",
-			"title_en": "General Manager",
-			"title_zh": "总经理"
-		},
-		{
-			"created_at": "2025-05-20 16:56:02",
-			"hotel_en": "DoubleTree by Hilton Shenzhen Bay",
-			"hotel_zh": "深圳湾希尔顿逸林酒店",
-			"id": 7,
-			"mobile": "+86 138 2336 0328,+86 755 8822 9888",
-			"name_en": "Waters Hong",
-			"name_zh": "洪松7",
-			"title_en": "General Manager",
-			"title_zh": "总经理"
-		}
-]
 const open = async (id) => {
 	if (!id) return message.warning('缺少数据ID')
 

+ 1 - 1
src/views/menduner/system/talentMap/duplicate/index.vue → src/views/menduner/system/talentMap/maintenance/duplicate/index.vue

@@ -64,7 +64,7 @@
 
 <script setup lang="ts" name="TalentMapDuplicate">
 import { talentDuplicateApi } from '@/api/menduner/system/talentMap/duplicate'
-import MergePage from '../components/merge.vue'
+import MergePage from '@/views/menduner/system/talentMap/components/merge.vue'
 
 const loading = ref(false)
 const list = ref([])

+ 244 - 0
src/views/menduner/system/talentMap/maintenance/gather/businessCard/FormPage.vue

@@ -0,0 +1,244 @@
+<template>
+  <div class="formBox">
+		<el-form
+      ref="formRef"
+      :model="formQuery"
+      label-width="128px"
+      v-loading="loading"
+    >
+      <el-row>
+        <div class="m-title">基础信息</div>
+      </el-row>
+      <el-row :gutter="10">
+        <el-col :span="12">
+          <el-form-item label="姓名(中)" prop="name_zh">
+            <el-input v-model="formQuery.name_zh" placeholder="请输入中文姓名" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="姓名(英)" prop="name_en">
+            <el-input v-model="formQuery.name_en" placeholder="请输入英文姓名" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="10">
+        <el-col :span="12">
+          <el-form-item label="职位/头衔(中)" prop="title_zh">
+            <el-input v-model="formQuery.title_zh" placeholder="请输入中文职位/头衔" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="职位/头衔(英)" prop="title_en">
+            <el-input v-model="formQuery.title_en" placeholder="请输入英文职位/头衔" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="10">
+        <el-col :span="24">
+          <el-form-item label="生日" prop="birthday">
+            <el-input v-model="formQuery.birthday" placeholder="请输入出生日期" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="10">
+        <el-col :span="24">
+          <el-form-item label="居住地" prop="residence">
+            <el-input v-model="formQuery.residence" placeholder="请输入当前居住地址" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <div class="m-title">联系方式</div>
+      </el-row>
+      <el-row :gutter="10">
+        <el-col :span="12">
+          <el-form-item label="手机号码" prop="mobile">
+            <el-input v-model="formQuery.mobile" placeholder="请输入手机号码" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="固定电话" prop="phone">
+            <el-input v-model="formQuery.phone" placeholder="请输入固定电话" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="电子邮箱" prop="email">
+        <el-input v-model="formQuery.email" placeholder="请输入电子邮箱" />
+      </el-form-item>
+      <el-row>
+        <div class="m-title">酒店/公司信息</div>
+      </el-row>
+      <el-form-item label="酒店/公司名称(中)" prop="hotel_zh">
+        <el-input v-model="formQuery.hotel_zh" placeholder="请输入中文酒店/公司名称" />
+      </el-form-item>
+      <el-form-item label="酒店/公司名称(英)" prop="hotel_en">
+        <el-input v-model="formQuery.hotel_en" placeholder="请输入英文酒店/公司名称" />
+      </el-form-item>
+      <el-form-item label="品牌名称(中)" prop="brand_zh">
+        <el-input v-model="formQuery.brand_zh" placeholder="请输入中文品牌名称" />
+      </el-form-item>
+      <el-form-item label="品牌名称(英)" prop="brand_en">
+        <el-input v-model="formQuery.brand_en" placeholder="请输入英文品牌名称" />
+      </el-form-item>
+      <el-form-item label="隶属关系(中)" prop="affiliation_zh">
+        <el-input v-model="formQuery.affiliation_zh" placeholder="请输入中文隶属关系" />
+      </el-form-item>
+      <el-form-item label="隶属关系(英)" prop="affiliation_en">
+        <el-input v-model="formQuery.affiliation_en" placeholder="请输入英文隶属关系" />
+      </el-form-item>
+      <el-form-item label="品牌组合" prop="brand_group">
+        <el-input v-model="formQuery.brand_group" placeholder="请输入品牌组合" />
+      </el-form-item>
+      <el-row>
+        <div class="m-title">职业轨迹</div>
+      </el-row>
+      <el-row :gutter="10" class="trajectoryBox" v-for="(item, index) of careerTrajectory" :key="'trajectory' + index">
+        <el-col :span="20">
+          <el-form-item label="酒店名称" prop="hotel_zh" label-width="128px">
+            <el-input v-model="item.hotel_zh" placeholder="请输入酒店名称" />
+          </el-form-item>
+          <el-form-item label="职位名称" prop="title_zh" label-width="128px">
+            <el-input v-model="item.title_zh" placeholder="请输入职位名称" />
+          </el-form-item>
+          <el-form-item label="任职时间" prop="date">
+            <el-date-picker
+              v-model="item.date"
+              value-format="YYYY-MM-DD"
+              type="date"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="4">
+          <div class="flex justify-center items-center !h-100%" style="flex-direction: column;">
+            <el-button @click="addCareer(index)" type="primary" class="cursor-pointer" :icon="Plus" circle />
+            <el-button
+              v-if="careerTrajectory.length > 1"
+              class="mt-15px ml-0 cursor-pointer"
+              @click="removeCareer(index)"
+              type="danger"
+              :icon="Delete"
+              circle
+            />
+          </div>
+        </el-col>
+      </el-row>
+      <el-row>
+        <div class="m-title">地址信息</div>
+      </el-row>
+      <el-form-item label="中文地址" prop="address_zh">
+        <el-input v-model="formQuery.address_zh" placeholder="请输入中文地址" />
+      </el-form-item>
+      <el-form-item label="英文地址" prop="address_en">
+        <el-input v-model="formQuery.address_en" placeholder="请输入英文地址" />
+      </el-form-item>
+      <el-row :gutter="10">
+        <el-col :span="12">
+          <el-form-item label="邮政编码(中)" prop="postal_code_zh">
+            <el-input v-model="formQuery.postal_code_zh" placeholder="请输入中文邮政编码" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="邮政编码(英)" prop="postal_code_en">
+            <el-input v-model="formQuery.postal_code_en" placeholder="请输入英文邮政编码" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <div class="m-title">系统信息</div>
+      </el-row>
+      <el-form-item label="状态">
+         <el-tag v-if="itemData.status" :type="itemData.status === 'active' ? 'success' : 'danger'">
+          {{ itemData.status === 'active' ? '已启用' : '已禁用' }}
+        </el-tag>
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-tag v-if="itemData.created_at" type="primary" effect="light">{{ itemData.created_at }}</el-tag>
+      </el-form-item>
+      <el-form-item label="更新时间">
+        <el-tag v-if="itemData.updated_at" type="primary" effect="light">{{ itemData.updated_at }}</el-tag>
+      </el-form-item>
+    </el-form>
+	</div>
+</template>
+
+<script setup>
+import { talentLabelingApi } from '@/api/menduner/system/talentMap/labeling'
+import { talentTagApi } from '@/api/menduner/system/talentMap/tag'
+import DefaultData from '@/views/menduner/system/talentMap/details/defaultData'
+import { getDict } from '@/hooks/web/useDictionaries'
+import { cloneDeep } from 'lodash-es'
+import { TalentMap } from '@/api/menduner/system/talentMap'
+import { Delete, Plus } from '@element-plus/icons-vue'
+
+const props = defineProps({
+  itemData: Object
+})
+
+const loading = ref(false)
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formQuery = ref({
+  name_zh: undefined,
+  name_en: undefined,
+  title_zh: undefined,
+  title_en: undefined,
+  mobile: undefined,
+  phone: undefined,
+  email: undefined,
+  hotel_zh: undefined,
+  hotel_en: undefined,
+  brand_zh: undefined,
+  brand_en: undefined,
+  affiliation_zh: undefined,
+  affiliation_en: undefined,
+  brand_group: undefined,
+  address_zh: undefined,
+  address_en: undefined,
+  postal_code_zh: undefined,
+  postal_code_en: undefined,
+  birthday: undefined,
+  residence: undefined,
+})
+const careerTrajectory = ref([{ company_name: null,  position: null, current_date: null }])
+
+if (props.itemData) {
+	formQuery.value = cloneDeep(props.itemData)
+	careerTrajectory.value = cloneDeep(props.itemData?.career_path) ?? []
+}
+
+const addCareer = () => {
+  careerTrajectory.value = careerTrajectory.value || []
+  careerTrajectory.value.push({ company_name: null,  position: null, current_date: null })
+}
+const removeCareer = (index) => {
+  if (careerTrajectory.value.length <= 1) return
+  careerTrajectory.value.splice(index, 1)
+}
+
+defineExpose({
+	formQuery
+})
+</script>
+
+<style scoped lang="scss">
+.formBox {
+  flex: 1;
+  max-height: 70vh;
+  padding: 12px;
+  overflow: auto;
+  background-color: #f5f7f9;
+  .m-title {
+    margin: 12px 8px;
+    font-size: 13px;
+    color: #999;
+  }
+  .trajectoryBox {
+    margin: 10px 20px;
+    padding-top: 20px;
+    padding-bottom: 5px;
+    border-radius: 5px;
+    background-color: #fff;
+  }
+}
+</style>

+ 9 - 5
src/views/menduner/system/talentMap/store/businessCard/index.vue → src/views/menduner/system/talentMap/maintenance/gather/businessCard/index.vue

@@ -262,7 +262,7 @@
 import { dateFormatter } from '@/utils/formatTime'
 import { talentLabelingApi } from '@/api/menduner/system/talentMap/labeling'
 import { Delete, Plus } from '@element-plus/icons-vue'
-import MergeForm from '../../components/merge.vue'
+import MergeForm from '@/views/menduner/system/talentMap/components/merge.vue'
 
 /** 人才地图 列表 */
 defineOptions({ name: 'TalentMapCard' })
@@ -429,19 +429,23 @@ const handleSave = async () => {
       uploadFile.value.append('card_data', JSON.stringify(itemData.value))
       result = await talentLabelingApi.createBusinessCard(uploadFile.value)
       message.success('新增成功')
+      showAnalysisTable.value = false
+      // 刷新列表
+      getList()
 
       if (result.code === 202 || result.message.includes('疑似重复')) {
         if (!result.data?.main_card?.id) return
-        message.notifyWarning('发现与当前名片的疑似数据,请处理')
+        
+        await message.confirm('发现与当前名片的疑似重复数据,去处理')
         mergeFormRef.value.open(result.data?.main_card?.id)
       }
     } else {
       await talentLabelingApi.updateBusinessCard(itemData.value, itemData.value.id)
       message.success('更新成功')
+      showAnalysisTable.value = false
+      // 刷新列表
+      getList()
     }
-    showAnalysisTable.value = false
-    // 刷新列表
-    getList()
   } catch (error) {
     console.log('更新失败', error)
   } finally {

+ 0 - 0
src/views/menduner/system/talentMap/store/index.vue → src/views/menduner/system/talentMap/maintenance/gather/index.vue


+ 0 - 0
src/views/menduner/system/talentMap/store/resume/index.vue → src/views/menduner/system/talentMap/maintenance/gather/resume/index.vue


+ 0 - 0
src/views/menduner/system/talentMap/store/webPageParsing/index.vue → src/views/menduner/system/talentMap/maintenance/gather/webPageParsing/index.vue


+ 34 - 26
src/views/menduner/system/talentMap/labeling/LabelingForm.vue → src/views/menduner/system/talentMap/maintenance/labeling/LabelingForm.vue

@@ -10,23 +10,18 @@
 				</el-card>
 			</el-col>
 			<el-col :span="15">
-				<!-- <el-card></el-card> -->
-				<div style="height: 100%; overflow-y: auto;">
+				<div class="!h-100% overflow-y-auto">
 					<el-tabs type="border-card">
 						<el-tab-pane label="人才信息">
-							<Info ref="InfoRef" v-model="result.person" :areaTreeData="areaTreeData" isEdit />
-							<JobIntention v-model="result.person.jobInterestedList" isEdit @change="handleUpdateJobIntention" />
-							<Edu v-model="result.eduList" isEdit />
-							<Exp v-model="result.workList" isEdit />
-							<Training v-model="result.trainList" isEdit />
+							<FormPage ref="baseInfoRef" :itemData="talentItem" />
+							<div class="text-right mt-12px">
+								<el-button @click="handleSave" type="primary" :disabled="saveLoading">保 存</el-button>
+								<el-button @click="dialogVisible = false">取消</el-button>
+							</div>
 						</el-tab-pane>
-						<el-tab-pane label="标签">
+						<el-tab-pane label="人才标签">
 							<el-card shadow="never">
-								<!-- <template #header>
-									<CardTitle title="已有标签" />
-								</template> -->
 								<div class="my-5">
-									<p>人才标签</p>
 									<div class="mt-4 px-3 pb-3" style="border: 1px dashed #67c23a; border-radius: 4px;">
 										<div v-if="talentSelectedTags?.length">
 											<el-tag 
@@ -59,7 +54,7 @@
 									</div>
 								</div>
 							</el-card>
-							<div style="text-align: right; margin-top: 12px;">
+							<div class="text-right mt-12px">
 								<el-button @click="submitForm" type="primary" :disabled="loading">确 认</el-button>
 								<el-button @click="handleCancel">取消</el-button>
 							</div>
@@ -93,15 +88,11 @@
 <script setup>
 import { talentLabelingApi } from '@/api/menduner/system/talentMap/labeling'
 import { talentTagApi } from '@/api/menduner/system/talentMap/tag'
-import Info from '../details/components/info.vue'
-import Edu from '../details/components/edu.vue'
-import Exp from '../details/components/exp.vue'
-import JobIntention from '../details/components/jobIntention.vue'
-import Training from '../details/components/training.vue'
-import DefaultData from '../details/defaultData'
+import DefaultData from '@/views/menduner/system/talentMap/details/defaultData'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { cloneDeep } from 'lodash-es'
 import { TalentMap } from '@/api/menduner/system/talentMap'
+import FormPage from '@/views/menduner/system/talentMap/maintenance/gather/businessCard/FormPage.vue'
 
 const message = useMessage() // 消息弹窗
 const loading = ref(false)
@@ -161,13 +152,13 @@ const open = async (data) => {
 	// 获取人才详情
 	// await getTalentMap()
 
-	if (data) {
-		Object.assign(result.value.person, {
-			name: data.name_en ? `${data.name_zh}(${ data.name_en })` : data.name_zh,
-			phone: data.mobile,
-			email: data.email
-		})
-	}
+	// if (data) {
+	// 	Object.assign(result.value.person, {
+	// 		name: data.name_en ? `${data.name_zh}(${ data.name_en })` : data.name_zh,
+	// 		phone: data.mobile,
+	// 		email: data.email
+	// 	})
+	// }
 
 	// 获取所有人才标签
 	await getTagList()
@@ -256,6 +247,23 @@ const handleUpdateJobIntention = async (val, type) => {
   }
 }
 
+// 保存人才信息
+const baseInfoRef = ref(null)
+const saveLoading = ref(false)
+const handleSave = async () => {
+	saveLoading.value = true
+	const params = baseInfoRef.value.formQuery
+	if (!params || !Object.keys(params).length) return saveLoading.value = true
+	try {
+		await talentLabelingApi.updateBusinessCard(params, params.id)
+		dialogVisible.value = false
+		message.success('保存成功')
+		emit('success')
+	} finally {
+	  saveLoading.value = false
+	}
+}
+
 </script>
 
 <style scoped lang="scss">

+ 2 - 2
src/views/menduner/system/talentMap/labeling/index.vue → src/views/menduner/system/talentMap/maintenance/labeling/index.vue

@@ -104,8 +104,8 @@ const openForm = (data: any) => {
 
 /** 搜索按钮操作 */
 const handleQuery = () => {
-  message.warning('建设中...')
-  // getList()
+  // message.warning('建设中...')
+  getList()
 }
 
 /** 重置按钮操作 */