完成物业我看静态页面

This commit is contained in:
liangbin 2026-01-12 14:44:23 +08:00
parent ad6c327634
commit 05c1fe7cd0
12 changed files with 1382 additions and 37 deletions

View File

@ -78,22 +78,25 @@ export const constantRoutes = [
redirect: "/index",
children: [
{
path: "/enterpriseManagement",
component: () => import("@/views/Tenement/EnterpriseManagement/index.vue"),
path: "/Tenement/enterpriseManagement",
component: () =>
import("@/views/Tenement/EnterpriseManagement/index.vue"),
name: "EnterpriseManagement",
meta: { title: "单位与账号管理", icon: "table" },
},
{
path: "/newEnterprise",
path: "/Tenement/newEnterprise",
hidden: true,
component: () => import("@/views/Tenement/EnterpriseManagement/NewEnterprise.vue"),
component: () =>
import("@/views/Tenement/EnterpriseManagement/NewEnterprise.vue"),
name: "NewEnterprise",
meta: { title: "新增单位建档", breadcrumb: false },
},
{
path: "/accountManagement",
path: "/Tenement/accountManagement",
hidden: true,
component: () => import("@/views/Tenement/EnterpriseManagement/AccountManagement.vue"),
component: () =>
import("@/views/Tenement/EnterpriseManagement/AccountManagement.vue"),
name: "AccountManagement",
meta: { title: "账号管理", breadcrumb: false },
},
@ -106,33 +109,95 @@ export const constantRoutes = [
meta: { title: "移动球机管控", icon: "table" },
children: [
{
path: "/StandingBook",
component: () => import("@/views/Tenement/BallheadCamera/StandingBook.vue"),
path: "/Tenement/StandingBook",
component: () =>
import("@/views/Tenement/BallheadCamera/StandingBook.vue"),
name: "StandingBook",
meta: { title: "球机台账", icon: "table" },
},
{
path: "/HighRiskProject",
component: () => import("@/views/Tenement/BallheadCamera/HighRiskProject.vue"),
path: "/Tenement/HighRiskProject",
component: () =>
import("@/views/Tenement/BallheadCamera/HighRiskProject.vue"),
name: "HighRiskProject",
meta: { title: "高风险项目球机分配", icon: "table" },
},
{
path: "/ReturnToInventory",
component: () => import("@/views/Tenement/BallheadCamera/ReturnToInventory.vue"),
path: "/Tenement/ReturnToInventory",
component: () =>
import("@/views/Tenement/BallheadCamera/ReturnToInventory.vue"),
name: "ReturnToInventory",
meta: { title: "球机回收入库", icon: "table" },
},
{
path: "/InventoryAudit",
component: () => import("@/views/Tenement/BallheadCamera/InventoryAudit.vue"),
path: "/Tenement/InventoryAudit",
component: () =>
import("@/views/Tenement/BallheadCamera/InventoryAudit.vue"),
name: "InventoryAudit",
meta: { title: "入库审核", icon: "table" },
},
],
},
// 物业模块END
{
path: "",
component: Layout,
redirect: "/index",
children: [
{
path: "/Tenement/FinishedProject",
component: () => import("@/views/Tenement/FinishedProject/index.vue"),
name: "FinishedProject",
meta: { title: "项目完工复核管理", icon: "table" },
},
{
path: "/Tenement/FinishedProject/particulars",
component: () =>
import("@/views/Tenement/FinishedProject/particulars.vue"),
name: "FinishedProjectParticulars",
hidden: true,
meta: {
title: "项目完工复核详情",
icon: "table",
breadcrumb: false,
},
},
],
},
{
path: "/Tenement/SystemSettings",
component: Layout,
redirect: "/Tenement/SystemSettings/PropertyPermission",
meta: { title: "系统设置", icon: "table" },
children: [
{
path: "PropertyPermission",
component: () =>
import("@/views/Tenement/SystemSettings/PropertyPermission.vue"),
name: "PropertyPermission",
meta: { title: "权限配置", icon: "table" },
},
]
},
{
path: "",
component: Layout,
redirect: "/index",
children: [
{
path: "/Tenement/PropertyPersonalCenter",
component: () =>
import("@/views/Tenement/SystemSettings/PropertyPersonalCenter.vue"),
name: "PropertyPersonalCenter",
meta: { title: "个人中心", icon: "table" },
},
]
},
// 物业模块END
{
path: "/user",
component: Layout,

View File

@ -1,9 +1,6 @@
<!-- 物业模块-移动球机管控-高风险项目球机分配 -->
<template>
<div class="MainBox">
<el-form :model="queryForm" inline class="card-box mb-4">
<el-form-item label="项目名称/编号">
<el-input v-model="queryForm.projectName" placeholder="请输入项目名称"></el-input>
@ -46,7 +43,7 @@
</el-table-column>
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button size="small" type="text">分配球机</el-button>
<el-button size="small" type="text" @click="handleAssignBallhead(scope.row)">分配球机</el-button>
<el-button size="small" type="primary" link>查看详情</el-button>
</template>
</el-table-column>
@ -60,13 +57,16 @@
:total="total" layout="prev, pager, next"></el-pagination>
</div>
</div>
<!-- 分配球机弹窗 -->
<DialogBox v-if="dialogShow" ref="dialogRef" :show="dialogShow" :CloseDialog="handleCancel" />
</div>
</template>
<script setup name="Index">
import { ref, onMounted } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
import { ref } from "vue";
import DialogBox from "./components/DialogA.vue"
const dialogShow = ref(false) //
//
const queryForm = ref({
projectName: "",
@ -132,11 +132,18 @@ const pageSize = ref(5); // 每页显示条数
const total = ref(20); //
//
const handleAccountManagement = (row) => {
console.log("账号管理", row);
router.push(`/accountManagement?enterpriseName=${row.name}`);
// -
const handleAssignBallhead = (row) => {
dialogShow.value = true
}
//
const handleCancel = () => {
console.log('关闭弹窗')
dialogShow.value = false
}
</script>
<style scoped lang="scss">
.MainBox {

View File

@ -39,7 +39,7 @@
</el-table-column>
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button size="small" type="primary" link>入库审核</el-button>
<el-button size="small" type="primary" link @click="handleAudit(scope.row)">入库审核</el-button>
<el-button size="small" type="Info" link>驳回</el-button>
</template>
</el-table-column>
@ -53,12 +53,14 @@
:total="total" layout="prev, pager, next"></el-pagination>
</div>
</div>
<!-- 入库审核弹窗 -->
<DialogBox v-if="dialogShow" ref="dialogRef" :show="dialogShow" :CloseDialog="handleCancel" />
</div>
</template>
<script setup name="Index">
import { ref, onMounted } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
import { ref } from "vue";
import DialogBox from "./components/DialogC.vue";
//
const queryForm = ref({
@ -111,11 +113,21 @@ const tableData = ref([
},
]);
const dialogShow = ref(false); // -
const pageNum = ref(1); //
const pageSize = ref(5); //
const total = ref(20); //
// -
const handleAudit = (row) => {
dialogShow.value = true
}
//
const handleCancel = () => {
console.log('关闭弹窗')
dialogShow.value = false
}
</script>
<style scoped lang="scss">

View File

@ -48,7 +48,7 @@
</el-table-column>
<el-table-column label="操作" width="180">
<template #default="scope">
<el-button size="small" type="primary" link>现场回收确认</el-button>
<el-button size="small" type="primary" link @click="handleReturnToInventory(scope.row)">现场回收确认</el-button>
</template>
</el-table-column>
</el-table>
@ -61,12 +61,16 @@
:total="total" layout="prev, pager, next"></el-pagination>
</div>
</div>
<!-- 球机回收入库弹窗 -->
<DialogBox v-if="dialogShow" ref="dialogRef" :show="dialogShow" :CloseDialog="handleCancel" />
</div>
</template>
<script setup name="Index">
import { ref, onMounted } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
<script setup>
import { ref } from "vue";
import DialogBox from "./components/DialogB.vue"
//
const queryForm = ref({
@ -116,11 +120,24 @@ const tableData = ref([
},
]);
//
const dialogShow = ref(false);
const pageNum = ref(1); //
const pageSize = ref(5); //
const total = ref(20); //
// -
const handleReturnToInventory = (row) => {
dialogShow.value = true
}
//
const handleCancel = () => {
console.log('关闭弹窗')
dialogShow.value = false
}
</script>
<style scoped lang="scss">
@ -136,6 +153,7 @@ const total = ref(20); // 总记录数
align-items: center;
gap: 10px;
}
.TitleBox {
font-size: 16px;
font-weight: bold;

View File

@ -0,0 +1,162 @@
<!-- 分配球机-弹窗详情 -->
<template>
<el-dialog title="分配球机" v-model="props.show" @close="handleClose" width="900px">
<div class="Cneter-box">
<!-- 项目信息 -->
<div class="project-info">
<h3>项目信息</h3>
<el-row :gutter="20">
<el-col :span="12">
<div class="info-item">
<label>项目名称</label>
<span>地铁10号线扩建工程</span>
</div>
</el-col>
<el-col :span="12">
<div class="info-item">
<label>需分配球机数量</label>
<span>3</span>
</div>
</el-col>
</el-row>
</div>
<!-- 球机选择 -->
<div class="camera-selection">
<h3>球机选择</h3>
<el-input placeholder="按球机编号或型号搜索" class="mb-4" style="margin-bottom: 10px;" />
<el-table :data="cameraList" border height="300px">
<el-table-column type="selection" />
<el-table-column prop="number" label="球机编号" />
<el-table-column prop="model" label="型号" />
<el-table-column prop="status" label="状态">
<template #default="scope">
<el-tag :type="scope.row.status === '闲置' ? 'success' : 'warning'">
{{ scope.row.status }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="unit" label="所属单位" />
</el-table>
</div>
<!-- 分配信息 -->
<div class="allocation-info">
<h3>分配信息</h3>
<el-form :model="form" label-width="100px" label-position="top">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="分配人:">
<el-input v-model="form.assigner" placeholder="请输入分配人" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分配时间:">
<el-date-picker v-model="form.assignTime" type="datetime" placeholder="选择分配时间"
style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="配送地址:">
<el-input v-model="form.deliveryAddress" type="textarea" placeholder="请输入配送地址" :rows="3" />
</el-form-item>
</el-form>
</div>
</div>
<!-- 底部按钮 -->
<template #footer>
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="handleSubmit">确认分配</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from 'vue'
const props = defineProps({
show: {
type: Boolean,
default: false
},
CloseDialog: {
type: Function,
default: () => { }
}
})
const emit = defineEmits(['update:show'])
//
const form = ref({
assigner: '张伟',
assignTime: '2024-04-05 14:30',
deliveryAddress: '北京市朝阳区建国路88号'
})
//
const cameraList = ref([
{ number: 'BG-2024-001', model: 'Hikvision DS-2DE4A425IW-DE', status: '闲置', unit: '北京设备租赁公司' },
{ number: 'BG-2024-002', model: 'Dahua SD1A404XB-GNR', status: '闲置', unit: '北京设备租赁公司' },
{ number: 'BG-2024-003', model: 'Hikvision DS-2DE4A425IW-DE', status: '闲置', unit: '北京设备租赁公司' },
{ number: 'BG-2024-004', model: 'Dahua SD6C425X-GNR', status: '维修中', unit: '北京设备租赁公司' },
{ number: 'BG-2024-005', model: 'Hikvision DS-2DE4A425IW-DE', status: '闲置', unit: '北京设备租赁公司' }
])
const handleClose = () => {
props.CloseDialog()
}
const handleSubmit = () => {
//
console.log('提交分配信息', form.value)
props.CloseDialog()
}
</script>
<style scoped lang="scss">
.Cneter-box {
height: 600px;
padding: 10px;
box-sizing: border-box;
overflow: auto;
}
.project-info,
.camera-selection,
.allocation-info {
margin-bottom: 24px;
}
.project-info h3,
.camera-selection h3,
.allocation-info h3 {
margin-bottom: 16px;
font-size: 16px;
font-weight: bold;
}
.info-item {
margin-bottom: 12px;
}
.info-item label {
display: inline-block;
width: 120px;
font-weight: 500;
}
.delivery-address {
margin-top: 16px;
}
.delivery-address label {
display: block;
margin-bottom: 8px;
font-weight: 500;
}
</style>

View File

@ -0,0 +1,203 @@
<!-- 球机回收入库- 现场回收确认弹窗 -->
<template>
<el-dialog title="回收确认" v-model="props.show" @close="handleClose" width="900px">
<div class="Cneter-box">
<!-- 项目信息 -->
<el-form :model="form" label-width="120px" label-position="top">
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="项目名称">
<el-input v-model="form.projectName" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="球机编号/数量">
<el-input v-model="form.cameraIds" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="分配时间">
<el-input v-model="form.allocationTime" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 球机外观完整性 -->
<el-form-item label="球机外观完整性">
<el-radio-group v-model="form.appearanceStatus">
<el-radio label="完好">完好</el-radio>
<el-radio label="破损">破损</el-radio>
<el-radio label="丢失">丢失</el-radio>
</el-radio-group>
</el-form-item>
<!-- 功能测试结果 -->
<el-form-item label="功能测试结果">
<el-radio-group v-model="form.functionStatus">
<el-radio label="正常">正常</el-radio>
<el-radio label="异常">异常</el-radio>
</el-radio-group>
</el-form-item>
<!-- 回收人信息 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="回收人">
<el-input v-model="form.recycler" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="回收时间">
<el-date-picker v-model="form.recycleTime" type="datetime" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<!-- 回收照片 -->
<el-form-item label="回收照片">
<div class="upload-area">
<p>点击上传或拖拽图片到此处</p>
<p>支持JPG/PNG格式至少上传1张</p>
</div>
<div class="photo-grid">
<div class="photo-item" v-for="(photo, index) in form.photos" :key="index">
<img :src="photo" alt="回收照片" />
</div>
</div>
</el-form-item>
<!-- 备注 -->
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" :rows="3" placeholder="如选择'破损'或'丢失',请在此说明原因" />
</el-form-item>
</el-form>
</div>
<!-- 底部按钮 -->
<template #footer>
<el-button @click="handleClose">返回</el-button>
<el-button type="primary" @click="handleSubmit">确认回收</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from 'vue'
const props = defineProps({
show: {
type: Boolean,
default: false
},
CloseDialog: {
type: Function,
default: () => { }
}
})
const emit = defineEmits(['update:show'])
//
const form = ref({
assigner: '张伟',
assignTime: '2024-04-05 14:30',
deliveryAddress: '北京市朝阳区建国路88号'
})
//
const cameraList = ref([
{ number: 'BG-2024-001', model: 'Hikvision DS-2DE4A425IW-DE', status: '闲置', unit: '北京设备租赁公司' },
{ number: 'BG-2024-002', model: 'Dahua SD1A404XB-GNR', status: '闲置', unit: '北京设备租赁公司' },
{ number: 'BG-2024-003', model: 'Hikvision DS-2DE4A425IW-DE', status: '闲置', unit: '北京设备租赁公司' },
{ number: 'BG-2024-004', model: 'Dahua SD6C425X-GNR', status: '维修中', unit: '北京设备租赁公司' },
{ number: 'BG-2024-005', model: 'Hikvision DS-2DE4A425IW-DE', status: '闲置', unit: '北京设备租赁公司' }
])
const handleClose = () => {
props.CloseDialog()
}
const handleSubmit = () => {
//
console.log('提交分配信息', form.value)
props.CloseDialog()
}
</script>
<style scoped>
.upload-area {
width: 100%;
border: 2px dashed #d9d9d9;
border-radius: 6px;
padding: 40px;
text-align: center;
margin-bottom: 20px;
cursor: pointer;
}
.upload-area:hover {
border-color: #409eff;
}
.photo-grid {
display: flex;
gap: 20px;
flex-wrap: wrap;
}
.photo-item {
width: 200px;
height: 200px;
border: 1px solid #e6e6e6;
border-radius: 4px;
overflow: hidden;
}
.photo-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
.Cneter-box {
height: 600px;
padding: 10px;
box-sizing: border-box;
overflow: auto;
}
.project-info,
.camera-selection,
.allocation-info {
margin-bottom: 24px;
}
.project-info h3,
.camera-selection h3,
.allocation-info h3 {
margin-bottom: 16px;
font-size: 16px;
font-weight: bold;
}
.info-item {
margin-bottom: 12px;
}
.info-item label {
display: inline-block;
width: 120px;
font-weight: 500;
}
.delivery-address {
margin-top: 16px;
}
.delivery-address label {
display: block;
margin-bottom: 8px;
font-weight: 500;
}
</style>

View File

@ -0,0 +1,207 @@
<!-- 入库审核-弹窗详情 -->
<template>
<el-dialog title="入库审核" v-model="props.show" @close="handleClose" width="900px">
<div class="Cneter-box">
<div class="inspection-details">
<h3>球机回收核验详情</h3>
<el-row :gutter="20">
<el-col :span="10">
<div class="camera-photo">
<img src="https://via.placeholder.com/300x200?text=Camera" alt="球机照片" />
</div>
</el-col>
<el-col :span="14">
<div class="info-list">
<div class="info-item">
<label>球机编号</label>
<span>{{ form.cameraId }}</span>
</div>
<div class="info-item">
<label>所属项目</label>
<span>{{ form.projectName }}</span>
</div>
<div class="info-item">
<label>回收人</label>
<span>{{ form.recycler }}</span>
</div>
<div class="info-item">
<label>回收时间</label>
<span>{{ form.recycleTime }}</span>
</div>
<div class="info-item">
<label>核验结果</label>
<span>{{ form.inspectionResult }}</span>
</div>
</div>
</el-col>
</el-row>
</div>
<div class="storage-info">
<h3>入库信息</h3>
<el-row :gutter="20">
<el-col :span="12">
<el-form :model="form" :rules="Frules" label-width="100px" ref="formRef">
<el-form-item label="入库仓库" required>
<el-select v-model="form.warehouse" placeholder="请选择入库仓库">
<el-option label="一号仓库" value="1" />
<el-option label="二号仓库" value="2" />
<el-option label="三号仓库" value="3" />
</el-select>
</el-form-item>
<el-form-item label="入库时间">
<el-date-picker v-model="form.storageTime" type="datetime" style="width: 100%;" />
</el-form-item>
</el-form>
</el-col>
<el-col :span="12">
<el-form :model="form" label-width="100px">
<el-form-item label="入库管理员">
<el-input v-model="form.manager" placeholder="请输入入库管理员" />
</el-form-item>
</el-form>
</el-col>
</el-row>
</div>
</div>
<!-- 底部按钮 -->
<template #footer>
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="handleSubmit">确认入库</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from 'vue'
const props = defineProps({
show: {
type: Boolean,
default: false
},
CloseDialog: {
type: Function,
default: () => { }
}
})
const form = ref({
cameraId: 'QJ20230401001',
projectName: '阳光花园小区改造项目',
recycler: '李建国',
recycleTime: '2023-04-15 14:30:22',
inspectionResult: '外观完好,功能正常',
warehouse: '1',
storageTime: '2023-04-18 10:30:00',
manager: '张伟'
})
const Frules = ref({
warehouse: [{ required: true, message: '请选择入库仓库', trigger: 'blur' }],
})
const handleClose = () => {
props.CloseDialog()
}
const handleSubmit = () => {
//
console.log('提交分配信息', form.value)
props.CloseDialog()
}
</script>
<style scoped>
.inspection-details,
.storage-info {
margin-bottom: 24px;
}
.inspection-details h3,
.storage-info h3 {
margin-bottom: 16px;
font-size: 16px;
font-weight: bold;
}
.camera-photo {
text-align: center;
padding: 20px;
border: 1px solid #e6e6e6;
border-radius: 4px;
}
.camera-photo img {
max-width: 100%;
height: auto;
border-radius: 4px;
}
.info-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.info-item {
display: flex;
align-items: center;
padding: 8px 0;
}
.info-item label {
width: 100px;
font-weight: 500;
color: #606266;
}
.info-item span {
flex: 1;
color: #303133;
margin-left: 12px;
}
.Cneter-box {
height: 600px;
padding: 10px;
box-sizing: border-box;
overflow: auto;
}
.project-info,
.camera-selection,
.allocation-info {
margin-bottom: 24px;
}
.project-info h3,
.camera-selection h3,
.allocation-info h3 {
margin-bottom: 16px;
font-size: 16px;
font-weight: bold;
}
.info-item {
margin-bottom: 12px;
}
.info-item label {
display: inline-block;
width: 120px;
font-weight: 500;
}
.delivery-address {
margin-top: 16px;
}
.delivery-address label {
display: block;
margin-bottom: 8px;
font-weight: 500;
}
</style>

View File

@ -126,12 +126,12 @@ const total = ref(20); // 总记录数
//
const handleAddEnterprise = () => {
console.log("新增单位建档",router);
router.push(`/newEnterprise?enterpriseType=${activeTab.value}`);
router.push(`/Tenement/newEnterprise?enterpriseType=${activeTab.value}`);
}
//
const handleAccountManagement = (row) => {
console.log("账号管理", row);
router.push(`/accountManagement?enterpriseName=${row.name}`);
router.push(`/Tenement/accountManagement?enterpriseName=${row.name}`);
}
</script>
<style scoped lang="scss">

View File

@ -0,0 +1,199 @@
<!-- 物业模块-项目完工复核管理-列表 -->
<template>
<div class="MainBox">
<el-form :model="queryForm" inline class="card-box mb-4">
<el-form-item label="项目名称或编号">
<el-input v-model="queryForm.projectName" placeholder="请输入项目名称或编号"></el-input>
</el-form-item>
<el-form-item label="施工单位">
<el-input v-model="queryForm.constructionUnit" placeholder="请输入施工单位"></el-input>
</el-form-item>
<el-form-item label="复核状态">
<el-select v-model="queryForm.reviewStatus" placeholder="全部">
<el-option label="全部" value=""></el-option>
<el-option v-for="item in StatusList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button size="default">重置</el-button>
<el-button type="primary" size="default">查询</el-button>
</el-form-item>
</el-form>
<div class="card-box">
<el-table :data="tableData" class="mt-2">
<el-table-column prop="projectName" label="项目名称"></el-table-column>
<el-table-column prop="constructionUnit" label="施工单位"></el-table-column>
<el-table-column prop="workLocation" label="作业地点"></el-table-column>
<el-table-column prop="supervisorReviewStatus" label="监理复核状态">
<template #default="scope">
<el-tag :type="scope.row.supervisorReviewStatus == '已完成' ? 'success' : 'warning'">
{{ scope.row.supervisorReviewStatus }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="ballheadStatus" label="球机状态">
<template #default="scope">
<el-tag :type="scope.row.ballheadStatus == '已入库' ? 'success' : 'warning'">
{{ scope.row.ballheadStatus }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="reviewStatus" label="复核状态">
<template #default="scope">
<el-tag :type="scope.row.reviewStatus == '已完成复核' ? 'success' : 'warning'">
{{ scope.row.reviewStatus }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="260">
<template #default="scope">
<el-button size="small" type="primary" link @click="handleReview(scope.row)">现场复核施工结果</el-button>
<el-button size="small" type="primary" link>查看复核详情</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination-container">
<span class="total-count">显示第 {{ (pageNum - 1) * pageSize + 1 }} {{ pageNum * pageSize }} 条记录 {{
total }}
</span>
<el-pagination v-model:current-page="pageNum" v-model:page-size="pageSize" :page-sizes="[5, 10, 20]"
:total="total" layout="prev, pager, next"></el-pagination>
</div>
</div>
</div>
</template>
<script setup name="Index">
import { ref } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
//
const queryForm = ref({
projectName: "",
constructionUnit: "",
reviewStatus: ""
});
//
const StatusList = ref([
{
label: "待现场复核",
value: "0"
},
{
label: "待球机入库",
value: "1"
},
{
label: "已完成复核",
value: "2"
},
]);
//
const tableData = ref([
{
id: 1,
projectName: "项目1",
constructionUnit: "施工单位1",
workLocation: "作业地点1",
supervisorReviewStatus: "已完成",
ballheadStatus: "已入库",
reviewStatus: "已完成复核",
submitEndTime: "2023-08-01 10:00:00"
},
{
id: 2,
projectName: "项目2",
constructionUnit: "施工单位2",
workLocation: "作业地点2",
supervisorReviewStatus: "待完成",
ballheadStatus: "待入库",
reviewStatus: "待复核",
submitEndTime: "2023-08-02 10:00:00",
returnStatus: "待回收"
},
{
id: 3,
projectName: "项目3",
constructionUnit: "施工单位3",
workLocation: "作业地点3",
supervisorReviewStatus: "待完成",
ballheadStatus: "待入库",
reviewStatus: "待复核",
submitEndTime: "2023-08-03 10:00:00",
returnStatus: "已回收待入库"
},
]);
const pageNum = ref(1); //
const pageSize = ref(5); //
const total = ref(20); //
// -
const handleReview = (row) => {
router.push({
path: "/Tenement/FinishedProject/particulars",
query: {
id: row.id
}
})
}
</script>
<style scoped lang="scss">
.MainBox {
padding: 20px;
height: 100%;
background: #F9FAFB;
}
.FlexBox {
display: flex;
justify-content: flex-start;
align-items: center;
gap: 10px;
}
.TitleBox {
font-size: 16px;
font-weight: bold;
color: #303133;
}
.mt-2 {
margin-top: 20px;
}
.card-box {
background: #fff;
padding: 16px;
border-radius: 4px;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.pagination-container {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 16px;
}
.total-count {
color: #606266;
}
</style>

View File

@ -0,0 +1,187 @@
<!-- 物业模块-项目完工复核管理-列表 -->
<template>
<div class="MainBox">
<!-- 施工结果复核 -->
<div class="card-box">
<h3>施工结果复核</h3>
<el-form :model="form" label-width="120px">
<!-- 作业内容完成度 -->
<el-form-item label="作业内容完成度">
<el-radio-group v-model="form.completionStatus">
<el-radio label="100%完成">100%完成</el-radio>
<el-radio label="部分完成">部分完成</el-radio>
<el-radio label="未完成">未完成</el-radio>
</el-radio-group>
</el-form-item>
<!-- 现场清理情况 -->
<el-form-item label="现场清理情况">
<el-radio-group v-model="form.cleanupStatus">
<el-radio label="符合要求">符合要求</el-radio>
<el-radio label="不符合">不符合</el-radio>
</el-radio-group>
</el-form-item>
<!-- 现场复核照片 -->
<el-form-item label="现场复核照片至少上传3张">
<div class="photo-upload">
<div class="photo-item" v-for="(photo, index) in form.photos" :key="index">
<img :src="photo" alt="复核照片" />
</div>
<div class="upload-btn">
<el-icon class="upload-icon">
<Plus />
</el-icon>
</div>
</div>
</el-form-item>
<!-- 复核意见 -->
<el-form-item label="复核意见">
<el-input v-model="form.comment" type="textarea" :rows="4"
placeholder="请输入复核意见,若选择'部分完成'或'未完成'需说明原因" />
</el-form-item>
</el-form>
</div>
<!-- 球机状态核验 -->
<div class="card-box">
<h3>球机状态核验</h3>
<el-row :gutter="20">
<el-col :span="8">
<div class="status-item">
<label>球机编号</label>
<span>CAM-2023-0456</span>
</div>
</el-col>
<el-col :span="8">
<div class="status-item">
<label>回收状态</label>
<span class="status-success">已回收</span>
</div>
</el-col>
<el-col :span="8">
<div class="status-item">
<label>入库状态</label>
<span class="status-warning">未入库</span>
<p class="status-desc">未入库需完成入库后再完成项目审核</p>
</div>
</el-col>
</el-row>
</div>
<!-- 按钮 -->
<div class="card-box btn-box">
<el-button type="primary" plain @click="router.back()">返回</el-button>
<el-button type="danger" plain @click="handleReject">驳回复核</el-button>
<el-button type="primary" @click="handleSubmit">提交复核结果</el-button>
</div>
</div>
</template>
<script setup name="Index">
import { ref } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
const form = ref({
completionStatus: '100%完成',
cleanupStatus: '符合要求',
photos: [],
comment: ''
})
</script>
<style scoped lang="scss">
.MainBox {
padding: 20px;
height: 100%;
background: #F9FAFB;
}
.btn-box {
display: flex;
justify-content: flex-end;
}
.card-box {
background: #fff;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.card-box h3 {
margin-bottom: 20px;
font-size: 16px;
font-weight: bold;
}
.photo-upload {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.photo-item {
width: 200px;
height: 150px;
border: 1px solid #e6e6e6;
border-radius: 4px;
overflow: hidden;
}
.photo-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
.upload-btn {
width: 200px;
height: 150px;
border: 2px dashed #d9d9d9;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.status-item {
padding: 16px;
border-radius: 4px;
height: 100%;
}
.status-item label {
display: block;
margin-bottom: 8px;
font-weight: 500;
color: #606266;
}
.status-item span {
display: block;
font-size: 16px;
font-weight: bold;
}
.status-success {
color: #67c23a;
}
.status-warning {
color: #e6a23c;
}
.status-desc {
margin-top: 8px;
font-size: 12px;
color: #f56c6c;
margin-bottom: 0;
}
</style>

View File

@ -0,0 +1,103 @@
<!-- 物业模块-系统设置-权限配置 -->
<template>
<div class="MainBox">
<!-- 角色选择 -->
<div class="card-box">
<el-form :model="form" label-width="120px">
<el-form-item label="请选择角色" required>
<el-select v-model="form.role" placeholder="请选择角色" style="width: 200px;">
<el-option label="管理员" value="admin" />
<el-option label="操作员" value="operator" />
<el-option label="查看员" value="viewer" />
</el-select>
</el-form-item>
</el-form>
</div>
<!-- 权限设置 -->
<div class="card-box">
<el-table :data="permissionList" border>
<el-table-column prop="moduleName" label="模块名称" align="center" />
<el-table-column prop="view" label="查看权限" align="center">
<template #default="scope">
<el-checkbox v-model="scope.row.view" />
</template>
</el-table-column>
<el-table-column prop="edit" label="编辑权限" align="center">
<template #default="scope">
<el-checkbox v-model="scope.row.edit" />
</template>
</el-table-column>
<el-table-column prop="audit" label="审核权限" align="center">
<template #default="scope">
<el-checkbox v-model="scope.row.audit" />
</template>
</el-table-column>
</el-table>
<div class="button-group">
<el-button @click="handleReset">重置</el-button>
<el-button type="primary" @click="handleSave">保存配置</el-button>
</div>
</div>
</div>
</template>
<script setup name="Index">
import { ref } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
const form = ref({
role: ''
})
const permissionList = ref([
{ moduleName: '单位与账号管理', view: false, edit: false, audit: false },
{ moduleName: '移动球机管控', view: false, edit: false, audit: false },
{ moduleName: '项目复核管理', view: false, edit: false, audit: false },
{ moduleName: '系统设置', view: false, edit: false, audit: false }
])
const handleReset = () => {
permissionList.value.forEach(item => {
item.view = false
item.edit = false
item.audit = false
})
}
const handleSave = () => {
console.log('保存权限配置', form.value, permissionList.value)
// Add save logic here
}
</script>
<style scoped lang="scss">
.MainBox {
padding: 20px;
height: 100%;
background: #F9FAFB;
}
.FlexBox {
display: flex;
justify-content: flex-start;
align-items: center;
gap: 10px;
}
.card-box {
background: #fff;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.button-group {
display: flex;
justify-content: flex-end;
gap: 12px;
margin-top: 20px;
}
</style>

View File

@ -0,0 +1,182 @@
<!-- 物业模块-个人中心 -->
<template>
<div class="MainBox">
<!-- 个人信息 -->
<div class="card-box personal-info">
<div class="info-header">
<h3>个人信息</h3>
<el-button type="primary" @click="handleEdit">编辑信息</el-button>
</div>
<el-row :gutter="20">
<el-col :span="12">
<div class="info-item">
<label>姓名</label>
<span>张伟</span>
</div>
<div class="info-item">
<label>手机号码</label>
<span>138 0013 8000</span>
</div>
</el-col>
<el-col :span="12">
<div class="info-item">
<label>所属部门</label>
<span>物业一部</span>
</div>
<div class="info-item">
<label>电子邮箱</label>
<span>zhangwei@example.com</span>
</div>
</el-col>
</el-row>
</div>
<el-row :gutter="20">
<!-- 操作日志查询 -->
<el-col :span="12">
<div class="card-box">
<div class="log-header">
<h3>操作日志查询</h3>
<el-button type="text" @click="handleViewMore">查看更多</el-button>
</div>
<div class="log-list" style="height: 180px; overflow-y: auto;">
<div class="log-item" v-for="(log, index) in operationLogs" :key="index">
<div class="log-time">{{ log.time }}</div>
<div class="log-content">{{ log.content }}</div>
</div>
</div>
</div>
</el-col>
<!-- 密码修改 -->
<el-col :span="12">
<div class="card-box">
<h3>密码修改</h3>
<el-form :model="form" label-width="100px">
<el-form-item label="当前密码">
<el-input v-model="form.currentPassword" type="password" placeholder="请输入当前密码" />
</el-form-item>
<el-form-item label="新密码">
<el-input v-model="form.newPassword" type="password" placeholder="请输入新密码" />
</el-form-item>
<el-form-item label="确认新密码">
<el-input v-model="form.confirmPassword" type="password" placeholder="请再次输入新密码" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSavePassword" style="width: 100%;">保存更改</el-button>
</el-form-item>
</el-form>
</div>
</el-col>
</el-row>
<!-- 最近活动 -->
<div class="card-box">
<h3>最近活动</h3>
<el-table :data="recentActivities" border height="186px" >
<el-table-column prop="time" label="时间" align="center" />
<el-table-column prop="operationType" label="操作类型" align="center" />
<el-table-column prop="details" label="详情" align="center" />
<el-table-column prop="status" label="状态" align="center">
<template #default="scope">
<el-tag :type="scope.row.status === '成功' ? 'success' : 'danger'">
{{ scope.row.status }}
</el-tag>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const form = ref({
currentPassword: '',
newPassword: '',
confirmPassword: ''
})
const operationLogs = ref([
{ time: '2023-10-01 14:30', content: '创建账号: 李娜' },
{ time: '2023-10-02 09:15', content: '审核球机入库: SJ-20231002-001' },
{ time: '2023-10-03 16:45', content: '修改项目状态: PRJ-20230928-A' },
{ time: '2023-10-04 11:20', content: '删除账号: 王强' }
])
const recentActivities = ref([
{ time: '2023-10-05 08:30', operationType: '账号创建', details: '创建新账号: 陈丽', status: '成功' },
{ time: '2023-10-05 10:15', operationType: '球机分配', details: '将球机 SJ-20231005-002 分配给项目 PRJ-20231001-B', status: '成功' },
{ time: '2023-10-05 14:20', operationType: '项目审核', details: '审核项目 PRJ-20231003-C', status: '待处理' },
{ time: '2023-10-05 16:45', operationType: '设备入库', details: '新增球机设备 SJ-20231005-003', status: '成功' }
])
const handleEdit = () => {
console.log('编辑信息')
}
const handleViewMore = () => {
console.log('查看更多日志')
}
const handleSavePassword = () => {
console.log('保存密码')
}
</script>
<style scoped lang="scss">
.MainBox {
padding: 20px;
height: 100%;
overflow: hidden;
background: #F9FAFB;
}
.card-box {
background: #fff;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.personal-info .info-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.log-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.info-item {
margin-bottom: 12px;
}
.info-item label {
display: inline-block;
width: 80px;
font-weight: 500;
color: #606266;
}
.log-item {
margin-bottom: 12px;
display: flex;
justify-content: space-between;
}
.log-time {
font-weight: 500;
color: #303133;
}
.log-content {
color: #606266;
}
</style>