communicationRecords.vue 27 KB

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