javacodeadmin/ruoyi-ui/src/views/system/UsersWorker/UserEditDialog.vue

736 lines
23 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-dialog :title="mode==='add' ? '添加师傅' : '编辑师傅'" :visible.sync="visible" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="ID" v-if="form.id">
<el-input v-model="form.id" disabled />
</el-form-item>
<el-form-item label="昵称" prop="name">
<el-input v-model="form.name" placeholder="请输入昵称" />
</el-form-item>
<el-form-item label="电话" prop="phone">
<el-input v-model="form.phone" placeholder="请输入电话" />
</el-form-item>
<el-form-item label="头像" prop="avatar">
<image-upload v-model="form.avatar" :limit="1"/>
</el-form-item>
<el-form-item label="禁止接单开始时间" prop="prohibitTime">
<el-date-picker
v-model="form.prohibitTime"
type="datetime"
placeholder="输入禁止开始时间"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="禁止接单时长" prop="prohibitTimeNum">
<div class="time-input">
<el-button icon="el-icon-minus" @click="decreaseTime" size="small"></el-button>
<el-input-number
v-model="form.prohibitTimeNum"
:min="0"
:controls="false"
placeholder="0"
style="width: 100px; text-align: center;" />
<el-button icon="el-icon-plus" @click="increaseTime" size="small"></el-button>
<span style="margin-left: 10px;">小时</span>
</div>
</el-form-item>
<el-form-item label="服务城市" prop="serviceCityPid">
<el-select
v-model="selectedCity"
placeholder="请选择服务城市"
filterable
clearable
style="width: 100%"
@change="handleCityChange">
<el-option
v-for="item in cityList"
:key="item.id"
:label="item.title"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="服务地区" prop="serviceCityIds">
<el-select
v-model="selectedAreas"
placeholder="请选择服务地区"
filterable
multiple
style="width: 100%"
@change="handleAreaChange">
<el-option
v-for="item in areaList"
:key="item.id"
:label="item.title"
:value="item.id">
</el-option>
</el-select>
<!-- 显示已选择的地区标签
<div class="selected-tags" v-if="selectedAreas.length > 0">
<el-tag
v-for="areaId in selectedAreas"
:key="areaId"
closable
@close="removeArea(areaId)"
style="margin: 2px;">
{{ getAreaName(areaId) }}
</el-tag>
</div> -->
</el-form-item>
<el-form-item label="技能" prop="skillIds">
<div class="skill-selection">
<el-select
v-model="selectedSkills"
multiple
filterable
placeholder="请选择技能"
style="width: 100%"
@change="handleSkillChange"
>
<el-option
v-for="item in skillList"
:key="item.id"
:label="item.title"
:value="item.id"
/>
</el-select>
<!-- 显示已选择的技能标签
<div class="selected-tags" v-if="selectedSkills.length > 0">
<el-tag
v-for="skillId in selectedSkills"
:key="skillId"
closable
@close="removeSkill(skillId)"
type="success"
style="margin: 2px;"
>
{{ getSkillName(skillId) }}
</el-tag>
</div> -->
</div>
</el-form-item>
<el-form-item label="状态">
<el-switch
v-model="form.status"
:active-value="1"
:inactive-value="0"
active-text="启用"
inactive-text="禁用">
</el-switch>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="resetForm">重置</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</div>
</el-dialog>
</template>
<script>
import { datalist } from "@/api/system/DiyCity"
import { getSiteSkillList } from "@/api/system/SiteSkill"
export default {
name: "UserEditDialog",
props: {
visible: {
type: Boolean,
default: false
},
user: {
type: Object,
default: () => ({})
},
mode: {
type: String,
default: 'add'
}
},
data() {
return {
form: {
id: null,
name: undefined,
phone: undefined,
avatar: undefined,
prohibitTime: undefined,
prohibitTimeNum: 0,
serviceCityPid: undefined,
serviceCityIds: undefined,
skillIds: undefined,
commission: undefined,
status: 1,
createdAt: null
},
rules: {
name: [
{ required: true, message: "昵称不能为空", trigger: "blur" }
],
phone: [
{ required: true, message: "电话不能为空", trigger: "blur" }
],
serviceCityPid: [
{ required: true, message: "服务城市不能为空", trigger: "change" }
],
serviceCityIds: [
{ required: true, message: "服务地区不能为空", trigger: "change" }
],
skillIds: [
{ required: true, message: "技能不能为空", trigger: "change" }
]
},
// 城市相关数据
cityList: [],
selectedCity: undefined,
cityNameCache: {},
// 地区相关数据
areaList: [],
selectedAreas: [],
areaNameCache: {},
// 技能相关数据
skillList: [],
selectedSkills: [],
skillNameCache: {},
// 标记是否正在初始化数据
isInitializing: false
}
},
watch: {
user: {
handler(val) {
if (val) {
console.log('UserEditDialog - 接收到用户数据:', val);
this.form = { ...val }
// 确保status是数字类型
if (typeof this.form.status === 'string') {
this.form.status = parseInt(this.form.status)
}
// 处理禁止接单时长
if (this.form.prohibitTimeNum) {
this.form.prohibitTimeNum = parseInt(this.form.prohibitTimeNum) || 0
}
// 清除验证错误
this.$nextTick(() => {
if (this.$refs["form"]) {
this.$refs["form"].clearValidate();
}
});
}
},
immediate: true
},
visible(val) {
if (val) {
console.log('UserEditDialog - 弹窗打开,开始加载数据');
this.isInitializing = true; // 设置初始化标记
// 先加载基础数据,然后处理已选择的数据
Promise.all([
this.loadCityList(),
this.loadSkillList()
]).then(() => {
console.log('UserEditDialog - 基础数据加载完成,开始处理已选择的数据');
// 处理服务城市ID
this.processSelectedCity();
// 处理技能ID
this.processSelectedSkills();
// 如果有选中的城市,加载对应的地区数据
if (this.selectedCity) {
this.loadAreaList().then(() => {
// 处理服务地区ID
this.processSelectedAreas();
this.isInitializing = false; // 初始化完成
});
} else {
this.isInitializing = false; // 初始化完成
}
}).catch(() => {
this.isInitializing = false; // 即使出错也要重置标记
});
} else {
// 弹窗关闭时重置数据
this.resetDialogData();
}
},
selectedCity(val) {
this.form.serviceCityPid = val;
this.updateCityNameCache();
// 只有在用户主动选择时才重新加载地区列表(非初始化状态)
if (!this.isInitializing && this.visible && this.cityList.length > 0) {
// 清空当前选中的地区,因为城市变化了
this.selectedAreas = [];
this.areaList = [];
this.loadAreaList();
}
},
selectedAreas(val) {
this.form.serviceCityIds = val.join(',');
this.updateAreaNameCache();
},
selectedSkills(val) {
this.form.skillIds = val.join(',');
this.updateSkillNameCache();
}
},
methods: {
// 加载城市列表
loadCityList() {
console.log('UserEditDialog - 开始加载城市列表');
const queryParams = {
parentId: 0 // 查询一级城市(省份)
}
return datalist(queryParams).then(response => {
console.log('UserEditDialog - 获取城市列表成功:', response);
if (response.code === 200) {
// AjaxResult.success()方法返回的数据在data字段中
this.cityList = response.data || [];
console.log('UserEditDialog - 城市列表:', this.cityList);
this.updateCityNameCache();
} else {
console.warn('UserEditDialog - 获取城市列表失败,使用默认数据');
this.cityList = [
{ id: 1, title: '陕西省' },
{ id: 27, title: '上海市' },
{ id: 44, title: '湖南省' },
{ id: 52, title: '安徽省' }
];
}
return response;
}).catch((error) => {
console.error('UserEditDialog - 获取城市列表异常:', error);
this.cityList = [
{ id: 1, title: '陕西省' },
{ id: 27, title: '上海市' },
{ id: 44, title: '湖南省' },
{ id: 52, title: '安徽省' }
];
return Promise.reject(error);
});
},
// 加载地区列表
loadAreaList() {
console.log('UserEditDialog - 开始加载地区列表,选中的城市:', this.selectedCity);
this.areaList = [];
this.areaNameCache = {};
if (!this.selectedCity) {
return Promise.resolve(); // 如果没有选中的城市,直接返回
}
// 为选中的城市加载地区数据
const queryParams = {
parentId: this.selectedCity // 根据城市ID查询下级地区
}
return datalist(queryParams).then(response => {
console.log(`UserEditDialog - 获取城市${this.selectedCity}的地区数据成功:`, response);
if (response.code === 200) {
// AjaxResult.success()方法返回的数据在data字段中
this.areaList = response.data || [];
}
console.log('UserEditDialog - 地区数据加载完成,地区列表:', this.areaList);
this.updateAreaNameCache();
return response;
}).catch((error) => {
console.error(`UserEditDialog - 获取城市${this.selectedCity}的地区数据失败:`, error);
// 使用默认数据
let defaultAreas = [];
if (this.selectedCity === 1) {
defaultAreas = [
{ id: 2, title: '新城区' },
{ id: 5, title: '碑林区' },
{ id: 7, title: '莲湖区' },
{ id: 10, title: '灞桥区' },
{ id: 11, title: '未央区' },
{ id: 12, title: '雁塔区' },
{ id: 13, title: '阎良区' },
{ id: 14, title: '临潼区' },
{ id: 15, title: '长安区' },
{ id: 16, title: '高陵区' },
{ id: 17, title: '鄠邑区' }
];
} else if (this.selectedCity === 52) {
defaultAreas = [
{ id: 53, title: '瑶海区' },
{ id: 54, title: '庐阳区' },
{ id: 55, title: '蜀山区' },
{ id: 56, title: '包河区' },
{ id: 57, title: '经开区' },
{ id: 58, title: '高新区' }
];
}
this.areaList = defaultAreas;
this.updateAreaNameCache();
return Promise.resolve(); // 即使加载失败也返回一个已完成的Promise
});
},
// 加载技能列表
loadSkillList() {
console.log('UserEditDialog - 开始加载技能列表');
return getSiteSkillList().then(response => {
console.log('UserEditDialog - 获取技能列表成功:', response);
if (response.code === 200) {
this.skillList = response.data || [];
console.log('UserEditDialog - 技能列表:', this.skillList);
this.updateSkillNameCache();
} else {
console.warn('UserEditDialog - 获取技能列表失败,使用默认数据');
this.skillList = [
{ id: 1, title: '水电工' },
{ id: 2, title: '油工师傅' },
{ id: 3, title: '改造维修' },
{ id: 4, title: '工程施工' }
];
}
return response;
}).catch((error) => {
console.error('UserEditDialog - 获取技能列表异常:', error);
this.skillList = [
{ id: 1, title: '水电工' },
{ id: 2, title: '油工师傅' },
{ id: 3, title: '改造维修' },
{ id: 4, title: '工程施工' }
];
return Promise.reject(error);
});
},
// 处理已选择的城市
processSelectedCity() {
console.log('开始处理服务城市数据:', this.form.serviceCityPid, '类型:', typeof this.form.serviceCityPid);
this.selectedCity = undefined; // 先清空
if (this.form.serviceCityPid) {
try {
let cityId = this.form.serviceCityPid;
if (typeof this.form.serviceCityPid === 'string') {
if (this.form.serviceCityPid.startsWith('[') && this.form.serviceCityPid.endsWith(']')) {
const parsed = JSON.parse(this.form.serviceCityPid);
cityId = Array.isArray(parsed) ? parsed[0] : parsed;
} else if (this.form.serviceCityPid.includes(',')) {
// 如果是逗号分隔的字符串,取第一个
cityId = this.form.serviceCityPid.split(',')[0].trim();
} else {
cityId = this.form.serviceCityPid.trim();
}
} else if (Array.isArray(this.form.serviceCityPid)) {
cityId = this.form.serviceCityPid[0];
} else if (typeof this.form.serviceCityPid === 'number') {
cityId = this.form.serviceCityPid;
}
// 转换为数字并验证
const parsedId = parseInt(cityId);
if (!isNaN(parsedId) && parsedId > 0) {
this.selectedCity = parsedId;
console.log('解析后的服务城市:', this.selectedCity);
// 更新缓存
this.$nextTick(() => {
this.updateCityNameCache();
});
}
} catch (error) {
console.error('解析服务城市数据失败:', error);
this.selectedCity = undefined;
}
}
},
// 处理已选择的地区
processSelectedAreas() {
console.log('开始处理服务地区数据:', this.form.serviceCityIds, '类型:', typeof this.form.serviceCityIds);
this.selectedAreas = []; // 先清空
if (this.form.serviceCityIds) {
try {
let areaIds = [];
if (typeof this.form.serviceCityIds === 'string') {
if (this.form.serviceCityIds.startsWith('[') && this.form.serviceCityIds.endsWith(']')) {
areaIds = JSON.parse(this.form.serviceCityIds);
} else {
areaIds = this.form.serviceCityIds.split(',').map(id => id.trim()).filter(id => id);
}
} else if (Array.isArray(this.form.serviceCityIds)) {
areaIds = this.form.serviceCityIds;
} else if (typeof this.form.serviceCityIds === 'number') {
areaIds = [this.form.serviceCityIds];
}
// 转换为数字并过滤无效值
this.selectedAreas = areaIds.map(id => parseInt(id)).filter(id => !isNaN(id) && id > 0);
console.log('解析后的服务地区:', this.selectedAreas);
// 更新缓存
this.$nextTick(() => {
this.updateAreaNameCache();
});
} catch (error) {
console.error('解析服务地区数据失败:', error);
this.selectedAreas = [];
}
}
},
// 处理已选择的技能
processSelectedSkills() {
console.log('开始处理技能数据:', this.form.skillIds, '类型:', typeof this.form.skillIds);
this.selectedSkills = []; // 先清空
if (this.form.skillIds) {
try {
let skillIds = [];
if (typeof this.form.skillIds === 'string') {
if (this.form.skillIds.startsWith('[') && this.form.skillIds.endsWith(']')) {
skillIds = JSON.parse(this.form.skillIds);
} else {
skillIds = this.form.skillIds.split(',').map(id => id.trim()).filter(id => id);
}
} else if (Array.isArray(this.form.skillIds)) {
skillIds = this.form.skillIds;
} else if (typeof this.form.skillIds === 'number') {
skillIds = [this.form.skillIds];
}
// 转换为数字并过滤无效值
this.selectedSkills = skillIds.map(id => parseInt(id)).filter(id => !isNaN(id) && id > 0);
console.log('解析后的技能:', this.selectedSkills);
// 更新缓存
this.$nextTick(() => {
this.updateSkillNameCache();
});
} catch (error) {
console.error('解析技能数据失败:', error);
this.selectedSkills = [];
}
}
},
// 更新城市名称缓存
updateCityNameCache() {
console.log('更新城市名称缓存,已选择城市:', this.selectedCity, '城市列表:', this.cityList);
this.cityNameCache = {};
if (this.selectedCity) {
const city = this.cityList.find(item => item.id === this.selectedCity);
if (city) {
this.cityNameCache[this.selectedCity] = city.title;
} else {
console.warn('未找到城市ID:', this.selectedCity, '对应的名称');
}
}
console.log('城市名称缓存:', this.cityNameCache);
},
// 更新地区名称缓存
updateAreaNameCache() {
console.log('更新地区名称缓存,已选择地区:', this.selectedAreas, '地区列表:', this.areaList);
this.areaNameCache = {};
this.selectedAreas.forEach(areaId => {
const area = this.areaList.find(item => item.id === areaId);
if (area) {
this.areaNameCache[areaId] = area.title;
} else {
console.warn('未找到地区ID:', areaId, '对应的名称');
}
});
console.log('地区名称缓存:', this.areaNameCache);
},
// 更新技能名称缓存
updateSkillNameCache() {
console.log('更新技能名称缓存,已选择技能:', this.selectedSkills, '技能列表:', this.skillList);
this.skillNameCache = {};
this.selectedSkills.forEach(skillId => {
const skill = this.skillList.find(item => item.id === skillId);
if (skill) {
this.skillNameCache[skillId] = skill.title;
} else {
console.warn('未找到技能ID:', skillId, '对应的名称');
}
});
console.log('技能名称缓存:', this.skillNameCache);
},
// 获取城市名称
getCityName(cityId) {
return this.cityNameCache[cityId] || this.cityList.find(item => item.id === cityId)?.title || cityId;
},
// 获取地区名称
getAreaName(areaId) {
return this.areaNameCache[areaId] || this.areaList.find(item => item.id === areaId)?.title || areaId;
},
// 获取技能名称
getSkillName(skillId) {
return this.skillNameCache[skillId] || this.skillList.find(item => item.id === skillId)?.title || skillId;
},
// 移除城市
removeCity(cityId) {
this.selectedCity = undefined;
},
// 移除地区
removeArea(areaId) {
const index = this.selectedAreas.indexOf(areaId);
if (index > -1) {
this.selectedAreas.splice(index, 1);
}
},
// 移除技能
removeSkill(skillId) {
const index = this.selectedSkills.indexOf(skillId);
if (index > -1) {
this.selectedSkills.splice(index, 1);
}
},
// 城市选择变化
handleCityChange() {
console.log('城市选择变化:', this.selectedCity);
this.updateCityNameCache();
// 清空当前选中的地区,因为城市变化了
this.selectedAreas = [];
this.areaList = [];
// 重新加载地区列表
if (this.selectedCity) {
this.loadAreaList();
}
},
// 地区选择变化
handleAreaChange() {
console.log('地区选择变化:', this.selectedAreas);
this.updateAreaNameCache();
},
// 技能选择变化
handleSkillChange() {
console.log('技能选择变化:', this.selectedSkills);
this.updateSkillNameCache();
},
// 减少时间
decreaseTime() {
if (this.form.prohibitTimeNum > 0) {
this.form.prohibitTimeNum--;
}
},
// 增加时间
increaseTime() {
this.form.prohibitTimeNum++;
},
// 提交表单
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
// 确保必要的字段有值
const submitData = {
...this.form,
type: '2', // 师傅类型
status: this.form.status || 0,
prohibitTimeNum: this.form.prohibitTimeNum || 0
}
this.$emit('confirm', submitData)
} else {
console.log('表单验证失败');
}
})
},
// 重置弹窗数据
resetDialogData() {
this.isInitializing = false;
this.cityList = [];
this.selectedCity = undefined;
this.cityNameCache = {};
this.areaList = [];
this.selectedAreas = [];
this.areaNameCache = {};
this.skillList = [];
this.selectedSkills = [];
this.skillNameCache = {};
},
// 重置表单
resetForm() {
// 重置表单但保留id
const id = this.form.id
const createdAt = this.form.createdAt
this.$refs["form"].resetFields()
this.resetDialogData()
this.form = {
id: id,
name: undefined,
phone: undefined,
avatar: undefined,
prohibitTime: undefined,
prohibitTimeNum: 0,
serviceCityPid: undefined,
serviceCityIds: undefined,
skillIds: undefined,
commission: undefined,
status: 1,
createdAt: createdAt
}
// 清除验证错误
this.$nextTick(() => {
if (this.$refs["form"]) {
this.$refs["form"].clearValidate();
}
});
}
}
}
</script>
<style scoped>
.time-input {
display: flex;
align-items: center;
}
.selected-tags {
margin-top: 8px;
max-width: 100%;
overflow: hidden;
}
.selected-tags .el-tag {
margin: 2px;
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>