Prechádzať zdrojové kódy

Merge branch 'master' of https://git.nanodreamtech.com/Boss/yizhizan-h5

L 3 mesiacov pred
rodič
commit
89b1c762c1

+ 4 - 0
common/queue.js

@@ -292,6 +292,7 @@ module.exports = {
 			header: {
 				token: uni.getStorageSync('token')
 			},
+			timeout: params?.timeout ? params.timeout : 60000,
 			success: (uploadFileRes) => {
 				let content = JSON.parse(uploadFileRes.data)
 				uni.hideLoading();
@@ -302,6 +303,9 @@ module.exports = {
 				console.log(err)
 			}
 		});
+		if (params?.hideUploadTask) {
+			return
+		}
 		uploadTask.onProgressUpdate((res) => {
 			uni.showLoading({
 				title: '上传进度' + res.progress + '%',

+ 2 - 2
manifest.json

@@ -2,8 +2,8 @@
     "name" : "亿职赞",
     "appid" : "__UNI__0B0096D",
     "description" : "",
-    "versionName" : "1.2.7",
-    "versionCode" : 127,
+    "versionName" : "1.2.8",
+    "versionCode" : 128,
     "transformPx" : false,
     "sassImplementationName" : "node-sass",
     /* 5+App特有相关 */

+ 175 - 6
package/jobIntention/basicInfo.vue

@@ -62,7 +62,10 @@
 			<!-- 手机号 -->
 			<view class="form-item">
 				<view class="form-label">手机号</view>
-				<view class="phone-number">{{ hidePhoneNumber }}</view>
+				<view class="flex align-center justify-between">
+					<view class="phone-number">{{ hidePhoneNumber }}</view>
+					<text class="modify-link" @click="showChangeModal = true">修改手机号</text>
+				</view>
 			</view>
 
 			<!-- 联系方式 -->
@@ -134,14 +137,31 @@
 				<view class="popup-text-permission">选择/拍摄照片需要相机/相册权限,用于上传用户头像</view>
 			</view>
 		</u-popup>
+		<!-- 变更手机号 -->
+		<c-modal
+			:value="showChangeModal"
+			title="请填写您需要变更的手机号"
+			@cancel="showChangeModal = false"
+			@confirm="submitChangePhoneNumber"
+		>
+			<view class="input-wrapper" style="margin-top: 30px">
+				<input v-model="phoneNum" type="number" placeholder="请输入要变更的手机号码" maxlength="11" placeholder-class="placeholder" />
+			</view>
+			<view class="input-wrapper flex align-center justify-between" style="margin-bottom: 30px;">
+				<input v-model="verifyCode" type="number" placeholder="输入验证码" maxlength="6" class="verify-input" placeholder-class="placeholder" />
+				<view class="verify-btn" @click="getVerifyCode">{{ disabled ? `${countdown}s` : '获取验证码' }}</view>
+			</view>
+		</c-modal>
 	</view>
 </template>
 
 <script>
 	import navBar from "@/components/nav-bar/index.vue";
+	import cModal from '@/components/c-modal.vue'
 	export default {
 		components: {
 			navBar,
+			cModal
 		},
 		data() {
 			return {
@@ -182,14 +202,21 @@
 						text: '在职-暂不考虑',
 						recommended: false
 					},
-					{
-						value: '4',
-						text: '实习',
-						recommended: false
-					}
+					// {
+					// 	value: '4',
+					// 	text: '实习',
+					// 	recommended: false
+					// }
 				],
 				isAnonymous: false, // 匿名展示
 				scene: 0, // 0.默认 1.H5邀请 2.注册进入
+				showChangeModal: false,
+				disabled: false,
+				timer: null,
+				countdown: 60,
+				getting: false,
+				verifyCode: '',
+				phoneNum: '', // 输入手机号
 			}
 		},
 		computed: {
@@ -201,6 +228,17 @@
 				return this.$queue.getData('userType')
 			}
 		},
+		watch: {
+			showChangeModal(nValue) {
+				if (!nValue) {
+					// 关闭弹窗时清除选择的手机号
+					this.changePhoneNum = ''
+					this.verifyCode = ''
+					this.phoneNum = ''
+					this.clearCountdownTimer()
+				}
+			}
+		},
 		onLoad(options) {
 			// #ifdef APP-PLUS
 			let systemInfo = uni.getSystemInfoSync();
@@ -221,6 +259,9 @@
 			}
 			this.getUserInfo()
 		},
+		onUnload() {
+			this.clearCountdownTimer()
+		},
 		methods: {
 			goBack() {
 				uni.navigateBack();
@@ -426,6 +467,104 @@
 			// 		}
 			// 	});
 			// }
+			
+			// 变更手机号
+			submitChangePhoneNumber() {
+				if (this.updating) return
+				this.updating = true
+				
+				if (!this.phoneNum) {
+					uni.showToast({
+						title: '请输入手机号',
+						icon: 'none'
+					})
+					return
+				}
+				
+				if (!this.verifyCode) {
+					uni.showToast({
+						title: '请输入验证码',
+						icon: 'none'
+					})
+					return
+				}
+				
+				uni.showLoading({ title: '处理中' })
+				this.$Request.getT('/app/user/updateUserByUserId', {
+					phone: this.phoneNum,
+					msg: this.verifyCode,
+				}).then(res => {
+					if (res.code == 0) {
+						this.showChangeModal = false
+						this.$queue.showToast('更换成功')
+						this.getUserInfo()
+					} else {
+						this.$queue.showToast(res.msg || '出错了,请稍后再试')
+					}
+				}).finally(() => {
+					uni.hideLoading()
+					this.updating = false
+				})
+			},
+			
+			// 获取验证码
+			getVerifyCode() {
+				if (!this.phoneNum) {
+					uni.showToast({
+						title: '请输入手机号',
+						icon: 'none'
+					})
+					return
+				}
+				if (!/^1[3-9]\d{9}$/.test(this.phoneNum)) {
+					uni.showToast({
+						title: '请输入正确的手机号',
+						icon: 'none'
+					})
+					return
+				}
+				
+				if (this.disabled || this.getting) return
+				
+				uni.showLoading({ title: '正在发送验证码' })
+				this.getting = true
+				this.$Request
+					.getT('/app/Login/sendMsg/' + this.phoneNum + '/bind')
+					.then((res) => {
+						if (res.code === 0) {
+							this.startCountdown()
+						} else {
+							uni.showModal({
+								showCancel: false,
+								title: '短信发送失败',
+								content: res.msg ? res.msg : '请一分钟后再获取验证码',
+							});
+						}
+					})
+					.finally(() => {
+						this.getting = false
+						uni.hideLoading();
+					})
+			},
+			
+			startCountdown() {
+				this.disabled = true
+				this.timer = setInterval(() => {
+					this.countdown--
+					if (this.countdown <= 0) {
+					    this.clearCountdownTimer()
+					}
+				}, 1000)
+			},
+			
+			clearCountdownTimer() {
+			    if (this.timer) {
+					clearInterval(this.timer)
+					this.timer = null // 重置定时器实例
+					this.countdown = 60
+					this.disabled = false
+				}
+			},
 		}
 	}
 </script>
@@ -580,6 +719,10 @@
 				line-height: 48rpx;
 			}
 			
+			.modify-link {
+				color: #007AFF;
+			}
+			
 			// 出生年月placeholder样式
 			.placeholder-text {
 				color: #999;
@@ -715,4 +858,30 @@
 			padding-right: 32rpx;
 		}
 	}
+	
+	// 更换账号弹窗
+	.input-wrapper {
+		box-sizing: border-box;
+		border: 1px solid rgba(242, 242, 242, 1);
+		border-radius: 6px;
+		background: rgba(250, 250, 250, 1);
+		margin-bottom: 16rpx;
+		padding: 10rpx 24rpx;
+		font-size: 28rpx;
+		line-height: 60rpx;
+		input {
+			height: 60rpx;
+			font-size: 28rpx;
+			color: #1f2c37;
+		}
+		.placeholder {
+			color: rgba(158, 161, 168, 1);
+		}
+		.verify-input {
+			width: 300rpx;
+		}
+		.verify-btn {
+			color: rgba(1, 107, 246, 1);
+		}
+	}
 </style>

+ 19 - 10
package/jobIntention/companyImg.vue

@@ -140,15 +140,19 @@
 
 				companyProofList: [], // 公司证明本地预览图
 				companyProofUrls: [], // 上传后URL列表
-
-				action: configdata.APIHOST1 + '/alioss/upload',
-				
-				actionBusinessLicense: configdata.APIHOST1 + '/alioss/uploadBusinessLicense',
 				
 				showDateModal: false
 			};
 		},
 		components: { navBar,fileSelector},
+		computed: {
+			action() {
+				return this.$Request.config('APIHOST1') + '/alioss/upload';
+			},
+			actionBusinessLicense() {
+				return this.$Request.config('APIHOST1') + '/alioss/uploadBusinessLicense';
+			},
+		},
 		onLoad(options) {
 			if (options.companyName) this.companyName = decodeURIComponent(options.companyName);
 			if (options.companyId) this.companyId = options.companyId;
@@ -198,15 +202,16 @@
 						formData: {
 							isBusinessLicense: url ? true : false
 						},
+						timeout: 480000,
 						success: (res) => {
 							const data = JSON.parse(res.data);
 							if (data.code === 0 && data.data) {
 								if (data.data.src) {
-									this.companyName = data.data.companyName
-									this.companyCreateTime = data.data.companyCreateTime?.slice(0, 10)
-									this.companyDutyParagraph = data.data.companyDutyParagraph
-									this.companyLegalPerson = data.data.companyLegalPerson
-									this.companyLegalPerson = data.data.companyLegalPerson
+									this.companyName = data.data?.companyAllName
+									this.companyCreateTime = data.data?.companyCreateTime?.slice(0, 10)
+									this.companyDutyParagraph = data.data?.companyDutyParagraph
+									this.companyLegalPerson = data.data?.companyLegalPerson
+									this.companyLegalPerson = data.data?.companyLegalPerson
 								}
 								let imgUrl = data.data.src ? data.data.src : data.data
 								resolve(imgUrl);
@@ -242,7 +247,11 @@
 							this.licenseUrl = await this.uploadSingleFile(tempFilePath, this.actionBusinessLicense);
 							uni.showToast({ title: '上传成功', icon: 'success' });
 						} catch (e) {
-							uni.showToast({ title: '上传失败', icon: 'none' });
+							uni.showModal({
+								title: '提示',
+								content: '上传失败',
+								showCancel: false
+							})
 						} finally {
 							uni.hideLoading();
 						}

+ 5 - 5
package/jobIntention/tagManage.vue

@@ -117,11 +117,11 @@ export default {
 					text: '在职-暂不考虑',
 					recommended: false
 				},
-				{
-					value: 4,
-					text: '实习',
-					recommended: false
-				}
+				// {
+				// 	value: 4,
+				// 	text: '实习',
+				// 	recommended: false
+				// }
 			]
 		}
 	},

+ 14 - 1
package/my/feedback/index.vue

@@ -17,7 +17,8 @@
 						<view class="text">{{ item.content }}</view>
 						<view class="time">{{ item.createTime }}</view>
 						<view>
-							<view class="tag" v-if="setStatusText(item.status)">{{ setStatusText(item.status) }}</view>
+							<view class="tag" :class="{ 'tag-danger': item.status == 2 }" v-if="setStatusText(item.status)">{{ setStatusText(item.status) }}</view>
+							<view v-if="item.auditContent" class="audit-content">{{ item.auditContent }}</view>
 						</view>
 						<view class="buttons">
 							<view class="button" @click="handleDelete(item)">删除</view>
@@ -91,6 +92,8 @@
 						return '已留言'
 					case 1: 
 						return '已采纳'
+					case 2:
+						return '不采纳'
 				}
 				return ''
 			},
@@ -248,6 +251,16 @@
 					line-height: 1;
 					margin: 8rpx 0;
 				}
+				.tag-danger {
+					color: rgba(237, 66, 69, 1);
+					background: rgba(255, 246, 247, 1);
+				}
+				.audit-content {
+					color: #999;
+					font-size: 24rpx;
+					margin-bottom: 12rpx;
+					word-wrap: break-word;
+				}
 				.button {
 					width: 190rpx;
 					height: 60rpx;

+ 14 - 3
pages/index/index.vue

@@ -435,9 +435,12 @@
 									<view class="tags">
 										<view class="tag" v-for="(skill, i) in parseSkills(item.intentIndustry)" :key="i">{{ skill }}</view>
 									</view>
-									<view class="bottom-section flex align-center">
-										<image src="@/static/images/svg/heart.svg" class="expection-icon"></image>
-										求职期望:{{ item.expectedPosition }}
+									<view class="bottom-section flex align-center justify-between">
+										<view class="flex align-center">
+											<image src="@/static/images/svg/heart.svg" class="expection-icon"></image>
+											求职期望:{{ item.expectedPosition }}											
+										</view>
+										<view class="has-view" v-if="item.isChatColleague">同事已看</view>
 									</view>
 								</view>
 							</view>
@@ -2786,6 +2789,14 @@ page {
 					height: 40rpx;
 					margin-right: 8rpx;
 				}
+				.has-view {
+					line-height: 1;
+					font-size: 24rpx;
+					color: rgba(102, 102, 102, 1);
+					border-radius: 8rpx;
+					background: rgba(153, 153, 153, 0.1);
+					padding: 8rpx 12rpx;
+				}
 			}
 		}
 	}

+ 25 - 2
pages/msg/im.vue

@@ -955,6 +955,7 @@
 				},
 				showChangYong: false,
 				changYongList: [],
+				customMessageList: [],
 				// 工作描述展开状态
 				isJobDescExpanded: false,
 				//播放语音相关参数
@@ -1087,10 +1088,11 @@
 					ruleClassifyName: this.postPushInfo?.ruleClassifyName, // 岗位
 					companyName: this.postPushInfo?.company?.companyAllName, // 公司名称
 				}
-				return this.changYongList.map(item => {
+				const list = this.changYongList.map(item => {
 					item.label = this.replaceTemplate(item.label, types)
 					return item
 				})
+				return this.customMessageList.concat(list)
 			}
 		},
 		onLoad(d) {
@@ -2150,7 +2152,8 @@
 						}
 					});
 			},
-			showChangYongSelect() {
+			async showChangYongSelect() {
+				await this.getCustomMessage();
 				this.showMore();
 				this.showChangYong = !this.showChangYong;
 			},
@@ -2183,6 +2186,26 @@
 					}
 				});
 			},
+			// 请求自定义语句
+			getCustomMessage() {
+				return this.$Request
+					.getT('/app/message/selectMessageByUserId?page=1&limit=100&state=20')
+					.then(res => {
+						if (res.code == 0) {
+							this.customMessageList = res.data?.list?.map(item => {
+								return {
+									label: item.content,
+									value: item.id
+								}
+							}) || []
+						} else {
+							this.customMessageList = []
+						}
+					})
+					.catch(() => {
+						this.customMessageList = []
+					})
+			},
 			// 替换常用语中的公司信息,个人信息等
 			replaceTemplate(template, data) {
 				return template.replace(/\[(\w+)\]/g, (match, key) => {

+ 125 - 148
pages/my/attachment.vue

@@ -32,11 +32,28 @@
 				<empty :isShow="false" v-if="content.length == 0" />
 			</scroll-view>
 		</view>
-		<view class="footer-btn">
+		<view class="buttons flex align-center">
 			<view class="white-btn" @click="handleWeChatUpload">微信上传</view>
-			<view class="white-btn" @click="handlUploadFile">附件简历一键识别</view>
-			<fileSelector title="简历上传" allowType=".doc,.docx,.xls,.xlsx,.pdf" @fileSelected="uploadResumes"
-				@filesChanged="onFilesChanged" />
+			<view class="button pain" @click="showTipPopup = true">Ai一键解析简历</view>
+			<view class="button primary">
+				简历上传
+				<fileSelector title="" allowType=".doc,.docx,.xls,.xlsx,.pdf" @fileSelected="uploadResumes"
+					@filesChanged="onFilesChanged" />
+			</view>
+		</view>
+		<!-- 简历解析确认弹窗 -->
+		<view class="popup-container" v-if="showTipPopup" @click="showTipPopup = false">
+			<view class="popup-content">
+				<view class="popup-title">温馨提示</view>
+				<view class="tip-container">
+					<view>1-2页简历识别预计耗时1分钟;</view>
+					<view>3-5页简历识别预计耗时1-3分钟;</view>
+					<view>5页简历以上耗时将会超过5分;</view>
+					<view>请您耐心等待!</view>
+				</view>
+				<image src="@/static/upload-tip.png" class="upload-tip"></image>
+				<view class="button-primary" @click.stop="handlUploadFile">知道了</view>
+			</view>
 		</view>
 		<!-- 简历解析加载 -->
 		<view class="load-container" v-if="showLoadCard">
@@ -131,7 +148,8 @@ export default {
 					value: '',
 				},
 			],
-			loading: false
+			loading: false,
+			showTipPopup: false
 		};
 	},
 	computed: {
@@ -200,95 +218,6 @@ export default {
 				url: '../jifen/myaddress'
 			});
 		},
-		// uploadImg() {
-		// 	let token = uni.getStorageSync('token')
-
-		// 	if (!token) {
-		// 		this.goLoginInfo();
-		// 		return;
-		// 	}
-		// 	let that = this;
-		// 	var url = null;
-		// 	uni.showActionSheet({
-		// 		// itemList按钮的文字接受的是数组
-		// 		itemList: ["查看头像", "从相册选择图片"],
-		// 		async success(e) {
-		// 			var index = e.tapIndex
-		// 			if (index === 0) {
-		// 				// 用户点击了预览当前图片
-		// 				// 可以自己实现当前头像链接的读取
-		// 				let url = that.avatar;
-		// 				let arr = []
-		// 				arr.push(url)
-		// 				uni.previewImage({
-		// 					// 预览功能图片也必须是数组的
-		// 					urls: arr
-		// 				})
-		// 			} else if (index === 1) {
-		// 				// 1. 检查权限状态
-		// 				const hasPermission = await this.$queue.checkPermission(
-		// 					'camera',
-		// 					'选择/拍摄照片需要相机/相册权限,用于上传用户头像',
-		// 					this
-		// 				);
-
-		// 				// 2. 如果未授权或者用户拒绝,显示提示
-		// 				if (!hasPermission) {
-		// 					return;
-		// 				}
-		// 				uni.chooseImage({
-		// 					count: 1, //默认9
-		// 					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
-		// 					sourceType: ['album'], //从相册选择
-		// 					success: function (res) {
-		// 						uni.showLoading({
-		// 							title: '上传中...'
-		// 						});
-		// 						let token = uni.getStorageSync('token');
-		// 						let userId = uni.getStorageSync('userId');
-		// 						uni.uploadFile({
-		// 							url: this.$Request.config("APIHOST1") +
-		// 								'/alioss/upload', //真实的接口地址
-
-		// 							filePath: res.tempFilePaths[0],
-		// 							header: {
-		// 								token: token
-		// 							},
-		// 							name: 'file',
-		// 							success: uploadFileRes => {
-		// 								url = JSON.parse(uploadFileRes.data);
-		// 								that.avatar = url.data
-		// 								uni.hideLoading();
-		// 							}
-		// 						});
-		// 					}
-		// 				});
-		// 			}
-		// 		}
-		// 	})
-		// },
-		// config: function (name) {
-		// 	var info = null;
-		// 	if (name) {
-		// 		var name2 = name.split("."); //字符分割
-		// 		if (name2.length > 1) {
-		// 			info = configdata[name2[0]][name2[1]] || null;
-		// 		} else {
-		// 			info = configdata[name] || null;
-		// 		}
-		// 		if (info == null) {
-		// 			let web_config = cache.get("web_config");
-		// 			if (web_config) {
-		// 				if (name2.length > 1) {
-		// 					info = web_config[name2[0]][name2[1]] || null;
-		// 				} else {
-		// 					info = web_config[name] || null;
-		// 				}
-		// 			}
-		// 		}
-		// 	}
-		// 	return info;
-		// },
 		getUserInfo() {
 			this.$Request.get("/app/resumes/getAttachment").then(res => {
 				if (res.code == 0) {
@@ -438,6 +367,7 @@ export default {
 		// 附件一键识别
 		handlUploadFile() {
 			if (this.content.length >= 3) {
+				this.showTipPopup = false
 				this.$queue.showToast('最多保存三张附件简历,请删除后再试')
 				return
 			}
@@ -470,7 +400,7 @@ export default {
 						fileType,
 						name
 					}
-					this.uploadFile(file)
+					this.uploadAndAnalysisResumes(file)
 				}
 			})
 			// #endif
@@ -478,7 +408,7 @@ export default {
 			uni.chooseFile({
 				count: 1,
 				success: res => {
-					this.uploadFile({
+					this.uploadAndAnalysisResumes({
 						path: res.tempFilePaths[0],
 						name: 'file'
 					})
@@ -486,56 +416,33 @@ export default {
 			})
 			// #endif
 		},
-		// 上传文件
-		uploadFile(file) {
+		// 上传解析简历
+		uploadAndAnalysisResumes(file) {
+			this.showTipPopup = false
+			this.showLoadCard = true
 			this.$queue.uploadFiles({
-				url: '/app/resumes/aiResumesUpload',
+				url: '/app/resumes/resumesAnalysisPlus',
 				path: file.path,
-				name: 'file'
+				name: 'file',
+				timeout: 480000,
+				hideUploadTask: true
 			}, (res) => {
-				if (res && res.code === 0) {
-					const id = res.data?.id
-					const resumesAttachmentId = res.data?.resumesAttachmentId || ''
-					if (id) {
-						this.getAiResumesAnalysis(id, resumesAttachmentId)
-					}
+				if (!res) {
+					this.showModal('解析失败,请稍后重试')
+					this.stopLoadStatus()
+					return
+				}
+				if (res.code == 0 && res.data) {
+					// 识别前,先清空数据
+					this.clearResumeData()
+					this.setAiResumesAnalysis(JSON.parse(res.data))
 					
-					// 上传成功,获取简历列表数据
 					this.getUserInfo()
 				} else {
-					this.$queue.showToast(res ? res.msg : '文件上传失败')
-				}
-			})
-		},
-		// 获取简历解析数据
-		getAiResumesAnalysis(fileId, resumesAttachmentId) {
-			this.showLoadCard = true
-			uni.request({
-				url: this.$Request.config('APIHOST') + '/app/resumes/aiResumesAnalysis',
-				header: {
-					'content-type': 'application/x-www-form-urlencoded', // 模拟 form-data
-					token: uni.getStorageSync('token'),
-				},
-				method: 'post',
-				data: {
-					fileId,
-					resumesAttachmentId
-				},
-				timeout: 180000,
-				success: (res) => {
-					this.stopLoadStatus()
-					
-					if (res.data?.code == 0) {
-						const data = res.data.data.data
-						// 识别前,先清空数据
-						this.clearResumeData()
-						this.setAiResumesAnalysis(data.output)
-					}
-				},
-				fail: (err) => {
 					this.showModal('解析失败,请稍后重试')
-					this.stopLoadStatus()
 				}
+				
+				this.stopLoadStatus()
 			})
 		},
 		stopLoadStatus() {
@@ -873,16 +780,39 @@ button {
 	border: none;
 }
 
-.footer-btn .usermain-btn {
-	color: rgba(255, 255, 255, 1);
-	background: rgba(1, 107, 246, 1);
-	text-align: center;
-	width: 90%;
-	height: 80rpx;
-	font-size: 32rpx;
-	line-height: 80rpx;
-	margin: 20rpx auto;
-	border-radius: 40rpx;
+.buttons {
+	padding: 40rpx 40rpx 60rpx;
+	.button {
+		position: relative;
+		flex: 1;
+		height: 80rpx;
+		line-height: 80rpx;
+		text-align: center;
+		border-radius: 80rpx;
+		&:first-child {
+			margin-right: 16rpx;
+		}
+	}
+	.pain {
+		color: rgba(1, 107, 246, 1);
+		background: rgba(1, 107, 246, 0.1);
+	}
+	.primary {
+		color: #fff;
+		background: linear-gradient(90.00deg, rgba(13, 39, 247, 1),rgba(19, 193, 234, 1));
+	}
+	::v-deep .main {
+		position: absolute;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		padding: 0;
+		.upload-area {
+			margin: 0;
+			background: transparent;
+		}
+	}
 }
 
 /* 选择器样式 - 参考workExperience页面 */
@@ -1026,4 +956,51 @@ button {
 		background: rgba(230, 230, 230, 1);
 	}
 }
+
+// 简历解析提示弹窗
+.popup-container {
+	position: fixed;
+	left: 0;
+	top: 0;
+	width: 100vw;
+	height: 100vh;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	background: rgba(0, 0, 0, 0.4);
+	.popup-content {
+		padding: 40rpx 0;
+		border-radius: 20rpx;
+		background: #fff;
+		.popup-title {
+			font-size: 32rpx;
+			font-weight: 600;
+			line-height: 56rpx;
+			color: rgba(16, 24, 40, 1);
+			text-align: center;
+			margin-bottom: 20rpx;
+		}
+		.tip-container {
+			padding: 0 130rpx;
+			color: rgba(96, 96, 96, 1);
+			font-size: 28rpx;
+			line-height: 36rpx;
+		}
+		.upload-tip {
+			display: block;
+			width: 654rpx;
+			height: 802rpx;
+		}
+		.button-primary {
+			height: 80rpx;
+			border-radius: 80rpx;
+			text-align: center;
+			color: #fff;
+			font-size: 32rpx;
+			line-height: 80rpx;
+			margin: 0 40rpx;
+			background: linear-gradient(90.00deg, rgba(13, 39, 247, 1),rgba(19, 193, 234, 1));
+		}
+	}
+}
 </style>

+ 63 - 39
pages/my/index.vue

@@ -28,7 +28,7 @@
 								<view class="flex align-center">
 									<view class="info-box-header-l">
 										<image :src="avatar ? avatar : '../../static/images/logo.jpg'" mode="aspectFill"></image>
-										<view class="info-tip" v-if="score < 60">待完善</view>
+										<view class="info-tip" v-if="score >= 0 && score < 60">待完善</view>
 									</view>
 									<view class="info-box-header-r">
 										<view class="info-box-header-r-name flex align-center">
@@ -107,13 +107,14 @@
 										<!-- <image src="../../static/images/index/qwzn.svg" mode=""></image> -->
 										<image src="@/static/images/my/icons/home.png"></image>
 										<view class=""> 在线简历 </view>
-										<view class="info-tip" v-if="score < 60">待完善</view>
+										<view class="info-tip" v-if="score >= 0 && score < 60">待完善</view>
 									</view>
 									<view class="jobServer-box-btn-item flex justify-center flex-wrap"
 										@click="goNav('/pages/my/attachment')">
 										<!-- <image src="../../static/images/index/cpbk.svg" mode=""></image> -->
 										<image src="@/static/images/my/icons/file.png" mode=""></image>
-										<view class=""> 附件简历 </view>
+										<view class=""> 附件简历 </view>
+										<image src="@/static/images/my/ai-icon.png" class="ai-icon"></image>
 									</view>
 									<view class="jobServer-box-btn-item flex justify-center flex-wrap"
 										@click="goNav('/package/jobIntention/tagManage')">
@@ -312,6 +313,7 @@
 										<view class="" style="color: #1a1a1a; font-size: 24rpx; margin-top: 15rpx">
 											企业管理
 										</view>
+										<image src="@/static/images/my/admin.png" class="admin-badge" v-if="isAdmin"></image>
 									</view>
 									<view class="util-item" @click="goChat">
 										<image src="../../static/images/my/icon/utils/kefu.png"
@@ -354,7 +356,7 @@
 				<view class="report-btn" @click="showReportModal = false">确认</view>
 			</view>
 		</u-popup>
-		<u-popup v-model="showNotice" mode="center" :mask-close-able="false">
+		<!-- <u-popup v-model="showNotice" mode="center" :mask-close-able="false">
 			<view class="flex flex-direction" style="background-color: rgba(0, 0, 0, 0.6);height: 85vh;">
 				<view class="pop-image" v-if="userType == 1">
 					<image src="/static/images/hxr.jpg"></image>
@@ -364,7 +366,7 @@
 				</view>
 				<u-button @click="handleCloseNotice" class="pop-btn">确认</u-button>
 			</view>
-		</u-popup>
+		</u-popup> -->
 		
 		<!-- 重新提交审核弹窗 -->
 		<c-modal :value="auditModal" title="提示" @cancel="auditModal = false" @confirm="handleAudit">
@@ -415,11 +417,11 @@ export default {
 				text: "在职-暂不考虑",
 				fontSize: 24,
 			},
-			{
-				id: 4,
-				text: "实习",
-				fontSize: 24,
-			},
+			// {
+			// 	id: 4,
+			// 	text: "实习",
+			// 	fontSize: 24,
+			// },
 			],
 			userType: 1,
 			avatar: "",
@@ -444,10 +446,10 @@ export default {
 			companyInfo: "",
 			companyStatus: "", //企业认证状态(1:审核中 2:已通过 3:已拒绝 空:未认证)
 			isAndroid: false,
-			iosAudit: 1,
+			iosAudit: 1,
 			showVipBanner: false,
-			showNotice:false,
-			score: 0, // 简历完善度
+			// showNotice:false,
+			score: undefined, // 简历完善度
 			auditModal: false,
 			unverified: false,
 			modalMessage: '',
@@ -480,7 +482,13 @@ export default {
 				return true
 			}
 			return false
-		},		
+		},
+		isAdmin() {
+			if (this.companyInfo?.companyUser?.isAdmin === 1) {
+				return true
+			}
+			return false
+		}
 	},
 	watch: {
 		auditModal(value) {
@@ -528,9 +536,9 @@ export default {
 		})
 		console.log(uni.getStorageSync("userType"))
 		this.$queue.changeTabbar(uni.getStorageSync("userType") || 1);
-		if (!this.$queue.getData('hadShowPoster')) {
-			this.showNotice = true
-		}
+		// if (!this.$queue.getData('hadShowPoster')) {
+		// 	this.showNotice = true
+		// }
 	},
 	onUnload() {
 		uni.$off('changeRole')
@@ -580,8 +588,8 @@ export default {
 				this.openMsg();
 			}
 			// #endif
-		}
-		
+		}
+		
 		this.getConfigData()
 	},
 	methods: {
@@ -735,7 +743,7 @@ export default {
 					if (res.data) {
 						this.resumesStatus = res.data.resumesStatus;
 						this.resumesId = res.data.resumesId;
-						this.score = res.data.score;
+						this.score = res.data?.score || 0;
 						if (this.resumesStatus == 1) {
 							this.list = [{
 								id: 2,
@@ -1346,11 +1354,11 @@ export default {
 			this.$queue.toLogin()
 		},
 		
-		// 关闭海报弹窗
-		handleCloseNotice() {
-			this.$queue.setData('hadShowPoster', '1')
-			this.showNotice = false
-		},
+		// // 关闭海报弹窗
+		// handleCloseNotice() {
+		// 	this.$queue.setData('hadShowPoster', '1')
+		// 	this.showNotice = false
+		// },
 		
 		// 点击公司首页
 		handleToCompanyIndex() {
@@ -1458,20 +1466,20 @@ export default {
 					this.$queue.showToast(err || '扫码失败了,请重新尝试')
 				}
 			})
-		},
-		
-		// 获取配置数据
-		getConfigData() {
-			this.$Request
-				.get('/app/dict/list', {
-					type: 'VIP按钮'
-				})
-				.then((res) => {
-					if (res.code == 0 && res.data?.length) {
-						this.showVipBanner = res.data[0]?.code == '开'
-					}
-					console.log(this.showVipBanner)
-				})
+		},
+		
+		// 获取配置数据
+		getConfigData() {
+			this.$Request
+				.get('/app/dict/list', {
+					type: 'VIP按钮'
+				})
+				.then((res) => {
+					if (res.code == 0 && res.data?.length) {
+						this.showVipBanner = res.data[0]?.code == '开'
+					}
+					console.log(this.showVipBanner)
+				})
 		}
 	},
 };
@@ -2021,6 +2029,14 @@ page {
 					width: 62rpx;
 					height: 62rpx;
 					margin-bottom: 10rpx;
+				}
+				
+				.ai-icon {
+					position: absolute;
+					top: -12rpx;
+					right: 12rpx;
+					width: 36rpx;
+					height: 36rpx;
 				}
 			}
 		}
@@ -2057,11 +2073,19 @@ page {
 				gap: 30rpx 20rpx;
 
 				.util-item {
+					position: relative;
 					display: flex;
 					flex-direction: column;
 					justify-content: center;
 					align-items: center;
 				}
+				.admin-badge {
+					position: absolute;
+					right: 16rpx;
+					top: 0;
+					width: 50rpx;
+					height: 28rpx;
+				}
 			}
 		}
 

+ 4 - 4
pages/my/jobApplicant/workRecord.vue

@@ -255,10 +255,10 @@ export default {
           value: '3',
           text: '在职-暂不考虑',
         },
-		{
-			value: '4',
-			text: '实习',
-		}
+		// {
+		// 	value: '4',
+		// 	text: '实习',
+		// }
       ],
       showStatus: false,
       formData: {

+ 3 - 3
pages/my/myCompany.vue

@@ -88,10 +88,10 @@
 				<view class="account-info flex">
 					<view class="account-info-l">
 						<view class="title flex align-center">
-							<text>王先生/18828000000</text>
+							<text>{{ currentAuditItem.userName }} / {{ currentAuditItem.phone }}</text>
 						</view>
-						<view class="sub-title">提交时间:2021.09.22 09:55</view>
-						<view class="sub-title">总监</view>
+						<view class="sub-title">提交时间:{{ currentAuditItem.createTime }}</view>
+						<view class="sub-title">{{ currentAuditItem.hrPosition }}</view>
 					</view>
 				</view>
 				

+ 2 - 2
pages/my/onlineResume.vue

@@ -425,7 +425,7 @@ export default {
 		// 判断是否有fileId,如果有则是从上传简历文件页面跳转
 		if (options.fileId) {
 			this.clearResumeData()
-			this.getAiResumesAnalysis(options.fileId)
+			this.getAiResumesAnalysis()
 		}
 		this.getData()
 		var that = this
@@ -747,7 +747,7 @@ export default {
 		
 		// 获取简历解析数据
 		getAiResumesAnalysis() {
-			const data = this.$queue.getData('AI_Resume_Data')
+			const data = JSON.parse(this.$queue.getData('AI_Resume_Data') || '{}')
 			AIResumeData = data || {}
 			if (data) {
 				this.showResumesAnalysis = true

+ 4 - 4
pages/my/workExperience.vue

@@ -674,7 +674,7 @@ export default {
 		},
 
 		saveWorkExperience() {
-			console.log(this.formData.resumes)
+			console.log(this.formData)
 			if (!this.formData.companyName) {
 				uni.showToast({
 					title: "请输入公司名称",
@@ -682,7 +682,7 @@ export default {
 				});
 				return;
 			}
-			if (this.formData.businessTypes.length <= 0) {
+			if (!this.formData?.businessTypes || this.formData?.businessTypes?.length <= 0) {
 				uni.showToast({
 					title: "请选择公司业务类型",
 					icon: "none"
@@ -728,14 +728,14 @@ export default {
 					this.$queue.showToast('岗位不能为空')
 					return false;
 				}
-				if (item.skills.length <= 0) {
+				if (!item.skills || item.skills?.length <= 0) {
 					this.$queue.showToast('岗位技能不能为空')
 					return false;
 				}
 				if (!item.workContent) {
 					this.$queue.showToast('请输入工作内容')
 					return false;
-				} else if (item.workContent.length < 80) {
+				} else if (!item.workContent || item.workContent.length < 80) {
 					this.$queue.showToast('工作内容至少输入80个字')
 					return false;
 				}

+ 86 - 51
pages/public/improvePrompt.vue

@@ -26,7 +26,7 @@
 			</template>
 			<template v-else>
 				<view class="link-btn" @click="handleSubmit">手动完善简历</view>
-				<view class="white-btn" @click="handlUploadFile">附件简历一键识别</view>
+				<view class="white-btn" @click="showTipPopup = true">附件简历一键识别</view>
 			</template>
 		</view>
 		
@@ -34,7 +34,20 @@
 			<image src="@/static/loading.gif" class="loading-image" mode="aspectFit"></image>
 		</view>
 		
-		<!-- <load-card :progress="progress" v-if="showLoadCard"></load-card> -->
+		<!-- 简历解析确认弹窗 -->
+		<view class="popup-container" v-if="showTipPopup" @click="showTipPopup = false">
+			<view class="popup-content">
+				<view class="popup-title">温馨提示</view>
+				<view class="tip-container">
+					<view>1-2页简历识别预计耗时1分钟;</view>
+					<view>3-5页简历识别预计耗时5分钟;</view>
+					<view>5页简历以上耗时将会超过5分;</view>
+					<view>请您耐心等待!</view>
+				</view>
+				<image src="@/static/upload-tip.png" class="upload-tip"></image>
+				<view class="button-primary" @click.stop="handlUploadFile">知道了</view>
+			</view>
+		</view>
 	</view>
 </template>
 
@@ -42,19 +55,16 @@
 	// #ifdef APP-PLUS
 	import { chooseFileFromModule } from '@/uni_modules/sr-file-choose'
 	// #endif
-	import loadCard from '@/components/load-card.vue'
 	import config from '@/common/config'
 	
 	export default {
-		components: {
-			loadCard
-		},
 		data() {
 			return {
 				scene: 0, // 0正常进入  1邀请进入
 				progress: 0,
 				showLoadCard: false,
-				timer: null
+				timer: null,
+				showTipPopup: false
 			};
 		},
 		onLoad(options) {
@@ -109,7 +119,7 @@
 							fileType,
 							name
 						}
-						this.uploadFile(file)
+						this.uploadAndAnalysisResumes(file)
 					}
 				})
 				// #endif
@@ -117,7 +127,7 @@
 				uni.chooseFile({
 					count: 1,
 					success: res => {
-						this.uploadFile({
+						this.uploadAndAnalysisResumes({
 							path: res.tempFilePaths[0],
 							name: 'file'
 						})
@@ -125,55 +135,33 @@
 				})
 				// #endif
 			},
-			// 上传文件
-			uploadFile(file) {
+			// 上传解析简历
+			uploadAndAnalysisResumes(file) {
+				this.showTipPopup = false
+				this.showLoadCard = true
 				this.$queue.uploadFiles({
-					url: '/app/resumes/aiResumesUpload',
+					url: '/app/resumes/resumesAnalysisPlus',
 					path: file.path,
-					name: 'file'
+					name: 'file',
+					timeout: 480000,
+					hideUploadTask: true
 				}, (res) => {
-					if (res && res.code === 0) {
-						const id = res.data?.id
-						const resumesAttachmentId = res.data?.resumesAttachmentId || ''
-						if (id) {
-							this.getAiResumesAnalysis(id, resumesAttachmentId)
-						}
-					} else {
-						this.$queue.showToast(res ? res.msg : '文件上传失败')
-					}
-				})
-			},
-			// 获取简历解析数据
-			getAiResumesAnalysis(fileId, resumesAttachmentId) {
-				this.showLoadCard = true
-				uni.request({
-					url: this.$Request.config('APIHOST') + '/app/resumes/aiResumesAnalysis',
-					header: {
-						'content-type': 'application/x-www-form-urlencoded', // 模拟 form-data
-						token: uni.getStorageSync('token'),
-					},
-					method: 'post',
-					data: {
-						fileId,
-						resumesAttachmentId
-					},
-					timeout: 180000,
-					success: (res) => {
+					if (!res) {
+						this.showModal('解析失败,请稍后重试')
 						this.stopLoadStatus()
+						return
+					}
+					if (res.code == 0 && res.data) {
+						this.$queue.setData('AI_Resume_Data', res.data)
 						
-						if (res.data?.code == 0) {
-							const data = res.data.data.data
-							this.$queue.setData('AI_Resume_Data', data.output)
-							
-							uni.reLaunch({
-								url: `/pages/my/onlineResume?fileId=${fileId}`
-							})
-						}
-					},
-					fail: (err) => {
+						uni.reLaunch({
+							url: '/pages/my/onlineResume?fileId=AI_Resume_Data'
+						})
+					} else {
 						this.showModal('解析失败,请稍后重试')
-						this.stopLoadStatus()
 					}
+					
+					this.stopLoadStatus()
 				})
 			},
 			
@@ -273,4 +261,51 @@
 			height: 100%;
 		}
 	}
+	
+	// 简历解析提示弹窗
+	.popup-container {
+		position: fixed;
+		left: 0;
+		top: 0;
+		width: 100vw;
+		height: 100vh;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: rgba(0, 0, 0, 0.4);
+		.popup-content {
+			padding: 40rpx 0;
+			border-radius: 20rpx;
+			background: #fff;
+			.popup-title {
+				font-size: 32rpx;
+				font-weight: 600;
+				line-height: 56rpx;
+				color: rgba(16, 24, 40, 1);
+				text-align: center;
+				margin-bottom: 20rpx;
+			}
+			.tip-container {
+				padding: 0 130rpx;
+				color: rgba(96, 96, 96, 1);
+				font-size: 28rpx;
+				line-height: 36rpx;
+			}
+			.upload-tip {
+				display: block;
+				width: 654rpx;
+				height: 802rpx;
+			}
+			.button-primary {
+				height: 80rpx;
+				border-radius: 80rpx;
+				text-align: center;
+				color: #fff;
+				font-size: 32rpx;
+				line-height: 80rpx;
+				margin: 0 40rpx;
+				background: linear-gradient(90.00deg, rgba(13, 39, 247, 1),rgba(19, 193, 234, 1));
+			}
+		}
+	}
 </style>

+ 114 - 4
pages/recruitmentData/communicationRecords.vue

@@ -260,11 +260,82 @@
 				</view>
 			</view>
 
-			<!-- 收藏职位标签页 -->
+			<!-- 同事沟通过标签页 -->
 			<view class="favorite-jobs-list" v-if="activeTab === 3">
 				<!-- 有数据时显示列表 -->
-				<view v-if="favoriteJobs.length > 0">
-					<!-- 收藏职位列表内容 -->
+				<view v-if="chatColleagueList.length > 0">
+					<view class="date-group" v-for="(group, groupIndex) in groupChatColleague" :key="groupIndex">
+						<view class="date-header">
+							<text class="date-text">{{ group.date }}</text>
+						</view>
+					
+						<!-- Records for this date -->
+						<view class="talent-card" v-for="(record, recordIndex) in group.records" :key="recordIndex"
+							@click="goToResumeDetail(record)">
+							<view class="talent-content">
+								<!-- 头像和基本信息 -->
+								<view class="talent-header">
+									<view class="avatar-wrapper">
+										<image :src="record.userAvatar || '/static/logo.png'" class="talent-avatar" mode="aspectFill"></image>
+										<image src="/static/images/svg/male.svg" class="sex-icon" v-if="record.userSex == 1"></image>
+										<image src="/static/images/svg/female.svg" class="sex-icon" v-if="record.userSex == 2"></image>
+									</view>
+									<view class="talent-info">
+										<view class="talent-name-section">
+											<view class="talent-name">{{ record.userName }}</view>
+											<view class="talent-tags">
+												<view class="status-tag online flex align-center" v-if="record.isOnline"><view class="dot"></view>在线</view>
+												<view class="status-tag hot" v-if="record.isHot">热门搜索</view>
+												<view class="status-tag active" v-if="record.lastActive">
+													{{ record.lastActive }}</view>
+											</view>
+										</view>
+										<!-- 经验和薪资 -->
+										<view class="talent-experience">
+											<text class="experience-text">{{ record.resumesWorkExperience }}</text>
+											<text class="education-salary">{{ record.degree }}</text>
+											<text>{{ record.salaryRange }}</text>
+											<text
+												class="status-text">{{ record.resumesStatus==1?'在职&考虑机会':"离职" }}</text>
+										</view>
+									</view>
+								</view>
+					
+								<!-- 当前职位 -->
+								<view class="current-job" v-if="record.companyName">
+									<view class="flex align-start">
+										<image src="../../static/images/aixin.svg" class="job-icon" mode="aspectFit">
+										</image>
+										<text class="job-text">
+											<text>{{ record.companyName }}</text>
+											<text v-if="record.lastWorkPosition"> · {{ record.lastWorkPosition }}</text>
+										</text>										
+									</view>
+									<text class="work-period">{{ record.resumesWorkExperience }}</text>
+								</view>
+					
+								<!-- 求职期望 -->
+								<view class="job-expectation">
+									<image src="../../static/images/xiangzi.svg" class="job-icon" mode="aspectFit">
+									</image>
+									<text class="expectation-text">求职期望: {{ record.expectedPosition }}</text>
+								</view>
+					
+								<!-- 技能标签 -->
+								<view class="skill-tags">
+									<view class="skill-tag" v-for="(skill, skillIndex) in record.intentIndustry"
+										:key="skillIndex">
+										{{ skill }}
+									</view>
+								</view>
+					
+								<!-- 工作描述 -->
+								<view class="job-description">
+									<text class="description-text">{{ record.workContent }}</text>
+								</view>
+							</view>
+						</view>
+					</view>
 				</view>
 
 				<!-- 空状态显示 -->
@@ -293,6 +364,9 @@
 				{
 					name: '收藏简历'
 				},
+				{
+					name: '同事沟通过'
+				}
 				// { name: '收藏职位' }
 			],
 			communicationRecords: [],
@@ -300,8 +374,9 @@
 			selectedDate: null, // 当前选中的日期
 			// 收藏相关数据
 			favoriteRecords: [], // 收藏记录(空数组,显示空状态)
-			favoriteJobs: [], // 收藏职位(空数组,显示空状态)
+			// favoriteJobs: [], // 收藏职位(空数组,显示空状态)
 			interviewRecords: [],
+			chatColleagueList: [], // 同事沟通过
 			// 当前显示的年月
 			currentYear: new Date().getFullYear(),
 			currentMonth: new Date().getMonth() + 1 // 1-12
@@ -331,6 +406,29 @@
 
 				return Object.values(groups)
 			},
+			groupChatColleague() {
+				const records = Array.isArray(this.chatColleagueList) ?
+					this.chatColleagueList :
+					[]
+				
+				const groups = {}
+				
+				records
+					.filter(r => r && r.lastTime) // 过滤掉 null 或没有 lastTime 的数据
+					.forEach(record => {
+						const date = record.lastTime.substring(0, 10)
+						record.intentIndustry = record.intentIndustry?.split('/')
+						if (!groups[date]) {
+							groups[date] = {
+								date,
+								records: []
+							}
+						}
+						groups[date].records.push(record)
+					})
+				
+				return Object.values(groups)
+			},
 			// 星期名称
 			currentMonthDays() {
 				const weekDays = ['日', '一', '二', '三', '四', '五', '六']
@@ -406,6 +504,7 @@
 			this.getData()
 			this.getInterviewRecords()
 			this.getFavoriteRecords()
+			this.getChatColleagueList()
 		},
 		methods: {
 			getFavoriteRecords() {
@@ -549,6 +648,17 @@
 				uni.navigateTo({
 					url: url
 				})
+			},
+			
+			// 获取同事沟通过列表数据
+			getChatColleagueList() {
+				this.$Request.getT('/app/chat/chatColleague', {
+					limit: 100
+				}).then(res => {
+					if (res.code === 0) {
+						this.chatColleagueList = res.data?.records
+					}
+				})
 			}
 		}
 	}

+ 16 - 8
pages/recruitmentData/index.vue

@@ -146,7 +146,12 @@ export default {
           isUrgent: true
         }
       ],
-	    zwList:[],
+	    zwList:[
+			{
+				name: '全部',
+				id: ''
+			}
+		],
 	    zwIndex:0,
 	  
     }
@@ -158,13 +163,16 @@ export default {
   methods: {
 	getZwList(){
 	  this.$Request.getT("/app/postPush/getMyPostPush").then(res=>{
-		  res.data.records.forEach(item=>{
-		  	this.zwList.push({
-		  		name:item.ruleClassifyName,
-		  		id:item.postPushId
-		  	})
-		  })
-			this.getDataStatics()
+		  if (res.code === 0) {
+			  res.data.records.forEach(item=>{
+				this.zwList.push({
+					name:item.ruleClassifyName,
+					id:item.postPushId
+				})
+			  })
+		  }
+	  }).finally(() => {
+		  this.getDataStatics()
 	  })
 	},
 	getDataStatics(){

BIN
static/images/my/admin.png


BIN
static/images/my/ai-icon.png


BIN
static/upload-tip.png