flat: 暂存,rules 表单 显示隐藏

This commit is contained in:
Apcallover
2025-11-11 21:03:35 +08:00
parent fd4e9298fc
commit 4f4f6e115b
13 changed files with 2670 additions and 722 deletions

View File

@@ -6,13 +6,12 @@
<el-button type="primary" size="small" @click="changeTabs(0)">匹配政策</el-button>
<el-button type="primary" @click="changeTabs(1)" size="small">匹配岗位</el-button>
<el-input style="width: 300px; margin-left: 15px" placeholder="搜索岗位" v-show="rightTabs === 1" size="small"
prefix-icon="el-icon-search"
@input="searchInputChange" v-model="searchInput" clearable>
prefix-icon="el-icon-search" @input="searchInputChange" v-model="searchInput" clearable>
</el-input>
</div>
<div>
<el-button type="primary" style="width: 80px" size="small" @click="informationPush">
推送信息
<el-button type="primary" style="width: 110px" size="small" v-show="visibleTip" @click="informationPush">
推送温馨提示
</el-button>
<el-button type="primary" style="width: 80px" size="small" :disabled="pushState" @click="onSubmit">
{{ pushState ? '推送中...' : rightTabs ? '推送岗位' : '推送政策' }}
@@ -21,9 +20,9 @@
</div>
<div class="content-right relative">
<avue-crud height="900" ref="crud2" :data="rightDataList"
:option="rightTabs ? rightPostOptions : rightPolicyOptions" :page.sync="rightPages"
@current-change="rightCurrentPageChange" @size-change="rightSizePageChange"
@selection-change="rightSelectionChange">
:option="rightTabs ? rightPostOptions : rightPolicyOptions" :page.sync="rightPages"
@current-change="rightCurrentPageChange" @size-change="rightSizePageChange"
@selection-change="rightSelectionChange">
<template slot="labelName" slot-scope="{row}">
<TextTooltip :content="row.labelName" length="40"></TextTooltip>
</template>
@@ -65,11 +64,11 @@ import {
pushMsg
} from "@/api/tenant/serve.js";
import TextTooltip from "@/components/text-tooltip/index.vue";
import {debounce} from '@/util/util'
import {DateTime} from "@/util/dateTime";
import { debounce } from '@/util/util'
import { DateTime } from "@/util/dateTime";
import CustomLoading from "@/components/Custom-Loading/index.vue";
const pages = {pagerCount: 3, total: 0, size: 10, currentPage: 1}
const pages = { pagerCount: 3, total: 0, size: 10, currentPage: 1 }
const baseOptions = {
size: 'medium',
dateBtn: false,
@@ -134,7 +133,7 @@ let rightPostOptions = {
]
}
export default {
components: {TextTooltip, CustomLoading},
components: { TextTooltip, CustomLoading },
data() {
return {
leftUserSelections: [],
@@ -153,9 +152,14 @@ export default {
},
props: {
visible: Boolean,
rowData: {default: null, type: Function},
phoneItem: {default: {}, type: Object},
changeVisible: {default: null, type: Function},
rowData: { default: null, type: Function },
phoneItem: { default: {}, type: Object },
changeVisible: { default: null, type: Function },
selectInfo: {
type: Object,
default: () => {
},
},
},
computed: {
viewDrawer: {
@@ -166,6 +170,16 @@ export default {
this.$emit("update:visible", val);
},
},
visibleTip: {
get() {
let name = this.selectInfo ? this.selectInfo.name : null;
if (name) name = name.trim()
if (['潜在就业困难人员', '潜在登记失业人员'].some(item => item === name)) {
return true
}
return false
}
}
},
methods: {
async informationPush() {
@@ -237,7 +251,7 @@ export default {
const createTime = Date.now() + 2000
let params = {
serveId: this.rowData.id,
posts: this.rightDataSelections.map((item) => ({id: item.id, type: item.type1, jobName: item.jobName})),
posts: this.rightDataSelections.map((item) => ({ id: item.id, type: item.type1, jobName: item.jobName })),
users: this.leftUserSelections.map((item) => ({
idNumber: item.idNumber,
talentsId: item.id,
@@ -281,7 +295,7 @@ export default {
},
async getRightSearch() {
this.progress = 0
let params = {keywords: this.searchInput || '1'}
let params = { keywords: this.searchInput || '1' }
const createTime = Date.now() + 4000
this.rightLoading = true
let resData = await getSearchAll(params)
@@ -291,7 +305,7 @@ export default {
setTimeout(() => {
this.rightLoading = false
this.rightDataList = resData.data.data
this.rightPages = {total: 10, currentPage: 1}
this.rightPages = { total: 10, currentPage: 1 }
}, 200)
})
// const timed = createTime - Date.now() > 0 ? createTime - Date.now() : 0
@@ -305,7 +319,7 @@ export default {
async getRightListPolicy() {
this.searchInput = ''
this.progress = 0
const {currentPage, size} = this.rightPages
const { currentPage, size } = this.rightPages
let params = {
ids: this.rowData.policyIds,
current: currentPage,
@@ -318,7 +332,7 @@ export default {
// this.setProgress().then(() => {
// setTimeout(() => {
// this.rightLoading = false
this.rightPages = {total: resData.data.data.length, currentPage: 1}
this.rightPages = { total: resData.data.data.length, currentPage: 1 }
this.rightDataList = resData.data.data
// }, 200)
// })
@@ -331,7 +345,7 @@ export default {
async getRightSearchByUserId() {
this.progress = 0
this.searchInput = ''
const {currentPage, size} = this.rightPages
const { currentPage, size } = this.rightPages
const idNumbers = this.leftUserSelections.map(item => item.idNumber).join(',');
const willingJobs = this.leftUserSelections.map(item => item.willingJob);
// const createTime = Date.now() + 4000
@@ -348,10 +362,10 @@ export default {
if (resData.data.code === 200) {
this.setProgress().then(() => {
setTimeout(() => {
const {records, total, size, current} = resData.data.data
const { records, total, size, current } = resData.data.data
this.rightLoading = false
this.rightDataList = records
this.rightPages = {total, size, currentPage: current}
this.rightPages = { total, size, currentPage: current }
}, 200)
})
// const timed = createTime - Date.now() > 0 ? createTime - Date.now() : 0

View File

@@ -0,0 +1,535 @@
<template>
<el-dialog title="回访" append-to-body :visible.sync="dialogVisible" width="50%" :rules="rules"
:before-close="handlePhoneClose">
<el-form :model="phoneForm" label-position="left" label-width="100px">
<!-- <div style="margin-bottom: 20px">-->
<!-- <div class="phoneListStyle " v-for="phone in phoneList" :key="phone.PHONE">-->
<!-- 来源<span style="color: #3a8ee6">{{ phone.DATASOURCE }} </span> &nbsp;&nbsp;&nbsp;电话号码 <span-->
<!-- style="color: #3a8ee6">{{ phone.PHONE }}</span>-->
<!-- </div>-->
<!-- </div>-->
<el-form-item label="联系方式">
<el-checkbox-group v-model="phoneForm.list" :min="0" :max="1">
<el-checkbox v-for="phone in phoneList" :label="phone" :key="phone">
<span>{{ phone.DATASOURCE }} </span> &nbsp;&nbsp;<span>{{ phone.PHONE }}</span>
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<div style="width: 100%; display: flex;flex-wrap: nowrap; justify-content: space-between;">
<div style="flex: 1">
<el-form-item label="人工录入">
<el-input v-model="phoneForm.phone" :disabled="phoneForm.list.length" autocomplete="off"></el-input>
</el-form-item>
</div>
<div>
<el-button type="danger" style="margin-left: 120px" :disabled="disablePhone" @click="updatePhoneInfo">
更改联系方式
</el-button>
</div>
</div>
<el-form-item label="本人是否有就业意愿" label-width="180px" v-show="fieldVisibility.isWork">
<el-radio-group v-model="phoneForm.isWork">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="本人是否需要服务" label-width="180px" v-show="fieldVisibility.isServe">
<el-radio-group v-model="phoneForm.isServe">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="本人是否需要培训" label-width="180px" v-show="fieldVisibility.isTrain">
<el-radio-group v-model="phoneForm.isTrain">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否退出" label-width="180px" v-show="fieldVisibility.isExit">
<el-radio-group v-model="phoneForm.isExit">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否拒绝就业服务" label-width="180px" v-show="fieldVisibility.isReject">
<el-radio-group v-model="phoneForm.isReject">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="拒绝服务有无正当理由" label-width="180px" v-show="fieldVisibility.isJustCase">
<el-radio-group v-model="phoneForm.isJustCase">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="fieldVisibility.exitReasonTitle" label-width="180px" v-show="fieldVisibility.exitReason">
<el-autocomplete style="width: 100%" popper-class="my-autocomplete" v-model="phoneForm.exitReason"
:fetch-suggestions="queryExitReason" placeholder="请输入内容" @select="handleSelect" :trigger-on-focus="true"
clearable>
<i class="el-icon-edit el-input__icon" slot="suffix" @click="handleIconClick">
</i>
<template slot-scope="{ item }">
<div class="name">{{ item }}</div>
</template>
</el-autocomplete>
</el-form-item>
<el-form-item label="期望薪资" v-show="fieldVisibility.salary">
<el-select style="width: 100%" v-model="phoneForm.salary" placeholder="请选择 期望薪资">
<el-option :label="item.value" :value="item.value" v-for="item in wageOptionsMonth"></el-option>
</el-select>
</el-form-item>
<el-form-item label="第一求职意愿" v-show="fieldVisibility.workSkillOne">
<el-cascader v-model="phoneForm.workSkillOne" :options="workSkillsOptions"
:props="{ label: 'name', value: 'name', children: 'child', emitPath: false }" filterable clearable
placeholder="请选择第一求职意愿" style="width: 100%">
</el-cascader>
</el-form-item>
<el-form-item label="第二求职意愿" v-show="fieldVisibility.workSkillTwo">
<el-cascader v-model="phoneForm.workSkillTwo" :options="workSkillsOptions"
:props="{ label: 'name', value: 'name', children: 'child', emitPath: false }" filterable clearable
placeholder="请选择第二求职意愿" style="width: 100%">
</el-cascader>
</el-form-item>
<el-form-item label="就业区县" v-show="fieldVisibility.workPlace">
<el-select style="width: 100%" v-model="phoneForm.workPlace" placeholder="请选择就业区县">
<el-option :label="item" :value="item" v-for="item in areaOptions"></el-option>
</el-select>
</el-form-item>
<el-form-item label="拒绝服务理由" label-width="180px" v-show="fieldVisibility.rejectReason">
<el-input v-model="phoneForm.rejectReason" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="文件佐证资料上传" label-width="180px" v-show="fieldVisibility.rejectResonUrl">
<el-upload class="upload-demo" :action="uploadAction" :on-preview="handlePreview" :on-remove="handleRemove"
:before-remove="beforeRemove" :on-success="handleSuccess" :on-error="handleError" :file-list="fileList"
:limit="3" :on-exceed="handleExceed" :before-upload="beforeUpload" :http-request="customUpload" multiple>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">支持pdfdocxdocxlsxlsx和图片格式单个文件不超过10MB</div>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleManagement" v-show="fieldVisibility.regmanage">失业登记管理</el-button>
<el-button @click="handleBasicUpdate" v-show="fieldVisibility.PersonalBaseInfo">个人基础信息修改</el-button>
<el-button @click="handlePhoneClose"> </el-button>
<el-button type="primary" @click="handelPhoneConfirm"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { phoneUpdate, serveUpdate } from "@/api/tenant/serve";
import { getWorkTypes } from "@/api/tenant/common";
import {
wageOptionsMonth,
} from "@/common/dic";
import categoryVisibilityRules from './rulesForm'
import { putFileUpload } from '@/api/resource/oss.js'
export default {
name: "FollowUpDialog",
props: {
visible: {
type: Boolean,
default: false,
},
// 传入的行数据
item: {
type: Object,
default: () => null,
},
// 传入的当前所选分组ID
serveId: {
type: String,
default: null,
},
phoneList: {
type: Array,
default: () => [],
},
workSkillsOptions: {
type: Array,
default: () => [],
},
areaOptions: {
type: Array,
default: () => [],
},
exitReasonOptions: {
type: Array,
default: () => [],
},
selectInfo: {
type: Object,
default: () => {
},
},
},
data() {
return {
wageOptionsMonth,
phoneForm: {
phone: '',
list: [],
isServe: '',
isTrain: '',
isWork: '',
isReject: '',
salary: '',
workSkillOne: '',
workSkillTwo: '',
isExit: '',
workPlace: '',
exitReason: '',
rejectReason: '',
rejectResonUrl: '',
isJustCase: '',
},
inputDisplays: [],
// 文件上传相关数据
fileList: [],
uploadAction: '', // 上传地址
uploadLoading: false,
rules: {
isServe: [
{ required: false, message: '请选择是否服务', trigger: 'change' }
],
isTrain: [
{ required: false, message: '请选择是否培训', trigger: 'change' }
],
isWork: [
{ required: false, message: '请选择是否有就业意愿', trigger: 'change' }
],
salary: [
{ required: false, message: '请选择期望薪资', trigger: 'change' }
],
},
};
},
computed: {
dialogVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit('update:visible', val);
}
},
fieldVisibility() {
let name = this.selectInfo ? this.selectInfo.name : null;
if (name) name = name.trim()
const strategyFn = categoryVisibilityRules[name] || categoryVisibilityRules.default;
return strategyFn(this.phoneForm);
},
disablePhone() {
const val = this.phoneForm.list[0] || null
if (val && val.DATATYPE === '1') return true
return false
}
},
watch: {
visible(newVal) {
if (newVal) {
this.setFormDefaults();
} else {
this.resetForm();
}
},
},
methods: {
queryExitReason(queryString, cb) {
var restaurants = this.exitReasonOptions;
var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants;
cb(results);
},
createFilter(queryString) {
const lowerQuery = queryString.toLowerCase();
return (restaurant) => {
if (typeof restaurant !== 'string') {
return false;
}
return restaurant.toLowerCase().includes(lowerQuery);
};
},
handleSelect(item) {
this.phoneForm.exitReason = item;
},
handleIconClick(ev) {
// 点击图标时清空输入框
this.phoneForm.exitReason = '';
this.$nextTick(() => {
// 获取输入框元素并聚焦
const input = this.$el.querySelector('.my-autocomplete input');
if (input) {
input.focus();
}
});
},
// 文件上传相关方法
// 自定义上传方法
async customUpload(options) {
const { file, onProgress, onSuccess, onError } = options;
try {
this.uploadLoading = true;
// 使用 putFileUpload 函数进行上传
const response = await putFileUpload(file, '3', (progressEvent) => {
const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);
onProgress({ percent });
});
if (response.data && response.data.code === 200) {
// 上传成功
const fileUrl = response.data.msg; // 假设返回的是文件URL
// 更新多文件URL用逗号隔开
const currentUrls = this.phoneForm.rejectResonUrl ? this.phoneForm.rejectResonUrl.split(',').filter(url => url.trim()) : [];
currentUrls.push(fileUrl);
this.phoneForm.rejectResonUrl = currentUrls.join(',');
// 添加到文件列表
this.fileList.push({
name: file.name,
url: fileUrl,
status: 'success'
});
onSuccess(response.data);
this.$message.success('文件上传成功');
} else {
throw new Error('上传失败');
}
} catch (error) {
console.error('文件上传失败:', error);
onError(error);
this.$message.error('文件上传失败: ' + (error.message || '未知错误'));
} finally {
this.uploadLoading = false;
}
},
// 文件上传前验证
beforeUpload(file) {
const allowedTypes = [
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'image/jpeg',
'image/jpg',
'image/png',
'image/gif',
'image/bmp'
];
const isAllowedType = allowedTypes.includes(file.type);
const isLt10M = file.size / 1024 / 1024 < 10;
if (!isAllowedType) {
this.$message.error('只能上传pdf、doc、docx、xls、xlsx和图片格式的文件!');
return false;
}
if (!isLt10M) {
this.$message.error('文件大小不能超过 10MB!');
return false;
}
return true;
},
// 文件预览
handlePreview(file) {
if (file.url) {
window.open(file.url, '_blank');
}
},
// 文件移除
handleRemove(file, fileList) {
this.fileList = fileList;
// 更新多文件URL移除对应的URL
const currentUrls = this.phoneForm.rejectResonUrl ? this.phoneForm.rejectResonUrl.split(',').filter(url => url.trim()) : [];
const updatedUrls = currentUrls.filter(url => url !== file.url);
this.phoneForm.rejectResonUrl = updatedUrls.join(',');
},
// 移除前确认
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}`);
},
// 上传成功
handleSuccess(response, file, fileList) {
this.fileList = fileList;
},
// 上传失败
handleError(err, file, fileList) {
this.fileList = fileList;
this.$message.error('文件上传失败');
},
// 超出文件限制
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
async updatePhoneInfo() {
let _this = this;
let params = {
idNumber: _this.item.idNumber,
serveId: _this.serveId,
serveUserId: _this.item.serveUserId,
}
if (/^1[3-9]{1}\d{9}/.test(this.phoneForm.phone)) params.phone = this.phoneForm.phone;
if (params.phone) {
this.$confirm(`请同步更改省就业3.0系统中的人员联系方式`, {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async (res) => {
const resData = await phoneUpdate(params)
if (resData.data.code === 200) {
_this.$message.success("更新成功");
_this.handlePhoneClose();
window.open('http://10.160.7.100:8000/jyback/template/general.html#/generalPage?_modulePartId_=1000076072', '_blank');
}
})
} else {
this.$message.error("请选择或输入用户手机号!");
}
},
setFormDefaults() {
if (this.item) {
this.phoneForm.isServe = this.item.isServe || '';
this.phoneForm.isTrain = this.item.isTrain || '';
this.phoneForm.isWork = this.item.isWork || '';
this.phoneForm.salary = this.item.isalary || '';
this.phoneForm.workSkillOne = this.item.workSkillOne || '';
this.phoneForm.workSkillTwo = this.item.workSkillTwo || '';
this.phoneForm.workPlace = this.item.workPlace || '';
this.phoneForm.exitReason = this.item.exitReason || '';
this.phoneForm.isExit = this.item.isExit || '';
this.phoneForm.isReject = this.item.isReject || '';
this.phoneForm.rejectReason = this.item.rejectReason || '';
this.phoneForm.rejectResonUrl = this.item.rejectResonUrl || '';
this.phoneForm.isJustCase = this.item.isJustCase || '';
// 初始化文件列表如果已有文件URL
if (this.item.rejectResonUrl) {
const urls = this.item.rejectResonUrl.split(',').filter(url => url.trim());
this.fileList = urls.map((url, index) => ({
name: `文件${index + 1}`,
url: url,
status: 'success'
}));
}
}
},
handleBasicUpdate() {
window.open('http://10.160.7.100:8000/jyback/template/general.html#/generalPage?_modulePartId_=1000076072', '_blank');
},
handleManagement() {
window.open('http://10.160.7.100:8000/jyback/template/general.html#/generalPage?_modulePartId_=1000076072', '_blank');
},
handelJobIntention() {
this.$message({ type: "info", message: "功能未配置" });
},
async handelPhoneConfirm() {
const name = this.selectInfo ? this.selectInfo.name : null;
let _this = this;
let text = '请确认信息'
// 麻烦的来了
switch (true) {
case name === '潜在就业困难人员' && this.phoneForm.isWork === 0:
text = '请到 就业3.0 中注销该人员的失业登记信息'
break
case name === '潜在的就业困难退出人员' && this.phoneForm.isExit === 1:
text = '请到 就业3.0 中注销该人员的就业登记困难人员登记信息'
break
}
this.$confirm(text, {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
let params = {
idNumber: _this.item.idNumber,
serveId: _this.serveId, // 使用 prop
serveUserId: _this.item.serveUserId, // 使用 prop
isServe: _this.phoneForm.isServe,
isTrain: _this.phoneForm.isTrain,
isExit: _this.phoneForm.isExit,
isWork: _this.phoneForm.isWork,
salary: _this.phoneForm.salary,
workSkillOne: _this.phoneForm.workSkillOne,
workSkillTwo: _this.phoneForm.workSkillTwo,
workPlace: _this.phoneForm.workPlace,
exitReason: _this.phoneForm.exitReason,
isReject: _this.phoneForm.isReject,
rejectReason: _this.phoneForm.rejectReason,
rejectResonUrl: _this.phoneForm.rejectResonUrl,
isJustCase: _this.phoneForm.isJustCase
}
let resData = await serveUpdate(params)
if (resData.data.code === 200) {
_this.$message.success("更新成功");
switch (true) {
case name === '潜在就业困难人员' && _this.phoneForm.isWork === 0:
window.open('http://10.160.7.100:8000/jyback/template/general.html#/generalPage?_modulePartId_=1000076072', '_blank');
break
case name === '潜在的就业困难退出人员' && _this.phoneForm.isExit === 1:
window.open('http://10.160.7.100:8000/jyback/template/general.html#/generalPage?_modulePartId_=1000076072', '_blank');
break
}
_this.handlePhoneClose(); // 关闭弹窗
_this.$emit('curdUpdate');
}
}).catch(() => {
});
},
resetForm() {
this.phoneForm.phone = '';
this.phoneForm.list = [];
this.phoneForm.isServe = '';
this.phoneForm.isTrain = '';
this.phoneForm.isWork = '';
this.phoneForm.workPlace = '';
this.phoneForm.exitReason = '';
this.phoneForm.salary = '';
this.phoneForm.isExit = '';
this.phoneForm.workSkillOne = '';
this.phoneForm.workSkillTwo = '';
this.phoneForm.isReject = '';
this.phoneList = [];
this.phoneForm.rejectReason = '';
this.phoneForm.rejectResonUrl = '';
this.phoneForm.isJustCase = '';
// 清理文件上传列表
this.fileList = [];
this.uploadLoading = false;
},
handlePhoneClose() {
this.resetForm();
this.dialogVisible = false; // 这将触发 .sync 更新
},
}
}
</script>
<style lang="scss" scoped>
.phoneListStyle {
display: flex;
flex-wrap: nowrap;
}
</style>

View File

@@ -0,0 +1,121 @@
const allFieldsHidden = {
isServe: false, // 本人是否需要服务
isTrain: false, //本人是否需要培训
isWork: false, // 本人是否有就业意愿
isReject: false, // 是否拒绝就业服务
isJustCase: false, // 拒绝服务有无正当理由
salary: false, // 期望薪资
isExit: false, // 是否要退出
workSkillOne: false, // 第一求职意愿
workSkillTwo: false, // 第二求职意愿
workPlace: false, // 就业区县
exitReason: false, // 不退出原因
exitReasonTitle: "不退出原因",
rejectReason: false, // 拒绝服务理由
rejectResonUrl: false, // 文件佐证资料上传
regmanage: false, // 失业登记管理<按钮>
PersonalBaseInfo: false // 个人基础信息修改<按钮>
};
const categoryVisibilityRules = {
潜在可享受职业培训政策人员: form => {
const showTrain = form.isServe === 1; // 联动规则
// 需要先全部隐藏,再打开需要的
return {
...allFieldsHidden,
isServe: true,
regmanage: true,
PersonalBaseInfo: true,
isTrain: showTrain
};
},
潜在登记失业人员: form => {
const showServe = form.isWork === 1;
const showTrain = showServe && form.isServe === 1;
// const showInpute = showTrain && form.isTrain === 1;
return {
...allFieldsHidden,
isServe: showServe,
isTrain: showTrain,
isWork: true,
PersonalBaseInfo: false,
salary: showTrain,
workSkillOne: showTrain,
workSkillTwo: showTrain,
workPlace: showTrain
};
},
潜在的就业困难退出人员: form => {
const showExitReason = form.isExit === 0;
return {
...allFieldsHidden,
isExit: true,
exitReason: showExitReason,
exitReasonTitle: "是否应退出就业困难人群"
};
},
潜在返乡未就业农村劳动力: form => {
const showServe = form.isWork === 1;
const showTrain = showServe && form.isServe === 1;
return {
...allFieldsHidden,
isServe: showServe,
isTrain: showTrain,
isWork: true,
PersonalBaseInfo: true,
salary: showTrain,
workSkillOne: showTrain,
workSkillTwo: showTrain,
workPlace: showTrain
};
},
潜在就业困难人员: form => {
const showServe = form.isWork === 1;
const showTrain = showServe && form.isServe === 1;
// const showInpute = showTrain && form.isTrain === 1;
return {
...allFieldsHidden,
isServe: showServe,
isTrain: showTrain,
isWork: true,
PersonalBaseInfo: false,
salary: showTrain,
workSkillOne: showTrain,
workSkillTwo: showTrain,
workPlace: showTrain
};
},
潜在就业见习申请人员: form => {
return {
...allFieldsHidden,
isServe: true
};
},
领取失业补助金人员: form => {
const showReason = form.isReject === 1;
return {
...allFieldsHidden,
isReject: true,
isJustCase: showReason,
rejectReason: showReason,
rejectResonUrl: showReason
};
},
default: () => {
return allFieldsHidden;
}
};
export default categoryVisibilityRules;

View File

@@ -7,36 +7,35 @@
<div>服务分组管理</div>
<div>
<el-button type="text" icon="el-icon-plus"
v-if="vaildData(permission.tenant_main_serve_index_groupadd, false)"
@click="updateGroups('add')">新建分组
v-if="vaildData(permission.tenant_main_serve_index_groupadd, false)" @click="updateGroups('add')">新建分组
</el-button>
</div>
</div>
<div class="box" :style="{height: leftHeight}">
<div class="box" :style="{ height: leftHeight }">
<el-scrollbar style="height: 100%">
<el-tree ref="tree" node-key="id" highlight-current @node-click="nodeClick"
:default-expand-all="true" :data="treeData" :props="{ label: 'groupName', id: 'id'}">
<span class="custom-tree-node" slot-scope="{ node, data }" style="width: 80%">
<span style="
<el-tree ref="tree" node-key="id" highlight-current @node-click="nodeClick" :default-expand-all="true"
:data="treeData" :props="{ label: 'groupName', id: 'id' }">
<span class="custom-tree-node" slot-scope="{ node, data }" style="width: 80%">
<span style="
flex-basis: 80%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
flex-shrink: 1;
">
{{ data.groupName || data.name }}
{{ data.groupName || data.name }}
</span>
<span v-show="data.children && data.id && data.id !== '0'" style="flex-basis: 20%">
<el-button type="text" icon="el-icon-edit" size="mini"
v-if="vaildData(permission.tenant_main_serve_index_groupedit, false)"
@click="() => updateGroups('edit', data)">
</el-button>
<el-button icon="el-icon-delete" type="text" size="mini"
v-if="vaildData(permission.tenant_main_serve_index_groupdel, false)"
@click="() => removeGroups(data)">
</el-button>
</span>
</span>
<span v-show="data.children && data.id && data.id !== '0'" style="flex-basis: 20%">
<el-button type="text" icon="el-icon-edit" size="mini"
v-if="vaildData(permission.tenant_main_serve_index_groupedit, false)"
@click="() => updateGroups('edit', data)">
</el-button>
<el-button icon="el-icon-delete" type="text" size="mini"
v-if="vaildData(permission.tenant_main_serve_index_groupdel, false)"
@click="() => removeGroups(data)">
</el-button>
</span>
</span>
</el-tree>
</el-scrollbar>
</div>
@@ -44,18 +43,9 @@
</el-col>
<el-col :span="18">
<basic-container>
<avue-crud
v-model="obj"
ref="crud"
:data="dataSource"
:option="option"
:search.sync="query"
:page.sync="page"
:table-loading="loading"
@search-change="serveSearchChange"
@search-reset="serveResetChange"
@size-change="infoSizeChange"
@current-change="infoCurrentChange">
<avue-crud v-model="obj" ref="crud" :data="dataSource" :option="option" :search.sync="query" :page.sync="page"
:table-loading="loading" @search-change="serveSearchChange" @search-reset="serveResetChange"
@size-change="infoSizeChange" @current-change="infoCurrentChange">
<!-- <template slot="menuLeft">-->
<!-- <el-button type="primary" size="small" @click="selectPushService">推送服务</el-button>-->
<!-- </template>-->
@@ -72,23 +62,11 @@
<!-- @click="matchPolicy(row)"-->
<!-- >查看匹配政策-->
<!-- </el-button>-->
<el-button type="text"
icon="el-icon-document"
size="small"
@click="phoneDataList(row)"
>回访
<el-button type="text" icon="el-icon-document" size="small" @click="phoneDataList(row)">回访
</el-button>
<el-button type="text"
icon="el-icon-document"
size="small"
@click="selectPushUserService(row)"
>推送服务
<el-button type="text" icon="el-icon-document" size="small" @click="selectPushUserService(row)">推送服务
</el-button>
<el-button type="text"
icon="el-icon-document"
size="small"
@click="serveLog(row)"
>管理服务日志
<el-button type="text" icon="el-icon-document" size="small" @click="serveLog(row)">管理服务日志
</el-button>
</template>
</avue-crud>
@@ -96,50 +74,28 @@
</el-col>
</el-row>
<!-- 匹配任务/岗位 -->
<el-drawer
title="匹配任务/岗位"
size="80%"
:append-to-body="true"
:before-close="() => innerDrawer1 = false"
<el-drawer title="匹配任务/岗位" size="80%" :append-to-body="true" :before-close="() => innerDrawer1 = false"
:visible.sync="innerDrawer1">
<avue-crud
:data="workData"
:option="workOption"
:page.sync="workPage"
@size-change="workSizeChange"
@current-change="workCurrentChange"
>
<avue-crud :data="workData" :option="workOption" :page.sync="workPage" @size-change="workSizeChange"
@current-change="workCurrentChange">
<template slot="missionDesc" slot-scope="{ row }">
<TextTooltip :content="row.missionDesc"></TextTooltip>
</template>
<template slot-scope="{row,index}" slot="menu">
<el-button type="text"
icon="el-icon-document"
size="small"
@click="toWorkMissionDetail(row)"
>查看详情
<el-button type="text" icon="el-icon-document" size="small" @click="toWorkMissionDetail(row)">查看详情
</el-button>
</template>
</avue-crud>
</el-drawer>
<!-- 匹配政策-->
<el-drawer
title="匹配政策"
size="80%"
:append-to-body="true"
:before-close="() => innerDrawer2 = false"
<el-drawer title="匹配政策" size="80%" :append-to-body="true" :before-close="() => innerDrawer2 = false"
:visible.sync="innerDrawer2">
<avue-crud
:data="policyData"
:option="policyOption"
:page.sync="policyPage"
@size-change="policySizeChange"
@current-change="policyCurrentChange"
>
<avue-crud :data="policyData" :option="policyOption" :page.sync="policyPage" @size-change="policySizeChange"
@current-change="policyCurrentChange">
<template slot="policyContent" slot-scope="{ row }">
<el-tooltip class="item" effect="dark" placement="top-start">
<div slot="content">
<div v-for="(item, index) in clipStr(row.policyContent)" :key="index">
<div v-for="(item, index) in clipStr(row.policyContent)" :key="index2">
<div>{{ item }}</div>
</div>
</div>
@@ -149,7 +105,7 @@
<template slot="labelName" slot-scope="{ row }">
<el-tooltip class="item" effect="dark" placement="top-start">
<div slot="content">
<div v-for="(item, index) in clipStr(row.labelName)" :key="index">
<div v-for="(item, index) in clipStr(row.labelName)" :key="index2">
<div>{{ item }}</div>
</div>
</div>
@@ -158,9 +114,9 @@
</template>
<template slot="labelNameForm" slot-scope="{row}">
<div>
<el-tag style="margin: 4px 10px" v-for="(item, index) in row.labelName.split(',')" :key="index">{{
item
}}
<el-tag style="margin: 4px 10px" v-for="(item, index) in row.labelName.split(',')" :key="index2">{{
item
}}
</el-tag>
</div>
</template>
@@ -179,27 +135,15 @@
</avue-crud>
</el-drawer>
<!-- 服务日志-->
<el-drawer
title="服务日志"
size="80%"
:append-to-body="true"
:before-close="() => innerDrawer3 = false"
<el-drawer title="服务日志" size="80%" :append-to-body="true" :before-close="() => innerDrawer3 = false"
:visible.sync="innerDrawer3">
<!-- <div>
<span>姓名:</span>
<span>身份证号:</span>
</div> -->
<avue-crud
:data="logData"
:option="logOption"
@row-save="saveLog"
@row-update="saveUpdateLog"
@row-del="removeLog"
:page.sync="logPage"
@size-change="logSizeChange"
@current-change="logCurrentChange"
ref="logCrud"
>
<avue-crud :data="logData" :option="logOption" @row-save="saveLog" @row-update="saveUpdateLog"
@row-del="removeLog" :page.sync="logPage" @size-change="logSizeChange" @current-change="logCurrentChange"
ref="logCrud">
<!-- <template slot="menuLeft">
<el-button @click="addNewLog" icon="el-icon-plus" type="primary" size="mini">添加</el-button>
</template>
@@ -209,67 +153,28 @@
</template> -->
<template slot-scope="{row,index}" slot="menu">
<el-button type="text" icon="el-icon-edit" size="small"
v-if="row.serveTheme !== '人工推送岗位' && row.serveTheme !== '人工推送政策'"
@click="$refs.logCrud.rowEdit(row, index)"
>编辑
v-if="row.serveTheme !== '人工推送岗位' && row.serveTheme !== '人工推送政策'" v-show="row.serveName === '手工录入服务日志'"
@click="$refs.logCrud.rowEdit(row, index2)">编辑
</el-button>
<el-button type="text" icon="el-icon-edit" size="small" v-show="row.serveName === '手工录入服务日志'"
@click="$refs.logCrud.rowDel(row, index2)">删除
</el-button>
</template>
</avue-crud>
</el-drawer>
<!--新建 编辑分组dialog-->
<add-groups ref="addGroups" @refresh="refresh" :listAllPolicyTree="listAllPolicyTree"
:treeData="treeData" :data="worktypeData" :worktypeDic="worktypeDic"
:talentsList="talentsList"></add-groups>
<PushService
:visible.sync="PushServiceVisible"
:rowData="selectPushServiceData"
:phoneItem="phoneItem"
ref="pushRef"
></PushService>
<add-groups ref="addGroups" @refresh="refresh" :listAllPolicyTree="listAllPolicyTree" :treeData="treeData"
:data="worktypeData" :worktypeDic="worktypeDic" :talentsList="talentsList"></add-groups>
<PushService :visible.sync="PushServiceVisible" :rowData="selectPushServiceData" :phoneItem="phoneItem"
:selectInfo="selectInfo" ref="pushRef"></PushService>
<mission-view :visible.sync="viewDrawer" :model="view"></mission-view>
<work-view :visible.sync="workViewDrawer" :model="workViewModel"></work-view>
<el-dialog
title="回访"
append-to-body
:visible.sync="phoneDialogVisible"
width="40%"
:rules="rules"
:before-close="handlePhoneClose">
<el-form :model="phoneForm" label-position="top" label-width="100px">
<el-form-item label="验证手机号">
<el-checkbox-group
v-model="phoneForm.list"
:min="0"
:max="1">
<el-checkbox v-for="phone in phoneList" :label="phone" :key="phone">{{ phone }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<!-- <el-form-item label="输入手机号">-->
<!-- <el-input v-model="phoneForm.phone" :disabled="phoneForm.list.length" autocomplete="off"></el-input>-->
<!-- </el-form-item>-->
<el-form-item label="是否服务">
<el-radio-group v-model="phoneForm.isServe">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否培训" v-show="phoneForm.isServe">
<el-radio-group v-model="phoneForm.isTrain">
<el-radio :label="1">是</el-radio>
<el-radio :label="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleBasicUpdate">个人基础信息修改</el-button>
<!-- <el-button @click="handelJobIntention">求职意愿修改</el-button>-->
<el-button @click="handlePhoneClose">取 消</el-button>
<el-button type="primary" @click="handelPhoneConfirm">确 定</el-button>
</span>
</el-dialog>
<FollowUpDialog :visible.sync="phoneDialogVisible" :item="phoneItem" :serveId="selectInfo ? selectInfo.id : null"
:phoneList="phoneList" :workSkillsOptions="workSkillsOptions" :areaOptions="areaOptions" :selectInfo="selectInfo"
:exitReasonOptions="exitReasonOptions" @curdUpdate="callbackPopup" />
</div>
</template>
@@ -281,17 +186,18 @@ import {
getListAllPolicy,
getListAllTalents, getMatchPolicy, getMatchServeList, getMatchWorkStation,
getServeListTalents,
removeDept, removeServeLog, updateServeLog, getPhoneList, phoneUpdate
removeDept, removeServeLog, updateServeLog, getPhoneList, serveRegion, serveExitReason
} from "@/api/tenant/serve";
import {mapGetters} from "vuex";
import { mapGetters } from "vuex";
import addGroups from "./Dialog/addGroup";
import {getLabelList} from "@/api/tenant/common";
import { getLabelList, getWorkTypes } from "@/api/tenant/common";
import missionView from "../../mission/Table/missionView.vue";
import workView from "../../works/Table/missionView.vue"
import TextTooltip from "@/components/text-tooltip/index.vue";
import {serviceType} from "@/common/dic";
import { serveTypeOptions, serviceType } from "@/common/dic";
import PushService from './Dialog/pushService2.vue'
import {getDeptMyTree} from "@/api/tenant/talents";
import { getDeptMyTree } from "@/api/tenant/talents";
import FollowUpDialog from "@/views/tenant/main/serve/followUpVisit/qzjyknry.vue";
const page = {
size: 10,
@@ -299,11 +205,16 @@ const page = {
total: 0,
}
export default {
components: {addGroups, missionView, workView, TextTooltip, PushService},
components: { FollowUpDialog, addGroups, missionView, workView, TextTooltip, PushService },
data() {
return {
exitReasonOptions: [],
arr: [],
worktypeDic: {},
arr_2: [],
worktypeDic_2: {},
workSkillsOptions: [],
areaOptions: [],
treeData: [],
loading: false,
tenantId: null,
@@ -337,20 +248,30 @@ export default {
list: [],
isServe: 0,
isTrain: 0,
isWork: 1,
salary: 4000,
workSkillOne: '',
workSkillTwo: '',
},
phoneItem: null,
depTree: [],
rules: {
isServe: [
{required: true, message: '请选择是否服务', trigger: 'change'}
{ required: true, message: '请选择是否服务', trigger: 'change' }
],
isTrain: [
{required: true, message: '请选择是否培训', trigger: 'change'}
{ required: true, message: '请选择是否培训', trigger: 'change' }
],
isWork: [
{ required: true, message: '请选择是否有就业意愿', trigger: 'change' }
],
salary: [
{ required: true, message: '请选择期望薪资', trigger: 'change' }
],
},
logOption: {
editBtn: false,
delBtn: true,
delBtn: false,
addBtn: true,
viewBtn: true,
border: true,
@@ -388,12 +309,7 @@ export default {
label: '服务类型',
prop: 'serveType',
type: 'select',
dicData: [
{label: '普通日志', value: 0},
{label: '回访日志', value: 1},
{label: '推送岗位日志', value: 2},
{label: '推送政策日志', value: 3},
],
dicData: serveTypeOptions,
display: false,
}, {
label: '服务主题',
@@ -452,7 +368,7 @@ export default {
for (let j = 0; j < this.arr.length; j++) {
const key = this.arr[j];
if (this.worktypeDic.hasOwnProperty(key)) {
rel.push({name: key})
rel.push({ name: key })
}
}
// for (let i = 0; i < this.tempWorkType.length; i++) {
@@ -509,9 +425,30 @@ export default {
searchLabelWidth: 100,
searchSpan: 8,
},
// {
// label: '专业',
// prop: 'aac183Major'
// },
{
label: '专业',
prop: 'aac183Major'
label: '性别',
prop: 'aac004',
type: 'select',
dicUrl: "/api/jobslink-api/system/dict-biz/tadict?code=AAC004",
props: {
label: "dictValue",
value: "dictKey",
},
rules: [
{
required: true,
message: "请输入性别",
trigger: "blur",
},
],
},
{
label: '常驻地址',
prop: 'residentAddress',
},
{
label: "毕业年份",
@@ -545,25 +482,48 @@ export default {
prop: 'aac010'
},
{
label: "政策推送次数",
prop: "servePolicyCount",
searchType: 'number',
search: unemployedCollegeStudents,
searchLabelWidth: 100,
searchSpan: 8,
label: "最小服务次数",
prop: "serveCountDown", // 后端对应的【最小】次数查询字段
type: "number",
search: true,
hide: true, // 不在列表中展示
display: false, // 不在表单中展示
searchSpan: 8, // 栅格占 4 (两个加起来是 8)
searchLabelWidth: 80,
},
{
label: "岗位服务次数",
prop: "serveCount",
searchType: 'number',
search: unemployedCollegeStudents,
searchLabelWidth: 100,
searchSpan: 8,
label: "最大服务次数",
prop: "serveCountUp", // 后端对应的【最大】次数查询字段
type: "number",
search: true,
hide: true,
display: false,
searchSpan: 8, // 栅格占 4
searchLabelWidth: 80,
},
// {
// label: "政策推送次数",
// prop: "servePolicyCount",
// searchType: 'number',
// search: unemployedCollegeStudents,
// searchLabelWidth: 100,
// searchSpan: 8,
// },
// {
// label: "岗位服务次数",
// prop: "serveCount",
// searchType: 'number',
// search: unemployedCollegeStudents,
// searchLabelWidth: 100,
// searchSpan: 8,
// },
{
label: "服务次数",
prop: "serveTotalCount",
},
{
label: "识别原因",
prop: "labelsBase",
width: 100,
}
]
}
@@ -604,129 +564,129 @@ export default {
label: '政策名称',
prop: 'name'
},
{
label: "政策级别",
prop: "level",
span: 12,
hide: true,
{
label: "政策级别",
prop: "level",
span: 12,
hide: true,
},
{
label: "政策文号",
prop: "number",
span: 12,
hide: true,
},
{
label: "发文机构",
prop: "issuingAuthority",
span: 12,
hide: true,
},
{
label: "分组",
prop: "groupId",
type: "tree",
hide: true,
span: 12,
display: true,
placeholder: "请选择 分组",
},
{
label: "有效性",
prop: "status",
type: "tree",
span: 12,
hide: true,
display: true,
dicData: [{ name: "有效", value: 1 }, { name: "无效", value: 0 }],
props: {
label: "name",
value: "value",
},
{
label: "政策文号",
prop: "number",
span: 12,
hide: true,
},
{
label: "服务类型",
prop: "stype",
type: "tree",
span: 12,
display: true,
hide: true,
dicData: serviceType,
props: {
label: "label",
value: "value",
},
{
label: "发文机构",
prop: "issuingAuthority",
span: 12,
hide: true,
},
{
label: "分组",
prop: "groupId",
type: "tree",
hide: true,
span: 12,
display: true,
placeholder: "请选择 分组",
},
{
label: "有效性",
prop: "status",
type: "tree",
span: 12,
hide: true,
display: true,
dicData: [{name: "有效", value: 1}, {name: "无效", value: 0}],
props: {
label: "name",
value: "value",
rules: [
{
required: true,
message: "请选择服务类型",
trigger: "change",
},
},
{
label: "服务类型",
prop: "stype",
type: "tree",
span: 12,
display: true,
hide: true,
dicData: serviceType,
props: {
label: "label",
value: "value",
},
rules: [
{
required: true,
message: "请选择服务类型",
trigger: "change",
},
],
placeholder: "请选择 服务类型",
},
{
label: "发文字号",
prop: "issuingNumber",
hide: true,
span: 12,
// row: true,
maxlength: 50,
showWordLimit: true,
},
{
label: "类别",
prop: "category",
span: 12,
hide: true,
maxlength: 50,
showWordLimit: true,
},
{
label: "标签",
prop: "labelName",
hide: false,
formslot: true,
span: 24,
},
{
label: "政策文件名",
prop: "policyFileName",
hide: true,
span: 24,
},
{
label: '政策内容',
prop: 'policyContent',
slot: true,
hide: true,
formslot: true,
span: 24,
},
{
label: "指南文件名",
prop: "guidelineFileName",
hide: true,
span: 24,
maxlength: 50,
showWordLimit: true,
},
{
label: "指南内容",
prop: "guidelineContent",
hide: true,
formslot: true,
span: 24,
},
{
label: "备注",
prop: "remarks",
type: "textarea",
hide: true,
span: 24,
maxlength: 100,
showWordLimit: true,
},
],
placeholder: "请选择 服务类型",
},
{
label: "发文字号",
prop: "issuingNumber",
hide: true,
span: 12,
// row: true,
maxlength: 50,
showWordLimit: true,
},
{
label: "类别",
prop: "category",
span: 12,
hide: true,
maxlength: 50,
showWordLimit: true,
},
{
label: "标签",
prop: "labelName",
hide: false,
formslot: true,
span: 24,
},
{
label: "政策文件名",
prop: "policyFileName",
hide: true,
span: 24,
},
{
label: '政策内容',
prop: 'policyContent',
slot: true,
hide: true,
formslot: true,
span: 24,
},
{
label: "指南文件名",
prop: "guidelineFileName",
hide: true,
span: 24,
maxlength: 50,
showWordLimit: true,
},
{
label: "指南内容",
prop: "guidelineContent",
hide: true,
formslot: true,
span: 24,
},
{
label: "备注",
prop: "remarks",
type: "textarea",
hide: true,
span: 24,
maxlength: 100,
showWordLimit: true,
},
]
}
},
@@ -739,19 +699,6 @@ export default {
this.getDept()
},
methods: {
// rowStyle(column) {
// if (column.row.serveTheme === '人工推送岗位' || column.row.serveTheme === '人工推送政策') {
// this.logOption.editBtn = true
// } else {
// this.logOption.editBtn = false
// }
// },
handleBasicUpdate() {
window.open('http://10.160.7.100:8000/jyback/template/general.html#/generalPage?_modulePartId_=1000076072', '_blank');
},
handelJobIntention() {
this.$message({type: "info", message: "功能未配置"});
},
async getDept() {
let params = {
tenantId: '000000'
@@ -771,55 +718,62 @@ export default {
})
})
},
handelPhoneConfirm() {
let _this = this
let phone = ''
if (this.phoneForm.list.length) phone = this.phoneForm.list[0];
// if (/^1[3-9]{1}\d{9}/.test(this.phoneForm.phone)) phone = this.phoneForm.phone;
if (phone) {
this.$confirm(`手机号为:${phone}`, {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async (res) => {
let params = {
idNumber: _this.phoneItem.idNumber,
phone,
serveId: this.selectInfo.id,
serveUserId: this.phoneItem.serveUserId,
isServe: this.phoneForm.isServe,
isTrain: this.phoneForm.isTrain
}
let resData = await phoneUpdate(params)
if (resData.data.code === 200) {
_this.$message.success("手机号更新成功");
_this.handlePhoneClose()
}
})
} else {
this.$message.error("请选择或输入用户手机号!");
}
},
handlePhoneClose() {
this.phoneDialogVisible = false
this.phoneForm.phone = ''
this.phoneForm.list = []
this.phoneForm.isServe = 0
this.phoneForm.isTrain = 0
},
// 5. 重写 phoneDataList 方法
async phoneDataList(item) {
let params = {
idNumber: item.idNumber
}
let resData = await getPhoneList(params)
if (resData.data.code === 200) {
this.phoneList = resData.data.data
this.phoneItem = item
this.phoneDialogVisible = true
this.phoneForm.isServe = item.isServe
this.phoneForm.isTrain = item.isTrain
} else {
this.$message.error("用户数据异常!");
// 开启 Loading
const loadingInstance = this.$loading({
lock: true,
text: '正在加载数据...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
try {
// 1. 获取电话列表
let params = { idNumber: item.idNumber };
let resData = await getPhoneList(params);
// 2. (如果需要) 获取技能列表
if (this.workSkillsOptions.length === 0) {
let skillsRes = await getWorkTypes(1);
if (skillsRes.data.code === 200) {
this.workSkillsOptions = skillsRes.data.data;
}
}
if (this.areaOptions.length === 0) {
let regsRes = await serveRegion();
if (regsRes.data.code === 200) {
this.areaOptions = regsRes.data.data;
}
}
if (this.exitReasonOptions.length === 0) {
let Reason = await serveExitReason();
if (Reason.data.code === 200) {
this.exitReasonOptions = Reason.data.data;
}
}
// 检查电话列表API结果
if (resData.data.code === 200) {
// 成功: 关闭 loading, 传递数据, 打开弹窗
loadingInstance.close();
this.phoneList = resData.data.data;
this.phoneItem = item;
this.phoneDialogVisible = true;
} else {
// 失败: 关闭 loading, 显示错误
loadingInstance.close();
this.$message.error("用户数据异常!");
}
} catch (error) {
// 异常: 关闭 loading, 显示错误
console.error("Error loading follow-up data:", error);
loadingInstance.close();
this.$message.error("获取用户数据失败!");
}
},
/*点击分组加载相应人才列表*/
@@ -859,7 +813,7 @@ export default {
this.$nextTick(function () {
this.$refs.tree.setCurrentKey(groupId);
}); //默认高亮
this.nodeClick({id: groupId});
this.nodeClick({ id: groupId });
} else {
if (this.treeData.length) {
const serveId2 = this.treeData[0].id
@@ -867,9 +821,10 @@ export default {
this.$nextTick(function () {
this.$refs.tree.setCurrentKey(serveId);
}); //默认高亮第一个
this.nodeClick({id: serveId});
this.nodeClick({ id: serveId });
}
}
this.selectInfo = data[0].children[0]
this.loading = false;
});
},
@@ -888,8 +843,8 @@ export default {
const h = this.$createElement;
this.$confirm(
h("div", null, [
h("p", {style: "font-size: 16px"}, "您确定要删除此分组吗? "),
h("p", {style: "color: red"}, "一旦删除则无法找回"),
h("p", { style: "font-size: 16px" }, "您确定要删除此分组吗? "),
h("p", { style: "color: red" }, "一旦删除则无法找回"),
]),
{
type: "warning",
@@ -933,6 +888,9 @@ export default {
.catch(() => {
});
},
callbackPopup() {
this.onLoad(this.page, this.query);
},
/*加载人才列表 */
onLoad(page, params = {}) {
this.loading = true;
@@ -940,10 +898,12 @@ export default {
current: page.currentPage,
size: page.size,
id: this.tenantId,
...params
}
for (const paramsKey in params) {
params[paramsKey] !== '' ? paramsed[paramsKey] = params[paramsKey] : null
}
getServeListTalents(paramsed).then((res) => {
const {records, current, size, total} = res.data.data
const { records, current, size, total } = res.data.data
this.dataSource = records
this.loading = false;
this.page.size = size
@@ -990,7 +950,7 @@ export default {
serveId: this.selectInfo.id,
companyId: this.selectInfo.companyId
}).then(res => {
const {records, current, size, total} = res.data.data
const { records, current, size, total } = res.data.data
this.innerDrawer1 = true
this.workData = records
this.workPage.size = size
@@ -1000,9 +960,9 @@ export default {
},
// 匹配政策
matchPolicy(row) {
getMatchPolicy({id: row.id, serveId: this.selectInfo.id, serveUserId: row.serveUserId}).then(res => {
getMatchPolicy({ id: row.id, serveId: this.selectInfo.id, serveUserId: row.serveUserId }).then(res => {
let _this = this;
const {records, current, size, total} = res.data.data
const { records, current, size, total } = res.data.data
_this.policyData = records
_this.innerDrawer2 = true
_this.policyPage.size = size
@@ -1021,7 +981,7 @@ export default {
size: this.logPage.size
}).then(res => {
let _this = this;
const {records, current, size, total} = res.data.data
const { records, current, size, total } = res.data.data
_this.logData = records
_this.innerDrawer3 = true
_this.logPage.size = size
@@ -1076,7 +1036,7 @@ export default {
type: "warning",
})
.then(() => {
return removeServeLog({ids: row.id});
return removeServeLog({ ids: row.id });
})
.then(() => {
this.serveLog(this.selectUserServeLog)
@@ -1144,6 +1104,4 @@ export default {
}
</script>
<style lang="scss" scoped>
</style>
<style lang="scss" scoped></style>

File diff suppressed because it is too large Load Diff

View File

@@ -76,6 +76,7 @@ import {isvalidatemobile} from "@/util/validate";
import {getDept, getDeptMyTree} from "@/api/tenant/talents";
import {addServeLog, getMainServeUserLog, removeServeLog, updateServeLog} from "@/api/tenant/serve";
import {cloneDeep} from "lodash";
import {serveTypeOptions} from "@/common/dic";
const page = {
size: 10,
@@ -382,12 +383,7 @@ export default {
label: '服务类型',
prop: 'serveType',
type: 'select',
dicData: [
{label: '普通日志', value: 0},
{label: '回访日志', value: 1},
{label: '推送岗位日志', value: 2},
{label: '推送政策日志', value: 3},
],
dicData: serveTypeOptions,
display: false,
}, {
label: '服务主题',