公寓端pc前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1001 lines
27 KiB

<template>
<div class="app-container home">
<el-row :gutter="20">
<!-- 左侧 -->
<el-col :span="16"
><div class="grid-content-l el-mb-5">
<div class="el-flex el-mb-4">
<div
class="el-flex el-flex-center el-flex-y-center bt-l"
:class="{ active: activeTab === 'talent' }"
@click="setActive('talent')"
>
查人才
</div>
<div
class="el-flex el-flex-center el-flex-y-center el-ml-6 bt-r"
:class="{ active: activeTab === 'house' }"
@click="setActive('house')"
>
查房屋
</div>
</div>
<!-- 人才显示 -->
<div class="el-flex" v-if="activeTab === 'talent'">
<el-input
placeholder="  输入姓名/联系电话/证件号查询"
v-model="input2"
>
</el-input>
<el-button type="primary">查询</el-button>
</div>
<!-- 房屋显示 -->
<div class="el-flex" v-if="activeTab === 'house'">
<el-input
placeholder="   输入小区名称/楼栋/房间号查询"
v-model="input2"
>
</el-input>
<el-button type="primary">查询</el-button>
</div>
</div>
<!-- 工作台 -->
<div class="work-content">
<CommonTitle>工作台</CommonTitle>
<el-row :gutter="10" class="el-mt-5 colItem">
<el-col
v-for="(item, index) in workbenchItems"
:key="index"
:span="5"
><div
class="el-flex el-flex-center el-flex-y-center single"
:style="{ backgroundColor: item.color }"
@click="handleClick(item.url, item.id)"
>
<el-image
style="width: 21px; margin-right: 8px"
:src="item.icon"
></el-image>
{{ item.label }}
<span v-if="item.count > 0" class="badge">
{{ item.count }}
</span>
</div></el-col
>
</el-row>
<div style="display: none">
<el-card class="el-flex box-card" shadow="always">
<div class="card-cont">
<el-row
:gutter="10"
wrap="no-wrap"
v-for="item in 2"
:key="item"
class="el-mt-3"
>
<!-- 入住办理 -->
<el-col :span="2.5">
<div class="clearfix">入住办理:</div>
</el-col>
<!-- 房间信息 -->
<el-col :span="5.5">
<div class="label">5号楼-1单元-805-南卧1</div>
</el-col>
<!-- 姓名信息 -->
<el-col :span="2">
<div class="info">张三四</div>
</el-col>
<!-- 性别信息 -->
<el-col :span="1">
<div class="sex">男</div>
</el-col>
<!-- 电话信息 -->
<el-col :span="2.5">
<div class="phone">187*****8989</div>
</el-col>
<!-- 身份证信息 -->
<el-col :span="3.5">
<div class="id">37*************12</div>
</el-col>
<!-- 状态信息 -->
<el-col :span="3">
<div class="status">等待签订电子合同</div>
</el-col>
<!-- 继续办理操作 -->
<el-col :span="4">
<div class="el-flex el-flex-center el-flex-y-center menu">
继续办理<el-image
style="width: 20px; height: 20px; margin-left: 8px"
:src="rightIcon"
></el-image>
</div>
</el-col>
</el-row>
</div>
</el-card>
</div>
</div>
<!-- 实际统计、月度趋势 -->
<div class="data-content">
<CommonTitle>实际统计/月度趋势</CommonTitle>
<el-row
type="flex"
justify="space-between"
:gutter="20"
class="el-mt-5"
>
<el-col :span="5" v-for="(item, index) in statistics" :key="index">
<div
class="el-flex el-flex-center el-flex-y-center statistic-item"
:style="{ backgroundColor: item.color }"
>
<el-image style="height: 23px" :src="item.icon"></el-image>
<div
class="el-flex el-flex-column el-flex-center el-flex-y-center info"
>
<div class="num" :style="{ color: item.fontcolor }">158</div>
<div class="tit">{{ item.label }}</div>
</div>
<div>{{ item.unit }}</div>
</div>
</el-col>
</el-row>
<div
id="mycharts"
ref="chart"
style="height: 320px; margin-top: 20px"
></div>
</div>
</el-col>
<!-- 右侧 -->
<el-col :span="8"
><div class="grid-content-r">
<!-- 消息提醒 -->
<div class="message-content">
<CommonTitle :showMore="isShowMore">消息提醒</CommonTitle>
<div class="el-mt-4" v-for="item in 4">
<div class="time">2024-09-24 11:29:31</div>
<div class="mess-cont el-flex el-flex-space-between">
<div class="mess-info">您有一条退房提醒</div>
<!-- 未读 -->
<el-tag type="danger">未读</el-tag>
</div>
<el-divider></el-divider>
</div>
</div>
<!-- 入住评价排行 -->
<div class="evaluation-content">
<CommonTitle>入住评价排行</CommonTitle>
<div>
<div
class="eva-item el-mt-5"
v-for="(item, index) in evaluationList"
:key="index"
>
<div class="el-flex">
<div class="rank-circle" :class="`rank-${index + 1}`">
{{ index + 1 }}
</div>
<div class="eva-tit">{{ item.title }}</div>
</div>
<div class="eva-info el-flex el-flex-space-around el-mt-2">
<div>
入住人次 <span>{{ item.checkInCount }}</span>
</div>
<div>
非常满意 <span>{{ item.verySatisfied }}</span>
</div>
<div>
满意 <span>{{ item.satisfied }}</span>
</div>
<div>
不满意 <span>{{ item.unsatisfied }}</span>
</div>
</div>
<el-divider v-if="index === 1 || index > 1"></el-divider>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
<!-- 入住预约弹框 -->
<el-dialog
:title="'入住预约'"
:visible.sync="reservationVisible"
v-if="reservationVisible"
width="1000px"
top="5vh"
append-to-body
>
<CommonReminder @close="reservationVisible = !reservationVisible" />
</el-dialog>
<!-- 退房提醒弹框 -->
<el-dialog
:title="'退房提醒'"
:visible.sync="visible"
v-if="visible"
width="1000px"
top="5vh"
append-to-body
>
<CheckOutDialog @close="visible = !visible" />
</el-dialog>
<!-- 延租提醒弹框 -->
<el-dialog
:title="'延租提醒'"
:visible.sync="renewalVisible"
v-if="renewalVisible"
width="1000px"
top="5vh"
append-to-body
>
<RenewalDialog @close="renewalVisible = !renewalVisible;openRenew=true " />
</el-dialog>
<!-- 续期办理弹框 -->
<el-dialog title="续期办理" :visible.sync="openRenew" width="55%">
<el-form :model="renewForm" ref="renewForm" label-width="100px">
<el-row :gutter="20">
<el-col :span="8" class="mb-10"
>姓名{{ renewInfo.graduateName }}</el-col
>
<el-col :span="8" class="mb-10"
>性别:{{ renewInfo.gender == 1 ? "男" : "女" }}</el-col
>
<el-col :span="8" class="mb-10"
>手机号:{{ renewInfo.telephone }}</el-col
>
<el-col :span="8" class="mb-10"
>身份证:{{ renewInfo.idCard }}</el-col
>
<el-col :span="8" class="mb-10"
>当前入住房间:{{ renewInfo.renewalRoom }}</el-col
>
<el-col :span="24">
<div class="line"></div>
</el-col>
<el-col :span="8" class="mb-10"
>申请续期时间{{ renewInfo.renewalApplyTime }}</el-col
>
<el-col :span="8" class="mb-10"
>申请续期至{{ renewInfo.renewalEndDate }}</el-col
>
<el-col :span="8" class="mb-10"
>工作状态{{
renewInfo.employState === "0"
? "求职中"
: renewInfo.employState === "1"
? "已就业"
: renewInfo.employState === "2"
? "已创业"
: "未知"
}}</el-col
>
<el-col :span="8" class="mb-10"
>续期房间{{ renewInfo.renewalRoom }}</el-col
>
<el-col :span="16" class="mb-10">
签订续期合同
<span
:class="{
'waiting-sign': renewInfo.employState == '1',
signed: renewInfo.employState != '1',
}"
>
{{
renewInfo.employState == "1"
? "等待签订(需毕业生从微信小程序短确认签订)"
: "已签订"
}}
</span>
</el-col>
<!-- 备注说明 -->
<el-col :span="24" class="mb-10">
<el-form-item label="备注说明" prop="remark">
<el-input
type="textarea"
v-model="renewForm.remark"
placeholder="请输入备注说明"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="8" class="mb-10"></el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleRenewSubmit">确 定</el-button>
</span>
</el-dialog>
<!-- 释放房源提醒弹框 -->
<el-dialog
:title="'释放房源提醒'"
:visible.sync="releaseVisible"
v-if="releaseVisible"
width="1000px"
top="5vh"
append-to-body
>
<ReleaseRoomDia
ref="releaseRoomDia"
@close="releaseVisible = !releaseVisible"
@update-count="updateWorkbenchCount"
/>
</el-dialog>
</div>
</template>
<script>
import {
listWaitingReleaseRooms,
listCheckoutAlert,
} from "@/api/residence/checkout";
import { checkInReservation } from "@/api/recs";
import { listRenewRec } from "@/api/mz/rec";
import * as Echarts from "echarts";
import CommonTitle from "./components/CommonTitle.vue";
import CommonReminder from "./components/CommonReminder.vue";
import CheckOutDialog from "./components/CheckOutDialog.vue";
import ReleaseRoomDia from "./components/ReleaseRoomDia.vue";
import RenewalDialog from "./components/RenewalDialog.vue";
export default {
name: "Index",
components: {
CommonTitle,
CommonReminder,
CheckOutDialog,
ReleaseRoomDia,
RenewalDialog,
},
data() {
return {
input2: "",
// 记录当前激活的标签
activeTab: "talent",
// 工作台数据
workbenchItems: [
{
id: 1,
label: "入住办理",
icon: require("../assets/images/fa-university.png"),
color: "#FBD5D5",
url: "/residence/check_in",
},
{
id: 2,
label: "退房办理",
icon: require("../assets/images/credit-card.png"),
color: "#c2e2f9",
url: "/residence/check_out",
},
{
id: 3,
label: "预约记录",
icon: require("../assets/images/fa5-address-card-fas.png"),
color: "#FBEDC8",
},
// {
// label: "看房预约",
// icon: require("../assets/images/antFill-phone.png"),
// color: "#eceeed",
// },
{
id: 4,
label: "退房提醒",
icon: require("../assets/images/fas fa-sign-out-alt.png"),
color: "#FDDDF1",
},
{
id: 5,
label: "延租提醒",
icon: require("../assets/images/fa-history.png"),
color: "#FBEDC8",
count: "",
},
{
id: 6,
label: "释放房源提醒",
icon: require("../assets/images/home.png"),
color: "#D2F9E2",
count: 0,
},
{
id: 7,
label: "水电预警",
icon: require("../assets/images/iconPark-water.png"),
color: "#FDE7ED ",
count: 0,
},
// 居住率预警
{
id: 8,
label: "居住率预警",
icon: require("../assets/images/fas fa-exclamation.png"),
color: "#FBEDC8",
count: 0,
},
{
id: 9,
label: "报修",
icon: require("../assets/images/fas fa-cut.png"),
color: "#FBEDC8",
},
{
id: 10,
label: "报事",
icon: require("../assets/images/fa-envelope-square.png"),
color: "#CFFFDC",
count: 0,
},
],
rightIcon: require("../assets/images/circle-right.png"),
statistics: [
{
icon: require("../assets/images/antOutline-home.png"),
count: 158,
label: "总房间",
unit: "间",
color: "#d3e7fd",
fontcolor: "#5D76FB ",
},
{
icon: require("../assets/images/pin-user.png"),
count: 100,
label: "已入住房间",
color: "#d2f9e2",
unit: "间",
fontcolor: "#19BC7F",
},
{
icon: require("../assets/images/fa-clock.png"),
count: 50,
label: "空闲房间",
color: "#fde7ed",
unit: "间",
fontcolor: "#F25656 ",
},
{
icon: require("../assets/images/mb-users.png"),
count: 8,
label: "入住人次",
color: "#f7f7ca",
unit: "间",
fontcolor: "#D7980D ",
},
],
isShowMore: true, //控制更多内容显示隐藏的状态
evaluationList: [
{
title: "国信上月云邸 1201",
checkInCount: 50,
verySatisfied: 30,
satisfied: 14,
unsatisfied: 16,
},
{
title: "国信上月云邸 1202",
checkInCount: 40,
verySatisfied: 25,
satisfied: 10,
unsatisfied: 25,
},
{
title: "国信上月云邸 1203",
checkInCount: 30,
verySatisfied: 20,
satisfied: 8,
unsatisfied: 22,
},
{
title: "国信上月云邸 1204",
checkInCount: 25,
verySatisfied: 15,
satisfied: 5,
unsatisfied: 20,
},
{
title: "国信上月云邸 1205",
checkInCount: 20,
verySatisfied: 12,
satisfied: 4,
unsatisfied: 16,
},
],
visible: false,
queryParams: {
pageNum: 1,
pageSize: 10,
},
tableData: [],
total: 3,
// 遮罩层
reservationVisible: false,
// 入住预约数据
reservationTableData: [],
checkOutActions: [
{
label: "释放房源",
type: "primary",
condition: (row) => row.status === "办理完成",
},
{
label: "继续办理",
type: "primary",
condition: (row) => row.status === "办理中",
},
{
label: "退房办理",
type: "primary",
condition: (row) =>
row.status === "待办理" || row.status === "已超期",
},
],
// 释放房源列表
releaseTableData: [],
releaseVisible: false,
renewalVisible: false, // 延租提醒
openRenew: false, // 续期办理弹框
renewForm: {
renewalId: "", // 续期ID
remark: "", // 备注说明
},
renewInfo: {},
};
},
mounted() {
this.setEcharts();
this.$nextTick(() => {
console.log("this.$refs.releaseRoomDia", this.$refs.releaseRoomDia);
if (this.$refs.releaseRoomDia) {
this.$refs.releaseRoomDia.getList();
}
});
},
created() {
this.getlistWaitingReleaseRooms();
this.getReservationList();
this.getCheckoutAlertList();
this.getRenewRecList();
},
methods: {
goTarget(href) {
window.open(href, "_blank");
},
// 跳转
handleClick(url, id) {
console.log(url);
if (url) {
this.$router.push(url);
}
if (id === 4) {
this.visible = !this.visible;
}
if (id === 3) {
this.reservationVisible = !this.reservationVisible;
}
if (id === 6) {
this.releaseVisible = !this.releaseVisible;
}
if (id === 5) {
this.renewalVisible = !this.renewalVisible;
}
},
// 设置当前激活的标签
setActive(tab) {
console.log(tab);
this.activeTab = tab;
},
setEcharts() {
// 生成从 2024-02 到最近月份的数据
const startYear = 2024;
const startMonth = 5;
const currentDate = new Date();
const currentYear = currentDate.getFullYear();
const currentMonth = currentDate.getMonth() + 1;
const xAxisData = [];
for (let year = startYear; year <= currentYear; year++) {
let monthStart = year === startYear ? startMonth : 1;
let monthEnd = year === currentYear ? currentMonth : 12;
for (let month = monthStart; month <= monthEnd; month++) {
xAxisData.push(`${year}-${month.toString().padStart(2, "0")}`);
}
}
let myChart = Echarts.init(document.getElementById("mycharts"));
let option = {
title: {
text: "",
},
tooltip: {
trigger: "axis",
},
legend: {
data: ["选房", "看房", "入住", "退住"],
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true,
},
toolbox: {
feature: {
saveAsImage: {
show: false,
},
},
},
xAxis: {
type: "category",
boundaryGap: false,
data: xAxisData,
},
yAxis: {
type: "value",
},
series: [
{
name: "选房",
type: "line",
stack: "Total",
data: [120, 132, 101, 134, 90, 230, 210],
// symbol: "circle",
// symbolSize: 10,
},
{
name: "看房",
type: "line",
stack: "Total",
data: [220, 182, 191, 234, 290, 330, 310],
// symbol: "rect",
// symbolSize: 10,
},
{
name: "入住",
type: "line",
stack: "Total",
data: [150, 232, 201, 154, 190, 330, 410],
// symbol: "triangle",
// symbolSize: 10,
},
{
name: "退住",
type: "line",
stack: "Total",
data: [
320, 332, 301, 334, 390, 330, 320, 320, 332, 301, 334, 390, 330,
320,
],
// symbol: "roundRect",
// symbolSize: 10,
},
],
};
myChart.setOption(option);
myChart.resize();
},
handleReservationQuery() {
// 处理入住预约搜索逻辑
},
handleReservationAction(action, row) {
// 处理入住预约操作逻辑
},
handleQuery() {
// 处理退房提醒搜索逻辑
},
handleEdit(action, row) {
// 处理退房提醒操作逻辑
console.log(action, row);
if (action.label === "释放房源") {
this.$confirm(
"请先确认房间已经完成清洁、维修、达到入住标准方可进行释放房源。",
"提示",
{
confirmButtonText: "确定释放",
cancelButtonText: "暂不释放",
type: "warning",
}
)
.then(() => {
// 用户点击确定释放按钮后执行的逻辑
console.log("用户确认释放房源");
// 这里可以添加实际释放房源的 API 调用代码
})
.catch(() => {
// 用户点击暂不释放按钮后执行的逻辑
console.log("用户取消释放房源");
});
}
},
updateWorkbenchCount(count) {
const releaseItem = this.workbenchItems.find((item) => item.id === 6);
if (releaseItem) {
releaseItem.count = count;
}
},
async getCheckoutAlertList() {
try {
const response = await listCheckoutAlert(this.queryParams);
if (response.code === 200) {
this.workbenchItems = this.workbenchItems.map((item) => {
if (item.id === 4) {
return {
...item,
count: response.total,
};
}
return item;
});
}
} catch (error) {}
},
// 延租提醒
async getRenewRecList() {
const response = await listRenewRec(this.queryParams);
if (response.code === 200) {
this.workbenchItems = this.workbenchItems.map((item) => {
if (item.id === 5) {
return {
...item,
count: response.total,
};
}
return item;
});
}
},
// 释放房源列表
async getlistWaitingReleaseRooms() {
console.log("zhixing");
const response = await listWaitingReleaseRooms(this.queryParams);
if (response.code === 200) {
this.workbenchItems = this.workbenchItems.map((item) => {
if (item.id === 6) {
return {
...item,
count: response.total,
};
}
return item;
});
}
},
// 入住预约列表
async getReservationList() {
const response = await checkInReservation(this.reservationQueryParams);
if (response.code === 200) {
this.workbenchItems = this.workbenchItems.map((item) => {
if (item.id === 3) {
return {
...item,
count: response.total,
};
}
return item;
});
}
},
},
};
</script>
<style scoped lang="scss">
.home {
background-color: #f7f7f7;
.grid-content-l {
background-color: #fff;
padding: 20px 20px;
}
.bt-l {
width: 104px;
height: 40px;
cursor: pointer;
}
.bt-r {
width: 104px;
height: 40px;
cursor: pointer;
// margin-left: 30px;
}
.active {
background-color: rgba(12, 94, 232, 1);
color: rgba(255, 255, 255, 1);
font-size: 16px;
position: relative;
&::after {
content: "";
position: absolute;
left: 50%;
bottom: -10px; // 调整下三角位置
transform: translateX(-50%);
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid rgba(12, 94, 232, 1); // 下三角颜色
}
}
.work-content {
background-color: #fff;
padding: 10px 14px;
.single {
height: 70px;
position: relative;
padding: 10px;
cursor: pointer;
margin-bottom: 20px;
white-space: nowrap;
}
.badge {
position: absolute;
top: -8px;
right: -8px;
background-color: red;
color: white;
border-radius: 50%;
width: 24px;
height: 24px;
font-size: 16px;
display: flex;
justify-content: center;
align-items: center;
}
::v-deep .el-card__body {
padding: 14px 20px;
width: 100%;
}
.box-card {
margin: 2% 0;
border: 1px solid #e0e0e0;
border-radius: 4px;
-radius: 4px;
background-color: #e1fff4;
// box-shadow: 0 2px 4px rgba(0, 0, 0, 0, 0.1);
}
.card-cont {
width: 100%;
position: relative;
&::after {
content: "";
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
width: 4px; // 小竖条宽度
height: 100%; // 小竖条高度
background-color: #9df7d6; // 小竖条颜色
}
}
.clearfix {
font-weight: 600;
}
.clearfix::after {
content: "";
display: table;
clear: both;
}
.text {
div {
}
}
.label {
}
.info,
.id {
color: #909399;
}
.status {
color: #ff2e2e;
font-size: 14px;
display: flex;
flex-wrap: nowrap;
white-space: nowrap;
}
.menu {
color: #2f50ff;
}
.item {
margin-bottom: 10px;
}
}
.data-content {
background-color: #fff;
margin-top: 20px;
padding: 10px 14px;
.statistic-item {
height: 80px;
padding: 0 10px;
}
.info {
margin: 0 10px;
.num {
font-size: 26px;
margin-bottom: 4px;
}
.tit {
color: #848383;
font-size: 14px;
white-space: nowrap;
}
}
}
.grid-content-r {
// padding: 20px;
}
.message-content {
padding: 20px;
background-color: #fff;
.time {
font-size: 14px;
color: #999898;
}
.mess-info {
line-height: 40px;
}
::v-deep .el-divider--horizontal {
margin: 0 0;
margin-top: 8px;
}
}
.evaluation-content {
background-color: #fff;
padding: 20px;
margin-top: 20px;
::v-deep .el-divider--horizontal {
margin: 0 0;
margin-top: 20px;
}
.eva-info {
div {
font-size: 14px;
}
span {
color: #f25656;
font-size: 18px;
}
}
.rank-circle {
width: 20px;
height: 20px;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 12px;
margin-right: 10px;
color: white;
}
.rank-1 {
background-color: red;
}
.rank-2 {
background-color: orange;
}
.rank-3 {
background-color: gray;
}
.rank-4,
.rank-5 {
background-color: #ccc;
}
}
}
::v-deep .colItem .el-col-5 {
width: 19.766667%;
}
</style>