2025008071805

This commit is contained in:
张潘 2025-08-11 17:18:23 +08:00
parent 9b23266010
commit 514248dae7
2 changed files with 466 additions and 0 deletions

View File

@ -0,0 +1,321 @@
<template>
<el-dialog
:title="title"
:visible.sync="visible"
width="800px"
append-to-body
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="申请ID" prop="id">
<el-input v-model="form.id" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请状态" prop="status">
<el-select v-model="form.status" placeholder="请选择审核状态" style="width: 100%">
<el-option
v-for="dict in dict.type.worker_apply_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="用户姓名" prop="name">
<el-input v-model="form.name" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="phone">
<el-input v-model="form.phone" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="申请地区" prop="address">
<el-input v-model="form.address" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请时间" prop="createdAt">
<el-input v-model="form.createdAt" disabled />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="申请技能" prop="skillId">
<div v-if="form.skillId && form.skillId !== '' && isSkillListReady">
<el-tag
v-for="(skillId, index) in parseSkillIds(form.skillId)"
:key="`skill-${form.id}-${index}`"
size="medium"
type="success"
style="margin: 5px;"
>
{{ getSkillName(skillId) }}
</el-tag>
</div>
<span v-else-if="!isSkillListReady">加载中...</span>
<span v-else>-</span>
</el-form-item>
<el-form-item v-if="!readonly" label="审核备注" prop="auditRemark">
<el-input
v-model="form.auditRemark"
type="textarea"
:rows="3"
placeholder="请输入审核备注信息"
maxlength="500"
show-word-limit
/>
</el-form-item>
<el-form-item v-if="!readonly" label="审核结果" prop="auditResult">
<el-radio-group v-model="form.auditResult">
<el-radio label="pass">通过</el-radio>
<el-radio label="reject">拒绝</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="handleCancel">{{ readonly ? '关闭' : ' ' }}</el-button>
<el-button v-if="!readonly" type="primary" @click="handleSubmit" :loading="submitLoading"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { getSiteSkillList } from "@/api/system/SiteSkill"
export default {
name: "WorkerApplyAudit",
dicts: ['worker_apply_status'],
props: {
visible: {
type: Boolean,
default: false
},
title: {
type: String,
default: "审核师傅申请"
},
data: {
type: Object,
default: () => ({})
},
readonly: {
type: Boolean,
default: false
}
},
data() {
return {
form: {},
rules: {
status: [
{ required: true, message: "请选择审核状态", trigger: "change" }
],
auditResult: [
{ required: true, message: "请选择审核结果", trigger: "change" }
]
},
submitLoading: false,
skillList: [],
skillNameCache: {}
}
},
computed: {
isSkillListReady() {
return this.skillList.length > 0;
}
},
watch: {
visible(val) {
if (val) {
this.loadSkillList();
this.initForm();
}
},
data: {
handler(val) {
if (val) {
this.form = { ...val };
//
if (!this.form.status) {
this.form.status = "0"; // 0
}
//
this.form.auditResult = "pass";
//
if (this.form.createdAt) {
this.form.createdAt = this.parseTime(this.form.createdAt, '{y}-{m}-{d} {h}:{i}:{s}');
}
}
},
immediate: true
}
},
methods: {
//
initForm() {
this.form = {
...this.data,
auditRemark: "",
auditResult: "pass"
};
if (!this.form.status) {
this.form.status = "0";
}
if (this.form.createdAt) {
this.form.createdAt = this.parseTime(this.form.createdAt, '{y}-{m}-{d} {h}:{i}:{s}');
}
},
//
loadSkillList() {
if (this.skillList.length > 0) return;
getSiteSkillList().then(response => {
if (response.code === 200) {
this.skillList = response.data || [];
this.updateSkillNameCache();
}
}).catch((error) => {
console.error('获取技能列表异常:', error);
this.useDefaultSkillList();
});
},
// 使
useDefaultSkillList() {
this.skillList = [
{ id: 1, title: '水电工' },
{ id: 2, title: '油工师傅' },
{ id: 3, title: '改造维修' },
{ id: 4, title: '工程施工' }
];
this.updateSkillNameCache();
},
//
updateSkillNameCache() {
this.skillNameCache = {};
this.skillList.forEach(skill => {
this.skillNameCache[skill.id] = skill.title;
});
},
// ID
parseSkillIds(skillIdData) {
if (!skillIdData) return [];
try {
if (typeof skillIdData === 'string') {
if (skillIdData.startsWith('[') && skillIdData.endsWith(']')) {
const parsed = JSON.parse(skillIdData);
return Array.isArray(parsed) ? parsed : [];
}
return skillIdData.split(',').filter(id => id.trim());
}
if (Array.isArray(skillIdData)) {
return skillIdData;
}
return [];
} catch (error) {
console.error('解析技能ID失败:', error, '原始数据:', skillIdData);
if (typeof skillIdData === 'string') {
return skillIdData.split(',').filter(id => id.trim());
}
return [];
}
},
//
getSkillName(skillId) {
if (!skillId) return '-';
const id = String(skillId).trim();
if (!id) return '-';
let skillName = this.skillNameCache[id];
if (!skillName && this.skillList.length > 0) {
const skill = this.skillList.find(s => String(s.id) === id);
if (skill) {
this.skillNameCache[id] = skill.title;
skillName = skill.title;
}
}
if (!skillName) {
return `未知技能(${id})`;
}
return skillName;
},
//
handleCancel() {
this.$emit('update:visible', false);
},
//
handleSubmit() {
this.$refs["form"].validate((valid) => {
if (valid) {
this.submitLoading = true;
//
if (this.form.auditResult === 'pass') {
this.form.status = "1"; // 1
} else if (this.form.auditResult === 'reject') {
this.form.status = "2"; // 2
}
//
this.$emit('confirm', this.form);
this.submitLoading = false;
}
});
},
//
parseTime(time, format) {
if (!time) return '';
const date = new Date(time);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return format
.replace('{y}', year)
.replace('{m}', month)
.replace('{d}', day)
.replace('{h}', hours)
.replace('{i}', minutes)
.replace('{s}', seconds);
}
}
}
</script>
<style scoped>
.dialog-footer {
text-align: right;
}
</style>

View File

@ -0,0 +1,145 @@
<template>
<el-dialog
title="批量审核师傅申请"
:visible.sync="visible"
width="600px"
append-to-body
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="审核记录数">
<el-input :value="recordCount" disabled />
</el-form-item>
<el-form-item label="审核状态" prop="status">
<el-select v-model="form.status" placeholder="请选择审核状态" style="width: 100%">
<el-option
v-for="dict in dict.type.worker_apply_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="审核结果" prop="auditResult">
<el-radio-group v-model="form.auditResult">
<el-radio label="pass">通过</el-radio>
<el-radio label="reject">拒绝</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="审核备注" prop="auditRemark">
<el-input
v-model="form.auditRemark"
type="textarea"
:rows="3"
placeholder="请输入批量审核备注信息"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="handleCancel"> </el-button>
<el-button type="primary" @click="handleSubmit" :loading="submitLoading"> </el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: "WorkerApplyBatchAudit",
dicts: ['worker_apply_status'],
props: {
visible: {
type: Boolean,
default: false
},
recordIds: {
type: Array,
default: () => []
}
},
data() {
return {
form: {
status: "",
auditResult: "pass",
auditRemark: ""
},
rules: {
status: [
{ required: true, message: "请选择审核状态", trigger: "change" }
],
auditResult: [
{ required: true, message: "请选择审核结果", trigger: "change" }
]
},
submitLoading: false
}
},
computed: {
recordCount() {
return this.recordIds.length;
}
},
watch: {
visible(val) {
if (val) {
this.initForm();
}
}
},
methods: {
//
initForm() {
this.form = {
status: "",
auditResult: "pass",
auditRemark: ""
};
},
//
handleCancel() {
this.$emit('update:visible', false);
},
//
handleSubmit() {
this.$refs["form"].validate((valid) => {
if (valid) {
this.submitLoading = true;
//
if (this.form.auditResult === 'pass') {
this.form.status = "1"; // 1
} else if (this.form.auditResult === 'reject') {
this.form.status = "2"; // 2
}
//
const auditData = {
ids: this.recordIds,
status: this.form.status,
auditRemark: this.form.auditRemark
};
//
this.$emit('confirm', auditData);
this.submitLoading = false;
}
});
}
}
}
</script>
<style scoped>
.dialog-footer {
text-align: right;
}
</style>