소스 검색

1. 新增

MONSTER-ygh 3 달 전
부모
커밋
b8070872b4
28개의 변경된 파일2183개의 추가작업 그리고 96개의 파일을 삭제
  1. 18 3
      src/myComponents/selectMoreBox.vue
  2. 278 0
      src/myComponents/selecteNew.vue
  3. 394 0
      src/views/tourism/financialManagement/detailsBox/ticketRorecRefundOrderDetails.vue
  4. 343 0
      src/views/tourism/financialManagement/ticketRorceRefundOrder.vue
  5. 61 2
      src/views/tourism/marketingActivities/formBox/eventManagementForm.vue
  6. 0 1
      src/views/tourism/marketingActivities/model/selectCouponManagement.vue
  7. 0 1
      src/views/tourism/marketingActivities/model/selectMemberInformation.vue
  8. 0 1
      src/views/tourism/marketingActivities/model/selectMembershipLevel.vue
  9. 0 1
      src/views/tourism/marketingActivities/model/selectMoreBox.vue
  10. 0 1
      src/views/tourism/marketingActivities/model/selectTicketOrders.vue
  11. 292 34
      src/views/tourism/membershipManagement/electronicMembership/formBox/membershipLevelForm.vue
  12. 0 1
      src/views/tourism/membershipManagement/electronicMembership/model/selectMoreBox.vue
  13. 24 1
      src/views/tourism/membershipManagement/equityCard/detailsBox/equityCardAllocationDetails.vue
  14. 1 0
      src/views/tourism/membershipManagement/equityCard/detailsBox/equityCardManagementUseList.vue
  15. 22 5
      src/views/tourism/membershipManagement/equityCard/equityCardManage.vue
  16. 110 7
      src/views/tourism/membershipManagement/equityCard/formBox/equityCardAllocationForm.vue
  17. 10 0
      src/views/tourism/membershipManagement/giftcard/detailsBox/equityCardManagementDetails.vue
  18. 2 0
      src/views/tourism/membershipManagement/giftcard/formBox/equityCardManagementForm.vue
  19. 6 10
      src/views/tourism/membershipManagement/giftcard/giftcardList.vue
  20. 26 7
      src/views/tourism/orderManagement/hotelsOrders/hotelsOrders.vue
  21. 334 0
      src/views/tourism/orderManagement/ticketOrdersAll/formBox/releaseForm.vue
  22. 30 6
      src/views/tourism/orderManagement/ticketOrdersAll/ticketOrders.vue
  23. 44 2
      src/views/tourism/productManagement/formBox/cateringManagementForm.vue
  24. 146 8
      src/views/tourism/productManagement/formBox/houseTypeListForm.vue
  25. 7 0
      src/views/tourism/productManagement/formBox/scenicAreaTicketsForm.vue
  26. 26 2
      src/views/tourism/productManagement/hotelsManagement.vue
  27. 8 2
      src/views/tourism/productManagement/scenicAreaTickets.vue
  28. 1 1
      src/views/tourism/productManagement/tabelBox/cateringManagementCategoryTabel.vue

+ 18 - 3
src/myComponents/selectMoreBox.vue

@@ -62,7 +62,7 @@
                                 v-model="item.checked"
                                 @change="(val)=>changeCheckbox(item,index,val)"
                                     :key="index">{{
-                                        item.name
+                                        showName(item)
                                     }}</el-checkbox>
                             </div>
                             
@@ -156,6 +156,16 @@ export default {
         placeholder: {
             type: String,
             default: '请点击添加',
+        },
+        showKeys: {
+            type: [Array],
+            default: () => {
+                return ['name']
+            }
+        },
+        showKeysJoin: {
+            type: [String],
+            default: ''
         }
     },
     data() {
@@ -181,7 +191,6 @@ export default {
     watch: {
         value: {
             handler(newValue){
-                console.log("dfsdsfsdf====",this.value)
                 if(this.value) {
                     this.modalDetails = JSON.parse(JSON.stringify(this.value))
                 }else {
@@ -374,8 +383,14 @@ export default {
                 }
             }
             this.checkedCurrentPageAll()
+        },
+        showName(obj) {
+            let sre = ''
+            this.showKeys.forEach((item,index)=>{
+                sre = sre + (obj[item] + (index == this.showKeys.length-1 ? '' : this.showKeysJoin))
+            })
+            return sre
         }
- 
     },
 }
 </script>

+ 278 - 0
src/myComponents/selecteNew.vue

@@ -0,0 +1,278 @@
+<template>
+    <el-popover
+        placement="bottom-start"
+        popper-class="select-new-popper"
+        trigger="manual"
+        v-model="visible">
+        <div ref="selectNew" class="select-new-box" slot="reference">
+           <div class="select-new-info">
+                <input 
+                type="select" 
+                :value="name" 
+                :placeholder="placeholder" 
+                readonly="readonly" 
+                unselectable="on"
+                id="select-new-box"
+                >
+                
+                <span v-if="!visible">
+                    <span class="el-icon_clear" @click.stop="clearData" v-if="isClear">
+                        <el-icon class="el-icon-circle-close"></el-icon>
+                    </span>
+                    <el-icon class="el-icon-arrow-down"></el-icon>
+                </span>
+                <span v-else>
+                    <span class="el-icon_clear" @click.stop="clearData" v-if="isClear">
+                        <el-icon class="el-icon-circle-close"></el-icon>
+                    </span>
+                    <el-icon class="el-icon-arrow-up"></el-icon>
+                </span>
+           </div>
+        </div>
+        <div v-loading="loading">
+            <div class="select-new-list" v-if="list && list.length > 0">
+                <div 
+                v-for="(item,index) in list" 
+                :key="index"
+                @click="change(item)"
+                :class="[item[idKey] == valuesCopy.classifyId ? 'is-action':'',item.disabled && item[idKey] != valuesCopy.classifyId?'is-disabled':'']"
+                > {{ item.goodsName }} </div>
+                <div>
+                    <el-pagination
+                    small
+                    layout="prev, pager, next"
+                    :total="total"
+                    @current-change="handleCurrentChange"
+                    :current-page.sync="page.pageNum"
+                    >
+                    </el-pagination>
+                </div>
+            </div>
+            <div v-else class="select-new-list-empty">
+                <el-empty description="暂无数据" :image-size="30"></el-empty>
+            </div>
+        </div>
+    </el-popover>
+</template>
+
+<script>
+export default {
+    name: 'SelectElInputNew',
+    props: {
+        value: {
+            type: [Object],
+            default: ()=>{
+                return {}
+            }
+        },
+        // list: {
+        //     type: [Array],
+        //     default: () => {
+        //         return []
+        //     }
+        // },
+        idKey: {
+            type: [String],
+            default: 'id'
+        },
+        placeholder: {
+            type: [String],
+            default: '请选择'
+        },
+        getDataFun: {
+            type: [Function,Object,Promise],
+            default: null
+        },
+        isPage: {
+            type: [Boolean],
+            default: true
+        }
+    },
+    data(){
+        return {
+            valuesCopy: {},
+            visible: false,
+            contentWrap: null,
+            loading: false,
+            name: "",
+            isClear: true,
+            page: {
+                pageNum: 1,
+                pageSize: 10
+            },
+            total: 0,
+            list: [],
+            isFocus: false
+        }
+    },
+    mounted(){
+        this.contentWrap = document.getElementById("select-new-box");
+        document.addEventListener('click',this.clear,false)
+    },
+    methods: {
+        open() {
+            this.visible = !this.visible
+            
+        },
+        async clear(e) {
+            if(!this.$el.contains(e.target)) {
+                this.visible = false
+            }else {
+                this.visible = !this.visible
+                if(this.visible && this.getDataFun && typeof this.getDataFun == 'function' ) {
+                    this.handleCurrentChange(1)
+                }
+            }
+        },
+        visibleChange() {
+            this.$emit('visibleChange',this.visible)
+        },
+        setLoading(){
+            this.loading = !this.loading
+        },
+        change(item) {
+            console.log("item===",item)
+            this.$emit('input',{
+                classifyId:item[this.idKey],
+                classifyName: item.goodsName
+            })
+            this.visible = false
+        },
+        blur(){
+            this.isClear = false
+        },
+        focus() {
+            this.isFocus = true
+            this.isClear = true
+        },
+        clearData(e) {
+            e.stopImmediatePropagation();
+            this.$emit('input',{
+                classifyId: null,
+                classifyName: null
+            })
+        },
+        async handleCurrentChange(index,oldIndex,e) {
+            console.log("e====",e)
+            if(e) {
+                e.stopPropagation();
+            }
+            this.page.pageNum = index
+            this.loading = true
+            let res = await this.getDataFun(this.page)
+            this.list = res.rows
+            this.total = res.total
+            this.loading = false
+        }
+    },
+    watch: {
+        visible(){
+            this.visibleChange()
+        },
+        value: {
+            handler(newValue) {
+                console.log("收到发生发射点发===",this.value)
+                if(this.value){
+                    this.$set(this,'valuesCopy',JSON.parse(JSON.stringify(this.value))) 
+                    this.name = this.value.classifyName ? this.value.classifyName:''
+                }else {
+                    this.$set(this,'valuesCopy',JSON.parse(JSON.stringify(this.value))) 
+                }
+            },
+            deep: true
+        }
+    },
+    destroyed() {
+        document.removeEventListener('click',this.clear)
+    }
+}
+</script>
+<style lang="scss">
+.select-new-box {
+    background-image: none;
+    display: inline-block;
+    cursor: pointer; 
+    .select-new-info {
+        width: 200px;
+        height: 36px;
+        box-sizing: border-box;
+        position: relative;
+        input {
+            width: 100%;
+            height: 100%;
+            display: block;
+            border: 1px solid #DCDFE6;
+            border-radius: 4px;
+            padding: 0 30px 0 15px;
+            color: #606266;
+            cursor: pointer; 
+        }
+        input:focus {
+            border: none;
+            outline: 1px solid #1890ff;
+        }
+        >span {
+            position: absolute;
+            top: 50%;
+            transform: translateY(-50%);
+            right: 10px;
+        }
+        .el-icon_clear {
+            display: none;
+        }
+    }
+}
+
+.select-new-box:hover {
+    .el-icon_clear {
+        display: inline-block;
+    }
+    .el-icon-arrow-down {
+        display: none;
+    }
+    .el-icon-arrow-up {
+        display: none;
+    }
+}
+
+.select-new-list {
+    min-width: 200px;
+    >div {
+        cursor: pointer; 
+        font-size: 14px;
+        padding: 0 20px;
+        display: flex;
+        align-items: center;
+        justify-content: flex-start;
+        //position: relative;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        color: #606266;
+        height: 34px;
+        box-sizing: border-box;
+    }
+
+    >div:hover {
+        background-color: #F5F7FA;
+    }
+    .is-action {
+        color: #409eff;
+        font-weight: 700;
+    }
+    .is-disabled {
+        color: #c0c4cc;
+        cursor: not-allowed;
+    }
+}
+
+.select-new-list-empty {
+    min-width: 200px;
+    height: 150px;
+}
+</style>
+<style>
+.select-new-popper {
+    padding: 0 !important;
+}
+</style>

+ 394 - 0
src/views/tourism/financialManagement/detailsBox/ticketRorecRefundOrderDetails.vue

@@ -0,0 +1,394 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="open"
+    width="70%"
+    append-to-body
+    :close-on-click-modal="false"
+    @close="cancel"
+  >
+    <div class="form-dialog-box"
+    v-loading="loading"
+    :element-loading-text="loadingText"
+    element-loading-spinner="el-icon-loading"
+    element-loading-background="rgba(0, 0, 0, 0)">
+      <div
+        v-loading="loading"
+        :element-loading-text="''"
+        element-loading-spinner="''"
+        element-loading-background="rgba(0, 0, 0, 0.8)"
+        >
+        <el-form :model="form" ref="form" :rules="rules" label-width="120px">
+          <div class="form-title"><span>订单信息</span></div>
+          <div style="display: flex;">
+            <!-- <el-form-item label="订单号:">
+              <span style="display: block; min-width: 250px;">{{ form.orderNum }}</span>
+            </el-form-item> -->
+            <el-form-item label="支付单号:">
+              <span style="display: block; min-width: 250px;">{{ form.transactionId }}</span>
+            </el-form-item>
+            <el-form-item label="原订单号:">
+              <span style="display: block;min-width: 250px;">{{ form.orderId }}</span>
+            </el-form-item>
+          </div>
+          <div style="display: flex;">
+            <el-form-item label="原订单金额:">
+              <span style="display: block;min-width: 250px;">{{ form.orderAmount }}</span>
+            </el-form-item>
+            <el-form-item label="规格:">
+              <span style="display: block;min-width: 250px;">{{ form.goodsName }}</span>
+            </el-form-item>
+            <el-form-item label="订单来源:">
+              <span style="display: block;min-width: 250px;">
+                <dict-tag :options="dict.type.tourism_ticketOrders_source" :value="form.source"/>
+              </span>
+            </el-form-item>  
+          </div>
+          <div style="display: flex;">
+            <el-form-item label="门票名称:">
+              <span style="display: block; min-width: 250px;">{{ form.performName }}</span>
+            </el-form-item>
+            <el-form-item label="下单时间:">
+              <span style="display: block;min-width: 250px;">{{ form.createTime }}</span>
+            </el-form-item>
+          </div>
+          <div class="form-title"><span>购票人信息</span></div>
+          <div style="display: flex;">
+            <el-form-item label="购票人名称:">
+              <span style="display: block;min-width: 250px;">{{ form.refundName }}</span>
+            </el-form-item>
+            <el-form-item label="购票人手机号:">
+              <span style="display: block;min-width: 250px;">{{ form.refundMobile }}</span>
+            </el-form-item>
+          </div>
+          <div class="form-title"><span>退款信息</span></div>
+          <div style="display: flex;">
+            <el-form-item label="退款单号:">
+              <span style="display: block;min-width: 250px;">{{ form.refundNo }}</span>
+            </el-form-item>
+            <el-form-item label="退款金额:">
+              <span style="display: block;min-width: 250px;">{{ form.refundAmount }}</span>
+            </el-form-item>
+            <el-form-item label="退款原因:">
+              <span style="display: block;min-width: 250px;">{{ form.refundReason }}</span>
+            </el-form-item>
+          </div>
+          <div style="display: flex;">
+            <el-form-item label="退款申请时间:">
+              <span style="display: block;min-width: 250px;">{{ form.refundTime }}</span>
+            </el-form-item>
+            <el-form-item label="退款状态:">
+              <span style="display: block;min-width: 250px;">
+                <dict-tag :options="dict.type.tourism_orderRefund_status" :value="form.status"/>
+              </span>
+            </el-form-item>
+            <el-form-item label="退款成功时间:">
+              <span style="display: block;min-width: 250px;">{{ form.refundSuccessTime }}</span>
+            </el-form-item>
+          </div>
+          <div style="display: flex;" v-if="form.errReason && model!='DEATILSADD'">
+            <el-form-item label="驳回原因:">
+              <span style="display: block;min-width: 250px;">{{ form.errReason }}</span>
+            </el-form-item>
+          </div>
+          <div v-if="model=='DEATILSADD'">
+            <div class="form-title"><span>审核操作</span></div>
+              <div>
+                <el-form-item label="审核备注:" :error="errorText" label-width="100px"><span style="color: #ccc;">(注:驳回时要填写驳回原因)</span></el-form-item>
+                <div>
+                  <el-input
+                    type="textarea"
+                    :rows="2"
+                    placeholder="请输入审核备注"
+                    v-model="form.errReason">
+                  </el-input>
+                </div>
+              </div>
+              <div style="display: flex;margin-top: 10px;justify-content: center;">
+                <el-button 
+                type="danger" 
+                @click="refundAudit(2)"
+                :loading="loading"
+                >驳回退款</el-button>
+                <el-button type="primary" :loading="loading" @click="refundAudit(1)">同意退款</el-button>
+              </div>
+          </div>
+        </el-form>
+      </div>
+    </div>
+    <!-- <span slot="footer" class="dialog-footer" v-if="formStatus==1">
+      <el-button @click="cancel">关闭</el-button>
+    </span> -->
+    <!-- 添加或修改对话框 End -->
+  </el-dialog>
+</template>
+
+<script>
+import { 
+  getTableDeatilsByIdApi,
+  addTableApi
+ } from '@/api/CURD'
+
+export default {
+  name: "addAndEdit",
+  dicts: ['tourism_orderRefund_status','tourism_ticketOrders_source'],
+  data() {
+    return {
+      title: "",
+      model: "", // EDIT: 编辑模式 ADD : 新增模式  EDITInit : 编辑模式(需要请求详情)
+      open: false,
+      loading: false,
+      loadingText: "拼命加载数据中...",
+      formStatus: null, // 0/null : 加载中 1 : 获取详情成功 2  : 获取详情失败 
+      configUrl: {
+        add: '', // 新增地址
+        details: '/merchant/orderBackAfter/selectById', // 详情地址
+        edit: '', // 编辑地址
+        refundAudit: '/merchant/orderBackAfter/afterAudit',// 审核接口
+      },
+      form: {
+        id: undefined,
+      },
+      rules: {},
+      scenicAreaProducts: [],// 景点产品关联
+      errorText: '', // 驳回原因
+    };
+  },
+  methods: {
+    async initData(title , model, row){
+      this.title = title
+      this.open = true
+      this.loadingText = "拼命加载数据中..."
+      this.loading = true
+      this.actionUrlLoading = false
+      this.model = model
+      this.formStatus = 0
+      this.errorText = ''
+      if(model=='DEATILSADD') { // 新增
+        this.$set(this,'form',{...row})
+        this.formStatus = 1
+      }else if(model=='DEATILS') { // 新增
+        let obj = {
+          ...row
+        }
+        this.$set(this,'form',obj)
+        this.formStatus = 1
+      }else if(model=='DEATILSInit') { // 新增
+        await this.getTableDeatilsFun(row)
+      }
+      this.loading = false
+      this.$nextTick(()=>{
+        if(this.$refs["form"]) {
+          this.$refs["form"].clearValidate();
+        }
+      })
+    },
+    /** 获取详情 */
+    async getTableDeatilsFun(row) {
+      const id = row.id
+      this.loading = true
+      try {
+        let res = await getTableDeatilsByIdApi(this.configUrl.details,{id})
+        if(res.code == 200) {
+          let obj = {
+            ...res.data,
+            imgUrl: res.data.imgUrl?res.data.imgUrl.split(','):[],
+        }
+          this.$set(this,'form',JSON.parse(JSON.stringify(obj)))
+          this.formStatus = 1
+        }else {
+          this.$message.error('获取详情失败!!!');
+          this.formStatus = 2
+          this.loading = false
+          this.open = false;
+        }
+        this.loading = false
+      } catch (error) {
+        console.error('获取详情失败!!!!',error)
+        this.formStatus = 2
+        this.loading = false
+        this.open = false;
+      }
+    },
+    /**
+     * 重置
+     * @date 2023-11-22
+     * @returns {any}
+     */
+    reset() {
+      if(this.$refs["form"]) {
+        this.$refs["form"].clearValidate();
+      }
+    },
+    /**
+     * 关闭弹框
+     * @date 2023-11-22
+     * @returns {any}
+     */
+    cancel() {
+      this.reset();
+      this.open = false;
+    },
+    /**  审核操作  */
+    refundAudit(type){
+      if(type==2 && !this.form.errReason) {
+        this.errorText = '驳回时请输入驳回原因'
+        return
+      }
+      addTableApi(
+        this.configUrl.refundAudit,{
+          id: this.form.id,// 退款ID-列表ID
+          status: type,
+          errReason: this.form.errReason,
+        }).then(response => {
+          this.$modal.msgSuccess(`提交成功`);
+          this.loading = false
+          this.open = false;
+          this.$emit('refresh')
+        }).catch(()=>{
+          this.$message.error("提交失败!!!");
+          this.loading = false
+        })
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.form-dialog-box {
+  padding: 0 30px;
+  padding: 0 30px;
+  min-height: 50vh;
+  max-height: 80vh;
+  overflow-y: auto;
+  >div {
+    width: 100%;
+    min-height: 50vh;
+  }
+  .form-title {
+    padding: 0 0 10px 0;
+    span {
+      display: flex;
+      color: rgba(65,80,88,1);
+      font-size: 16px;
+      font-family: SourceHanSansSC;
+      font-weight: 700;
+      line-height: 23px;
+      border-left: 4px solid rgb(22, 132, 252);
+      padding-left: 10px;
+    }
+    
+  }
+  ::v-deep .ql-editor {
+    height: 400px;
+  }
+  .upload-btn {
+    width: 100px;
+    height: 100px;
+    background-color: #fbfdff;
+    border: dashed 1px #c0ccda;
+    border-radius: 5px;
+    i {
+      font-size: 30px;
+      margin-top: 20px;
+    }
+    &-text {
+      margin-top: -10px;
+    }
+  }
+  .avatar {
+    cursor: pointer;
+  }
+}
+.el-table{
+  .upload-btn {
+    width: 100px;
+    height: 100px;
+    background-color: #fbfdff;
+    border: dashed 1px #c0ccda;
+    border-radius: 5px;
+    i {
+      font-size: 30px;
+      margin-top: 20px;
+    }
+    &-text {
+      margin-top: -10px;
+    }
+  }
+  .avatar {
+    cursor: pointer;
+  }
+}
+
+.area-container {
+  min-height: 400px;
+}
+
+::v-deep .area-wrap-city.el-cascader {
+  line-height: normal;
+  .el-input {
+    cursor: pointer;
+    width: 100% !important;
+    height: 28px !important;
+    .el-input__inner {
+      display: none !important;
+    }
+    span.el-input__suffix {
+      position: inherit !important;
+      i.el-input__icon {
+        line-height: inherit;
+        margin-left: 5px;
+      }
+    }
+
+    .el-input__wrapper {
+      box-shadow: none;
+      input {
+        display: none;
+      }
+    }
+  }
+
+  .el-cascader__tags {
+    display: none;
+  }
+}
+
+.area-city-popper {
+  .el-cascader-panel {
+    .el-scrollbar.el-cascader-menu {
+      .el-cascader-menu__wrap.el-scrollbar__wrap {
+        height: 315px;
+      }
+    }
+  }
+}
+::v-deep .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+  ::v-deep .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+  ::v-deep .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 100px;
+    height: 100px;
+    line-height: 100px;
+    text-align: center;
+  }
+  ::v-deep .avatar {
+    width: 100px;
+    height: 100px;
+    display: block;
+  }
+</style>
+<style>
+.custom-class-box {
+  z-index: 999999 !important;
+}
+</style>

+ 343 - 0
src/views/tourism/financialManagement/ticketRorceRefundOrder.vue

@@ -0,0 +1,343 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--用户数据-->
+      <el-col :span="24" :xs="24">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="订单号">
+              <el-input
+              v-model="queryParams.orderId"
+              placeholder="请输入原订单号"
+              clearable
+              style="width: 240px;"
+              @keyup.enter.native="handleQuery"
+              />
+          </el-form-item>
+          <el-form-item label="手机号码">
+              <el-input
+              v-model="queryParams.refundMobile"
+              placeholder="请输入手机号码"
+              clearable
+              style="width: 240px;"
+              @keyup.enter.native="handleQuery"
+              />
+          </el-form-item>
+          <el-form-item label="退款申请时间" prop="time" label-width="100px">
+              <el-date-picker
+              v-model="queryParams.time"
+              type="datetimerange"
+              range-separator="至"
+              start-placeholder="开始日期"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              end-placeholder="结束日期">
+              </el-date-picker>
+          </el-form-item>
+          <el-form-item label="退款状态">
+              <el-select
+              v-model="queryParams.status"
+              placeholder="退款状态"
+              clearable
+              style="width: 100%"
+              >
+              <el-option
+                  v-for="dict in dict.type.tourism_orderRefund_status"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+              />
+              </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="configPermi.export"
+            >导出</el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="tableList" @selection-change="handleSelectionChange">
+          <el-table-column type="index" label="序号" align="center"  />
+          <el-table-column label="订单号" align="center" key="orderId" prop="orderId" v-if="columns[0].visible" :show-overflow-tooltip="true">
+            <template slot-scope="scope">
+                <span @click="handleOrderDetails(scope.row)" style="color: #1890ff;cursor: pointer;">{{ scope.row.orderId }}</span>
+              </template>
+          </el-table-column>
+          <el-table-column label="退款单号" align="center" key="refundNo" prop="refundNo" v-if="columns[1].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="支付单号" align="center" key="transactionId" prop="transactionId" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="购票人手机号" align="center" key="refundMobile" prop="refundMobile" v-if="columns[3].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="门票名称" align="center" key="performName" prop="performName" v-if="columns[4].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="规格" align="center" key="goodsName" prop="goodsName" v-if="columns[5].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="购票渠道" align="center" key="source" prop="source" v-if="columns[6].visible" :show-overflow-tooltip="true">
+              <template slot-scope="scope">
+                  <dict-tag :options="dict.type.tourism_ticketOrders_source" :value="scope.row.source"/>
+              </template>
+          </el-table-column>
+          <el-table-column label="退款申请时间" align="center" key="refundTime" prop="refundTime" v-if="columns[7].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="退款金额" align="center" key="refundAmount" prop="refundAmount" v-if="columns[8].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="申请原因" align="center" key="refundReason" prop="refundReason" v-if="columns[9].visible" :show-overflow-tooltip="true" />
+          <el-table-column label="退款状态" align="center" key="status" prop="status" v-if="columns[10].visible" :show-overflow-tooltip="true">
+              <template slot-scope="scope">
+                  <dict-tag :options="dict.type.tourism_orderRefund_status" :value="scope.row.status"/>
+              </template>
+          </el-table-column>
+          <el-table-column
+            label="操作"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope" >
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-document"
+                @click="handleDetails(scope.row)"
+                v-hasPermi="configPermi.details"
+              >详情</el-button>
+              <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-coordinate"
+              v-if="scope.row.status == 0"
+              @click="refundAuditFun(scope.row)"
+              v-hasPermi="configPermi.refund"
+              >审核</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+    <!--  详情  -->
+    <detailsBox ref="detailsBox" @refresh="getList" />
+    <!--  原订单详情 -->
+    <detailsOrderBox ref="detailsOrderBox" @refresh="getList" />
+  </div>
+</template>
+
+<script>
+import { 
+  listTableApi, 
+  delTableParamsApi, 
+  updateTableApi
+} from "@/api/CURD";
+import detailsBox from "./detailsBox/ticketRorecRefundOrderDetails.vue"
+import detailsOrderBox from "./detailsBox/ticketOrdersDetails.vue"
+export default {
+  name: "User",
+  dicts: ['tourism_orderRefund_status','tourism_ticketOrders_source'],
+  components: {detailsBox,detailsOrderBox},
+  data() {
+    return {
+      title: "门票退款管理",// 通用标题
+      configPermi: {
+        add: [''], // 新增权限
+        details: ['financialManagement:ticketRorceRefundOrder:details'], // 详情权限
+        delect: [''], // 删除权限
+        edit: [''], // 编辑权限
+        upload: [''],// 导入权限
+        export: ['financialManagement:ticketRorceRefundOrder:export'],// 导出权限
+        refund: ['financialManagement:ticketRorceRefundOrder:refund']
+      },
+      configUrl: {
+        list: '/merchant/orderBackAfter/pageList', // 列表地址
+        delect: '', // 删除地址
+        upload: '',// 导入地址
+        download:'', // 下载模板地址
+        export: '/order/orderRefund/exportExcel',// 导出地址
+        edit: '/merchant/merchantTourRoute/updateStatus', // 编辑地址
+      },
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户表格数据
+      tableList: null,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      dateRange: [],
+      // 控制列表是否显示
+      columns: [
+        { key: 0, label: `订单号`, visible: true },
+        { key: 1, label: `退款号`, visible: true },
+        { key: 2, label: `支付单号`, visible: true },
+        { key: 3, label: `购票人手机号`, visible: true },
+        { key: 4, label: `门票名称`, visible: true },
+        { key: 5, label: `规格`, visible: true },
+        { key: 6, label: `购票渠道`, visible: true },
+        { key: 7, label: `退款申请时间`, visible: true },
+        { key: 8, label: `退款金额`, visible: true },
+        { key: 9, label: `申请原因`, visible: true },
+        { key: 10, label: `退款状态`, visible: true },
+      ],
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询用户列表 */
+    getList() {
+      this.loading = true;
+      let params = JSON.parse(JSON.stringify({
+          ...this.queryParams,
+          refundStartCreateTime: this.queryParams.time&&this.queryParams.time[0]?this.queryParams.time[0]:null,
+          refundEndCreateTime: this.queryParams.time&&this.queryParams.time[1]?this.queryParams.time[1]:null,
+      }))
+      delete params.time;
+      listTableApi(
+        this.configUrl.list,
+        this.addDateRange(
+          params,
+          this.dateRange)).then(response => {
+            this.tableList = response.data.rows;
+            this.total = response.data.total;
+            this.loading = false;
+        }
+      ).catch (error=>{
+        console.error('获取列表失败!!!!',error)
+        this.tableList = [];
+        this.total = 0;
+        this.loading = false
+      }) 
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+      }
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      if(this.$refs.addAndEdit) {
+        this.$refs.addAndEdit.initData(this.title + '新增', "ADD",{})
+      }
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      if(this.$refs.addAndEdit) {
+        this.$refs.addAndEdit.initData(this.title + '编辑', "EDITInit",{...row})
+      }
+    },
+    /**    */
+    handleDetails(row){
+      if(this.$refs.detailsBox) {
+        this.$refs.detailsBox.initData(this.title + '详情',"DEATILS", row)
+      }
+    },
+    handleOrderDetails(row){
+        if(this.$refs.detailsBox) {
+          this.$refs.detailsOrderBox.initData(this.title + '详情', "EDITInit",{...row})
+        }
+    },
+    /**    */
+    refundAuditFun(row){
+      if(this.$refs.detailsBox) {
+        this.$refs.detailsBox.initData(this.title + '审核',"DEATILSADD", row)
+      }
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除数据项?').then( () => {
+        return delTableParamsApi(this.configUrl.delect,{
+          id: ids
+        });
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch((e) => {
+        console.error("删除失败====",e)
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      
+      let params = JSON.parse(JSON.stringify({
+          ...this.queryParams,
+          refundTimeStart: this.queryParams.time&&this.queryParams.time[0]?this.queryParams.time[0]:null,
+          refundTimeEnd: this.queryParams.time&&this.queryParams.time[1]?this.queryParams.time[1]:null,
+      }))
+      delete params.time;
+      delete params.pageSize;
+      delete params.pageNum;
+      this.downloadGet(this.configUrl.export, {
+        ...params
+      }, `${this.title }_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      if(this.$refs.upload) {
+        this.$refs.upload.initData({
+          width: '400px',
+          // 弹出层标题(用户导入)
+          title: this.title + "导入",
+          // 下载模板地址
+          importTemplate: this.configUrl.download,
+          // 上传的地址
+          url: this.configUrl.upload
+        })
+      }
+    },
+    /** 开/闭 园 */
+    openAttraction(row) {
+      console.log("row======",row)
+      this.$modal.confirm(`是否确认${row.status == 1 ? '关闭' : '打开'} ${row.titleName}吗?`).then( () => {
+        return updateTableApi(this.configUrl.edit,{
+          ...row,
+          status: row.status == 1 ? 0 : 1
+        });
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess(`${row.status == 1 ? '打开' : '关闭'}成功`);
+      }).catch((e) => {
+        console.error("失败====",e)
+      });
+    },
+  }
+};
+</script>

+ 61 - 2
src/views/tourism/marketingActivities/formBox/eventManagementForm.vue

@@ -117,6 +117,54 @@
                     @submitForm="()=>$refs.form.validateField('performVoList')">
                 </selectMoreBox>
               </el-form-item>
+              <el-form-item label="酒店房型:" prop="hotelVoList">
+                <selectMoreBox 
+                    v-model="form.hotelVoList"
+                    title="新增酒店房型" 
+                    listUrl="/goods/goodsHotel/pageList"
+                    nameKey="goodsName"
+                    selectKey="goodsName"
+                    :showKeys="['shopName','name']"
+                    showKeysJoin="-"
+                    idKey="id"
+                    :params="{
+                      goodsType: 5
+                    }"
+                    @submitForm="()=>$refs.form.validateField('hotelVoList')">
+                </selectMoreBox>
+              </el-form-item>
+              <el-form-item label="餐饮菜品:" prop="cateringVoList">
+                <selectMoreBox 
+                    v-model="form.cateringVoList"
+                    title="新增餐饮菜品" 
+                    listUrl="/merchant/merchantPerformAuditorium/shopGoodsList"
+                    nameKey="goodsName"
+                    selectKey="goodsName"
+                    idKey="goodsId"
+                    :showKeys="['shopName','name']"
+                    showKeysJoin="-"
+                    :params="{
+                      goodsType: 4
+                    }"
+                    @submitForm="()=>$refs.form.validateField('cateringVoList')">
+                </selectMoreBox>
+              </el-form-item>
+              <el-form-item label="文创商品:" prop="creativeVoList">
+                <selectMoreBox 
+                    v-model="form.creativeVoList"
+                    title="新增文创商品" 
+                    listUrl="/merchant/merchantPerformAuditorium/shopGoodsList"
+                    nameKey="goodsName"
+                    selectKey="goodsName"
+                    idKey="goodsId"
+                    :showKeys="['shopName','name']"
+                    showKeysJoin="-"
+                    :params="{
+                      goodsType: 3
+                    }"
+                    @submitForm="()=>$refs.form.validateField('creativeVoList')">
+                </selectMoreBox>
+              </el-form-item>
           </div>
         </el-form>
       </div>
@@ -174,8 +222,10 @@ export default {
         templateId: [{ required: true, message: "请选择模板", trigger: ["change","blur"] }],
         couponVoList: [{ required: false, message: "请选择优惠券", trigger: ["change","blur"] }],
         performVoList: [{ required: false, message: "请选择景区门票", trigger: ["change","blur"] }],
+        hotelVoList: [{ required: false, message: "请选择酒店商品", trigger: ["change","blur"] }],
+        cateringVoList: [{ required: false, message: "请选择餐饮商品", trigger: ["change","blur"] }],
+        creativeVoList: [{ required: false, message: "请选择文创商品", trigger: ["change","blur"] }],
       },
-
       activeName: 'first',
 
       actionUrl: process.env.VUE_APP_BASE_API + process.env.VUE_APP_UPLOAD_IMAGE,
@@ -201,6 +251,9 @@ export default {
           image: [],
           couponVoList: [],
           performVoList: [],
+          hotelGoodsIdList: [],
+          cateringGoodsIdList: [],
+          creativeGoodsIdList: []
         })
         this.formStatus = 1
       }else if(model=='EDIT') { // 新增
@@ -234,6 +287,7 @@ export default {
             eventTime: [res.data.startDate,res.data.endDate], // 发放时间段
             image: res.data.image?res.data.image.split(','):[],
           }
+
           this.$set(this,'form',JSON.parse(JSON.stringify(obj)))
           this.formStatus = 1
         }else {
@@ -281,10 +335,15 @@ export default {
 
           param['couponIdList'] = this.form.couponVoList.map((item)=> item.id)
           param['performIdList'] = this.form.performVoList.map((item)=> item.id)
-
+          param['hotelGoodsIdList']= this.form.hotelVoList.map((item)=> item.id)
+          param['cateringGoodsIdList']= this.form.cateringVoList.map((item)=> item.id)
+          param['creativeGoodsIdList']= this.form.creativeVoList.map((item)=> item.id)
           delete param.eventTime
           delete param.couponVoList
           delete param.performVoList
+          delete param.hotelVoList
+          delete param.creativeVoList
+          delete param.cateringVoList
           if (this.model != 'ADD') {
             addTableApi(
               this.configUrl.edit,{

+ 0 - 1
src/views/tourism/marketingActivities/model/selectCouponManagement.vue

@@ -158,7 +158,6 @@ export default {
     watch: {
         value: {
             handler(newValue){
-                console.log("dfsdsfsdf====",this.value)
                 if(this.value) {
                     this.modalDetails = JSON.parse(JSON.stringify(this.value))
                 }else {

+ 0 - 1
src/views/tourism/marketingActivities/model/selectMemberInformation.vue

@@ -154,7 +154,6 @@ export default {
     watch: {
         value: {
             handler(newValue){
-                console.log("dfsdsfsdf====",this.value)
                 if(this.value) {
                     this.modalDetails = JSON.parse(JSON.stringify(this.value))
                 }else {

+ 0 - 1
src/views/tourism/marketingActivities/model/selectMembershipLevel.vue

@@ -154,7 +154,6 @@ export default {
     watch: {
         value: {
             handler(newValue){
-                console.log("dfsdsfsdf====",this.value)
                 if(this.value) {
                     this.modalDetails = JSON.parse(JSON.stringify(this.value))
                 }else {

+ 0 - 1
src/views/tourism/marketingActivities/model/selectMoreBox.vue

@@ -181,7 +181,6 @@ export default {
     watch: {
         value: {
             handler(newValue){
-                console.log("dfsdsfsdf====",this.value)
                 if(this.value) {
                     this.modalDetails = JSON.parse(JSON.stringify(this.value))
                 }else {

+ 0 - 1
src/views/tourism/marketingActivities/model/selectTicketOrders.vue

@@ -154,7 +154,6 @@ export default {
     watch: {
         value: {
             handler(newValue){
-                console.log("dfsdsfsdf====",this.value)
                 if(this.value) {
                     this.modalDetails = JSON.parse(JSON.stringify(this.value))
                 }else {

+ 292 - 34
src/views/tourism/membershipManagement/electronicMembership/formBox/membershipLevelForm.vue

@@ -2,7 +2,7 @@
   <el-dialog
     :title="title"
     :visible.sync="open"
-    width="75%"
+    width="95%"
     append-to-body
     :close-on-click-modal="false"
     @close="cancel"
@@ -72,20 +72,25 @@
           <div class="form-title"><span>会员权益</span></div>
           <el-form-item label="折扣权益:">
             <div style="display: flex;align-items: center;">
-              <el-form-item label="基本折扣:" prop="discount" label-width="100px">
+              <el-form-item label="基本折扣:" prop="discount" label-width="150px">
                 <el-input-number style="width: 150px;" v-model="form.discount" controls-position="right" placeholder="请输入基本折扣"></el-input-number>
                 <span style="padding-bottom: 15px;">%</span>
               </el-form-item>
-              <el-button style="margin-left: 15px;" v-if="!form.classifyList||form.classifyList.length==0" type="primary" @click="addClassifyList">添加单品</el-button>
             </div>
             
+            <!-- 门票折扣 -->
+            <div v-if="!form.classifyList||form.classifyList.length==0" style="margin-top: 20px;">
+              <el-form-item label="门票折扣" label-width="150px">
+                <el-button style="margin-left: 15px;" type="primary" @click="addClassifyList('classifyList')">添加门票</el-button>
+              </el-form-item>
+            </div>
             <div v-for="(item,index) in form.classifyList" :key="index" style="margin-top: 10px;display: flex;align-items: center;">
-              <el-form-item label="单品折扣:" label-width="100px">
+              <el-form-item :label="index == 0 ? '门票折扣:':''" label-width="150px">
                 <el-select 
                 v-model="form.classifyList[index].classifyId" 
                 clearable 
-                placeholder="请选择单品"
-                @visible-change="visibleChange"
+                placeholder="请选择门票"
+                @visible-change="(type)=> visibleChange(type,'scenicAreaProducts','classifyList','performId','classifyId')"
                 >
                   <el-option
                     v-for="item in scenicAreaProducts"
@@ -96,11 +101,121 @@
                     >
                   </el-option>
                 </el-select>
-                <el-input-number style="width: 150px;margin-left: 20px;" v-model="form.classifyList[index].discount" placeholder="请输入单品折扣" controls-position="right"></el-input-number>
+                <el-input-number style="width: 150px;margin-left: 20px;" v-model="form.classifyList[index].discount" placeholder="请输入门票折扣" controls-position="right"></el-input-number>
                 <span style="padding-bottom: 15px;">%</span>
               </el-form-item>
-              <el-button style="margin-left: 15px;" v-if="form.classifyList.length==(index+1)" type="primary" @click="addClassifyList">添加单品</el-button>
-              <el-button style="margin-left: 15px;" type="danger" @click="clearClassifyList(index)">移除</el-button>
+              <el-button style="margin-left: 15px;" v-if="form.classifyList.length==(index+1)" type="primary" @click="addClassifyList('classifyList')">添加门票</el-button>
+              <el-button style="margin-left: 15px;" type="danger" @click="clearClassifyList('classifyList',index)">移除</el-button>
+            </div>
+
+            <!-- 酒店品类折扣 -->
+            <div v-if="!form.hotelList||form.hotelList.length==0" style="margin-top: 20px;">
+              <el-form-item label="酒店品类折扣" label-width="150px">
+                <el-button style="margin-left: 15px;" type="primary" @click="addClassifyList('hotelList')">添加门票</el-button>
+              </el-form-item>
+            </div>
+            <div v-for="(item,index) in form.hotelList" :key="'hotel'+index" style="margin-top: 10px;display: flex;align-items: center;">
+              <el-form-item :label="index == 0 ? '酒店品类折扣:':''" label-width="150px">
+                <el-select 
+                v-model="form.hotelList[index].classifyParentId" 
+                clearable 
+                placeholder="请选择酒店品类"
+                @change="(value) => visibleChange1('hotelList','hoteClassList',index)"
+                >
+                  <el-option
+                    v-for="item in hotelParentList"
+                    :key="item.id + index + 'sdfsdfsfsd'"
+                    :label="item.name"
+                    :value="item.id"
+                    >
+                  </el-option>
+                </el-select>
+                <selecteNew 
+                style="margin-left: 20px;"
+                v-model="form.hotelList[index].classInfo"
+                :list="hoteClassList"
+                placeholder="请选择酒店品类房型"
+                :getDataFun="(page)=> getDataFun(page,configUrl.hotelListClass,5,index,'hoteClassList','hotelList','id','classifyId')"
+                 />
+                <el-input-number style="width: 150px;margin-left: 20px;" v-model="form.hotelList[index].discount" placeholder="请输入酒店品类折扣" controls-position="right"></el-input-number>
+                <span style="padding-bottom: 15px;">%</span>
+              </el-form-item>
+              <el-button style="margin-left: 15px;" v-if="form.hotelList.length==(index+1)" type="primary" @click="addClassifyList('hotelList')">添加酒店品类</el-button>
+              <el-button style="margin-left: 15px;" type="danger" @click="clearClassifyList('hotelList',index)">移除</el-button>
+            </div>
+
+            <!-- 餐饮品类折扣 -->
+            <div v-if="!form.foodList||form.foodList.length==0" style="margin-top: 20px;">
+              <el-form-item label="餐饮品类折扣" label-width="150px">
+                <el-button style="margin-left: 15px;" type="primary" @click="addClassifyList('foodList')">添加门票</el-button>
+              </el-form-item>
+            </div>
+            <div v-for="(item,index) in form.foodList" :key="'food'+index" style="margin-top: 10px;display: flex;align-items: center;">
+              <el-form-item :label="index == 0 ? '餐饮品类折扣:':''" label-width="150px">
+                <el-select 
+                v-model="form.foodList[index].classifyParentId" 
+                clearable 
+                placeholder="请选择餐饮品类"
+                @change="(value) => visibleChange1('foodList','foodClassList',index)"
+                >
+                  <el-option
+                    v-for="item in foodParentList"
+                    :key="item.id + index + 'sdfsdfsfsd1'"
+                    :label="item.name"
+                    :value="item.id"
+                    >
+                  </el-option>
+                </el-select>
+                <selecteNew 
+                  style="margin-left: 20px;"
+                  v-model="form.foodList[index].classInfo"
+                  :list="foodClassList"
+                  idKey="goodsId"
+                  placeholder="请选择菜品"
+                  :getDataFun="(page)=> getDataFun(page,configUrl.foodListClass,4,index,'foodClassList','foodList','goodsId','classifyId')"
+                 />
+                <el-input-number style="width: 150px;margin-left: 20px;" v-model="form.foodList[index].discount" placeholder="请输入餐饮品类折扣" controls-position="right"></el-input-number>
+                <span style="padding-bottom: 15px;">%</span>
+              </el-form-item>
+              <el-button style="margin-left: 15px;" v-if="form.foodList.length==(index+1)" type="primary" @click="addClassifyList('foodList')">添加餐饮品类</el-button>
+              <el-button style="margin-left: 15px;" type="danger" @click="clearClassifyList('foodList',index)">移除</el-button>
+            </div>
+
+            <!-- 餐饮品类折扣 -->
+            <div v-if="!form.productList||form.productList.length==0" style="margin-top: 20px;">
+              <el-form-item label="文创品类折扣" label-width="150px">
+                <el-button style="margin-left: 15px;" type="primary" @click="addClassifyList('productList')">添加门票</el-button>
+              </el-form-item>
+            </div>
+            <div v-for="(item,index) in form.productList" :key="'product'+index" style="margin-top: 10px;display: flex;align-items: center;">
+              <el-form-item :label="index == 0 ? '文创品类折扣:':''" label-width="150px">
+                <el-select 
+                v-model="form.productList[index].classifyParentId" 
+                clearable 
+                placeholder="请选择文创品类"
+                @change="(value) => visibleChange1('productList','productParentList',index)"
+                >
+                  <el-option
+                    v-for="item in productParentList"
+                    :key="item.id + index + 'sdfsdfsfsd1'"
+                    :label="item.name"
+                    :value="item.id"
+                    >
+                  </el-option>
+                </el-select>
+                <selecteNew 
+                style="margin-left: 20px;"
+                v-model="form.productList[index].classInfo"
+                :list="productClassList"
+                idKey="goodsId"
+                placeholder="请选择文创类品商品"
+                :getDataFun="(page)=> getDataFun(page,configUrl.productListClass,3,index,'productClassList','productList','goodsId','classifyId')"
+                 />
+                <el-input-number style="width: 150px;margin-left: 20px;" v-model="form.productList[index].discount" placeholder="请输入文创品类折扣" controls-position="right"></el-input-number>
+                <span style="padding-bottom: 15px;">%</span>
+              </el-form-item>
+              <el-button style="margin-left: 15px;" v-if="form.productList.length==(index+1)" type="primary" @click="addClassifyList('productList')">添加文创品类</el-button>
+              <el-button style="margin-left: 15px;" type="danger" @click="clearClassifyList('productList',index)">移除</el-button>
             </div>
           </el-form-item>
           <el-form-item label="积分权益:">
@@ -165,10 +280,11 @@ import {
   addTableApi
  } from '@/api/CURD'
  import selectMoreBox from '../model/selectMoreBox.vue';
+ import selecteNew from '@/myComponents/selecteNew.vue';
 export default {
   name: "addAndEdit",
   dicts: [],
-  components: {selectMoreBox},
+  components: {selectMoreBox,selecteNew},
   data() {
     return {
       title: "",
@@ -181,7 +297,13 @@ export default {
         add: '/member/memberLevelInfo/insertOrUpdate', // 新增地址
         details: '/member/memberLevelInfo/selectById', // 详情地址
         edit: '/member/memberLevelInfo/insertOrUpdate', // 编辑地址
-        list: '/merchant/merchantPerformAuditorium/merchantPerformList'
+        list: '/merchant/merchantPerformAuditorium/merchantPerformList', // 门票类商品
+
+        pinglei: '/merchant/merchantShop/pageList', // 获取品类 和 酒店商品
+        hotelListClass: '/goods/goodsHotel/pageList', // 酒业商品
+        foodListClass: '/merchant/merchantPerformAuditorium/shopGoodsList', // 获取餐饮商品
+        productListClass: '/merchant/merchantPerformAuditorium/shopGoodsList', // 获取餐饮商品
+
       },
       form: {
         id: undefined,
@@ -193,7 +315,16 @@ export default {
         discount: [{ required: true, message: "请输入基本折扣", trigger: ["change","blur"] }],
         integralRatio: [{ required: true, message: "请输入积分成长系数", trigger: ["change","blur"] }],
       },
-      scenicAreaProducts: [],// 景点产品关联
+      scenicAreaProducts: [],// 景点门票产品关联
+
+      hotelParentList: [], // 酒店列表
+      hoteClassList: [], // 酒店房型列表
+
+      foodParentList: [], // 餐饮列表
+      foodClassList: [], // 餐饮房型列表
+
+      productParentList: [], // 文创品类列表
+      productClassList: [], // 文创品类房型列表
 
       //  上传文件
       actionUrl: process.env.VUE_APP_BASE_API + process.env.VUE_APP_UPLOAD_IMAGE,
@@ -209,7 +340,10 @@ export default {
       this.actionUrlLoading = false
       this.model = model
       this.formStatus = 0
-      this.getList()
+      await this.getList()
+      await this.getPinglei(this.configUrl.pinglei,5,'hotelParentList') // 酒店
+      await this.getPinglei(this.configUrl.pinglei,4,'foodParentList') // 餐饮
+      await this.getPinglei(this.configUrl.pinglei,3,'productParentList') // 文创
       if(model=='ADD') { // 新增
         this.$set(this,'form',{
           ...row,
@@ -247,9 +381,10 @@ export default {
             ...res.data,
             logo: res.data.logo?res.data.logo.split(','):[],
           }
-          if(!obj.classifyList) {
-            obj.classifyList = []
-          }
+          this.setDiscountParams(obj,'classifyList')
+          this.setDiscountParams(obj,'hotelList')
+          this.setDiscountParams(obj,'foodList')
+          this.setDiscountParams(obj,'productList')
           if(obj.couponList && obj.couponList.length>0) {
             let list = []
             obj.couponList.forEach((item,index)=>{
@@ -290,6 +425,18 @@ export default {
         this.open = false;
       }
     },
+    setDiscountParams(obj,key){
+      if(!obj[key]) {
+        obj[key] = []
+      }else {
+        obj[key].forEach((item,index) => {
+          obj[key][index]['classInfo'] = {
+            classifyName: item.classifyName,
+            classifyId: item.classifyId
+          }
+        })
+      }
+    },
     /** 查询用户列表 */
     async getList() {
       try {
@@ -313,8 +460,17 @@ export default {
       this.$refs["form"].validate(valid => {
         if (valid) {
           this.loadingText = "提交数据中..."
-          
           let params = JSON.parse(JSON.stringify(this.form))
+          let hotelList = this.checkClassList(this.form,'hotelList','酒店房型')
+          let foodList = this.checkClassList(this.form,'foodList','酒店房型')
+          let productList = this.checkClassList(this.form,'productList','酒店房型')
+          if(!hotelList || !foodList || !productList){
+            return
+          }else {
+            params['hotelList'] = hotelList
+            params['foodList'] = foodList
+            params['productList'] = productList
+          }
           if(params.classifyList && params.classifyList.length>0) {
             let list = []
             let flog = false
@@ -330,7 +486,7 @@ export default {
               })
             })
             if(flog) {
-              this.$message.error("请选择单品或输入单品折扣!!!");
+              this.$message.error("请选择门票或输入门票折扣!!!");
               return
             }
             params.classifyList = list
@@ -393,6 +549,32 @@ export default {
         }
       });
     },
+    checkClassList(obj,formKey,message){
+      let params = JSON.parse(JSON.stringify(obj))
+      if(params[formKey] && params[formKey].length>0) {
+        let list = []
+        let flog = false
+        params[formKey].forEach((item,index)=>{
+          if((!item.discount&&item.discount!=0) || !item.classInfo.classifyId) {
+            flog = true
+          }else {
+            list[index] = {
+              classifyParentId: item.classifyParentId,
+              ...item.classInfo,
+              discount: item.discount
+            }
+          }
+        })
+        if(flog) {
+          this.$message.error(`请选择${message}或输入${message}折扣!!!`);
+          return false
+        }
+        return list
+      }else {
+        return []
+      }
+
+    },
     /**
      * 重置
      * @date 2023-11-22
@@ -444,31 +626,43 @@ export default {
       this.form.logo.splice(index,1)
     },
 
-    /** 填加单品  */
-    addClassifyList(){
+    /** 填加门票  */
+    addClassifyList(key){
       let list = []
-      if(this.form.classifyList) {
-        list = JSON.parse(JSON.stringify(this.form.classifyList))
+      if(this.form[key]) {
+        list = JSON.parse(JSON.stringify(this.form[key]))
       }
       list.push({
         classifyId: null,
         discount: null,
-        classifyName: null
+        classifyName: null,
+        classInfo: {
+          classifyId: null,
+          classifyName: null,
+        }
       })
-      this.$set(this.form,'classifyList',list)
+      this.$set(this.form,key,list)
     }, 
-    /** 移除单品  */
-    clearClassifyList(index) {
-      this.form.classifyList.splice(index,1)
+    /** 移除门票  */
+    clearClassifyList(key,index) {
+      this.form[key].splice(index,1)
     },
     /**  禁选 */
-    visibleChange(type) {
-      if(type) {
-        let list = JSON.parse(JSON.stringify(this.scenicAreaProducts))
-        this.scenicAreaProducts.forEach((item1,index1)=>{
+    async visibleChange(type,url,goodsType,index,key,keyForm,key1,key2) {
+      if(type && this.form[keyForm][index].classifyParentId) {
+        //this.$refs.selecteNew.setLoading()
+        let res = await listTableApi(url,{
+          shopId:this.form[keyForm][index].classifyParentId,
+          goodsType, 
+          pageSize: 10000,
+          pageNum: 1
+        })
+        this[key] = res.data.rows;
+        let list = JSON.parse(JSON.stringify(this[key]))
+        this[key].forEach((item1,index1)=>{
           let folg = false
-          this.form.classifyList.forEach((item,index)=>{
-            if(item1.performId == item.classifyId) {
+          this.form[keyForm].forEach((item,index)=>{
+            if(item.classInfo[key2] && item1[key1] == item.classInfo[key2]) {
               folg = true
             }
           })
@@ -478,9 +672,73 @@ export default {
             list[index1].disabled = false
           }
         })
-        this.scenicAreaProducts = list
+        return {
+          rows: list,
+          total: res.data.total
+        }
+        // this[key] = list
+      }else {
+        // this[key] = []
+        return {
+          rows: [],
+          total: 0
+        }
       }
       
+    },
+     /**  获取品类的产品 */
+    async visibleChange1(keyForm,keyList,index) {
+      console.log("值发生了改变====")
+      this.form[keyForm][index].classInfo = {}
+      this[keyList] = []
+    },
+    /**  获取品类 */
+    async getPinglei(url,shopType,key) {
+      if(this[key] && this[key].length>0) return
+      try {
+        let res = await listTableApi(
+        url,{shopType, pageSize: 10000,pageNum: 1})
+        this[key] = res.data.rows;
+      } catch (error) {
+        console.error('获取列表失败!!!!',error)
+        this[key] = [];
+      }
+    },
+    async getDataFun(page,url,goodsType,index,key,keyForm,key1,key2) {
+      if(this.form[keyForm][index].classifyParentId) {
+        //this.$refs.selecteNew.setLoading()
+        let res = await listTableApi(url,{
+          shopId:this.form[keyForm][index].classifyParentId,
+          goodsType, 
+          ...page
+        })
+        this[key] = res.data.rows;
+        let list = JSON.parse(JSON.stringify(this[key]))
+        this[key].forEach((item1,index1)=>{
+          let folg = false
+          this.form[keyForm].forEach((item,index)=>{
+            if(item.classInfo[key2] && item1[key1] == item.classInfo[key2]) {
+              folg = true
+            }
+          })
+          if(folg) {
+            list[index1].disabled = true
+          }else {
+            list[index1].disabled = false
+          }
+        })
+        return {
+          rows: list,
+          total: res.data.total
+        }
+        // this[key] = list
+      }else {
+        // this[key] = []
+        return {
+          rows: [],
+          total: 0
+        }
+      }
     }
   },
 };

+ 0 - 1
src/views/tourism/membershipManagement/electronicMembership/model/selectMoreBox.vue

@@ -181,7 +181,6 @@ export default {
     watch: {
         value: {
             handler(newValue){
-                console.log("dfsdsfsdf====",this.value)
                 if(this.value) {
                     this.modalDetails = JSON.parse(JSON.stringify(this.value))
                 }else {

+ 24 - 1
src/views/tourism/membershipManagement/equityCard/detailsBox/equityCardAllocationDetails.vue

@@ -54,6 +54,27 @@
               :label="dict.value">{{dict.label}}</el-checkbox>
             </el-checkbox-group>
           </el-form-item> -->
+          <el-form-item label="不可使用日期类型:" prop="unUsedType">
+            <el-radio-group v-model="form.unUsedType">
+              <el-radio v-if="form.unUsedType == 0" :label="0">不设置</el-radio>
+              <el-radio v-if="form.unUsedType == 1" :label="1">星期</el-radio>
+              <el-radio v-if="form.unUsedType == 2" :label="2">自定义</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item v-if="form.unUsedType==1" label="不可用周期:" prop="unUsedWeek">
+            <tag v-if="form.unUsedWeek.includes(1)">星期一</tag>
+            <tag v-if="form.unUsedWeek.includes(2)">星期二</tag>
+            <tag v-if="form.unUsedWeek.includes(3)">星期三</tag>
+            <tag v-if="form.unUsedWeek.includes(4)">星期四</tag>
+            <tag v-if="form.unUsedWeek.includes(5)">星期五</tag>
+            <tag v-if="form.unUsedWeek.includes(6)">星期六</tag>
+            <tag v-if="form.unUsedWeek.includes(7)">星期天</tag>
+          </el-form-item>
+          <el-form-item v-if="form.unUsedType==2" label="不可使用日期:" prop="cardExdateList">
+            <div v-for="(item,index) in form.cardExdateList" :key="index" style="margin-bottom: 20px;">
+              <span>{{ item.startDate }} - {{ item.endDate }}</span>
+            </div>
+          </el-form-item>
           <div class="form-title"><span>权益规则</span></div>
           <el-form-item label="门票免费:">
             <div v-if="form.benefitList">
@@ -143,7 +164,9 @@ export default {
         if (res.code == 200) {
           let obj = {
             ...res.data,
-            activateType: res.data.activateType?res.data.activateType.split('|'):[]
+            activateType: res.data.activateType?res.data.activateType.split('|'):[],
+            unUsedWeek: res.data.unUsedWeek ? res.data.unUsedWeek.split(',') : [],
+            cardExdateList: res.data.cardExdateList ? res.data.cardExdateList : []
           }
           this.$set(this, 'form', JSON.parse(JSON.stringify(obj)))
           this.radioInputs(obj.validityDay)

+ 1 - 0
src/views/tourism/membershipManagement/equityCard/detailsBox/equityCardManagementUseList.vue

@@ -49,6 +49,7 @@ export default {
       model: "", // EDIT: 编辑模式 ADD : 新增模式  EDITInit : 编辑模式(需要请求详情)
       open: false,
       loading: false,
+      formStatus: null,
       configUrl: {
         add: '', // 新增地址
         details: '/merchant/memberEquityCard/wipeList', // 详情地址

+ 22 - 5
src/views/tourism/membershipManagement/equityCard/equityCardManage.vue

@@ -106,11 +106,9 @@
                 v-hasPermi="configPermi.details"
               >详情</el-button>
               <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" >
-                  <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-if="checkPermi(configPermi.Password) && checkPermi(configPermi.AuthRole)">更多</el-button>
-                  <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-else-if="checkPermi(configPermi.AuthRole) && !checkPermi(configPermi.Password) && scope.row.actStatus != 1">更多</el-button>
-                  <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-else-if="!checkPermi(configPermi.AuthRole) && checkPermi(configPermi.Password)">更多</el-button>
+                  <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-if="checkPermi([...configPermi.Password,...configPermi.AuthRole,...configPermi.sellingCards])">更多</el-button>
                   <el-dropdown-menu slot="dropdown">
-                      <el-dropdown-item command="handleAuthRole" v-if="scope.row.actStatus != 1" icon="el-icon-circle-check"
+                      <el-dropdown-item command="handleAuthRole" :disabled="scope.row.actStatus != 1" icon="el-icon-circle-check"
                       v-hasPermi="configPermi.AuthRole">审核</el-dropdown-item>
                       <!-- <el-dropdown-item command="handleEdit" icon="el-icon-circle-check"
                       v-hasPermi="configPermi.edit">编辑</el-dropdown-item> -->
@@ -118,6 +116,8 @@
                       v-hasPermi="configPermi.Password">重置密码</el-dropdown-item>
                       <el-dropdown-item command="handletUseList" icon="el-icon-circle-check"
                       v-hasPermi="configPermi.useList">使用记录</el-dropdown-item>
+                      <el-dropdown-item command="handletSellingCards" icon="el-icon-circle-check"
+                      v-hasPermi="configPermi.sellingCards">强制销卡</el-dropdown-item>
                   </el-dropdown-menu>
               </el-dropdown>
             </template>
@@ -171,6 +171,7 @@ export default {
         AuthRole: ['equityCard:equityCardManagement:AuthRole'],// 设置审核
         Password: ['equityCard:equityCardManagement:Password'], // 重置密码
         useList: ['equityCard:equityCardManagement:uselist'], // 重置密码
+        sellingCards: ['equityCard:equityCardManagement:sellingCards'] // 强制退卡
       },
       configUrl: {
         list: '/merchant/memberEquityCard/pageList', // 列表地址
@@ -181,6 +182,7 @@ export default {
         updateStatus: '/merchant/memberEquityCard/updateStatus', // 禁用/启用
         resetPassword: '/merchant/memberEquityCard/resetPwd', //重置密码
         listCopy: '/merchant/equityCard', // 卡种
+        sellingCards: '/merchant/memberEquityCard/deleteById'
       },
       // 遮罩层
       loading: true,
@@ -353,6 +355,20 @@ export default {
       }).catch((e) => {
         console.error("失败====",e)
       });
+    },
+    /**  强制销卡   */
+    handletSellingCards(row){
+      this.$modal.confirm(`请问是否要进行退卡,退卡后该卡将不能使用?`).then( () => {
+        return delTableParamsApi(this.configUrl.sellingCards,{
+          id: row.id,
+          status: 0
+        });
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess(`退卡成功`);
+      }).catch((e) => {
+        console.error("失败====",e)
+      });
     },
       handleAuthRole(row) {
           if(this.$refs.detailsBox) {
@@ -376,7 +392,8 @@ export default {
             case "handleResetPassword":
             this.handleResetPassword(row);
             break;
-            case "handletUseList": this.handletUseList(row);
+            case "handletUseList": this.handletUseList(row); break;
+            case "handletSellingCards": this.handletSellingCards(row); break;
             default:
             break;
         }

+ 110 - 7
src/views/tourism/membershipManagement/equityCard/formBox/equityCardAllocationForm.vue

@@ -74,6 +74,39 @@
               :label="dict.value">{{dict.label}}</el-checkbox>
             </el-checkbox-group>
           </el-form-item> -->
+          <el-form-item label="不可使用日期类型:" prop="unUsedType">
+            <el-radio-group v-model="form.unUsedType">
+              <el-radio :label="0">不设置</el-radio>
+              <el-radio :label="1">星期</el-radio>
+              <el-radio :label="2">自定义</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item v-if="form.unUsedType==1" label="不可用周期:" prop="unUsedWeek">
+            <el-checkbox-group v-model="form.unUsedWeek">
+              <el-checkbox label="1">星期一</el-checkbox>
+              <el-checkbox label="2">星期二</el-checkbox>
+              <el-checkbox label="3">星期三</el-checkbox>
+              <el-checkbox label="4">星期四</el-checkbox>
+              <el-checkbox label="5">星期五</el-checkbox>
+              <el-checkbox label="6">星期六</el-checkbox>
+              <el-checkbox label="7">星期天</el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+          <el-form-item v-if="form.unUsedType==2" label="不可使用日期:" prop="cardExdateList">
+            <div v-for="(item,index) in form.cardExdateList" :key="index" style="margin-bottom: 20px;">
+              <el-date-picker
+                v-model="form.cardExdateList[index].data"
+                type="datetimerange"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期">
+              </el-date-picker>
+              <el-button type="primary" style="margin-left: 20px;" v-if="index==form.cardExdateList.length-1" @click="addData">添加</el-button>
+              <el-button type="danger" style="margin-left: 20px;" @click="clearData(index)">移除</el-button>
+            </div>
+            <el-button type="primary" v-if="form.cardExdateList.length == 0" @click="addData">添加</el-button>
+          </el-form-item>
           <div class="form-title"><span>权益规则</span></div>
           <!-- <el-form-item label="门票折扣权益:">
             <div style="display: flex;align-items: center;">
@@ -139,7 +172,9 @@ export default {
         activateType: [0],
         validityType: 0,
         validityDayS: 2,
-        projectId: []
+        projectId: [],
+        unUsedWeek: [],
+        cardExdateList: []
       },
       rules: {
         name: [{ required: true, message: "请输入权益卡名称", trigger: ["change", "blur"] }],
@@ -153,6 +188,9 @@ export default {
         
         benefitList: [{ required: true, message: "请输入基本折扣", trigger: ["change", "blur"] }],
 
+        unUsedType: [{ required: true, message: "请选择不可使用日期类型", trigger: ["change", "blur"] }],
+        unUsedWeek: [{ required: true, message: "请选择不可用周期", trigger: ["change", "blur"] }],
+        cardExdateList: [{ required: true, message: "请选择不可使用日期", trigger: ["change", "blur"] }],
       },
       tableList: [],// 景点产品关联
       scenicAreaProducts: [],
@@ -177,13 +215,25 @@ export default {
           activateType: ["0"],
           validityType: 0,
           validityDayS: 2,
-          projectId: []
+          projectId: [],
+          unUsedWeek: [],
+          cardExdateList: []
         })
         this.radioInputs(this.form.validityDayS)
         this.formStatus = 1
       }else if(model=='EDIT') { // 新增
+        let list = []
+        if(obj.cardExdateList && obj.cardExdateList.length>0){
+          obj.cardExdateList.forEach((item,index)=>{
+            list.push({
+              data: [item.startDate,item.endDate]
+            })
+          })
+        }
         let obj = {
-          ...row
+          ...row,
+          unUsedWeek: row.unUsedWeek?row.unUsedWeek.split(','):[],
+          cardExdateList: list
         }
         this.$set(this,'form',obj)
         this.formStatus = 1
@@ -214,9 +264,19 @@ export default {
       try {
         let res = await getTableDeatilsByIdApi(this.configUrl.details, { id })
         if (res.code == 200) {
+          let list = []
+          if(res.data.cardExdateList && res.data.cardExdateList.length>0){
+            res.data.cardExdateList.forEach((item,index)=>{
+              list.push({
+                data: [item.startDate,item.endDate]
+              })
+            })
+          }
           let obj = {
             ...res.data,
-            activateType: res.data.activateType?res.data.activateType.split('|'):[]
+            activateType: res.data.activateType?res.data.activateType.split('|'):[],
+            unUsedWeek: res.data.unUsedWeek?res.data.unUsedWeek.split(','):[],
+            cardExdateList: list
           }
           obj['projectId'] = []
           if(res.data.benefitList && res.data.benefitList.length>0) {
@@ -253,8 +313,7 @@ export default {
       console.log("dsfsfds=======", type, this.form)
       this.$refs["form"].validate(valid => {
         if (valid) {
-          this.loadingText = "提交数据中..."
-          this.loading = true
+          
           let params = JSON.parse(JSON.stringify(this.form))
           if(this.form.projectId){
             params['benefitList'] = []
@@ -265,12 +324,48 @@ export default {
               })
             })
           }
+          console.log("(params.cardExdateList",params.cardExdateList)
+          if(params.unUsedType==2) {
+            params.unUsedWeek = null
+            if(params.cardExdateList && params.cardExdateList.length>0) {
+              let list = []
+              let flog = false
+              params.cardExdateList.forEach((item,index)=>{
+                if(item.data.length==0 || item.data.length<2){
+                  flog = true
+                }else {
+                  list.push({
+                    startDate: item.data[0],
+                    endDate: item.data[1]
+                  })
+                }
+              })
+              params.cardExdateList = list
+              if(flog) {
+                this.$message.error(`请选择不可使用日期!!!`);
+                return
+              }
+            }else {
+              this.$message.error(`请选择不可使用日期!!!`);
+              return
+            }
+            
+          }else if(params.unUsedType==1){
+            params.cardExdateList = null
+            if(params.unUsedWeek && params.unUsedWeek.length>0) {
+              params.unUsedWeek = params.unUsedWeek.join(',')
+            }else {
+              this.$message.error(`请选择不可用周期!!!`);
+              return
+            }
+          }
           if(params.validityDayS == -1) {
             params.validityDay = -1
           }
           delete params.validityDayS
           delete params.projectId
-
+          this.loadingText = "提交数据中..."
+          this.loading = true
           if(this.model == 'ADD') {
             addTableApi(this.configUrl.edit, {
               ...params,
@@ -369,6 +464,14 @@ export default {
     },
     changeGroup(value) {
       console.log("value===",value)
+    },
+    addData() {
+      this.form.cardExdateList.push({
+        data: []
+      })
+    },
+    clearData(index) {
+      this.form.cardExdateList.splice(index,1)
     }
   },
 };

+ 10 - 0
src/views/tourism/membershipManagement/giftcard/detailsBox/equityCardManagementDetails.vue

@@ -39,6 +39,16 @@
           <el-form-item label="核销密码:" prop="checkPassword">
             <span>{{ form.checkPassword }}</span>
           </el-form-item>
+          <div class="form-title"><span>使用信息</span></div>
+          <el-form-item label="使用账户:" prop="name">
+            <span>{{ form.name }}</span>
+          </el-form-item>
+          <el-form-item label="使用手机号:" prop="mobile">
+            <span>{{ form.mobile }}</span>
+          </el-form-item>
+          <el-form-item label="使用时间:" prop="checkTime">
+            <span>{{ form.checkTime }}</span>
+          </el-form-item>
         </el-form>
       </div>
     </div>

+ 2 - 0
src/views/tourism/membershipManagement/giftcard/formBox/equityCardManagementForm.vue

@@ -41,6 +41,7 @@
             <el-date-picker
               v-model="form.startTime"
               type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
               placeholder="选择开始时间">
             </el-date-picker>
           </el-form-item>
@@ -48,6 +49,7 @@
             <el-date-picker
               v-model="form.endTime"
               type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
               placeholder="选择到期时间">
             </el-date-picker>
           </el-form-item>

+ 6 - 10
src/views/tourism/membershipManagement/giftcard/giftcardList.vue

@@ -127,9 +127,7 @@
                     v-hasPermi="configPermi.delect"
                   >删除</el-button>
                 <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" >
-                    <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-if="checkPermi(configPermi.Password) && checkPermi(configPermi.AuthRole)">更多</el-button>
-                    <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-else-if="checkPermi(configPermi.AuthRole) && !checkPermi(configPermi.Password) && scope.row.actStatus != 1">更多</el-button>
-                    <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-else-if="!checkPermi(configPermi.AuthRole) && checkPermi(configPermi.Password)">更多</el-button>
+                    <el-button size="mini" type="text" icon="el-icon-d-arrow-right" v-if="checkPermi(configPermi.Password) && checkPermi([...configPermi.Password,...configPermi.edit])">更多</el-button>
                     <el-dropdown-menu slot="dropdown">
                         <!-- <el-dropdown-item command="handleAuthRole" v-if="scope.row.actStatus != 1" icon="el-icon-circle-check"
                         v-hasPermi="configPermi.AuthRole">审核</el-dropdown-item> -->
@@ -179,15 +177,13 @@
       return {
         title: "礼品卡管理",// 通用标题
         configPermi: {
-          add: ['equityCard:equityCardManagement:add'], // 新增权限
-          details: ['equityCard:equityCardManagement:details'], // 详情权限
-          delect: [], // 删除权限
-          edit: [], // 编辑权限
+          add: ['equityCard:giftcard:add'], // 新增权限
+          details: ['equityCard:giftcard:details'], // 详情权限
+          delect: ['equityCard:giftcard:delect'], // 删除权限
+          edit: ['equityCard:giftcard:edit'], // 编辑权限
           upload: [''],// 导入权限
           export: [''],// 导出权限
-          AuthRole: ['equityCard:equityCardManagement:AuthRole'],// 设置审核
-          Password: ['equityCard:equityCardManagement:Password'], // 重置密码
-          useList: ['equityCard:equityCardManagement:uselist'], // 重置密码
+          Password: ['equityCard:giftcard:Password'], // 重置密码
         },
         configUrl: {
           list: '/merchant/merchantGiftCard/pageList', // 列表地址

+ 26 - 7
src/views/tourism/orderManagement/hotelsOrders/hotelsOrders.vue

@@ -14,13 +14,14 @@
                     />
                 </el-form-item>
                 <el-form-item label="酒店名称:" prop="shopName">
-                    <el-input
-                        v-model="queryParams.shopName"
-                        placeholder="请输入酒店名称"
-                        clearable
-                        style="width: 240px"
-                        @keyup.enter.native="handleQuery"
-                    />
+                    <el-select v-model="queryParams.shopName" clearable placeholder="请输入酒店/民宿名称">
+                      <el-option
+                      v-for="item in hotelsList"
+                      :key="item.id"
+                      :label="item.name"
+                      :value="item.name">
+                      </el-option>
+                    </el-select>
                 </el-form-item>
                 <el-form-item label="房型名称:" prop="goodsName">
                     <el-input
@@ -251,6 +252,7 @@
           export: '/order/orderInfo/hotelOrderListExport',// 导出地址
           updateStatusById: '',
           repastOrderAccept: '/order/orderInfo/repastOrderAccept', //  接单/拒单
+          hotelsList: '/merchant/merchantShop/pageList'
         },
         // 遮罩层
         loading: true,
@@ -287,12 +289,29 @@
           { key: 7, label: `订单来源`, visible: true },
           { key: 8, label: `订单状态`, visible: true },
         ],
+        hotelsList: []
       };
     },
     created() {
+      this.getList1()
       this.getList();
     },
     methods: {
+       /** 查询酒店列表 */
+       getList1() {
+        listTableApi(
+          this.configUrl.hotelsList,
+          {
+            shopType: 5,
+            pageNum: 1,
+            pageSize: 9999
+          }).then(response => {
+            this.hotelsList = response.data.rows;
+          }
+        ).catch (error=>{
+          this.hotelsList = []
+        })
+      },
       /** 查询用户列表 */
       getList() {
         this.loading = true;

+ 334 - 0
src/views/tourism/orderManagement/ticketOrdersAll/formBox/releaseForm.vue

@@ -0,0 +1,334 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="open"
+    width="40%"
+    append-to-body
+    :close-on-click-modal="false"
+    @close="cancel"
+  >
+    <div class="form-dialog-box"
+    v-loading="loading"
+    :element-loading-text="loadingText"
+    element-loading-spinner="el-icon-loading"
+    element-loading-background="rgba(0, 0, 0, 0)">
+      <div
+        v-loading="loading"
+        :element-loading-text="''"
+        element-loading-spinner="''"
+        element-loading-background="rgba(0, 0, 0, 0.8)"
+        >
+        <el-form :model="form" ref="form" :rules="rules" label-width="130px">
+          <el-form-item label="退款金额:" prop="refundAmount">
+            <el-input-number style="width: 350px;" v-model="form.refundAmount" placeholder="请输入退款金额" :min="0" />
+          </el-form-item>
+          <el-form-item label="扣减积分:" prop="refundCredit">
+            <el-input-number style="width: 350px;" v-model="form.refundCredit" placeholder="请输入扣减积分" :min="0" />
+          </el-form-item>
+          <el-form-item label="退款说明:" prop="refundReason">
+            <el-input style="width: 350px;" type="textarea" v-model="form.refundReason" placeholder="请输入退款说明" maxlength="250" show-word-limit />
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+    <span slot="footer" class="dialog-footer" v-if="formStatus==1">
+      <el-button @click="cancel">取消</el-button>
+      <el-button
+        type="primary"
+        @click="submitForm"
+        :loading="loading"
+        element-loading-text="提交中..."
+        element-loading-spinner="el-icon-loading"
+        element-loading-background="rgba(0, 0, 0, 0.8)"
+      > 
+        {{ loading ? '提交中...' : '保存' }}
+      </el-button>
+    </span>
+    <!-- 添加或修改对话框 End -->
+  </el-dialog>
+</template>
+
+<script>
+import { 
+  getTableDeatilsByIdApi,
+  updateTableApi,
+  addTableApi
+ } from '@/api/CURD'
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "addAndEdit",
+  dicts: ['tourism_online_status','tourism_online_type'],
+  components: {Treeselect},
+  data() {
+    return {
+      title: "",
+      activeName: 'first',
+      model: "", // EDIT: 编辑模式 ADD : 新增模式  EDITInit : 编辑模式(需要请求详情)
+      open: false,
+      loading: false,
+      loadingText: "拼命加载数据中...",
+      formStatus: null, // 0/null : 加载中 1 : 获取详情成功 2  : 获取详情失败 
+      configUrl: {
+        add: '/merchant/orderBackAfter/insert', // 新增地址
+        details: '', // 详情地址
+        edit: '/merchant/orderBackAfter/insert', // 编辑地址
+      },
+      form: {
+        id: undefined,
+      },
+      rules: {
+        refundAmount: [{ required: true, message: "请输入退款金额", trigger: ["change","blur"] }],
+        refundCredit: [{ required: true, message: "请输入扣减积分", trigger: ["change","blur"] }],
+        refundReason: [{ required: false, message: "请输入退款说明", trigger: ["change","blur"] }],
+      },
+      scenicAreaProducts: [],// 景点产品关联
+
+      //  上传文件
+      actionUrl: process.env.VUE_APP_BASE_API + process.env.VUE_APP_UPLOAD_IMAGE,
+      actionUrlLoading: false,
+    };
+  },
+  methods: {
+    async initData(title , model,row){
+      this.title = title
+      this.open = true
+      this.loadingText = "拼命加载数据中..."
+      this.loading = true
+      this.actionUrlLoading = false
+      this.model = model
+      this.formStatus = 0
+      if(model=='ADD') { // 新增
+        this.$set(this,'form',{
+          ...row,
+        })
+        this.formStatus = 1
+      }else if(model=='EDIT') { // 新增
+        let obj = {
+          orderId: row.id,
+        }
+        this.$set(this,'form',obj)
+        this.formStatus = 1
+      }else if(model=='EDITInit') { // 新增
+        await this.getTableDeatilsFun(row)
+      }
+      this.loading = false
+      this.$nextTick(()=>{
+        if(this.$refs["form"]) {
+          this.$refs["form"].clearValidate();
+        }
+      })
+    },
+    /** 获取详情 */
+    async getTableDeatilsFun(row) {
+      const id = row.id
+      this.loading = true
+      try {
+        let res = await getTableDeatilsByIdApi(this.configUrl.details,{id})
+        if(res.code == 200) {
+          let obj = {
+            ...res.data
+          }
+          this.$set(this,'form',JSON.parse(JSON.stringify(obj)))
+          this.formStatus = 1
+        }else {
+          this.$message.error('获取详情失败!!!');
+          this.formStatus = 2
+          this.loading = false
+          this.open = false;
+        }
+        this.loading = false
+      } catch (error) {
+        console.error('获取详情失败!!!!',error)
+        this.formStatus = 2
+        this.loading = false
+        this.open = false;
+      }
+    },
+    /**
+     * 保存
+     * @date 2023-11-22
+     * @returns {any}
+     */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.loadingText = "提交数据中..."
+          this.loading = true
+          let params = JSON.parse(JSON.stringify(this.form))
+          addTableApi(this.configUrl.edit,{
+            ...params,
+          }).then(response => {
+              this.$modal.msgSuccess("申请成功");
+              this.loading = false
+              this.open = false;
+              this.$emit('refresh')
+          }).catch(()=>{
+              this.$message.error("申请失败!!!");
+              this.loading = false
+          })
+        }
+      });
+    },
+    /**
+     * 重置
+     * @date 2023-11-22
+     * @returns {any}
+     */
+    reset() {
+      if(this.$refs["form"]) {
+        this.$refs["form"].clearValidate();
+      }
+    },
+    /**
+     * 关闭弹框
+     * @date 2023-11-22
+     * @returns {any}
+     */
+    cancel() {
+      this.reset();
+      this.open = false;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.form-dialog-box {
+  padding: 0 30px;
+  padding: 0 30px;
+  min-height: 30vh;
+  max-height: 65vh;
+  overflow-y: auto;
+  >div {
+    width: 100%;
+    min-height: 30vh;
+  }
+  .form-title {
+    padding: 0 0 10px 0;
+    span {
+      display: flex;
+      color: rgba(65,80,88,1);
+      font-size: 16px;
+      font-family: SourceHanSansSC;
+      font-weight: 700;
+      line-height: 23px;
+      border-left: 4px solid rgb(22, 132, 252);
+      padding-left: 10px;
+    }
+    
+  }
+  ::v-deep .ql-editor {
+    height: 400px;
+  }
+  .upload-btn {
+    width: 100px;
+    height: 100px;
+    background-color: #fbfdff;
+    border: dashed 1px #c0ccda;
+    border-radius: 5px;
+    i {
+      font-size: 30px;
+      margin-top: 20px;
+    }
+    &-text {
+      margin-top: -10px;
+    }
+  }
+  .avatar {
+    cursor: pointer;
+  }
+}
+.el-table{
+  .upload-btn {
+    width: 100px;
+    height: 100px;
+    background-color: #fbfdff;
+    border: dashed 1px #c0ccda;
+    border-radius: 5px;
+    i {
+      font-size: 30px;
+      margin-top: 20px;
+    }
+    &-text {
+      margin-top: -10px;
+    }
+  }
+  .avatar {
+    cursor: pointer;
+  }
+}
+
+.area-container {
+  min-height: 400px;
+}
+
+::v-deep .area-wrap-city.el-cascader {
+  line-height: normal;
+  .el-input {
+    cursor: pointer;
+    width: 100% !important;
+    height: 28px !important;
+    .el-input__inner {
+      display: none !important;
+    }
+    span.el-input__suffix {
+      position: inherit !important;
+      i.el-input__icon {
+        line-height: inherit;
+        margin-left: 5px;
+      }
+    }
+
+    .el-input__wrapper {
+      box-shadow: none;
+      input {
+        display: none;
+      }
+    }
+  }
+
+  .el-cascader__tags {
+    display: none;
+  }
+}
+
+.area-city-popper {
+  .el-cascader-panel {
+    .el-scrollbar.el-cascader-menu {
+      .el-cascader-menu__wrap.el-scrollbar__wrap {
+        height: 315px;
+      }
+    }
+  }
+}
+
+::v-deep .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+  ::v-deep .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+  ::v-deep .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 100px;
+    height: 100px;
+    line-height: 100px;
+    text-align: center;
+  }
+  ::v-deep .avatar {
+    width: 100px;
+    height: 100px;
+    display: block;
+  }
+</style>
+<style>
+.custom-class-box {
+  z-index: 999999 !important;
+}
+</style>

+ 30 - 6
src/views/tourism/orderManagement/ticketOrdersAll/ticketOrders.vue

@@ -162,11 +162,16 @@
                 <dict-tag :options="dict.type.tourism_ticketOrders_status" :value="scope.row.status"/>
               </template>
             </el-table-column>
-            <el-table-column label="核销数" align="center" key="usedTotal" prop="usedTotal" v-if="columns[14].visible" />
+            <el-table-column label="售后状态" align="center" key="afterStatus" prop="afterStatus" v-if="columns[14].visible">
+              <template slot-scope="scope">
+                <dict-tag :options="dict.type.tourism_ticketOrders_afterStatus" :value="scope.row.afterStatus"/>
+              </template>
+            </el-table-column>
+            <el-table-column label="核销数" align="center" key="usedTotal" prop="usedTotal" v-if="columns[15].visible" />
             <el-table-column
               label="操作"
               align="center"
-              width="60"
+              width="100"
               class-name="small-padding fixed-width"
             >
               <template slot-scope="scope" >
@@ -177,6 +182,13 @@
                   @click="handleDetails(scope.row)"
                   v-hasPermi="configPermi.details"
                 >详情</el-button>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-document-copy"
+                  v-if="checkPermi([...configPermi.release]) && scope.row.status != 0 && (scope.row.afterStatus == 0 || !scope.row.afterStatus || scope.row.afterStatus==3)"
+                  @click="releaseFormFun(scope.row)"
+                >退款</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -192,6 +204,8 @@
       </el-row>
       <!--  详情 -->
       <detailsBox ref="detailsBox" />
+      <!-- 退货  -->
+      <releaseForm ref="releaseForm" @refresh="getList"></releaseForm>
     </div>
   </template>
   
@@ -201,10 +215,12 @@
     delTableParamsApi,
   } from "@/api/CURD";
   import detailsBox from "./detailsBox/ticketOrdersDetails.vue"
+  import releaseForm from "./formBox/releaseForm.vue";
+  import { checkPermi } from "@/utils/permission"
   export default {
     name: "User",
-    dicts: ['tourism_ticketOrders_source','tourism_ticketOrders_status','tourism_ticketOrders_payStatus','tourism_ticketOrders_payWay'],
-    components: {detailsBox},
+    dicts: ['tourism_ticketOrders_source','tourism_ticketOrders_status','tourism_ticketOrders_payStatus','tourism_ticketOrders_payWay','tourism_ticketOrders_afterStatus'],
+    components: {detailsBox,releaseForm},
     data() {
       return {
         title: "门票订单",// 通用标题
@@ -215,6 +231,7 @@
           edit: [''], // 编辑权限
           upload: [''],// 导入权限
           export: ['ticketOrdersAll:ticketOrders:export'],// 导出权限
+          release: ['ticketOrdersAll:ticketOrders:release']
         },
         configUrl: {
           list: '/order/orderInfo/list', // 列表地址
@@ -247,7 +264,6 @@
         columns: [
           { key: 0, label: `订单号`, visible: true },
           { key: 1, label: `购票人手机号`, visible: true },
-          { key: 2, label: `景点名称`, visible: true },
           { key: 3, label: `门票名称`, visible: true },
           { key: 4, label: `票种规格`, visible: true },
           { key: 5, label: `购票渠道`, visible: true },
@@ -260,7 +276,8 @@
           { key: 12, label: `支付方式`, visible: true },
           { key: 13, label: `支付时间`, visible: true },
           { key: 14, label: `订单状态`, visible: true },
-          { key: 15, label: `核销数`, visible: true },
+          { key: 15, label: `售后状态`, visible: true },
+          { key: 16, label: `核销数`, visible: true },
         ],
       };
     },
@@ -268,6 +285,7 @@
       this.getList();
     },
     methods: {
+      checkPermi,
       /** 查询用户列表 */
       getList() {
         this.loading = true;
@@ -348,6 +366,12 @@
           this.$refs.detailsBox.initData(this.title + '详情', "EDITInit",{...row})
         }
       },
+      /**  退货   */
+      releaseFormFun(row) {
+        if(this.$refs.releaseForm) {
+          this.$refs.releaseForm.initData('退款申请', "EDIT",{...row})
+        }
+      },
       /** 删除按钮操作 */
       handleDelete(row) {
         const ids = row.id || this.ids;

+ 44 - 2
src/views/tourism/productManagement/formBox/cateringManagementForm.vue

@@ -138,6 +138,26 @@
                   </el-form-item>
                 </div>
               </el-form-item>
+              <el-form-item label="打烊时间:" prop="closeTime">
+                <el-time-picker
+                  is-range
+                  v-model="form.closeTime"
+                  value-format="HH:mm:ss"
+                  range-separator="至"
+                  start-placeholder="开始时间"
+                  end-placeholder="结束时间"
+                  placeholder="选择时间范围">
+                </el-time-picker>
+              </el-form-item>
+              <el-form-item label="关店节假日时间:" prop="holiday">
+                <el-date-picker
+                  type="dates"
+                  v-model="form.holiday"
+                  value-format="yyyy-MM-dd"
+                  style="width: 400px;"
+                  placeholder="选择一个或多个日期">
+                </el-date-picker>
+              </el-form-item>
               <el-form-item label="餐厅地址" prop="address">
                 <el-input
                   v-model="form.address"
@@ -292,7 +312,8 @@ export default {
         id: undefined,
         shopAdvImgs: [],
         shopLabel: [],
-        cancelOrderFlag: '-1'
+        cancelOrderFlag: '-1',
+        closeTime: []
       },
       rules: {
         name: [{ required: true, message: "请输入门店名称", trigger: ["change","blur"] }],
@@ -309,6 +330,7 @@ export default {
        
         cancelOrderFlag: [{ required: true, message: "请选择是否支持取消订单", trigger: ["change","blur"] }],
         cancelOrderTime: [{ required: false, message: "请输入分钟", trigger: ["change","blur"] }],
+        closeTime: [{ required: true, message: "请输入打烊时间", trigger: ["change","blur"] }],
       },
       scenicAreaProducts: [],// 景点产品关联
 
@@ -336,7 +358,9 @@ export default {
           row,
           shopAdvImgs: [],
           shopLabel: [],
-          cancelOrderFlag: '-1'
+          cancelOrderFlag: '-1',
+          closeTime: [],
+          holiday: []
         })
         this.formStatus = 1
         this.$nextTick(()=>{
@@ -382,6 +406,16 @@ export default {
             obj.cancelOrderFlag = '-2'
             obj['cancelOrderTime'] = undefined
           }
+          if(res.data.closeTimeStart && res.data.closeTimeEnd) {
+            obj['closeTime'] = [res.data.closeTimeStart,res.data.closeTimeEnd]
+          }else {
+            obj['closeTime'] = []
+          }
+          if(res.data.holiday) {
+            obj['holiday'] = res.data.holiday.split(',')
+          }else {
+            obj['holiday'] = []
+          }
           this.$set(this,'form',JSON.parse(JSON.stringify(obj)))
           this.formStatus = 1
           this.$nextTick(()=>{
@@ -428,6 +462,14 @@ export default {
             params['cancelOrderFlag'] = 1
             params['cancelOrderTime'] = 0
           }
+          if(params.closeTime&&params.closeTime.length>0) {
+            params['closeTimeStart'] = params.closeTime[0]
+            params['closeTimeEnd'] = params.closeTime[1]
+            delete params.closeTime
+          }
+          if(params.holiday && params.holiday.length>0) {
+            params.holiday = params.holiday.join(',')
+          }
           params.shopLabel = params.shopLabel.join(',')
           params.shopAdvImgs = params.shopAdvImgs.join(',')
           if (this.model != 'ADD') {

+ 146 - 8
src/views/tourism/productManagement/formBox/houseTypeListForm.vue

@@ -40,7 +40,6 @@
               </div>
               <div 
               style="width: 100px; height: 100px;" 
-              v-if="!form.goodsImage||form.goodsImage.length<1"
               v-loading="actionUrlLoading"
               element-loading-text="上传中..."
               element-loading-spinner="el-icon-loading"
@@ -116,6 +115,27 @@
           <el-form-item label="有无早餐:" prop="dinnerProfile">
             <el-input style="width: 350px;" v-model="form.dinnerProfile" placeholder="请输入有无早餐" maxlength="50" show-word-limit />
           </el-form-item>
+          <el-form-item label="卫生间:" prop="hasToilet">
+            <el-radio-group v-model="form.hasToilet" placeholder="请选择有无卫生间">
+              <el-radio :label="1">有</el-radio>
+              <el-radio :label="0">无</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="可否加床:" prop="isAddBed">
+            <el-radio-group v-model="form.isAddBed" placeholder="请选择可否加床">
+              <el-radio :label="0">不可以</el-radio>
+              <el-radio :label="1">可以</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="楼层:" prop="floor">
+            <el-input style="width: 350px;" v-model="form.floor" placeholder="请输入楼层" maxlength="50" show-word-limit />
+          </el-form-item>
+          <el-form-item label="空调信息:" prop="airProfile">
+            <el-input style="width: 350px;" v-model="form.airProfile" placeholder="请输入空调信息" maxlength="50" show-word-limit />
+          </el-form-item>
+          <el-form-item label="停车场信息:" prop="parkProfile">
+            <el-input style="width: 350px;" v-model="form.parkProfile" placeholder="请输入停车场信息" maxlength="50" show-word-limit />
+          </el-form-item>
           <el-form-item label="其他信息:" prop="otherProfile">
             <el-input style="width: 350px;" type="textarea" v-model="form.otherProfile" placeholder="请输入其他信息" maxlength="200" show-word-limit />
           </el-form-item>
@@ -135,6 +155,49 @@
               <el-time-picker v-model="form.outRoom" value-format="HH:mm" format="HH:mm" placeholder="请选择次日最晚离店时间" ></el-time-picker>
             </el-form-item>
           </div>
+          <div class="form-title"><span>房型设施</span></div>
+          <el-button type="primary" size="mini" @click="addDeviceJson()">新增</el-button>
+          <el-table v-loading="loading" :data="form.deviceJson">
+            <el-table-column label="设施类型" align="center" key="key" prop="key">
+              <template slot-scope="scope">
+                <!-- <dict-tag :options="dict.type.room_type_device" :value="scope.row.key"/> -->
+                <el-select 
+                v-model="form.deviceJson[scope.$index].key" 
+                clearable 
+                placeholder="请选择房型设施类型"
+                @visible-change="visibleChange"
+                >
+                  <el-option
+                    v-for="item in roomTypeDeviceList"
+                    :key="item.value"
+                    :label="item.label"
+                    :disabled="item.disabled"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column label="设施内容" align="center" key="text" prop="text">
+              <template slot-scope="scope">
+                <el-input type="textarea" v-model="form.deviceJson[scope.$index].text"></el-input>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="操作"
+              align="center"
+              width="300px"
+              class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope" >
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row,scope.$index)"
+                >删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
           <div class="form-title"><span>退票规则</span></div>
           <el-form-item label="是否支持取消订单:" prop="refundFlag">
             <el-radio-group v-model="form.refundFlag" placeholder="请选择是否支持取消订单">
@@ -187,12 +250,12 @@
             </div>
           </div>
           <el-tabs v-model="activeName">
-            <el-tab-pane label="预定须知" name="first">
+            <el-tab-pane label="使用说明" name="first">
               <el-form-item label-width="0px" label="" prop="reservationNotice">
                 <editor ref="editor" v-model="form.reservationNotice" :fileSize="20" :min-height="200" />
               </el-form-item>
             </el-tab-pane>
-            <el-tab-pane label="退款说明" name="second">
+            <el-tab-pane label="退款须知" name="second">
               <el-form-item label-width="0px" label="" prop="refundNotice">
                 <editor ref="editor" v-model="form.refundNotice" :fileSize="20" :min-height="200" />
               </el-form-item>
@@ -230,7 +293,7 @@ import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 export default {
   name: "addAndEdit4",
-  dicts: ['tourism_online_status','tourism_online_type'],
+  dicts: ['tourism_online_status','tourism_online_type','room_type_device'],
   components: {Editor,Treeselect},
   props: ['listTreeCopy'],
   data() {
@@ -252,9 +315,9 @@ export default {
         goodsImage: [],
         refundFlag: 0,
         refundRuleList: [],
+        deviceJson: []
       },
       rules: {
-
         name: [{ required: true, message: "请输入房型名称", trigger: ["change","blur"] }],
         goodsImage: [{ required: true, message: "请输入房型图片", trigger: ["change","blur"] }],
         roomNum: [{ required: true, message: "请输入房型数量", trigger: ["change","blur"] }],
@@ -269,6 +332,13 @@ export default {
         networkProfile: [{ required: true, message: "请输入网络", trigger: ["change","blur"] }],
         windowsProfile: [{ required: true, message: "请输入窗户", trigger: ["change","blur"] }],
         dinnerProfile: [{ required: true, message: "请输入有无早餐", trigger: ["change","blur"] }],
+
+        hasToilet: [{ required: true, message: "请选择有无卫生间", trigger: ["change","blur"] }],
+        isAddBed: [{ required: true, message: "请选择可否加床", trigger: ["change","blur"] }],
+        floor: [{ required: true, message: "请输入楼层", trigger: ["change","blur"] }],
+        airProfile: [{ required: true, message: "请输入空调信息", trigger: ["change","blur"] }],
+        parkProfile: [{ required: true, message: "请输入停车场信息", trigger: ["change","blur"] }],
+        
         otherProfile: [{ required: true, message: "请输入其他信息", trigger: ["change","blur"] }],
         roomTypeCode: [{ required: false, message: "请输入房型编码", trigger: ["change","blur"] }],
        
@@ -279,8 +349,8 @@ export default {
         refundFlag: [{ required: true, message: "请选择是否支持取消订单", trigger: ["change","blur"] }],
         latestInRoom: [{ required: true, message: "请选择时间", trigger: ["change","blur"] }],
         refundRuleList: [{ required: true, message: "请输入退票规则", trigger: ["change","blur"] }],
-        reservationNotice: [{ required: true, message: "请输入预定须知", trigger: ["change","blur"] }],
-        refundNotice: [{ required: true, message: "请输入退款说明", trigger: ["change","blur"] }],
+        reservationNotice: [{ required: true, message: "请输入使用说明", trigger: ["change","blur"] }],
+        refundNotice: [{ required: true, message: "请输入退款须知", trigger: ["change","blur"] }],
        
       },
       scenicAreaProducts: [],// 景点产品关联
@@ -289,7 +359,8 @@ export default {
       actionUrl: process.env.VUE_APP_BASE_API + process.env.VUE_APP_UPLOAD_IMAGE,
       actionUrlLoading: false,
       labelName: '',
-      activeName: 'first'
+      activeName: 'first',
+      roomTypeDeviceList: []
     };
   },
   methods: {
@@ -303,12 +374,21 @@ export default {
       this.formStatus = 0
       this.activeName = 'first'
       this.labelName = ''
+      let list = []
+      this.dict.type.room_type_device.forEach((item,index)=>{
+        list.push({
+          label: item.label,
+          value: item.value
+        })
+      })
+      this.roomTypeDeviceList = JSON.parse(JSON.stringify(list))
       if(model=='ADD') { // 新增
         this.$set(this,'form',{
           ...row,
           goodsImage: [],
           refundFlag: 0,
           refundRuleList: [],
+          deviceJson: []
         })
         this.formStatus = 1
       }else if(model=='EDIT') { // 新增
@@ -340,6 +420,7 @@ export default {
         if(res.code == 200) {
           let obj = {
             ...res.data,
+            deviceJson: res.data.deviceJson ? JSON.parse(res.data.deviceJson) : [],
             refundRuleList: res.data.refundRuleList ? res.data.refundRuleList : [],
           }
           if(obj.goodsImage) {
@@ -354,6 +435,7 @@ export default {
           }
 
           this.$set(this,'form',JSON.parse(JSON.stringify(obj)))
+          this.checkOption()
           this.formStatus = 1
         }else {
           this.$message.error('获取详情失败!!!');
@@ -399,6 +481,23 @@ export default {
           }
           params.goodsImage = params.goodsImage.join(',')
 
+          if(params.deviceJson && params.deviceJson.length>0) {
+            let flog = false
+            params.deviceJson.forEach((item,index)=>{
+              if(!item.key || !item.text){
+                flog = true
+              }
+            })
+            if(flog) {
+              this.$message.error("请选择或输入设施类型和设施内容!!!");
+              this.loading = false
+              return
+            }
+            params.deviceJson = JSON.stringify(params.deviceJson)
+          }else {
+            params.deviceJson = null
+          }
+
           delete params.saleDate 
           if (this.model != 'ADD') {
             addTableApi(
@@ -539,6 +638,45 @@ export default {
     /**  删除规格  */
     clearGoodsSkuList(row,index) {
       this.form.refundRuleList.splice(index,1)
+    },
+
+    handleDelete(row,index) {
+      console.log('row===',row,index)
+      this.form.deviceJson.splice(index,1)
+    },
+
+    addDeviceJson() {
+      console.log('row===',this.form.deviceJson)
+      this.form.deviceJson.push({
+        key: null,
+        text: null
+      })
+    },
+    visibleChange(type) {
+      console.log('type==',type)
+      if(type) {
+        this.checkOption()
+      }
+    },
+    checkOption(){
+      let list = []
+      let list1 = JSON.parse(JSON.stringify(this.roomTypeDeviceList))
+      if(this.form.deviceJson && this.form.deviceJson.length>0){
+        this.form.deviceJson.forEach((item,index)=>{
+          if(item.key) {
+            list.push(item.key)
+          }
+        })
+      }
+      list1.forEach((item,index)=>{
+        if(list.includes(item.value)) {
+          list1[index]['disabled'] = true
+        }else {
+          list1[index]['disabled'] = false
+        }
+      })
+      this.roomTypeDeviceList = list1
+      
     }
   },
   watch: {

+ 7 - 0
src/views/tourism/productManagement/formBox/scenicAreaTicketsForm.vue

@@ -23,6 +23,12 @@
           <el-form-item label="门票名称:" prop="name">
             <el-input style="width: 350px;" v-model="form.name" placeholder="请输入门票名称" maxlength="50" show-word-limit />
           </el-form-item>
+          <el-form-item label="是否可见:" prop="ifMinishow">
+            <el-radio-group v-model="form.ifMinishow">
+              <el-radio :label="1">可见</el-radio>
+              <el-radio :label="0">不可见</el-radio>
+            </el-radio-group>
+          </el-form-item>
           <el-form-item label="详情图片:" prop="showImg">
 
             <div
@@ -120,6 +126,7 @@ export default {
         showImg: [{ required: true, message: "请上传图片", trigger: ["change","blur"] }],
         performSnapshot: [{ required: true, message: "请输产品介绍", trigger: ["change","blur"] }],
         performNotice: [{ required: true, message: "请输购票须知", trigger: ["change","blur"] }],
+        ifMinishow: [{ required: true, message: "请选择是否可见", trigger: ["change","blur"] }]
       },
       scenicAreaProducts: [],// 景点产品关联
 

+ 26 - 2
src/views/tourism/productManagement/hotelsManagement.vue

@@ -5,7 +5,14 @@
         <el-col :span="24" :xs="24">
             <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
                 <el-form-item label="酒店/民宿名称" prop="name" label-width="100px">
-                  <el-input v-model="queryParams.name" placeholder="请输入酒店/民宿名称" />
+                  <el-select v-model="queryParams.name" clearable placeholder="请输入酒店/民宿名称">
+                    <el-option
+                    v-for="item in hotelsList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name">
+                    </el-option>
+                  </el-select>
                 </el-form-item>
                 <el-form-item label="酒店类型" prop="shopModel">
                   <el-select v-model="queryParams.shopModel" clearable placeholder="请选择酒店类型">
@@ -195,13 +202,30 @@
           { key: 3, label: `营业状态`, visible: true },
           // { key: 4, label: `创建时间`, visible: true },
         ],
+        hotelsList: []
       };
     },
     created() {
+      this.getList1()
       this.getList();
     },
     methods: {
-      /** 查询用户列表 */
+      /** 查询酒店列表 */
+      getList1() {
+        listTableApi(
+          this.configUrl.list,
+          {
+            shopType: 5,
+            pageNum: 1,
+            pageSize: 9999
+          }).then(response => {
+            this.hotelsList = response.data.rows;
+          }
+        ).catch (error=>{
+          this.hotelsList = []
+        })
+      },
+      /** 查询酒店列表 */
       getList() {
         this.loading = true;
         let params = JSON.parse(JSON.stringify(this.queryParams))

+ 8 - 2
src/views/tourism/productManagement/scenicAreaTickets.vue

@@ -33,7 +33,12 @@
                   />
                 </template>
             </el-table-column>
-            <el-table-column label="发布时间" align="center" key="onlineTime" prop="onlineTime" v-if="columns[3].visible" :show-overflow-tooltip="true" />
+            <el-table-column label="可见状态" align="center" key="ifMinishow" prop="ifMinishow" v-if="columns[3].visible">
+                <template slot-scope="scope">
+                  <span>{{ scope.row.ifMinishow == 1 ? '可见' : '不可见' }}</span>
+                </template>
+            </el-table-column>
+            <el-table-column label="发布时间" align="center" key="onlineTime" prop="onlineTime" v-if="columns[4].visible" :show-overflow-tooltip="true" />
             <el-table-column
               label="操作"
               align="center"
@@ -148,7 +153,8 @@
           { key: 0, label: `票务名称`, visible: true },
           { key: 2, label: `票务规格`, visible: true },
           { key: 3, label: `可用状态`, visible: true },
-          { key: 4, label: `发布时间`, visible: true },
+          { key: 4, label: `可见状态`, visible: true },
+          { key: 5, label: `发布时间`, visible: true },
         ],
       };
     },

+ 1 - 1
src/views/tourism/productManagement/tabelBox/cateringManagementCategoryTabel.vue

@@ -249,7 +249,7 @@ export default {
       this.tabelName = row.name
       this.getList();
       this.remoteClassifyId()
-      this.remoteShop('')
+      //this.remoteShop('')
     },
     /** 查询用户列表 */
     getList() {