jhprjv2/ruoyi-ui/src/views/wxsetting/labourComplaint/index.vue

714 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container" v-loading="loading">
<transition v-if="state == 'INIT'" name="el-zoom-in-center">
<div v-show="state == 'INIT'" class="transition-box">
<el-alert
v-if="display"
show-icon
title="温馨提示"
type="info"
description="请如实准确的填写劳资投诉信息,投诉受理后我们会快速响应并处理。请勿重复提交投诉!"
close-text="查询投诉进度"
@close="showSearch"
>
</el-alert>
<el-form
ref="form"
label-position="top"
:model="form"
:rules="rules"
label-width="180px"
>
<el-form-item label="投诉人姓名" prop="laborName">
<el-input v-model="form.laborName" placeholder="请输入投诉人姓名" />
</el-form-item>
<el-form-item label="投诉人手机号码" prop="laborPhone">
<el-input
v-model="form.laborPhone"
type="number"
pattern="[0-9]*"
placeholder="请输入投诉人手机号码"
/>
</el-form-item>
<el-form-item label="投诉人身份证号码" prop="laborCardId">
<el-input v-model="form.laborCardId" placeholder="请输入投诉人身份证号码" />
</el-form-item>
<el-form-item label="所属项目单位" prop="projectId">
<el-select
v-model="form.projectId"
filterable
placeholder="请选择所属项目单位"
@change="projectChange"
class="sel"
>
<el-option
v-for="item in projectOptions"
:key="item.id"
:label="item.projectName"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="所属总承包单位" prop="deptId" v-if="form.projectId">
<el-select
v-model="form.deptId"
placeholder="请选择所属总承包单位"
@change="deptChange"
class="sel"
>
<el-option
v-for="item in deptOptions"
:key="'dept' + item.unitId"
:label="item.unitName"
:value="item.unitId"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="所属劳务分包单位" prop="subDeptId" v-if="form.projectId">
<el-select
v-model="form.subDeptId"
placeholder="请选择所属劳务分包单位"
@change="subDeptChange"
class="sel"
>
<el-option
v-for="item in subDeptOptions"
:key="'subDept' + item.unitId"
:label="item.unitName"
:value="item.unitId"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="欠薪人数" prop="laborNumber">
<el-input
v-model="form.laborNumber"
type="number"
pattern="[0-9]*"
placeholder="请输入欠薪人数"
max="99999"
>
<i slot="suffix">人</i>
</el-input>
</el-form-item>
<el-form-item label="欠薪金额" prop="laborAmount">
<el-input
v-model="form.laborAmount"
type="number"
pattern="[0-9]*"
placeholder="请输入欠薪金额"
max="999999999"
>
<i slot="suffix">元</i>
</el-input>
</el-form-item>
<el-form-item label="拖欠原因说明" prop="laborReason">
<el-input
v-model="form.laborReason"
type="textarea"
rows="3"
placeholder="请输入拖欠原因说明"
/>
</el-form-item>
<el-form-item label="凭证附件" prop="files">
<image-upload v-model="form.files" :limit="9" />
</el-form-item>
</el-form>
<div style="text-align: center; padding-bottom: 20px">
<el-button
round
icon="el-icon-finished"
type="primary"
@click="submitForm"
style="width: 90%; background-color: #409eff; border-color: #409eff"
>确 定 提 交 投 诉</el-button
>
</div>
</div>
</transition>
<transition v-if="state == 'OK'" name="el-zoom-in-center">
<div v-show="state == 'OK'" class="transition-box">
<el-result
style="margin-top: 50px"
icon="success"
title="投诉成功"
subTitle="我们已收到您的劳资投诉,问题已提交相关部门审核。"
>
<template slot="extra">
<el-button
type="primary"
icon="el-icon-thumb"
size="medium"
plain
round
style="
width: 100%;
background-color: #409eff;
border-color: #409eff;
color: #ffffff;
"
@click="findFlowInfos"
:disabled="disabled"
:class="disabled ? 'button-dis' : 'button-active'"
>{{ buttonText }}</el-button
>
</template>
</el-result>
</div>
</transition>
<transition v-if="state == 'NO'" name="el-zoom-in-center">
<div v-show="state == 'NO'" class="transition-box">
<el-result
style="margin-top: 50px"
icon="warning"
title="投诉失败"
subTitle="我们已收到您的劳资投诉,问题已提交相关部门审核,请勿重复投诉。"
>
<template slot="extra">
<el-button
type="primary"
icon="el-icon-thumb"
size="medium"
style="
width: 100%;
background-color: #409eff;
border-color: #409eff;
color: #ffffff;
"
@click="findFlowInfos"
:disabled="disabled"
:class="disabled ? 'button-dis' : 'button-active'"
>{{ buttonText }}</el-button
>
</template>
</el-result>
</div>
</transition>
<transition v-if="state == 'QUERY'" name="el-zoom-in-center">
<div v-show="state == 'QUERY'" class="transition-box">
<el-alert
v-if="display"
show-icon
title="温馨提示"
type="info"
description="请输入身份证号码查询投诉进度及投诉结果!"
close-text="返回投诉主页"
@close="showIndex"
>
</el-alert>
<el-form
ref="queryForm"
:model="queryForm"
:rules="rules"
style="margin-top: 30px"
>
<el-form-item prop="laborCardId">
<el-input
v-model="queryForm.laborCardId"
placeholder="请输入投诉人身份证号码查询"
/>
</el-form-item>
</el-form>
<div style="text-align: center">
<el-button
round
icon="el-icon-thumb"
type="primary"
@click="submitQuery"
:disabled="disabled"
:class="disabled ? 'button-dis' : 'button-active'"
>{{ buttonText }}</el-button
>
</div>
</div>
</transition>
<div class="inspect_max" v-if="showInspect">
<div class="inspect_list">
<div class="inspect_for" v-for="(item, index) in flowLabours">
<div class="inspect_for_bgd">
<div class="inspect_list_title">
<div class="inspect_list_title_label inspect_list_title_width">
<div class="inspect_list_title_number">
{{ index < 9 ? "0" + (index + 1) : index + 1 }}
</div>
<div class="module_title module_title_flex inspect_list_title_text">
投诉时间:{{ item.createTime }}
</div>
</div>
</div>
<div
:class="
item.approveStatus == '100'
? 'inspect_shtg'
: 'inspect_shz'
"
>
<div class="inspect_list_info_details">
<div class="inspect_list_info_data">
<div class="inspect_list_info_data_prop">
项目名称:{{ item.projectName }}
</div>
<div class="inspect_list_info_data_prop">
总包单位:{{ item.deptName }}
</div>
<div class="inspect_list_info_data_prop" v-if="item.subDeptId">
分包单位:{{ item.subDeptName }}
</div>
<div class="inspect_list_info_data_prop">
欠薪人数:{{ item.laborNumber }} <el-tag size="small">人</el-tag>
</div>
<div class="inspect_list_info_data_prop">
欠薪金额:{{ item.laborAmount }} <el-tag size="small">元</el-tag>
</div>
<div class="inspect_list_info_data_prop" v-if="item.files">
<image-preview
v-for="(file, idx) in item.files.split(',')"
v-show="idx < 3"
:src="file"
:width="90"
:height="90"
/>
</div>
</div>
</div>
<div class="inspect_list_info_position">
原因说明:{{ item.laborReason }}
</div>
<div class="inspect_list_info_data_prop" style="text-align: center">
<el-button
type="text"
style="color: #1890ff"
@click="showDetail(item.id, index)"
>
<i class="el-icon-d-arrow-right"></i>
{{ nav == index ? "收起" : "展开" }}处理详细信息
<i class="el-icon-d-arrow-left"></i>
</el-button>
</div>
<div class="inspect_list_info_data_prop block" v-show="nav == index">
<el-timeline>
<el-timeline-item
v-for="(node, idx) in flowLabourNodes"
:key="'fns' + idx"
:icon="
node.flowNode % 10 == 0
? 'el-icon-circle-check'
: 'el-icon-circle-close'
"
:color="node.flowNode % 10 == 0 ? '#0bbd87' : '#f56c6c'"
:type="node.flowNode % 10 == 0 ? 'success' : 'danger'"
size="normal"
:timestamp="node.createTime"
>
{{
node.flowNode == "0"
? node.createBy + " 提交投诉"
: node.flowNodeName
}}
<el-card shadow="never" v-show="node.flowNode != '0'">
<p>{{ node.flowComment }}</p>
<p v-if="node.files">
<image-preview
v-for="(file, idx) in node.files.split(',')"
:src="file"
:width="50"
:height="50"
/>
</p>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
</div>
</div>
</div>
</div>
<div v-if="flowLabours.length == 0">
<div style="padding-top: 70px; text-align: -webkit-center">
<el-image
src="https://szgcwx.jhncidg.com/staticFiles/nodata.png"
style="width: 200px; height: 135px"
></el-image>
<div style="color: #a5abbb; margin-top: 20px"> </div>
</div>
</div>
</div>
</div>
</template>
<script>
import {
addFlowLabourInfo,
findMyFlowLabours,
findMyFlowLabourNodes,
} from "@/api/flow/flowLabourInfo";
export default {
name: "labourComplaint",
data() {
return {
state: "INIT",
// 遮罩层
loading: false,
display: true,
showInspect: false,
// 表单参数
form: {},
queryForm: {},
// 选项列表
projectOptions: [],
deptOptions: [],
subDeptOptions: [],
flowLabours: [],
flowLabourNodes: [],
nav: null,
// 表单校验
rules: {
laborName: [{ required: true, message: "请输入投诉人名称", trigger: "blur" }],
laborPhone: [
{ required: true, message: "请输入投诉人手机号码", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur",
},
],
laborCardId: [
{ required: true, message: "请输入投诉人身份证号", trigger: "blur" },
{
pattern: /^[1-9]\d{5}(18|19|20|21|22)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])$/,
message: "请输入正确的身份证号",
trigger: "blur",
},
],
projectId: [{ required: true, message: "请选择所属项目单位", trigger: "blur" }],
deptId: [{ required: true, message: "请选择所属总承包单位", trigger: "blur" }],
subDeptId: [
{ required: true, message: "请选择所属劳务分包单位", trigger: "blur" },
],
laborNumber: [
{ required: true, message: "请输入欠薪人数", trigger: "blur" },
{
min: 0,
max: 6,
message: "输入的数值过大,请确认后重新输入",
trigger: "blur",
},
],
laborAmount: [
{ required: true, message: "请输入欠薪金额", trigger: "blur" },
{
min: 0,
max: 10,
message: "输入的数值过大,请确认后重新输入",
trigger: "blur",
},
],
laborReason: [
{ required: true, message: "请输入拖欠原因说明", trigger: "blur" },
{ max: 200, message: "最多输入600字符", trigger: "blur" },
],
},
timer: null, // 定时器
count: 60, // 初始倒计时时间单位s
buttonText: "查 询 投 诉 进 度", // 按钮显示文本
disabled: false, // 按钮是否可点击
};
},
created() {
this.reset();
this.getAllProjects();
},
methods: {
getAllProjects() {
this.$api.publics.getProjectAllList().then((response) => {
this.projectOptions = response.data || [];
});
},
projectChange(v) {
this.projectOptions.forEach((option) => {
if (option.id == v) {
this.form.projectName = option.projectName;
}
});
this.form.deptId = null;
this.form.subDeptId = null;
this.$api.publics.queryAllUnitList(v, 2).then((response) => {
this.deptOptions = response.data || [];
});
this.$api.publics.queryAllUnitList(v, 3).then((response) => {
this.subDeptOptions = response.data || [];
});
},
deptChange(v) {
this.deptOptions.forEach((option) => {
if (option.unitId == v) {
this.form.deptName = option.unitName;
}
});
//this.$set(this.form, 'deptId', v);
this.$forceUpdate();
},
subDeptChange(v) {
this.subDeptOptions.forEach((option) => {
if (option.unitId == v) {
this.form.subDeptName = option.unitName;
}
});
//this.$set(this.form, 'subDeptId', v);
this.$forceUpdate();
},
// 表单重置
reset() {
this.form = {
projectId: null
};
this.resetForm("form");
},
/** 提交按钮 */
submitForm() {
let that = this;
this.$refs["form"].validate((valid) => {
if (valid) {
this.loading = true;
addFlowLabourInfo(this.form).then((response) => {
setTimeout(() => {
that.loading = false;
if (response.data.id > 0) {
this.state = "OK";
} else {
this.state = "NO";
}
}, 1200);
});
}
});
},
showIndex() {
this.state = "INIT";
},
showSearch() {
this.state = "QUERY";
},
findFlowInfos() {
this.loading = true;
findMyFlowLabours(this.form.laborCardId).then((response) => {
this.loading = false;
this.flowLabours = response.data || [];
this.showInspect = true;
this.startCountdown();
});
},
submitQuery() {
this.$refs["queryForm"].validate((valid) => {
if (valid) {
this.loading = true;
findMyFlowLabours(this.queryForm.laborCardId).then((response) => {
this.loading = false;
this.flowLabours = response.data || [];
this.showInspect = true;
this.startCountdown();
});
}
});
},
resetCountdown() {
this.count = 60;
this.buttonText = "查 询 投 诉 进 度";
this.disabled = false; // 恢复按钮可点击
},
startCountdown() {
this.disabled = true; // 禁用按钮
this.buttonText = `${this.count} 秒 后 继 续 查 询`;
this.timer = setInterval(() => {
this.count--;
this.buttonText = `${this.count} 秒 后 继 续 查 询`;
if (this.count <= 0) {
clearInterval(this.timer);
this.resetCountdown();
}
}, 1000);
},
showDetail(detailId, nv) {
if (this.nav == nv) {
this.nav = null;
return false;
}
this.loading = true;
findMyFlowLabourNodes(detailId).then((response) => {
this.loading = false;
this.nav = nv;
this.flowLabourNodes = response.data || [];
});
},
},
};
</script>
<style scope>
.app-container {
height: 100%;
background-image: url("https://szgc.jhncidg.com/profile/static/bg.png");
background-size: 100% 100%;
}
.el-form--label-top .el-form-item__label {
padding: 0 !important;
}
.el-input__suffix {
right: 10px !important;
}
.el-alert {
display: flex !important;
}
.el-alert--info.is-light {
background: cornflowerblue !important;
color: #ffffff !important;
}
.el-alert--info .el-alert__description {
color: #ffffff !important;
}
.el-select-dropdown {
left: 20px !important;
right: 20px !important;
}
.sel {
width: 100%;
}
.el-alert__closebtn {
color: #f3cd46 !important;
font-weight: 900 !important;
}
.el-result__title {
font-weight: 900 !important;
}
.el-result__extra {
width: 100% !important;
}
.inspect_max {
padding: 0;
}
.inspect_list {
padding: 5px 0;
}
.inspect_for {
padding: 10px 0;
font-size: 13px;
}
.inspect_for_bgd {
background: #d3e0ed;
padding: 0 15px;
border-radius: 5px 5px 0 0;
}
.inspect_list_title {
border-bottom: 1px solid #323b86;
height: 40px;
display: flex;
justify-content: space-between;
align-items: center;
font-weight: 900;
}
.inspect_list_title_label {
display: flex;
align-items: center;
width: calc(100% - 75px);
}
.inspect_list_title_width {
width: 100%;
}
.inspect_list_title_number {
width: 40px;
height: 40px;
border-bottom: 1px solid #000000;
text-align: center;
line-height: 40px;
color: #000000;
}
.inspect_list_title_text {
width: calc(100% - 40px);
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.module_title_flex {
display: flex;
align-items: center;
justify-content: space-between;
}
.module_title {
height: 20px;
line-height: 20px;
padding-left: 20px;
background: url("https://szgcwx.jhncidg.com/staticFiles/images/lw_8.png") no-repeat
left/17px;
}
.inspect_shtg {
padding: 15px 3px;
background-size: 120px 120px !important;
background: url("https://szgcwx.jhncidg.com/staticFiles/images/shtg.png") no-repeat top
40px right;
}
.inspect_shz {
padding: 15px 3px;
background-size: 120px 120px !important;
background: url("https://szgcwx.jhncidg.com/staticFiles/images/shz.png") no-repeat top
40px right;
}
.inspect_shbh {
padding: 15px 3px;
background-size: 120px 120px !important;
background: url("https://szgcwx.jhncidg.com/staticFiles/images/shbh.png") no-repeat top
40px right;
}
.inspect_list_info_details {
display: flex;
align-items: center;
}
.inspect_list_info_data {
width: 100%;
}
.inspect_list_info_data_prop {
padding: 5px 0;
word-break: break-all;
}
.inspect_list_info_position {
padding-bottom: 2px;
}
.button-active {
color: #ffffff;
width: 90% !important;
background-color: #1890ff !important;
border-color: #1890ff !important;
}
.button-dis {
color: #000000;
width: 90% !important;
background-color: #e6ebf5 !important;
border-color: #e6ebf5 !important;
}
.block {
border-radius: 5px;
}
.el-timeline {
padding-left: 5px !important;
}
.el-timeline-item__wrapper {
padding-left: 15px !important;
}
.el-timeline-item__content {
font-weight: 900;
}
.el-card {
border: 0px !important;
background-color: #d3e0ed !important;
}
.el-card__body {
border: 0px !important;
padding: 0px !important;
padding-right: 10px !important;
font-weight: 500 !important;
}
.el-image {
margin-right: 6px !important;
}
</style>