|
@@ -104,6 +104,7 @@
|
|
|
controls-position="right"
|
|
|
min="0"
|
|
|
@input="updateSalaryRange"
|
|
|
+ @blur="validateSalaryInput"
|
|
|
/>
|
|
|
<span class="salary-separator">-</span>
|
|
|
<el-input-number
|
|
@@ -114,6 +115,7 @@
|
|
|
type="number"
|
|
|
min="0"
|
|
|
@input="updateSalaryRange"
|
|
|
+ @blur="validateSalaryInput"
|
|
|
/>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
@@ -308,12 +310,41 @@ const validateRichText = (rule: any, value: string, callback: any) => {
|
|
|
callback();
|
|
|
};
|
|
|
|
|
|
+// 薪资范围验证函数
|
|
|
+const validateSalaryRange = (rule: any, value: any, callback: any) => {
|
|
|
+ if (!formData.start_salary || !formData.end_salary) {
|
|
|
+ callback(new Error('请完整填写起始薪资和最高薪资'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const startSalary = Number(formData.start_salary);
|
|
|
+ const endSalary = Number(formData.end_salary);
|
|
|
+
|
|
|
+ if (isNaN(startSalary) || isNaN(endSalary)) {
|
|
|
+ callback(new Error('薪资必须为有效数字'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (startSalary < 0 || endSalary < 0) {
|
|
|
+ callback(new Error('薪资不能为负数'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (startSalary > endSalary) {
|
|
|
+ callback(new Error('起始薪资不能高于最高薪资'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ callback();
|
|
|
+};
|
|
|
+
|
|
|
// 表单验证规则
|
|
|
const rules = {
|
|
|
title: [{ required: true, message: '职位名称必填', trigger: 'blur' }],
|
|
|
job_category: [{ required: true, message: '职位类别必填', trigger: 'change' }],
|
|
|
job_type: [{ required: true, message: '职位性质必填', trigger: 'change' }],
|
|
|
location: [{ required: true, message: '工作地点必填', trigger: 'change' }],
|
|
|
+ detailed_address: [{ required: true, message: '详细地址必填', trigger: 'blur' }],
|
|
|
department: [{ required: true, message: '所属部门必填', trigger: 'blur' }],
|
|
|
status: [{ required: true, message: '职位状态必填', trigger: 'change' }],
|
|
|
end_date: [{ required: true, message: '截止日期必填', trigger: 'change' }],
|
|
@@ -329,7 +360,7 @@ const rules = {
|
|
|
validator: validateRichText,
|
|
|
trigger: 'blur'
|
|
|
}],
|
|
|
- salary_range: [{ required: true, message: '请完整填写薪资类型、起始薪资和最高薪资', trigger: 'blur' }],
|
|
|
+ salary_range: [{ required: true, validator: validateSalaryRange, trigger: 'blur' }],
|
|
|
/* competency_tags: [
|
|
|
{ required: true, message: '请选择胜任力标签', trigger: 'change' }
|
|
|
], */
|
|
@@ -381,7 +412,23 @@ const handleLocationChange = (value: any) => {
|
|
|
};
|
|
|
|
|
|
// 实时更新薪资范围
|
|
|
-const updateSalaryRange = () => {
|
|
|
+const updateSalaryRange = (isBlur = false) => {
|
|
|
+ // 验证薪资范围
|
|
|
+ if (formData.start_salary && formData.end_salary) {
|
|
|
+ const startSalary = Number(formData.start_salary);
|
|
|
+ const endSalary = Number(formData.end_salary);
|
|
|
+
|
|
|
+ // 如果起始薪资大于最高薪资,自动调整
|
|
|
+ if (startSalary > endSalary) {
|
|
|
+ formData.end_salary = formData.start_salary;
|
|
|
+ if (isBlur) {
|
|
|
+ ElMessage.warning('起始薪资不能高于最高薪资,已自动调整为相同值');
|
|
|
+ } else {
|
|
|
+ ElMessage.warning('起始薪资不能高于最高薪资,已自动调整');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (formData.salary_type && formData.start_salary && formData.end_salary) {
|
|
|
formData.salary_range = `${formData.salary_type} ${formData.start_salary}-${formData.end_salary}`;
|
|
|
} else {
|
|
@@ -389,6 +436,34 @@ const updateSalaryRange = () => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+// 失焦时的薪资调整处理
|
|
|
+const handleSalaryBlur = () => {
|
|
|
+ // 检查是否需要调整薪资范围
|
|
|
+ if (formData.start_salary && formData.end_salary) {
|
|
|
+ const startSalary = Number(formData.start_salary);
|
|
|
+ const endSalary = Number(formData.end_salary);
|
|
|
+
|
|
|
+ // 如果起始薪资大于最高薪资,自动调整
|
|
|
+ if (startSalary > endSalary) {
|
|
|
+ formData.end_salary = formData.start_salary;
|
|
|
+ ElMessage.warning('起始薪资不能高于最高薪资,已自动调整为相同值');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新薪资范围显示
|
|
|
+ updateSalaryRange();
|
|
|
+
|
|
|
+ // 触发表单验证
|
|
|
+ if (formRef.value) {
|
|
|
+ formRef.value.validateField('salary_range');
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 验证薪资输入(保持向后兼容)
|
|
|
+const validateSalaryInput = () => {
|
|
|
+ handleSalaryBlur();
|
|
|
+};
|
|
|
+
|
|
|
// 添加生成职位描述的方法
|
|
|
const generatePositionDescription = async () => {
|
|
|
// 检查必要字段是否已填写
|