Quellcode durchsuchen

Merge branch 'master' of http://49.4.53.36:3000/hotel/hotel-saas-tenant-frontend

gqx vor 2 Jahren
Ursprung
Commit
f9a08cc04a

+ 43 - 1
src/api/roomBuildingApi.js

@@ -63,4 +63,46 @@ export function saveBatch(param) {
         method: 'post',
         data: param
     })
- }
+ }
+
+
+ /**
+ * 批量删除房间
+ * @param {Object} param 
+ * @returns 
+ */
+export function delBatch(param) { 
+    return axios({
+        url: '/rooms/cesRooms/delete',
+        method: 'delete',
+        data: param
+    })
+ }
+
+  /**
+ * 删除所有
+ * @param {Object} param 
+ * @returns 
+ */
+export function delAll(param) { 
+    return axios({
+        url: '/rooms/cesRooms/removeAll',
+        method: 'delete',
+        data: param
+    })
+ }
+
+   /**
+ * 编辑房间
+ * @param {Object} param 
+ * @returns 
+ */
+export function roomEdit(param) { 
+    return axios({
+        url: '/rooms/cesRooms/modify',
+        method: 'put',
+        data: param
+    })
+ }
+
+ 

+ 94 - 0
src/views/settings/components/roomModules/allDaysRoomFeeRule.vue

@@ -0,0 +1,94 @@
+
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="false">
+      <a-form-model
+        ref="form"
+        :model="model"
+        layout="horizontal"
+        :rules="validatorRules"
+        slot="detail"
+      >
+        <div class="item-wrapper">
+          <div class="wrapper-content">1、进店时间在</div>
+          <div class="wrapper-form-item">
+            <a-form-model-item
+              label=""
+              :labelCol="labelCol"
+              :wrapperCol="wrapperCol"
+              prop="enterTime"
+            >
+              <a-time-picker
+                :open.sync="open1"
+                v-model="model.enterTime"
+                format="HH:mm"
+              >
+                <a-button
+                  slot="addon"
+                  size="small"
+                  type="primary"
+                  @click="open1 = false"
+                >
+                  确定
+                </a-button>
+              </a-time-picker>
+            </a-form-model-item>
+          </div>
+          <div class="wrapper-content">
+            之后的,算第二天退房(例如,如果是6点,那么当天6点之后开的房间就是第二天中午退房,0点到6点开房就是当天中午退房)。
+          </div>
+        </div>
+
+        <a-form-model-item
+          label=""
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          prop="ass"
+        >
+          <a-input v-model="model.ass"></a-input>
+        </a-form-model-item>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      labelCol: {
+        xs: { span: 0 },
+        sm: { span: 0 },
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 24 },
+      },
+      open1: false,
+      enterTime: "",
+      confirmLoading: false,
+      model: {
+        enterTime: null,
+        ass: null,
+      },
+      validatorRules: {
+        enterTime: [
+          {
+            required: true,
+            message: "进!",
+          },
+        ],
+        ass: [{ required: true, message: "测试" }],
+      },
+    };
+  },
+};
+</script>
+
+<style lang="css" scoped>
+.item-wrapper{
+    display: flex;
+    align-items: center;
+    height: 50px;
+}
+</style>

+ 69 - 8
src/views/settings/components/roomModules/roomGen.vue

@@ -31,9 +31,9 @@
             placeholder="请选择楼栋"
             v-model="buildingId"
             option-filter-prop="children"
-            @change="floorChange"
+            @change="onBuildChange"
           >
-            <a-select-option v-for="item in buildingTreeData" :key="item.id">
+            <a-select-option v-for="item in buildingTreeData" :key="item.id" >
               {{ item.name }}
             </a-select-option>
           </a-select>
@@ -108,6 +108,7 @@
               style="margin-left: 5px"
             />
           </div>
+          <div style="color:red;" v-if="isExistNames(item.name)">名称已存在</div>
           <div
             style="display: flex;justify-content: start;margin: 20px;flex-wrap: wrap;"
           >
@@ -116,7 +117,8 @@
               :key="indexs"
               style="width: 25%; margin-top: 10px"
             >
-              <input :value="room.name" style="width: 50%; margin: auto" />
+              <input v-model="room.name" style="width: 50%; margin: auto" />
+              
               <a-button
                 @click="delRoom(index, indexs)"
                 type="danger"
@@ -125,7 +127,9 @@
                 icon="minus"
                 style="margin-left: 5px"
               />
+              <div style="color:red;" v-if="repeatName(item.children,indexs)">房名重复</div>
             </div>
+            
           </div>
           <div>
             <a-button
@@ -240,6 +244,7 @@ export default {
   },
   data() {
     return {
+      floorNames:[],
         saveLoading: false,
       myArray: [
         {
@@ -314,6 +319,12 @@ export default {
   },
 
   methods: {
+    onBuildChange() {
+      let bIndex = this.buildingTreeData.findIndex(s => s.id == this.buildingId)
+      let currentFloorNames = (this.buildingTreeData[bIndex].children||[]).map(s => s.name)
+      this.floorNames = currentFloorNames
+      // this.roomTree = JSON.parse(JSON.stringify(this.roomTree))
+    },
     delLayoutRoom(item, layoutIndex, roomIndex) {
         this.roomTree[item.floorIndex].children.push({
             checked: false,
@@ -375,7 +386,38 @@ export default {
         this.$message.error("房间数不正确");
         return;
       }
-
+      let errMsg = '';
+      
+      for(let i =0;i<this.roomTree.length;i++) {
+        let s = this.roomTree[i]
+        if(this.isExistNames(s.name)) {
+          errMsg = '楼层名称有重复';
+          break;
+        }
+      }
+      if(errMsg == '') {
+        for(let i =0;i<this.roomTree.length;i++) {
+        let s = this.roomTree[i]
+        for(let j=0;j<s.children.length;j++) {
+          let room = s.children[j]
+          if(!room.name){
+            errMsg = '存在空房名,请填写'
+            break
+          }
+          if(this.repeatName(s.children, j)) {
+            errMsg = '存在重复房名'
+            break
+          }
+        }
+        if(errMsg) break
+      }
+      }
+      if(errMsg) {
+        this.$message.error(errMsg)
+        return
+      }
+      
+      
       if (this.step == 1) {
         this.step = 2;
         return;
@@ -437,9 +479,6 @@ export default {
     hotelChange(value) {
       console.log(`selected ${value}`);
     },
-    floorChange(value) {
-      console.log(`selected ${value}`);
-    },
     tailNumberExclude() {
       console.log(`selected ${value}`);
     },
@@ -450,7 +489,11 @@ export default {
       this.closeCurrent();
     },
     check() {},
-    genRooms() {
+    genRooms() { 
+      if(!this.buildingId) {
+        this.$message.error("请先选择楼栋")
+        return
+      }
       let floors = [];
       let model = this.model;
       for (let i = 0; i < model.floorCount; i++) {
@@ -480,7 +523,25 @@ export default {
         });
       }
       this.roomTree = floors;
+      let bIndex = this.buildingTreeData.findIndex(s => s.id == this.buildingId)
+      let currentFloorNames = (this.buildingTreeData[bIndex].children||[]).map(s => s.name)
+      this.floorNames = currentFloorNames
     },
+    isExistNames(name) {
+      return this.floorNames.includes(name)
+    },
+    repeatName(items, index) {
+      let name = items[index].name
+      let newArr = JSON.parse(JSON.stringify(items)).map(s => s.name)
+      newArr.splice(index,1)
+
+      if(newArr.includes(items[index].name)) {
+        return true
+      }
+      return false
+    }
+
+
   },
 };
 </script>

+ 66 - 0
src/views/settings/components/roomModules/roomNumSettings/roomImagesForm.vue

@@ -0,0 +1,66 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭"
+  >
+  <a-form-model ref="form" :model="model">
+            <a-form-model-item label="房间大图" >
+                <j-image-upload class="avatar-uploader" text="上传" v-model="model.cover" ></j-image-upload>
+              </a-form-model-item>
+              <a-form-model-item label="图片" >
+                <j-image-upload class="avatar-uploader" text="上传" v-model="model.images" :isMultiple="true"></j-image-upload>
+              </a-form-model-item>
+        </a-form-model>
+  </j-modal>
+</template>
+
+<script>
+import { roomEdit } from '@/api/roomBuildingApi'
+export default {
+    data() {
+        return {
+            title: '房间图片',
+            width: '40%',
+            visible: false,
+            model: {
+                id: null,
+                cover: null,
+                images: null,
+            }
+        }
+    },
+    methods: {
+        // 设置模型图片数据
+        setModel(data) {
+            this.model = JSON.parse(JSON.stringify(data))
+            this.visible = true
+        },
+        // save
+        handleOk() {
+            roomEdit(this.model).then(res => {
+                if(res.code == 200) {
+                    this.$message.success('保存成功')
+                    this.$emit("saveOk")
+                    this.visible = false
+                }
+            }).catch(_ => {
+                this.$message.success('保存失败')
+            })
+        },
+        // 取消
+        handleCancel() {
+            this.visible = false
+        }
+    }
+
+}
+</script>
+
+<style>
+
+</style>

+ 14 - 1
src/views/settings/components/roomModules/roomNumSettings/roomNumList.vue

@@ -103,6 +103,7 @@ export default {
     },
   data() {
     return {
+        currentFilterId: null,
       flowData: {
         id: null,
         hotelId: null,
@@ -128,7 +129,9 @@ export default {
   methods: {
     // 点击 触发搜索
     filterSearch(item) {
-
+        this.currentFilterId = item.id
+        this.$refs.numtable.ipagination.current = 1
+        this.$refs.numtable.searchParam(item.id, item.name, item.parentId == "0")
     },
     // 获取楼栋树
     loadBuildingTreeData() {
@@ -168,7 +171,17 @@ export default {
         }).then(res => {
             if(res.code == 200) {
                 this.$message.success('删除成功')
+                
                 this.loadBuildingTreeData()
+                this.$refs.numtable.ipagination.current = 1
+                this.$refs.numtable.ipagination.pageSize = 10
+                if(this.currentFilterId == item.id ) {
+                    if(item.parentId == "0")
+                        this.$refs.numtable.filters['buildId'] = null
+                    else 
+                        this.$refs.numtable.filters['floorId'] = null
+                }
+                this.$refs.numtable.loadData()
             }
         })
     },

+ 92 - 6
src/views/settings/components/roomModules/roomNumSettings/roomNumTable.vue

@@ -4,18 +4,37 @@
 
     <!-- 操作按钮区域 -->
     <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="plus"
+      <a-button @click="onAddBatch" type="primary" icon="tags"
         >批量新增</a-button
       >
-      <a-button @click="onDelAll" type="primary" icon="plus">全部删除</a-button>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
+      <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>
+      
+      <!-- <a-dropdown v-if="selectedRowKeys.length > 0">
         <a-button style="margin-left: 8px">
           批量操作 <a-icon type="down"
         /></a-button>
-      </a-dropdown>
+      </a-dropdown> -->
       <a-button type="primary" @click="searchQuery" icon="search"
         >查询</a-button
       >
@@ -70,22 +89,26 @@
       </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 {
+      delLoading: false,
       layouts: [],
       queryParam: {},
       // 分页参数
@@ -151,6 +174,9 @@ export default {
         exportXlsUrl: "/rooms/cesRooms/exportXls",
         importExcelUrl: "rooms/cesRooms/importExcel",
       },
+      buildingFloorSearchTag: {
+        name: null
+      },
       dictOptions: {},
       superFieldList: [],
       selectedRowKeys: [],
@@ -170,6 +196,32 @@ export default {
     });
   },
   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) {
@@ -177,6 +229,40 @@ export default {
       }
       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');
@@ -185,7 +271,7 @@ export default {
     onDelAll() {},
     // 显示图片弹窗
     handleImage(row) {
-
+      this.$refs.roomimgmodal.setModel(row)
     },
     onSaveOk() {
       this.loadData();

+ 16 - 3
src/views/settings/roomSettings.vue

@@ -23,21 +23,34 @@
                 </span>
                <goodList></goodList>     
             </a-tab-pane>
+            <a-tab-pane key="4">
+                <span slot="tab">
+                    <a-icon type="clock-circle" />
+                    全天房计费
+                </span>
+                <all-days-rule></all-days-rule>
+            </a-tab-pane>
+            <a-tab-pane key="5">
+                <span slot="tab">
+                    <a-icon type="history" />
+                    钟点房计费
+                </span>
+            </a-tab-pane>
         </a-tabs>
     </a-card>
 </template>
 
 <script>
 import roomLayoutList from "./components/roomModules/roomLayoutList.vue"
-// import roomGen from "./components/roomModules/roomGen.vue";
 import goodList from "./components/roomModules/goodList.vue";
 import roomNumList from "./components/roomModules/roomNumSettings/roomNumList.vue";
+import allDaysRule from './components/roomModules/allDaysRoomFeeRule.vue'
 export default {
     components: {
         roomLayoutList,
-        // roomGen,
         goodList,
-        roomNumList
+        roomNumList,
+        allDaysRule, // 全天房计费规则tabContent
     },
     data() {
         return {