DESKTOP-B78GIPM\admin преди 2 години
родител
ревизия
b8da759351

+ 222 - 0
src/views/fangwu/index.vue

@@ -0,0 +1,222 @@
+<template>
+<a-card :bordered="false">
+    <a-tabs default-active-key="1" @change="callback">
+        <a-tab-pane key="1" tab="房务数据概览">
+            <div>
+                <h3>今日房务管理</h3>
+                <a-card style="width:50%;" class="card">
+                    <div class="grid-day">
+                        <div>
+                            <div>今日锁房</div>
+                            <div>0间</div>
+                        </div>
+                        <div>
+                            <div>正在维修中房间</div>
+                            <div>0间</div>
+                        </div>
+                        <div>
+                            <div>今日完成维修房间</div>
+                            <div>0间</div>
+                        </div>
+                    </div>
+                </a-card>
+            </div>
+
+            <div>
+                <h3>分派房</h3>
+                <div class="grid-assign">
+                    <a-card class="card">
+                        <div class="assign-flex">
+                            <div>今日待派房间<span>0</span>间,已经分配了<span>0</span>间,剩余<span>0</span>间</div>
+                            <div style="color:#1890FF">点击分配</div>
+                        </div>
+                        <div style="text-indent: 2em;" class="assign-content">
+                            <div v-for="(item, index) in 15" :key="index">
+                                <span style="color:#1890FF">{{'小明'}}</span>:{{'0间'}}
+                            </div>
+                        </div>
+                    </a-card>
+                    <a-card class="card">
+                        <div>
+                            <div>房务审核记录及调整</div>
+                        </div>
+                        <div class="assgin-center">0条需要审核,点击查看> </div>
+                    </a-card>
+                    <a-card class="card">
+                        <div>
+                            <div>房屋审核记录及调整</div>
+                        </div>
+                        <div class="assgin-right">
+                            <a-button>点击设置</a-button>
+                        </div>
+                    </a-card>
+                </div>
+            </div>
+
+            <div>
+                <h3>房扫记录</h3>
+                <div class="">
+                    <ClearRecords />
+                </div>
+            </div>
+
+            <div>
+                <h3>房间易耗品记录</h3>
+                <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;">
+                    <div style="display:flex;align-items:center;width:100%;">
+                        <div class="list-container">
+                            <div class="list-item" v-for="(item, index) in list" :key="index" :class="{active: activeIndex === index}" @click="handleClick(index)">
+                                {{ item }}
+                            </div>
+                        </div>
+                        <a-range-picker v-show="activeIndex==4" @change="onChange" size="large" />
+                    </div>
+
+                    <a-button style="background:#1890ff;color:#fff;">配置易耗品</a-button>
+                </div>
+                <a-card class="card">
+                    <div>
+                        客房易耗品消耗数量
+                    </div>
+                    <div>
+                        布草换洗
+                    </div>
+                </a-card>
+            </div>
+        </a-tab-pane>
+        <a-tab-pane key="2" tab="维修记录" force-render>
+            <MaintenanceRecords />
+        </a-tab-pane>
+        <a-tab-pane key="3" tab="锁房记录">
+            <LockRoomRecords />
+        </a-tab-pane>
+        <a-tab-pane key="4" tab="房扫管理">
+            <ClearRoomManagement />
+        </a-tab-pane>
+        <a-tab-pane key="5" tab="房型易耗品">
+            <HouseTypeConsumablesVue />
+        </a-tab-pane>
+    </a-tabs>
+</a-card>
+</template>
+
+<script>
+import ClearRecords from './tabList/clearRecords.vue'
+import ClearRoomManagement from './tabList/clearRoomManagement.vue'
+import HouseTypeConsumablesVue from './tabList/houseTypeConsumables.vue'
+import LockRoomRecords from './tabList/LockRoomRecords.vue'
+import MaintenanceRecords from './tabList/maintenanceRecords.vue'
+export default {
+    components: {
+        ClearRecords,
+        MaintenanceRecords,
+        LockRoomRecords,
+        ClearRoomManagement,
+        HouseTypeConsumablesVue
+    },
+    data() {
+        return {
+            list: ['今天', '昨日', '本周', '本月', '更多'],
+            activeIndex: 0,
+        }
+    },
+    methods: {
+        callback(key) {
+            console.log(key)
+        },
+        handleClick(index) {
+            this.activeIndex = index
+            this.searchQuery()
+        },
+        onChange(date, dateString) {
+            console.log(date, dateString)
+        },
+    },
+    mounted() {
+
+    }
+}
+</script>
+
+<style lang="less">
+.grid-day {
+    display: grid;
+    grid-template-columns: 1fr 1fr 1fr;
+}
+
+.grid-assign {
+    display: grid;
+    grid-template-columns: 2fr 1fr 1fr;
+    gap: 10px;
+
+    .assign-flex {
+        display: flex;
+        justify-content: space-between;
+    }
+
+    .assign-content {
+        display: flex;
+        flex-wrap: wrap;
+        margin-top: 18px;
+    }
+
+    .assgin-center {
+        color: #1890ff;
+        text-align: center;
+        margin-top: 25px;
+    }
+
+    .assgin-right {
+        text-align: center;
+        margin-top: 18px;
+
+        button {
+            background: #1890ff;
+            color: #fff;
+        }
+    }
+}
+
+.grid-clearRecords {
+    display: grid;
+    grid-template-columns: 2fr 1fr;
+    gap: 10px;
+}
+
+.list-container {
+    display: grid;
+    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
+    border: solid 1px #d9d9d9;
+    width: 300px;
+    border-radius: 5px;
+    margin-right: 10px;
+    overflow: hidden;
+}
+
+.list-item {
+    padding: 10px;
+    border-right: solid 1px #d9d9d9;
+    cursor: pointer;
+    text-align: center;
+}
+
+.list-item.active {
+    background-color: #1890ff;
+    color: #fff;
+}
+
+.card {
+    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
+    transition: 0.3s;
+    border-radius: 5px;
+    /* optional */
+}
+
+.card:hover {
+    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
+}
+
+h3 {
+    margin-top: 15px;
+}
+</style>

+ 282 - 0
src/views/fangwu/tabList/LockRoomRecords.vue

@@ -0,0 +1,282 @@
+<template>
+<a-card :bordered="false">
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+        <a-tag color="pink" v-if="buildingFloorSearchTag.name">
+            {{ buildingFloorSearchTag.name }}
+            <a-icon type="close" @click="onFliterClose" />
+        </a-tag>
+        <!-- <a-button @click="handleAdd" type="primary" icon="plus">新增房间</a-button>
+        <a-button @click="onAddBatch" type="primary" icon="tags">批量新增</a-button>
+        <a-popconfirm title="确定全部删除吗?" @confirm="delAll">
+            <a-button :disabled="delLoading" :loading="delLoading" type="primary" icon="stop">全部删除</a-button>
+        </a-popconfirm> -->
+        <j-input placeholder="房间号" v-model="queryParam.name" style="width: 200px;margin-right:8px;"></j-input>
+        <a-range-picker style="margin-right:8px;" @change="onChangeTime" />
+        <a-popconfirm v-if="selectedRowKeys.length > 0" title="确定删除吗?" @confirm="delBatch">
+            <a-button :disabled="delLoading" :loading="delLoading" icon="stop" style="">
+                批量删除</a-button>
+        </a-popconfirm>
+        <!-- <div style="display:flex;align-items:center;width:100%;">
+            <div class="list-container">
+                <div class="list-item" v-for="(item, index) in list" :key="index" :class="{active: activeIndex === index}" @click="handleClick(index)">
+                    {{ item }}
+                </div>
+            </div>
+            <a-range-picker v-show="activeIndex==4" @change="onChangeTime" size="large" />
+        </div> -->
+        <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div class="grid-clear">
+        <a-table ref="table" size="middle" :scroll="{ x: true }" bordered rowKey="id" :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading" :rowSelection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }" class="j-table-force-nowrap" @change="handleTableChange">
+
+            <template slot="layoutId" slot-scope="text, record">
+                {{ getLayoutName(record) }}
+            </template>
+            <template slot="prefix_name" slot-scope="text, record">
+                {{ (record.prefix || "") + record.name }}
+            </template>
+            <template slot="pictureSlot" slot-scope="text, record">
+                <img :src="record.cover" style="width:40px;height40px;" />
+            </template>
+            <template slot="htmlSlot" slot-scope="text">
+                <div v-html="text"></div>
+            </template>
+
+            <span slot="action" slot-scope="text, record">
+                <a @click="handleEdit(record)">编辑</a>
+
+                <a-divider type="vertical" />
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                    <a>删除</a>
+                </a-popconfirm>
+                <a-divider type="vertical" />
+                <a @click="handleImage(record)">图片</a>
+            </span>
+        </a-table>
+    </div>
+    <!-- <room-num-modal ref="modalForm" @ok="modalFormOk"></room-num-modal> -->
+    <!-- <room-imgs @saveOk="onImgSave" ref="roomimgmodal"></room-imgs> -->
+</a-card>
+</template>
+
+<script>
+import {
+    JeecgListMixin
+} from "@/mixins/JeecgListMixin";
+// import roomNumModal from "./roomNumModal.vue"; // todo roomLayoutForm 需要替换成房型的表单弹窗
+// import roomImgs from './roomImagesForm.vue'
+import {
+    getAllLayouts
+} from "@/api/roomLayout";
+import {
+    delBatch,
+    delAll
+} from '@/api/roomBuildingApi'
+let hotelInfo = JSON.parse(localStorage.getItem("storeInfo"));
+export default {
+    mixins: [JeecgListMixin],
+    components: {
+        // roomNumModal,
+        // roomImgs
+    },
+    data() {
+        return {
+            list: ['今天', '昨日', '本周', '本月', '更多'],
+            activeIndex: 0,
+            delLoading: false,
+            layouts: [],
+            queryParam: {},
+            // 分页参数
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ["10", "20", "30"],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条";
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                total: 0,
+            },
+            // 表头
+            columns: [{
+                    title: "房间号",
+                    align: "center",
+                    dataIndex: "hotelName",
+                },
+                {
+                    title: "状态",
+                    // align: "center",
+                    dataIndex: "buildName",
+                },
+                {
+                    title: "原因",
+                    // align: "center",
+                    dataIndex: "floorName",
+                }
+            ],
+            url: {
+                // list: 'org.jeecg.modules.business/busMarketMember/list',
+                list: "/rooms/cesRooms/list",
+                delete: "/rooms/cesRooms/remove",
+                deleteBatch: "/rooms/cesRooms/deleteBatch",
+                exportXlsUrl: "/rooms/cesRooms/exportXls",
+                importExcelUrl: "rooms/cesRooms/importExcel",
+            },
+            buildingFloorSearchTag: {
+                name: null
+            },
+            dictOptions: {},
+            superFieldList: [],
+            selectedRowKeys: [],
+            isorter: {
+                column: "createTime",
+                order: "desc",
+            },
+        };
+    },
+    created() {
+        // this.loadData()
+        getAllLayouts().then((res) => {
+            if (res.code == 200) {
+                this.layouts = res.result.records;
+                this.loadData();
+            }
+        });
+    },
+    methods: {
+        onImgSave() {
+            this.loadData()
+        },
+        onFliterClose() {
+            this.filters['buildId'] = null
+            this.filters['floorId'] = null
+            this.ipagination.current = 1
+            this.buildingFloorSearchTag.name = null
+            this.loadData()
+        },
+        // 搜索
+        searchParam(id, name, isBuilding) {
+            this.$set(this.buildingFloorSearchTag, 'name', name)
+            if (isBuilding) {
+                this.filters['buildId'] = id
+                if (this.filters['floorId']) {
+                    delete this.filters.floorId
+                }
+            } else {
+                this.filters['floorId'] = id
+                if (this.filters['buildId']) {
+                    delete this.filters.buildId
+                }
+            }
+            this.loadData()
+        },
+        getLayoutName(row) {
+            let i = this.layouts.findIndex((s) => s.id == row.layoutId);
+            if (i > -1) {
+                return this.layouts[i].name;
+            }
+            return "";
+        },
+        // 批量删除
+        delBatch() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            let keys = this.selectedRowKeys
+            this.delLoading = true
+            delBatch({
+                hotelId: hotelInfo.id,
+                idStr: keys.toString()
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 删除所有
+        delAll() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            this.delLoading = true
+            delAll({
+                hotelId: hotelInfo.id,
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('全部删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 批量添加按钮
+        onAddBatch() {
+            this.$router.push('/tenant/gen/rooms');
+        },
+        // 全部删除
+        onDelAll() {},
+        // 显示图片弹窗
+        handleImage(row) {
+            this.$refs.roomimgmodal.setModel(row)
+        },
+        onSaveOk() {
+            this.loadData();
+        },
+        handleClick(index) {
+            this.activeIndex = index
+            this.searchQuery()
+        },
+        onChange(checkedValues) {
+            console.log('checked = ', checkedValues)
+        },
+        //选择日期
+        onChangeTime(date, dateString) {
+            console.log(date, dateString)
+        },
+    },
+};
+</script>
+
+<style scoped>
+@import "~@assets/less/common.less";
+
+.list-container {
+    display: grid;
+    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
+    border: solid 1px #d9d9d9;
+    width: 300px;
+    border-radius: 5px;
+    /* margin-bottom: 20px; */
+    margin-right: 10px;
+}
+
+.list-item {
+    padding: 10px;
+    border-right: solid 1px #d9d9d9;
+    cursor: pointer;
+    text-align: center;
+}
+
+.list-item.active {
+    background-color: #1890ff;
+    color: #fff;
+}
+
+.grid-clear {
+    /* display: grid; */
+    /* grid-template-columns: 2fr 1fr; */
+    /* grid-gap: 10px; */
+    width: 100%;
+}
+</style>

+ 349 - 0
src/views/fangwu/tabList/clearRecords.vue

@@ -0,0 +1,349 @@
+<template>
+<a-card :bordered="false">
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+        <a-tag color="pink" v-if="buildingFloorSearchTag.name">
+            {{ buildingFloorSearchTag.name }}
+            <a-icon type="close" @click="onFliterClose" />
+        </a-tag>
+        <!-- <a-button @click="handleAdd" type="primary" icon="plus">新增房间</a-button>
+        <a-button @click="onAddBatch" type="primary" icon="tags">批量新增</a-button>
+        <a-popconfirm title="确定全部删除吗?" @confirm="delAll">
+            <a-button :disabled="delLoading" :loading="delLoading" type="primary" icon="stop">全部删除</a-button>
+        </a-popconfirm>
+
+        <a-popconfirm v-if="selectedRowKeys.length > 0" title="确定删除吗?" @confirm="delBatch">
+            <a-button :disabled="delLoading" :loading="delLoading" icon="stop" style="margin-left: 8px">
+                批量删除</a-button>
+        </a-popconfirm> -->
+        <div style="display:flex;align-items:center;width:100%;">
+            <div class="list-container">
+                <div class="list-item" v-for="(item, index) in list" :key="index" :class="{active: activeIndex === index}" @click="handleClick(index)">
+                    {{ item }}
+                </div>
+            </div>
+            <a-range-picker v-show="activeIndex==4" @change="onChangeTime" size="large" />
+        </div>
+        <!-- <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> -->
+    </div>
+
+    <!-- table区域-begin -->
+    <div class="grid-clear">
+        <a-table ref="table" size="middle" :scroll="{ x: true }" bordered rowKey="id" :columns="columns" :dataSource="dataSource" :pagination="false" :loading="loading" :rowSelection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }" class="j-table-force-nowrap" @change="handleTableChange">
+
+            <template slot="layoutId" slot-scope="text, record">
+                {{ getLayoutName(record) }}
+            </template>
+            <template slot="prefix_name" slot-scope="text, record">
+                {{ (record.prefix || "") + record.name }}
+            </template>
+            <template slot="pictureSlot" slot-scope="text, record">
+                <img :src="record.cover" style="width:40px;height40px;" />
+            </template>
+            <template slot="htmlSlot" slot-scope="text">
+                <div v-html="text"></div>
+            </template>
+
+            <span slot="action" slot-scope="text, record">
+                <a @click="handleEdit(record)">编辑</a>
+
+                <a-divider type="vertical" />
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                    <a>删除</a>
+                </a-popconfirm>
+                <a-divider type="vertical" />
+                <a @click="handleImage(record)">图片</a>
+            </span>
+        </a-table>
+        <a-card>
+            <a-checkbox-group @change="onChange">
+                <a-row>
+                    <a-col :span="6">
+                        <a-checkbox value="A">
+                            退脏房
+                        </a-checkbox>
+                    </a-col>
+                    <a-col :span="6">
+                        <a-checkbox value="B">
+                            续脏房
+                        </a-checkbox>
+                    </a-col>
+                    <a-col :span="6">
+                        <a-checkbox value="C">
+                            特脏房
+                        </a-checkbox>
+                    </a-col>
+                    <a-col :span="6">
+                        <a-checkbox value="D">
+                            钟点房
+                        </a-checkbox>
+                    </a-col>
+                </a-row>
+            </a-checkbox-group>
+        </a-card>
+    </div>
+    <!-- <room-num-modal ref="modalForm" @ok="modalFormOk"></room-num-modal> -->
+    <!-- <room-imgs @saveOk="onImgSave" ref="roomimgmodal"></room-imgs> -->
+</a-card>
+</template>
+
+<script>
+import {
+    JeecgListMixin
+} from "@/mixins/JeecgListMixin";
+// import roomNumModal from "./roomNumModal.vue"; // todo roomLayoutForm 需要替换成房型的表单弹窗
+// import roomImgs from './roomImagesForm.vue'
+import {
+    getAllLayouts
+} from "@/api/roomLayout";
+import {
+    delBatch,
+    delAll
+} from '@/api/roomBuildingApi'
+let hotelInfo = JSON.parse(localStorage.getItem("storeInfo"));
+export default {
+    mixins: [JeecgListMixin],
+    components: {
+        // roomNumModal,
+        // roomImgs
+    },
+    data() {
+        return {
+            list: ['今天', '昨日', '本周', '本月', '更多'],
+            activeIndex: 0,
+            delLoading: false,
+            layouts: [],
+            queryParam: {},
+            // 分页参数
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ["10", "20", "30"],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条";
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                total: 0,
+            },
+            // 表头
+            columns: [{
+                    title: "房屋人员",
+                    align: "center",
+                    dataIndex: "hotelName",
+                },
+                {
+                    title: "退房",
+                    // align: "center",
+                    dataIndex: "buildName",
+                    children: [{
+                        title: '脏房数',
+                        dataIndex: 'buildName',
+                        // key: 'companyAddress',
+                        // width: 200,
+                    }],
+                },
+                {
+                    title: "续房",
+                    // align: "center",
+                    dataIndex: "floorName",
+                    children: [{
+                        title: '脏房',
+                        dataIndex: 'floorName',
+                        // key: 'companyAddress',
+                        // width: 200,
+                    }],
+                },
+                {
+                    title: "钟点",
+                    align: "center",
+                    dataIndex: "layoutId",
+                    scopedSlots: {
+                        customRender: "layoutId"
+                    },
+                },
+                {
+                    title: "特脏",
+                    align: "center",
+                    dataIndex: "name",
+                    scopedSlots: {
+                        customRender: "prefix_name"
+                    },
+                },
+                {
+                    title: "合计房间数",
+                    align: "center",
+                    dataIndex: "createAt",
+                },
+                {
+                    title: "提成金额",
+                    dataIndex: "action",
+                    align: "center",
+                    fixed: "right",
+                    width: 147,
+                    scopedSlots: {
+                        customRender: "action"
+                    },
+                },
+            ],
+            url: {
+                // list: 'org.jeecg.modules.business/busMarketMember/list',
+                list: "/rooms/cesRooms/list",
+                delete: "/rooms/cesRooms/remove",
+                deleteBatch: "/rooms/cesRooms/deleteBatch",
+                exportXlsUrl: "/rooms/cesRooms/exportXls",
+                importExcelUrl: "rooms/cesRooms/importExcel",
+            },
+            buildingFloorSearchTag: {
+                name: null
+            },
+            dictOptions: {},
+            superFieldList: [],
+            selectedRowKeys: [],
+            isorter: {
+                column: "createTime",
+                order: "desc",
+            },
+        };
+    },
+    created() {
+        // this.loadData()
+        getAllLayouts().then((res) => {
+            if (res.code == 200) {
+                this.layouts = res.result.records;
+                this.loadData();
+            }
+        });
+    },
+    methods: {
+        onImgSave() {
+            this.loadData()
+        },
+        onFliterClose() {
+            this.filters['buildId'] = null
+            this.filters['floorId'] = null
+            this.ipagination.current = 1
+            this.buildingFloorSearchTag.name = null
+            this.loadData()
+        },
+        // 搜索
+        searchParam(id, name, isBuilding) {
+            this.$set(this.buildingFloorSearchTag, 'name', name)
+            if (isBuilding) {
+                this.filters['buildId'] = id
+                if (this.filters['floorId']) {
+                    delete this.filters.floorId
+                }
+            } else {
+                this.filters['floorId'] = id
+                if (this.filters['buildId']) {
+                    delete this.filters.buildId
+                }
+            }
+            this.loadData()
+        },
+        getLayoutName(row) {
+            let i = this.layouts.findIndex((s) => s.id == row.layoutId);
+            if (i > -1) {
+                return this.layouts[i].name;
+            }
+            return "";
+        },
+        // 批量删除
+        delBatch() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            let keys = this.selectedRowKeys
+            this.delLoading = true
+            delBatch({
+                hotelId: hotelInfo.id,
+                idStr: keys.toString()
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 删除所有
+        delAll() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            this.delLoading = true
+            delAll({
+                hotelId: hotelInfo.id,
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('全部删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 批量添加按钮
+        onAddBatch() {
+            this.$router.push('/tenant/gen/rooms');
+        },
+        // 全部删除
+        onDelAll() {},
+        // 显示图片弹窗
+        handleImage(row) {
+            this.$refs.roomimgmodal.setModel(row)
+        },
+        onSaveOk() {
+            this.loadData();
+        },
+        handleClick(index) {
+            this.activeIndex = index
+            this.searchQuery()
+        },
+        onChange(checkedValues) {
+            console.log('checked = ', checkedValues)
+        },
+        //选择日期
+        onChangeTime(date, dateString) {
+            console.log(date, dateString)
+        },
+    },
+};
+</script>
+
+<style scoped>
+@import "~@assets/less/common.less";
+
+.list-container {
+    display: grid;
+    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
+    border: solid 1px #d9d9d9;
+    width: 300px;
+    border-radius: 5px;
+    /* margin-bottom: 20px; */
+    margin-right: 10px;
+}
+
+.list-item {
+    padding: 10px;
+    border-right: solid 1px #d9d9d9;
+    cursor: pointer;
+    text-align: center;
+}
+
+.list-item.active {
+    background-color: #1890ff;
+    color: #fff;
+}
+
+.grid-clear {
+    display: grid;
+    grid-template-columns: 2fr 1fr;
+    grid-gap: 10px;
+}
+</style>

+ 303 - 0
src/views/fangwu/tabList/clearRoomManagement.vue

@@ -0,0 +1,303 @@
+<template>
+<a-card :bordered="false">
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+        <a-tag color="pink" v-if="buildingFloorSearchTag.name">
+            {{ buildingFloorSearchTag.name }}
+            <a-icon type="close" @click="onFliterClose" />
+        </a-tag>
+        <!-- <a-button @click="handleAdd" type="primary" icon="plus">新增房间</a-button>
+        <a-button @click="onAddBatch" type="primary" icon="tags">批量新增</a-button>
+        <a-popconfirm title="确定全部删除吗?" @confirm="delAll">
+            <a-button :disabled="delLoading" :loading="delLoading" type="primary" icon="stop">全部删除</a-button>
+        </a-popconfirm> -->
+        <j-input placeholder="房间号" v-model="queryParam.name" style="width: 200px;margin-right:8px;"></j-input>
+        <a-range-picker style="margin-right:8px;" @change="onChangeTime" />
+        <!-- <a-popconfirm v-if="selectedRowKeys.length > 0" title="确定删除吗?" @confirm="delBatch">
+            <a-button :disabled="delLoading" :loading="delLoading" icon="stop" style="">
+                批量删除</a-button>
+        </a-popconfirm> -->
+        <!-- <div style="display:flex;align-items:center;width:100%;">
+            <div class="list-container">
+                <div class="list-item" v-for="(item, index) in list" :key="index" :class="{active: activeIndex === index}" @click="handleClick(index)">
+                    {{ item }}
+                </div>
+            </div>
+            <a-range-picker v-show="activeIndex==4" @change="onChangeTime" size="large" />
+        </div> -->
+        <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div class="grid-clear">
+        <a-table ref="table" size="middle" :scroll="{ x: true }" bordered rowKey="id" :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading" :rowSelection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }" class="j-table-force-nowrap" @change="handleTableChange">
+
+            <template slot="layoutId" slot-scope="text, record">
+                {{ getLayoutName(record) }}
+            </template>
+            <template slot="prefix_name" slot-scope="text, record">
+                {{ (record.prefix || "") + record.name }}
+            </template>
+            <template slot="pictureSlot" slot-scope="text, record">
+                <img :src="record.cover" style="width:40px;height40px;" />
+            </template>
+            <template slot="htmlSlot" slot-scope="text">
+                <div v-html="text"></div>
+            </template>
+
+            <span slot="action" slot-scope="text, record">
+                <a @click="handleEdit(record)">编辑</a>
+
+                <a-divider type="vertical" />
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                    <a>删除</a>
+                </a-popconfirm>
+                <a-divider type="vertical" />
+                <a @click="handleImage(record)">图片</a>
+            </span>
+        </a-table>
+    </div>
+    <!-- <room-num-modal ref="modalForm" @ok="modalFormOk"></room-num-modal> -->
+    <!-- <room-imgs @saveOk="onImgSave" ref="roomimgmodal"></room-imgs> -->
+</a-card>
+</template>
+
+<script>
+import {
+    JeecgListMixin
+} from "@/mixins/JeecgListMixin";
+// import roomNumModal from "./roomNumModal.vue"; // todo roomLayoutForm 需要替换成房型的表单弹窗
+// import roomImgs from './roomImagesForm.vue'
+import {
+    getAllLayouts
+} from "@/api/roomLayout";
+import {
+    delBatch,
+    delAll
+} from '@/api/roomBuildingApi'
+let hotelInfo = JSON.parse(localStorage.getItem("storeInfo"));
+export default {
+    mixins: [JeecgListMixin],
+    components: {
+        // roomNumModal,
+        // roomImgs
+    },
+    data() {
+        return {
+            list: ['今天', '昨日', '本周', '本月', '更多'],
+            activeIndex: 0,
+            delLoading: false,
+            layouts: [],
+            queryParam: {},
+            // 分页参数
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ["10", "20", "30"],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条";
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                total: 0,
+            },
+            // 表头
+            columns: [{
+                    title: "房扫时间",
+                    align: "center",
+                    dataIndex: "hotelName",
+                },
+                {
+                    title: "房扫人员",
+                    // align: "center",
+                    dataIndex: "buildName",
+                },
+                {
+                    title: "房间号",
+                    // align: "center",
+                    dataIndex: "floorName",
+                },
+                {
+                    title: "是否续住",
+                    align: "center",
+                    dataIndex: "layoutId",
+                    scopedSlots: {
+                        customRender: "layoutId"
+                    },
+                },
+                {
+                    title: "脏房类型",
+                    align: "center",
+                    dataIndex: "name",
+                    scopedSlots: {
+                        customRender: "prefix_name"
+                    },
+                },
+                {
+                    title: "操作人",
+                    align: "center",
+                    dataIndex: "createAt",
+                }
+            ],
+            url: {
+                // list: 'org.jeecg.modules.business/busMarketMember/list',
+                list: "/rooms/cesRooms/list",
+                delete: "/rooms/cesRooms/remove",
+                deleteBatch: "/rooms/cesRooms/deleteBatch",
+                exportXlsUrl: "/rooms/cesRooms/exportXls",
+                importExcelUrl: "rooms/cesRooms/importExcel",
+            },
+            buildingFloorSearchTag: {
+                name: null
+            },
+            dictOptions: {},
+            superFieldList: [],
+            selectedRowKeys: [],
+            isorter: {
+                column: "createTime",
+                order: "desc",
+            },
+        };
+    },
+    created() {
+        // this.loadData()
+        getAllLayouts().then((res) => {
+            if (res.code == 200) {
+                this.layouts = res.result.records;
+                this.loadData();
+            }
+        });
+    },
+    methods: {
+        onImgSave() {
+            this.loadData()
+        },
+        onFliterClose() {
+            this.filters['buildId'] = null
+            this.filters['floorId'] = null
+            this.ipagination.current = 1
+            this.buildingFloorSearchTag.name = null
+            this.loadData()
+        },
+        // 搜索
+        searchParam(id, name, isBuilding) {
+            this.$set(this.buildingFloorSearchTag, 'name', name)
+            if (isBuilding) {
+                this.filters['buildId'] = id
+                if (this.filters['floorId']) {
+                    delete this.filters.floorId
+                }
+            } else {
+                this.filters['floorId'] = id
+                if (this.filters['buildId']) {
+                    delete this.filters.buildId
+                }
+            }
+            this.loadData()
+        },
+        getLayoutName(row) {
+            let i = this.layouts.findIndex((s) => s.id == row.layoutId);
+            if (i > -1) {
+                return this.layouts[i].name;
+            }
+            return "";
+        },
+        // 批量删除
+        delBatch() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            let keys = this.selectedRowKeys
+            this.delLoading = true
+            delBatch({
+                hotelId: hotelInfo.id,
+                idStr: keys.toString()
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 删除所有
+        delAll() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            this.delLoading = true
+            delAll({
+                hotelId: hotelInfo.id,
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('全部删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 批量添加按钮
+        onAddBatch() {
+            this.$router.push('/tenant/gen/rooms');
+        },
+        // 全部删除
+        onDelAll() {},
+        // 显示图片弹窗
+        handleImage(row) {
+            this.$refs.roomimgmodal.setModel(row)
+        },
+        onSaveOk() {
+            this.loadData();
+        },
+        handleClick(index) {
+            this.activeIndex = index
+            this.searchQuery()
+        },
+        onChange(checkedValues) {
+            console.log('checked = ', checkedValues)
+        },
+        //选择日期
+        onChangeTime(date, dateString) {
+            console.log(date, dateString)
+        },
+    },
+};
+</script>
+
+<style scoped>
+@import "~@assets/less/common.less";
+
+.list-container {
+    display: grid;
+    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
+    border: solid 1px #d9d9d9;
+    width: 300px;
+    border-radius: 5px;
+    /* margin-bottom: 20px; */
+    margin-right: 10px;
+}
+
+.list-item {
+    padding: 10px;
+    border-right: solid 1px #d9d9d9;
+    cursor: pointer;
+    text-align: center;
+}
+
+.list-item.active {
+    background-color: #1890ff;
+    color: #fff;
+}
+
+.grid-clear {
+    /* display: grid; */
+    /* grid-template-columns: 2fr 1fr; */
+    /* grid-gap: 10px; */
+    width: 100%;
+}
+</style>

+ 298 - 0
src/views/fangwu/tabList/houseTypeConsumables.vue

@@ -0,0 +1,298 @@
+<template>
+<a-card :bordered="false">
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+        <a-tag color="pink" v-if="buildingFloorSearchTag.name">
+            {{ buildingFloorSearchTag.name }}
+            <a-icon type="close" @click="onFliterClose" />
+        </a-tag>
+        <!-- <a-button @click="onAddBatch" type="primary" icon="tags">批量新增</a-button> -->
+        <!-- <a-popconfirm title="确定全部删除吗?" @confirm="delAll">
+            <a-button :disabled="delLoading" :loading="delLoading" type="primary" icon="stop">全部删除</a-button>
+        </a-popconfirm> -->
+        <j-input placeholder="商品名称" v-model="queryParam.name" style="width: 200px;margin-right:8px;"></j-input>
+        <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+        <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+        <!-- <a-range-picker style="margin-right:8px;" @change="onChangeTime" /> -->
+        <a-popconfirm v-if="selectedRowKeys.length > 0" title="确定删除吗?" @confirm="delBatch">
+            <a-button :disabled="delLoading" :loading="delLoading" icon="stop" style="">
+                批量删除</a-button>
+        </a-popconfirm>
+        <!-- <div style="display:flex;align-items:center;width:100%;">
+            <div class="list-container">
+                <div class="list-item" v-for="(item, index) in list" :key="index" :class="{active: activeIndex === index}" @click="handleClick(index)">
+                    {{ item }}
+                </div>
+            </div>
+            <a-range-picker v-show="activeIndex==4" @change="onChangeTime" size="large" />
+        </div> -->
+    </div>
+
+    <!-- table区域-begin -->
+    <div class="grid-clear">
+        <a-table ref="table" size="middle" :scroll="{ x: true }" bordered rowKey="id" :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading" :rowSelection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }" class="j-table-force-nowrap" @change="handleTableChange">
+
+            <template slot="layoutId" slot-scope="text, record">
+                {{ getLayoutName(record) }}
+            </template>
+            <template slot="prefix_name" slot-scope="text, record">
+                {{ (record.prefix || "") + record.name }}
+            </template>
+            <template slot="pictureSlot" slot-scope="text, record">
+                <img :src="record.cover" style="width:40px;height40px;" />
+            </template>
+            <template slot="htmlSlot" slot-scope="text">
+                <div v-html="text"></div>
+            </template>
+
+            <span slot="action" slot-scope="text, record">
+                <a @click="handleEdit(record)">编辑</a>
+
+                <a-divider type="vertical" />
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                    <a>删除</a>
+                </a-popconfirm>
+                <a-divider type="vertical" />
+                <a @click="handleImage(record)">图片</a>
+            </span>
+        </a-table>
+    </div>
+    <!-- <room-num-modal ref="modalForm" @ok="modalFormOk"></room-num-modal> -->
+    <!-- <room-imgs @saveOk="onImgSave" ref="roomimgmodal"></room-imgs> -->
+</a-card>
+</template>
+
+<script>
+import {
+    JeecgListMixin
+} from "@/mixins/JeecgListMixin";
+// import roomNumModal from "./roomNumModal.vue"; // todo roomLayoutForm 需要替换成房型的表单弹窗
+// import roomImgs from './roomImagesForm.vue'
+import {
+    getAllLayouts
+} from "@/api/roomLayout";
+import {
+    delBatch,
+    delAll
+} from '@/api/roomBuildingApi'
+let hotelInfo = JSON.parse(localStorage.getItem("storeInfo"));
+export default {
+    mixins: [JeecgListMixin],
+    components: {
+        // roomNumModal,
+        // roomImgs
+    },
+    data() {
+        return {
+            list: ['今天', '昨日', '本周', '本月', '更多'],
+            activeIndex: 0,
+            delLoading: false,
+            layouts: [],
+            queryParam: {},
+            // 分页参数
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ["10", "20", "30"],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条";
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                total: 0,
+            },
+            // 表头
+            columns: [{
+                    title: "商品名称",
+                    align: "center",
+                    dataIndex: "hotelName",
+                },
+                {
+                    title: "类型",
+                    // align: "center",
+                    dataIndex: "buildName",
+                },
+                {
+                    title: "商品规格",
+                    // align: "center",
+                    dataIndex: "floorName",
+                },
+                {
+                    title: "单位",
+                    align: "center",
+                    dataIndex: "layoutId",
+                    scopedSlots: {
+                        customRender: "layoutId"
+                    },
+                },
+                {
+                    title: "操作",
+                    align: "center",
+                    dataIndex: "name",
+                    scopedSlots: {
+                        customRender: "action"
+                    },
+                }
+            ],
+            url: {
+                // list: 'org.jeecg.modules.business/busMarketMember/list',
+                list: "/rooms/cesRooms/list",
+                delete: "/rooms/cesRooms/remove",
+                deleteBatch: "/rooms/cesRooms/deleteBatch",
+                exportXlsUrl: "/rooms/cesRooms/exportXls",
+                importExcelUrl: "rooms/cesRooms/importExcel",
+            },
+            buildingFloorSearchTag: {
+                name: null
+            },
+            dictOptions: {},
+            superFieldList: [],
+            selectedRowKeys: [],
+            isorter: {
+                column: "createTime",
+                order: "desc",
+            },
+        };
+    },
+    created() {
+        // this.loadData()
+        getAllLayouts().then((res) => {
+            if (res.code == 200) {
+                this.layouts = res.result.records;
+                this.loadData();
+            }
+        });
+    },
+    methods: {
+        onImgSave() {
+            this.loadData()
+        },
+        onFliterClose() {
+            this.filters['buildId'] = null
+            this.filters['floorId'] = null
+            this.ipagination.current = 1
+            this.buildingFloorSearchTag.name = null
+            this.loadData()
+        },
+        // 搜索
+        searchParam(id, name, isBuilding) {
+            this.$set(this.buildingFloorSearchTag, 'name', name)
+            if (isBuilding) {
+                this.filters['buildId'] = id
+                if (this.filters['floorId']) {
+                    delete this.filters.floorId
+                }
+            } else {
+                this.filters['floorId'] = id
+                if (this.filters['buildId']) {
+                    delete this.filters.buildId
+                }
+            }
+            this.loadData()
+        },
+        getLayoutName(row) {
+            let i = this.layouts.findIndex((s) => s.id == row.layoutId);
+            if (i > -1) {
+                return this.layouts[i].name;
+            }
+            return "";
+        },
+        // 批量删除
+        delBatch() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            let keys = this.selectedRowKeys
+            this.delLoading = true
+            delBatch({
+                hotelId: hotelInfo.id,
+                idStr: keys.toString()
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 删除所有
+        delAll() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            this.delLoading = true
+            delAll({
+                hotelId: hotelInfo.id,
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('全部删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 批量添加按钮
+        onAddBatch() {
+            this.$router.push('/tenant/gen/rooms');
+        },
+        // 全部删除
+        onDelAll() {},
+        // 显示图片弹窗
+        handleImage(row) {
+            this.$refs.roomimgmodal.setModel(row)
+        },
+        onSaveOk() {
+            this.loadData();
+        },
+        handleClick(index) {
+            this.activeIndex = index
+            this.searchQuery()
+        },
+        onChange(checkedValues) {
+            console.log('checked = ', checkedValues)
+        },
+        //选择日期
+        onChangeTime(date, dateString) {
+            console.log(date, dateString)
+        },
+    },
+};
+</script>
+
+<style scoped>
+@import "~@assets/less/common.less";
+
+.list-container {
+    display: grid;
+    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
+    border: solid 1px #d9d9d9;
+    width: 300px;
+    border-radius: 5px;
+    /* margin-bottom: 20px; */
+    margin-right: 10px;
+}
+
+.list-item {
+    padding: 10px;
+    border-right: solid 1px #d9d9d9;
+    cursor: pointer;
+    text-align: center;
+}
+
+.list-item.active {
+    background-color: #1890ff;
+    color: #fff;
+}
+
+.grid-clear {
+    /* display: grid; */
+    /* grid-template-columns: 2fr 1fr; */
+    /* grid-gap: 10px; */
+    width: 100%;
+}
+</style>

+ 303 - 0
src/views/fangwu/tabList/maintenanceRecords.vue

@@ -0,0 +1,303 @@
+<template>
+<a-card :bordered="false">
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+        <a-tag color="pink" v-if="buildingFloorSearchTag.name">
+            {{ buildingFloorSearchTag.name }}
+            <a-icon type="close" @click="onFliterClose" />
+        </a-tag>
+        <!-- <a-button @click="handleAdd" type="primary" icon="plus">新增房间</a-button>
+        <a-button @click="onAddBatch" type="primary" icon="tags">批量新增</a-button>
+        <a-popconfirm title="确定全部删除吗?" @confirm="delAll">
+            <a-button :disabled="delLoading" :loading="delLoading" type="primary" icon="stop">全部删除</a-button>
+        </a-popconfirm> -->
+        <j-input placeholder="房间号" v-model="queryParam.name" style="width: 200px;margin-right:8px;"></j-input>
+        <a-range-picker style="margin-right:8px;" @change="onChangeTime" />
+        <a-popconfirm v-if="selectedRowKeys.length > 0" title="确定删除吗?" @confirm="delBatch">
+            <a-button :disabled="delLoading" :loading="delLoading" icon="stop" style="">
+                批量删除</a-button>
+        </a-popconfirm>
+        <!-- <div style="display:flex;align-items:center;width:100%;">
+            <div class="list-container">
+                <div class="list-item" v-for="(item, index) in list" :key="index" :class="{active: activeIndex === index}" @click="handleClick(index)">
+                    {{ item }}
+                </div>
+            </div>
+            <a-range-picker v-show="activeIndex==4" @change="onChangeTime" size="large" />
+        </div> -->
+        <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div class="grid-clear">
+        <a-table ref="table" size="middle" :scroll="{ x: true }" bordered rowKey="id" :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading" :rowSelection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }" class="j-table-force-nowrap" @change="handleTableChange">
+
+            <template slot="layoutId" slot-scope="text, record">
+                {{ getLayoutName(record) }}
+            </template>
+            <template slot="prefix_name" slot-scope="text, record">
+                {{ (record.prefix || "") + record.name }}
+            </template>
+            <template slot="pictureSlot" slot-scope="text, record">
+                <img :src="record.cover" style="width:40px;height40px;" />
+            </template>
+            <template slot="htmlSlot" slot-scope="text">
+                <div v-html="text"></div>
+            </template>
+
+            <span slot="action" slot-scope="text, record">
+                <a @click="handleEdit(record)">编辑</a>
+
+                <a-divider type="vertical" />
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                    <a>删除</a>
+                </a-popconfirm>
+                <a-divider type="vertical" />
+                <a @click="handleImage(record)">图片</a>
+            </span>
+        </a-table>
+    </div>
+    <!-- <room-num-modal ref="modalForm" @ok="modalFormOk"></room-num-modal> -->
+    <!-- <room-imgs @saveOk="onImgSave" ref="roomimgmodal"></room-imgs> -->
+</a-card>
+</template>
+
+<script>
+import {
+    JeecgListMixin
+} from "@/mixins/JeecgListMixin";
+// import roomNumModal from "./roomNumModal.vue"; // todo roomLayoutForm 需要替换成房型的表单弹窗
+// import roomImgs from './roomImagesForm.vue'
+import {
+    getAllLayouts
+} from "@/api/roomLayout";
+import {
+    delBatch,
+    delAll
+} from '@/api/roomBuildingApi'
+let hotelInfo = JSON.parse(localStorage.getItem("storeInfo"));
+export default {
+    mixins: [JeecgListMixin],
+    components: {
+        // roomNumModal,
+        // roomImgs
+    },
+    data() {
+        return {
+            list: ['今天', '昨日', '本周', '本月', '更多'],
+            activeIndex: 0,
+            delLoading: false,
+            layouts: [],
+            queryParam: {},
+            // 分页参数
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ["10", "20", "30"],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条";
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                total: 0,
+            },
+            // 表头
+            columns: [{
+                    title: "房间号",
+                    align: "center",
+                    dataIndex: "hotelName",
+                },
+                {
+                    title: "开始时间",
+                    // align: "center",
+                    dataIndex: "buildName",
+                },
+                {
+                    title: "结束时间",
+                    // align: "center",
+                    dataIndex: "floorName",
+                },
+                {
+                    title: "维修状态",
+                    align: "center",
+                    dataIndex: "layoutId",
+                    scopedSlots: {
+                        customRender: "layoutId"
+                    },
+                },
+                {
+                    title: "维修原因",
+                    align: "center",
+                    dataIndex: "name",
+                    scopedSlots: {
+                        customRender: "prefix_name"
+                    },
+                },
+                {
+                    title: "维修结果",
+                    align: "center",
+                    dataIndex: "createAt",
+                }
+            ],
+            url: {
+                // list: 'org.jeecg.modules.business/busMarketMember/list',
+                list: "/rooms/cesRooms/list",
+                delete: "/rooms/cesRooms/remove",
+                deleteBatch: "/rooms/cesRooms/deleteBatch",
+                exportXlsUrl: "/rooms/cesRooms/exportXls",
+                importExcelUrl: "rooms/cesRooms/importExcel",
+            },
+            buildingFloorSearchTag: {
+                name: null
+            },
+            dictOptions: {},
+            superFieldList: [],
+            selectedRowKeys: [],
+            isorter: {
+                column: "createTime",
+                order: "desc",
+            },
+        };
+    },
+    created() {
+        // this.loadData()
+        getAllLayouts().then((res) => {
+            if (res.code == 200) {
+                this.layouts = res.result.records;
+                this.loadData();
+            }
+        });
+    },
+    methods: {
+        onImgSave() {
+            this.loadData()
+        },
+        onFliterClose() {
+            this.filters['buildId'] = null
+            this.filters['floorId'] = null
+            this.ipagination.current = 1
+            this.buildingFloorSearchTag.name = null
+            this.loadData()
+        },
+        // 搜索
+        searchParam(id, name, isBuilding) {
+            this.$set(this.buildingFloorSearchTag, 'name', name)
+            if (isBuilding) {
+                this.filters['buildId'] = id
+                if (this.filters['floorId']) {
+                    delete this.filters.floorId
+                }
+            } else {
+                this.filters['floorId'] = id
+                if (this.filters['buildId']) {
+                    delete this.filters.buildId
+                }
+            }
+            this.loadData()
+        },
+        getLayoutName(row) {
+            let i = this.layouts.findIndex((s) => s.id == row.layoutId);
+            if (i > -1) {
+                return this.layouts[i].name;
+            }
+            return "";
+        },
+        // 批量删除
+        delBatch() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            let keys = this.selectedRowKeys
+            this.delLoading = true
+            delBatch({
+                hotelId: hotelInfo.id,
+                idStr: keys.toString()
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 删除所有
+        delAll() {
+            let hotelInfo = JSON.parse(localStorage.getItem('storeInfo'))
+            this.delLoading = true
+            delAll({
+                hotelId: hotelInfo.id,
+            }).then(res => {
+                if (res.code == 200) {
+                    this.selectedRowKeys = []
+                    this.$message.success('全部删除成功');
+                    this.loadData()
+                }
+            }).finally(_ => {
+                this.delLoading = false
+            })
+        },
+        // 批量添加按钮
+        onAddBatch() {
+            this.$router.push('/tenant/gen/rooms');
+        },
+        // 全部删除
+        onDelAll() {},
+        // 显示图片弹窗
+        handleImage(row) {
+            this.$refs.roomimgmodal.setModel(row)
+        },
+        onSaveOk() {
+            this.loadData();
+        },
+        handleClick(index) {
+            this.activeIndex = index
+            this.searchQuery()
+        },
+        onChange(checkedValues) {
+            console.log('checked = ', checkedValues)
+        },
+        //选择日期
+        onChangeTime(date, dateString) {
+            console.log(date, dateString)
+        },
+    },
+};
+</script>
+
+<style scoped>
+@import "~@assets/less/common.less";
+
+.list-container {
+    display: grid;
+    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
+    border: solid 1px #d9d9d9;
+    width: 300px;
+    border-radius: 5px;
+    /* margin-bottom: 20px; */
+    margin-right: 10px;
+}
+
+.list-item {
+    padding: 10px;
+    border-right: solid 1px #d9d9d9;
+    cursor: pointer;
+    text-align: center;
+}
+
+.list-item.active {
+    background-color: #1890ff;
+    color: #fff;
+}
+
+.grid-clear {
+    /* display: grid; */
+    /* grid-template-columns: 2fr 1fr; */
+    /* grid-gap: 10px; */
+    width: 100%;
+}
+</style>