communicationRecords.vue 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. <template>
  2. <view class="page">
  3. <!-- Custom Navbar -->
  4. <view class="custom-navbar">
  5. <view class="navbar-content">
  6. <view class="navbar-left" @click="goBack">
  7. <u-icon name="arrow-leftward" color="color: rgba(51, 51, 51, 1);" size="36"></u-icon>
  8. </view>
  9. <view class="navbar-title">沟通记录</view>
  10. <view class="navbar-right"></view>
  11. </view>
  12. </view>
  13. <view class="tab-section-bg">
  14. <text class="title-text">沟通记录</text>
  15. <text class="interview-manage" @click="goToInterviewManage">面试管理</text>
  16. </view>
  17. <!-- Tab Navigation -->
  18. <view class="tab-section">
  19. <u-tabs :list="tabs" :current="activeTab" @change="switchTab" :is-scroll="false" :height="88"
  20. :font-size="24" active-color="rgba(1, 107, 246, 1)" inactive-color="rgba(102, 102, 102, 1)"
  21. :bar-width="80" :bar-height="4" :gutter="40" bg-color="#ffffff" :bar-style="{
  22. borderRadius: '2rpx'
  23. }"></u-tabs>
  24. </view>
  25. <!-- Content Section -->
  26. <view class="content-section">
  27. <!-- Communication Records List -->
  28. <view class="communication-list" v-if="activeTab === 0">
  29. <!-- 有数据时显示列表 -->
  30. <view v-if="communicationRecords.length > 0">
  31. <!-- Date Group -->
  32. <view class="date-group" v-for="(group, groupIndex) in groupedRecords" :key="groupIndex">
  33. <view class="date-header">
  34. <text class="date-text">{{ group.date }}</text>
  35. </view>
  36. <!-- Records for this date -->
  37. <view class="talent-card" v-for="(record, recordIndex) in group.records" :key="recordIndex"
  38. @click="goToResumeDetail(record)">
  39. <view class="talent-content">
  40. <!-- 头像和基本信息 -->
  41. <view class="talent-header">
  42. <image :src="record.userAvatar" class="talent-avatar" mode="aspectFill"></image>
  43. <view class="talent-info">
  44. <view class="talent-name-section">
  45. <view class="talent-name">{{ record.userName }}</view>
  46. <view class="talent-tags">
  47. <view class="status-tag online" v-if="record.isOnline">在线</view>
  48. <view class="status-tag hot" v-if="record.isHot">热门搜索</view>
  49. <view class="status-tag active" v-if="record.lastActive">
  50. {{ record.lastActive }}</view>
  51. </view>
  52. </view>
  53. <!-- 经验和薪资 -->
  54. <view class="talent-experience">
  55. <text class="experience-text">{{ record.resumesWorkExperience }}年</text>
  56. <text class="education-salary">{{ record.degree }}
  57. {{ record.minSalary }}-{{record.maxSalary}}</text>
  58. <text
  59. class="status-text">{{ record.resumesStatus==1?'在职&考虑机会':"离职" }}</text>
  60. </view>
  61. </view>
  62. </view>
  63. <!-- 当前职位 -->
  64. <view class="current-job" v-if="record.companyName">
  65. <image src="../../static/images/aixin.svg" class="job-icon" mode="aspectFit">
  66. </image>
  67. <text class="job-text">{{ record.companyName }}</text>
  68. </view>
  69. <!-- 求职期望 -->
  70. <view class="job-expectation">
  71. <image src="../../static/images/xiangzi.svg" class="job-icon" mode="aspectFit">
  72. </image>
  73. <text class="expectation-text">求职期望: {{ record.expectedPosition }}</text>
  74. </view>
  75. <!-- 技能标签 -->
  76. <view class="skill-tags">
  77. <view class="skill-tag" v-for="(skill, skillIndex) in record.skillName.split(',')"
  78. :key="skillIndex">
  79. {{ skill }}
  80. </view>
  81. </view>
  82. <!-- 工作描述 -->
  83. <view class="job-description">
  84. <text class="description-text">{{ record.workContent }}</text>
  85. </view>
  86. </view>
  87. </view>
  88. </view>
  89. </view>
  90. <!-- 空状态显示 -->
  91. <view class="empty-state" v-else>
  92. <view class="empty-illustration">
  93. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  94. </view>
  95. </view>
  96. </view>
  97. <!-- Interview Records List -->
  98. <view class="interview-list" v-if="activeTab === 1">
  99. <!-- Date Selector -->
  100. <view class="date-selector">
  101. <view class="week-days">
  102. <text class="day-name" v-for="day in currentWeekDays" :key="day.name">{{ day.name }}</text>
  103. </view>
  104. <view class="week-dates">
  105. <view class="date-item" :class="{ active: date.isSelected }" v-for="date in currentWeekDates"
  106. :key="date.value" @click="selectDate(date)">
  107. <text class="date-value">{{ date.value }}</text>
  108. </view>
  109. </view>
  110. </view>
  111. <!-- Interview Records -->
  112. <view class="interview-records">
  113. <!-- 有数据时显示列表 -->
  114. <view v-if="interviewRecords.length > 0">
  115. <view class="interview-record"
  116. :class="{ 'today': formatDate(record.interviewDateTime,'YYYY-MM-DD') === formatDate(selectDate,'YYYY-MM-DD') }"
  117. v-for="(record, index) in interviewRecords" :key="index"
  118. @click="goToInterviewDetail(record)">
  119. <view class="record-content">
  120. <view class="record-left">
  121. <text
  122. class="date-label">{{ checkDate(record.interviewDateTime) === 1 ? '今天' : checkDate(record.interviewDateTime) === 2 ? '明天' : record.interviewDateTime.substring(5, 10) }}</text>
  123. <text
  124. class="time-label">{{ record.detailTime? record.detailTime : record.interviewDateTime.substring(11, 16) }}</text>
  125. </view>
  126. <view class="record-divider"></view>
  127. <view class="record-right">
  128. <text class="candidate-name">{{ record.userEntity.userName }}</text>
  129. <block v-if="record.resumesListDto.length > 0">
  130. <text
  131. class="candidate-details">{{ record.resumesListDto[0].resumesWorkExperience? record.resumesListDto[0].resumesWorkExperience + '年' :'无经验'}}
  132. {{ record.resumesListDto[0].degree }}
  133. {{ record.resumesListDto[0].minSalary }}-{{ record.resumesListDto[0].maxSalary }}</text>
  134. </block>
  135. </view>
  136. </view>
  137. </view>
  138. </view>
  139. <!-- 空状态显示 -->
  140. <view class="empty-state" v-else>
  141. <view class="empty-illustration">
  142. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  143. </view>
  144. </view>
  145. </view>
  146. </view>
  147. <!-- 收藏标签页 -->
  148. <view class="favorite-list" v-if="activeTab === 2">
  149. <!-- 有数据时显示列表 -->
  150. <view v-if="favoriteRecords.length > 0">
  151. <!-- 收藏记录列表内容 -->
  152. <view class="qyList flex justify-center">
  153. <view class="qyList-box">
  154. <view class="qyList-box-item flex justify-center" v-for="(item, index) in favoriteRecords"
  155. :key="index"
  156. @click="goNav(`/pages/talentSearch/resumeDetail?resumesId=${item.resumesId}&postPushId=${item.postPushId}`)">
  157. <view class="qyList-box-item-box">
  158. <view class="qyList-box-item-info flex justify-between align-center">
  159. <view class="qyList-box-item-info-l">
  160. <view style="color: #212121; font-size: 38rpx; font-weight: 800">
  161. {{ item.resumes.resumesName }}
  162. </view>
  163. <view class="flex align-center flex-wrap"
  164. style="color: #999999; font-size: 26rpx; margin-top: 10rpx">
  165. <text>{{ item.resumes.resumesAge }}岁</text>
  166. <text style="margin-left: 20rpx; margin-right: 20rpx">|</text>
  167. <text>{{ item.resumes.resumesWorkExperience }}年</text>
  168. <text style="margin-left: 20rpx; margin-right: 20rpx">|</text>
  169. <text>{{ item.resumes.resumesEducation }}</text>
  170. <text style="margin-left: 20rpx; margin-right: 20rpx">|</text>
  171. <text>期望{{item.resumes.resumesCompensation}}</text>
  172. </view>
  173. </view>
  174. <view class="qyList-box-item-info-r" v-if="item.resumesListDto[0]">
  175. <image
  176. :src="item.resumesListDto[0].userAvatar ? item.resumesListDto[0].userAvatar : '../../static/logo.png'"
  177. style="width: 95rpx; height: 95rpx; border-radius: 50%" mode=""></image>
  178. </view>
  179. </view>
  180. <view class="qyList-box-item-job flex align-center" v-if="item.resumesListDto[0]">
  181. <image src="../../static/images/qi.png"
  182. style="width: 30rpx; height: 32rpx; margin-right: 16rpx" mode=""></image>
  183. <view class="txt-desc flex align-center justify-between">
  184. <view>
  185. <view>{{ item.resumesListDto[0].companyName }}</view>
  186. <view v-if="item.resumesListDto[0]">
  187. {{ item.resumesListDto[0].lastWorkStartTime ? item.resumesListDto[0].lastWorkStartTime.slice(0, 10)
  188. : ''
  189. }}--{{
  190. item.resumesListDto[0].lastWorkEndTime ? item.resumesListDto[0].lastWorkEndTime.slice(0, 10) : '' }}
  191. </view>
  192. </view>
  193. <view>
  194. <view>
  195. {{ item.resumes.school ? item.resumes.school : '' }}
  196. </view>
  197. <view>
  198. {{ item.resumes.resumesEducation ? item.resumes.resumesEducation : '' }}
  199. </view>
  200. </view>
  201. </view>
  202. </view>
  203. <view class="qyList-box-item-job flex align-center">
  204. <u-icon name="heart-fill" color="#016BF6" size="30" style="margin-right: 16rpx">
  205. </u-icon>
  206. 期望岗位:{{ item.resumes.industryName }}
  207. </view>
  208. <!-- <view class="qyList-box-item-rem" v-if="item.resumesDetails">
  209. 优势:{{ item.resumes.workContent }}
  210. </view> -->
  211. </view>
  212. </view>
  213. </view>
  214. </view>
  215. </view>
  216. <!-- 空状态显示 -->
  217. <view class="empty-state" v-else>
  218. <view class="empty-illustration">
  219. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  220. </view>
  221. </view>
  222. </view>
  223. <!-- 收藏职位标签页 -->
  224. <view class="favorite-jobs-list" v-if="activeTab === 3">
  225. <!-- 有数据时显示列表 -->
  226. <view v-if="favoriteJobs.length > 0">
  227. <!-- 收藏职位列表内容 -->
  228. </view>
  229. <!-- 空状态显示 -->
  230. <view class="empty-state" v-else>
  231. <view class="empty-illustration">
  232. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  233. </view>
  234. </view>
  235. </view>
  236. </view>
  237. </view>
  238. </template>
  239. <script>
  240. export default {
  241. data() {
  242. return {
  243. statusBarHeight: 0,
  244. activeTab: 0,
  245. tabs: [{
  246. name: '沟通过'
  247. },
  248. {
  249. name: '面试'
  250. },
  251. {
  252. name: '收藏简历'
  253. },
  254. // { name: '收藏职位' }
  255. ],
  256. communicationRecords: [],
  257. // 面试相关数据
  258. selectedDate: null, // 当前选中的日期
  259. // 收藏相关数据
  260. favoriteRecords: [], // 收藏记录(空数组,显示空状态)
  261. favoriteJobs: [], // 收藏职位(空数组,显示空状态)
  262. interviewRecords: []
  263. }
  264. },
  265. computed: {
  266. groupedRecords() {
  267. const records = Array.isArray(this.communicationRecords) ?
  268. this.communicationRecords :
  269. []
  270. const groups = {}
  271. records
  272. .filter(r => r && r.lastTime) // 过滤掉 null 或没有 lastTime 的数据
  273. .forEach(record => {
  274. const date = record.lastTime.substring(0, 10)
  275. if (!groups[date]) {
  276. groups[date] = {
  277. date,
  278. records: []
  279. }
  280. }
  281. groups[date].records.push(record)
  282. })
  283. return Object.values(groups)
  284. },
  285. // 当前周的星期名称
  286. currentWeekDays() {
  287. const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  288. return weekDays.map(name => ({
  289. name
  290. }))
  291. },
  292. // 当前周的日期
  293. currentWeekDates() {
  294. const today = new Date()
  295. const currentDay = today.getDay() // 0-6,0是周日
  296. // 获取本周一的日期(周一开始)
  297. const monday = new Date(today)
  298. // 如果今天是周日(0),则往前推6天到周一
  299. // 如果今天是周一(1),则往前推0天
  300. // 如果今天是周二(2),则往前推1天
  301. const daysToMonday = currentDay === 0 ? 6 : currentDay - 1
  302. monday.setDate(today.getDate() - daysToMonday)
  303. // 生成本周7天的日期
  304. const weekDates = []
  305. for (let i = 0; i < 7; i++) {
  306. const date = new Date(monday)
  307. date.setDate(monday.getDate() + i)
  308. const isToday = date.toDateString() === today.toDateString()
  309. const isSelected = this.selectedDate ?
  310. date.toDateString() === this.selectedDate.toDateString() : isToday
  311. weekDates.push({
  312. value: date.getDate().toString(),
  313. date: date,
  314. isSelected: isSelected
  315. })
  316. }
  317. return weekDates
  318. }
  319. },
  320. onLoad(options) {
  321. console.log(options);
  322. this.activeTab = options.tab ? parseInt(options.tab) : 0
  323. const systemInfo = uni.getSystemInfoSync()
  324. this.statusBarHeight = systemInfo.statusBarHeight || 0
  325. this.getData()
  326. this.getInterviewRecords()
  327. this.getFavoriteRecords()
  328. },
  329. methods: {
  330. getFavoriteRecords() {
  331. this.$Request.getT("/app/myCollection/getCompanyCollectionList").then(res => {
  332. console.log(res);
  333. this.favoriteRecords = res.data.records //收藏记录
  334. })
  335. },
  336. checkDate(targetDate) {
  337. const today = new Date();
  338. const tomorrow = new Date();
  339. tomorrow.setDate(today.getDate() + 1);
  340. const inputDate = new Date(targetDate);
  341. // 重置时间为 00:00:00 进行比较
  342. today.setHours(0, 0, 0, 0);
  343. tomorrow.setHours(0, 0, 0, 0);
  344. inputDate.setHours(0, 0, 0, 0);
  345. if (inputDate.getTime() === today.getTime()) {
  346. return 1; // 今天
  347. } else if (inputDate.getTime() === tomorrow.getTime()) {
  348. return 2; // 明天
  349. } else {
  350. return 0; // 其他日期
  351. }
  352. },
  353. formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  354. const d = new Date(date);
  355. const padZero = (num) => String(num).padStart(2, '0');
  356. const replacements = {
  357. 'YYYY': d.getFullYear(),
  358. 'MM': padZero(d.getMonth() + 1),
  359. 'DD': padZero(d.getDate()),
  360. 'HH': padZero(d.getHours()),
  361. 'mm': padZero(d.getMinutes()),
  362. 'ss': padZero(d.getSeconds()),
  363. 'SSS': padZero(d.getMilliseconds()).padStart(3, '0'),
  364. 'M': d.getMonth() + 1,
  365. 'D': d.getDate(),
  366. 'H': d.getHours(),
  367. 'm': d.getMinutes(),
  368. 's': d.getSeconds()
  369. };
  370. return format.replace(/YYYY|MM|DD|HH|mm|ss|SSS|M|D|H|m|s/g, match => replacements[match]);
  371. },
  372. getInterviewRecords() {
  373. this.$Request.getT("/app/interviewRecord/getHrInterviewList").then(res => {
  374. console.log(res);
  375. this.interviewRecords = res.data.records //沟通记录
  376. })
  377. },
  378. getYearMonthInterval(startDate, endDate) {
  379. // 确保传入的是 Date 对象
  380. const start = new Date(startDate);
  381. const end = new Date(endDate);
  382. console.log(start, end, '为啥')
  383. return;
  384. // 确保结束日期在开始日期之后
  385. if (end < start) {
  386. throw new Error('结束日期必须在开始日期之后');
  387. }
  388. // 计算年份差异
  389. let yearDiff = end.getFullYear() - start.getFullYear();
  390. // 计算月份差异
  391. let monthDiff = end.getMonth() - start.getMonth();
  392. // 如果结束日期的月份小于开始日期的月份,需要借年
  393. if (monthDiff < 0) {
  394. yearDiff--;
  395. monthDiff += 12;
  396. }
  397. // 如果月份相同,但结束日期的日期小于开始日期的日期,也需要借月
  398. if (monthDiff === 0 && end.getDate() < start.getDate()) {
  399. yearDiff--;
  400. monthDiff = 11;
  401. } else if (end.getDate() < start.getDate()) {
  402. monthDiff--;
  403. }
  404. return [yearDiff, monthDiff];
  405. },
  406. goBack() {
  407. uni.navigateBack()
  408. },
  409. switchTab(index) {
  410. this.activeTab = index
  411. },
  412. goToResumeDetail(record) {
  413. console.log('查看简历详情:', record)
  414. uni.navigateTo({
  415. url: `/pages/talentSearch/resumeDetail?resumeId=${record.id}`
  416. })
  417. },
  418. selectDate(date) {
  419. // 选中当前点击的日期
  420. this.selectedDate = date.date
  421. console.log('选中日期:', date.date)
  422. },
  423. goToInterviewDetail(record) {
  424. console.log('查看面试详情:', record)
  425. uni.navigateTo({
  426. url: `/my/jilu/bossMianshiDetail?recordId=${record.recordId}`
  427. })
  428. },
  429. goToInterviewManage() {
  430. console.log('跳转到面试管理')
  431. uni.navigateTo({
  432. url: '/pages/recruitmentData/interviewManage'
  433. })
  434. },
  435. getData() {
  436. this.$Request.getT("/app/chat/chatUser").then(res => {
  437. console.log(res);
  438. this.communicationRecords = res.data.records //沟通记录
  439. })
  440. },
  441. goNav(url) {
  442. uni.navigateTo({
  443. url: url
  444. })
  445. }
  446. }
  447. }
  448. </script>
  449. <style lang="scss" scoped>
  450. .page {
  451. height: 100vh;
  452. overflow: hidden;
  453. }
  454. .tab-section-bg {
  455. position: fixed;
  456. top: 150rpx;
  457. left: 0;
  458. right: 0;
  459. z-index: 1000;
  460. background-color: #ffffff;
  461. padding: 32rpx;
  462. display: flex;
  463. justify-content: space-between;
  464. align-items: center;
  465. .title-text {
  466. color: rgba(51, 51, 51, 1);
  467. font-family: DM Sans;
  468. font-size: 48rpx;
  469. font-weight: 700;
  470. line-height: 60rpx;
  471. letter-spacing: 0px;
  472. }
  473. .interview-manage {
  474. color: rgba(1, 107, 246, 1);
  475. font-family: DM Sans;
  476. font-size: 28rpx;
  477. font-weight: 400;
  478. line-height: 60rpx;
  479. letter-spacing: 0px;
  480. text-align: left;
  481. }
  482. }
  483. /* Custom Navbar */
  484. .custom-navbar {
  485. position: fixed;
  486. top: 0;
  487. left: 0;
  488. right: 0;
  489. z-index: 1000;
  490. background-color: #ffffff;
  491. padding-top: 80rpx;
  492. }
  493. .navbar-content {
  494. display: flex;
  495. align-items: center;
  496. justify-content: space-between;
  497. height: 44px;
  498. padding: 20rpx;
  499. }
  500. .navbar-left {
  501. width: 44px;
  502. height: 44px;
  503. display: flex;
  504. align-items: center;
  505. justify-content: center;
  506. }
  507. .navbar-title {
  508. color: rgba(51, 51, 51, 1);
  509. font-family: DM Sans;
  510. font-size: 30rpx;
  511. font-weight: 700;
  512. line-height: 52rpx;
  513. letter-spacing: 0.5%;
  514. text-align: center;
  515. }
  516. .navbar-right {
  517. width: 44px;
  518. }
  519. /* Tab Section */
  520. .tab-section {
  521. position: fixed;
  522. top: 250rpx;
  523. left: 0;
  524. right: 0;
  525. background: white;
  526. z-index: 99;
  527. }
  528. /* Content Section */
  529. .content-section {
  530. margin-top: 330rpx;
  531. padding: 20rpx;
  532. height: calc(100vh - 330rpx) !important;
  533. overflow-y: auto;
  534. }
  535. /* Date Group */
  536. .date-group {
  537. margin-bottom: 20rpx;
  538. }
  539. .date-header {
  540. margin-bottom: 16rpx;
  541. }
  542. .date-text {
  543. color: rgba(153, 153, 153, 1);
  544. font-family: DM Sans;
  545. font-size: 24rpx;
  546. font-weight: 400;
  547. line-height: 32rpx;
  548. margin-left: 32rpx;
  549. }
  550. /* Talent Card */
  551. .talent-card {
  552. background-color: #ffffff;
  553. border-radius: 16rpx;
  554. margin-bottom: 20rpx;
  555. padding: 30rpx;
  556. // box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
  557. }
  558. .talent-content {
  559. .talent-header {
  560. display: flex;
  561. align-items: flex-start;
  562. .talent-avatar {
  563. width: 80rpx;
  564. height: 80rpx;
  565. border-radius: 50%;
  566. margin-right: 20rpx;
  567. }
  568. .talent-info {
  569. flex: 1;
  570. .talent-name-section {
  571. display: flex;
  572. align-items: center;
  573. justify-content: flex-start;
  574. width: 100%;
  575. margin-bottom: 6rpx;
  576. }
  577. .talent-name {
  578. color: rgba(51, 51, 51, 1);
  579. font-family: DM Sans;
  580. font-size: 28rpx;
  581. font-weight: 500;
  582. line-height: 36rpx;
  583. letter-spacing: 0.5%;
  584. text-align: left;
  585. margin-right: 16rpx;
  586. }
  587. .talent-tags {
  588. display: flex;
  589. flex-wrap: wrap;
  590. gap: 10rpx;
  591. .status-tag {
  592. padding: 8rpx;
  593. border-radius: 12rpx;
  594. font-size: 18rpx;
  595. font-family: DM Sans;
  596. font-weight: 400;
  597. line-height: 20rpx;
  598. letter-spacing: -0.5px;
  599. text-align: left;
  600. &.online {
  601. background: rgba(213, 255, 231, 1);
  602. color: rgba(29, 209, 104, 1);
  603. }
  604. &.hot {
  605. background: rgba(252, 233, 220, 1);
  606. color: rgba(1, 107, 246, 1);
  607. }
  608. &.active {
  609. color: rgba(153, 153, 153, 1);
  610. }
  611. }
  612. }
  613. }
  614. }
  615. .talent-experience {
  616. display: flex;
  617. align-items: center;
  618. margin-bottom: 12rpx;
  619. gap: 16rpx;
  620. color: rgba(156, 164, 171, 1);
  621. font-family: DM Sans;
  622. font-size: 24rpx;
  623. font-weight: 400;
  624. line-height: 32rpx;
  625. letter-spacing: 0.5%;
  626. text-align: left;
  627. }
  628. .current-job {
  629. display: flex;
  630. align-items: center;
  631. margin-bottom: 12rpx;
  632. .job-icon {
  633. width: 40rpx;
  634. height: 40rpx;
  635. margin-right: 8rpx;
  636. }
  637. .job-text {
  638. color: rgba(156, 164, 171, 1);
  639. font-family: DM Sans;
  640. font-size: 24rpx;
  641. font-weight: 400;
  642. line-height: 40rpx;
  643. letter-spacing: 0.5%;
  644. text-align: left;
  645. flex: 1;
  646. }
  647. .work-period {
  648. color: rgba(153, 153, 153, 1);
  649. font-family: DM Sans;
  650. font-size: 22rpx;
  651. font-weight: 400;
  652. line-height: 28rpx;
  653. }
  654. }
  655. .job-expectation {
  656. display: flex;
  657. align-items: center;
  658. margin-bottom: 16rpx;
  659. .job-icon {
  660. width: 40rpx;
  661. height: 40rpx;
  662. margin-right: 8rpx;
  663. }
  664. .expectation-text {
  665. color: rgba(156, 164, 171, 1);
  666. font-family: DM Sans;
  667. font-size: 24rpx;
  668. font-weight: 400;
  669. line-height: 40rpx;
  670. letter-spacing: 0.5%;
  671. text-align: left;
  672. }
  673. }
  674. .skill-tags {
  675. display: flex;
  676. flex-wrap: wrap;
  677. gap: 10rpx;
  678. margin-bottom: 16rpx;
  679. .skill-tag {
  680. padding: 8rpx;
  681. background: rgba(198, 198, 198, 0.1);
  682. border-radius: 12rpx;
  683. color: rgba(153, 153, 153, 1);
  684. font-family: DM Sans;
  685. font-size: 20rpx;
  686. font-weight: 400;
  687. line-height: 20rpx;
  688. letter-spacing: -0.5px;
  689. text-align: left;
  690. }
  691. }
  692. .job-description {
  693. margin-bottom: 12rpx;
  694. .description-text {
  695. color: rgba(97, 110, 124, 1);
  696. font-family: DM Sans;
  697. font-size: 24rpx;
  698. font-weight: 400;
  699. line-height: 32rpx;
  700. letter-spacing: 0px;
  701. text-align: left;
  702. }
  703. }
  704. }
  705. /* Interview List Styles */
  706. .interview-list {
  707. padding: 0 20rpx;
  708. }
  709. /* Date Selector */
  710. .date-selector {
  711. background: #ffffff;
  712. border-radius: 12rpx;
  713. padding: 24rpx 0;
  714. // margin-bottom: 20rpx;
  715. // border: 0.5px solid rgba(227, 231, 236, 1);
  716. }
  717. .week-days {
  718. display: flex;
  719. justify-content: space-between;
  720. margin-bottom: 16rpx;
  721. }
  722. .day-name {
  723. color: rgba(153, 153, 153, 1);
  724. font-family: DM Sans;
  725. font-size: 24rpx;
  726. font-weight: 400;
  727. line-height: 32rpx;
  728. text-align: center;
  729. flex: 1;
  730. }
  731. .week-dates {
  732. display: flex;
  733. justify-content: space-between;
  734. }
  735. .date-item {
  736. flex: 1;
  737. display: flex;
  738. justify-content: center;
  739. align-items: center;
  740. height: 60rpx;
  741. border-radius: 50%;
  742. cursor: pointer;
  743. min-width: 60rpx;
  744. max-width: 60rpx;
  745. }
  746. .date-item.active {
  747. background: rgba(1, 107, 246, 1);
  748. }
  749. .date-value {
  750. color: rgba(51, 51, 51, 1);
  751. font-family: DM Sans;
  752. font-size: 28rpx;
  753. font-weight: 400;
  754. line-height: 36rpx;
  755. text-align: center;
  756. }
  757. .date-item.active .date-value {
  758. color: #ffffff;
  759. }
  760. /* Interview Records */
  761. .interview-records {
  762. background: #ffffff;
  763. border-radius: 12rpx;
  764. padding: 24rpx 0;
  765. // border: 0.5px solid rgba(227, 231, 236, 1);
  766. }
  767. .interview-record {
  768. display: flex;
  769. position: relative;
  770. border-radius: 8rpx;
  771. margin-bottom: 16rpx;
  772. }
  773. .interview-record.today {
  774. background: rgba(250, 187, 143, 1);
  775. }
  776. .interview-record:not(.today) {
  777. background: rgba(221, 221, 221, 1);
  778. }
  779. .interview-record:last-child {
  780. margin-bottom: 0;
  781. }
  782. /* Record Content */
  783. .record-content {
  784. flex: 1;
  785. display: flex;
  786. align-items: center;
  787. gap: 24rpx;
  788. }
  789. .record-left {
  790. display: flex;
  791. flex-direction: column;
  792. min-width: 80rpx;
  793. padding: 32rpx;
  794. }
  795. .record-divider {
  796. width: 10rpx;
  797. height: 100%;
  798. background: rgba(1, 107, 246, 1);
  799. }
  800. .record-right {
  801. flex: 1;
  802. display: flex;
  803. flex-direction: column;
  804. gap: 8rpx;
  805. }
  806. .date-label {
  807. color: rgba(106, 106, 106, 1);
  808. font-family: DM Sans;
  809. font-size: 16rpx;
  810. font-weight: 400;
  811. line-height: 40rpx;
  812. letter-spacing: 0.5%;
  813. text-align: right;
  814. }
  815. .time-label {
  816. color: rgba(106, 106, 106, 1);
  817. font-family: DM Sans;
  818. font-size: 24rpx;
  819. font-weight: 400;
  820. line-height: 32rpx;
  821. letter-spacing: 0.5%;
  822. text-align: left;
  823. }
  824. .candidate-name {
  825. color: rgba(51, 51, 51, 1);
  826. font-family: DM Sans;
  827. font-size: 32rpx;
  828. font-weight: 600;
  829. line-height: 40rpx;
  830. }
  831. .candidate-details {
  832. color: rgba(102, 102, 102, 1);
  833. font-family: DM Sans;
  834. font-size: 24rpx;
  835. font-weight: 400;
  836. line-height: 32rpx;
  837. }
  838. /* Empty State - 与jobManagement页面保持一致 */
  839. .empty-state {
  840. display: flex;
  841. align-items: center;
  842. justify-content: center;
  843. padding: 40rpx;
  844. .empty-illustration {
  845. margin-bottom: 40rpx;
  846. .empty-image {
  847. width: 700rpx;
  848. height: 800rpx;
  849. }
  850. }
  851. .empty-text {
  852. color: rgba(120, 130, 138, 1);
  853. font-family: DM Sans;
  854. font-size: 28rpx;
  855. font-weight: 400;
  856. line-height: 36rpx;
  857. letter-spacing: 0.5%;
  858. text-align: center;
  859. }
  860. }
  861. .qyList {
  862. width: 100%;
  863. height: auto;
  864. margin-top: 20rpx;
  865. .qyList-box {
  866. width: 686rpx;
  867. height: 100%;
  868. .qyList-box-item {
  869. width: 100%;
  870. // height: 400rpx;
  871. padding-bottom: 40rpx;
  872. background-color: #ffffff;
  873. border-radius: 24rpx;
  874. margin-bottom: 20rpx;
  875. .qyList-box-item-box {
  876. width: 626rpx;
  877. height: 100%;
  878. }
  879. .qyList-box-item-info {
  880. margin-top: 40rpx;
  881. }
  882. .qyList-box-item-job {
  883. color: #121212;
  884. font-size: 28rpx;
  885. font-weight: 500;
  886. margin-top: 20rpx;
  887. }
  888. .qyList-box-item-rem {
  889. color: #999999;
  890. font-size: 26rpx;
  891. margin-top: 20rpx;
  892. }
  893. }
  894. }
  895. }
  896. .txt-desc{
  897. color: rgba(153, 153, 153, 1);
  898. font-family: DM Sans;
  899. font-size: 20rpx;
  900. font-weight: 400;
  901. line-height: 34rpx;
  902. letter-spacing: 0%;
  903. flex: 1;
  904. }
  905. </style>