<!--
 * @Description: 新增/编辑弹框
 * @Author: Sugar.
 * @Date: 2023-11-24 13:55:00
 * @LastEditors: Sugar.
 * @LastEditTime: 2023-11-24 13:55:00
 * @FilePath: \cattle_webui\src\views\ticket\ticketMr\dialog\AddOrEditDialog.vue
 * @Copyright: Copyright (c) 2016~2023 by Sugar., All Rights Reserved.
-->
<template>
  <el-dialog
    :title="title"
    :visible.sync="open"
    width="800px"
    append-to-body
    :close-on-click-modal="false"
    @close="cancel"
  >
    <div class="dialog">
      <el-form v-if="open" :model="form" ref="form" :rules="rules" label-width="120px">
        <el-tabs v-model="activeName">
          <!--    基础信息     -->
          <el-tab-pane label="基础信息" name="01">
            <el-form-item label="票务名称:" prop="goodsName" style="margin-top: 20px">
              <el-input
                v-model="form.goodsName"
                placeholder="票务名称"
                clearable
              />
            </el-form-item>
            <el-form-item label="实名信息:" prop="isAuth">
              <el-radio v-model="form.isAuth" label="1">全部观影人员均实名</el-radio>
            </el-form-item>
            <el-form-item label="停止售卖时间:" prop="stopSaleTime">
              <span style="margin-right: 5px">开演前</span>
              <el-input
                v-model="form.stopSaleTime"
                type="number"
                placeholder="停止售卖时间"
                clearable
                style="width: 180px;"
              >
              </el-input>
              <span style="margin-left: 5px">分钟内<i style="font-size: 12px;margin-left: 5px;">注:必须大于核销时间至少30秒</i></span>
            </el-form-item>
            <el-form-item label="核销时间:" prop="beforeTime">
              <span style="margin-right: 5px">开演前</span>
              <el-input
                v-model="form.beforeTime"
                @change="changePriceAmount('beforeTime')"
                type="number"
                placeholder="核销时间"
                clearable
                style="width: 120px;"
              >
              </el-input>
              <span style="margin-left: 5px">分钟内</span>
            </el-form-item>
            <el-form-item label="核销播报次数:" prop="verificationSpeaker">
              <el-input
                v-model="form.verificationSpeaker"
                @change="changePriceAmount('verificationSpeaker')"
                type="number"
                placeholder="核销播报次数"
                clearable
                style="width: 100%;"
              >
              </el-input>
            </el-form-item>
            <el-form-item label="票务说明:">
              <el-input
                type="textarea"
                :rows="3"
                maxlength="40"
                show-word-limit
                placeholder="请输入内容"
                v-model="form.detail">
              </el-input>
            </el-form-item>
          </el-tab-pane>

          <!--    销售信息     -->
          <el-tab-pane label="销售信息" name="02">
            <el-form-item label="销售价:" label-width="100px" prop="salePrice">
              <el-input
                v-model="form.salePrice"
                placeholder="销售价"
                type="number"
                clearable
                @change="changePriceAmount('salePrice')"
                style="width: 100%;"
              >
                <template slot="append">元</template>
              </el-input>
            </el-form-item>
            <el-form-item label="是否限购:" prop="buyAstrictType" label-width="100px" style="margin-bottom: 10px">
              <el-radio v-model="form.buyAstrictType" label="1">是</el-radio>
              <el-radio v-model="form.buyAstrictType" label="2">否</el-radio>
            </el-form-item>
            <el-form-item label="" prop="buyAstrict" label-width="100px" v-if="form.buyAstrictType == 1">
              <span><span style="color: red">*</span>每个账号在每个场次限购</span>
              <el-input
                v-model.number="form.buyAstrict"
                placeholder=""
                clearable
                style="width: 140px;margin-left: 5px"
              >
                <template slot="append">张</template>
              </el-input>
            </el-form-item>
            <el-form-item label="售票渠道:" required label-width="100px">
              <el-checkbox v-model="form.channelWx">小程序</el-checkbox>
              <el-checkbox v-model="form.channelWindow">窗口</el-checkbox>
              <el-checkbox v-model="form.channelAutoSale">自助售/取票机</el-checkbox>
            </el-form-item>
            <el-form-item label="可售区域:" label-width="100px">
              <span @click="deliverableAreaDialogCancel" style="cursor: pointer;color: #1890ff;">请选择</span>
            </el-form-item>
          </el-tab-pane>

          <!--    退票信息     -->
          <el-tab-pane label="退票信息" name="03">
            <el-form-item label="是否支持退票:" prop="backStatus" label-width="120px">
              <el-radio v-model="form.backStatus" label="0">是</el-radio>
              <el-radio v-model="form.backStatus" label="1">否</el-radio>
            </el-form-item>
            <el-form-item v-if="form.backStatus == '0'" label="退票时间:" prop="backTime" label-width="120px" style="margin-bottom: 10px">
              <el-radio v-model="form.backTime" label="1">按购买日期结算</el-radio>
            </el-form-item>
            <el-form-item label="" v-if="form.backStatus == '0'" prop="days" label-width="120px">
              <span>提前</span>
              <el-input
                v-model="form.days"
                type="number"
                placeholder=""
                clearable
                @change="changePriceAmount('days')"
                style="width: 140px;margin-left: 5px"
              />
              <span style="padding: 0 10px">天</span>
              <el-time-select
                v-model="form.hour"
                :picker-options="{ start: '00:00', step: '00:01', end: '23:59'}"
                placeholder="选择时间">
              </el-time-select>
              <span style="padding-left: 10px">可退</span>
            </el-form-item>
          </el-tab-pane>
        </el-tabs>
      </el-form>
    </div>
    <span slot="footer" class="dialog-footer">
      <el-button @click="cancel">取消</el-button>
      <el-button
        type="primary"
        @click="submitForm"
        v-loading.fullscreen.lock="loading"
        element-loading-text="提交中..."
        element-loading-spinner="el-icon-loading"
        element-loading-background="rgba(0, 0, 0, 0.8)"
      >
        <span v-if="loading">提交中...</span>
        <span v-else>保存</span>
      </el-button>
    </span>
    <!-- 选择配送区域对话框 Start -->
    <el-dialog
        :visible.sync="selectDeliveryAreaDialogOpen"
        :title="selectDeliveryAreaDialogTitle"
        width="60%"
        append-to-body
        class="delivery-area-dialog"
        @close="selectDeliveryAreaDialogCancel"
      >
        <div class="area-container">
          <el-row>
            <el-col
              v-for="(areaItem, areaIndex) in selectDeliveryAreaDialogList"
              :key="areaItem.areaCode"
              class="area-wrap"
              :span="8"
            >
              <el-checkbox
                v-model="areaItem.selected"
                :label="areaItem.areaName"
                class="area-wrap-province"
                @change="handleChangeProvince(areaIndex, areaItem)"
              >
                <template #default>
                  <span
                    slot="reference"
                      :class="areaItem.hasChildrenSelect ? 'area-province-label' : ''"
                    >{{ areaItem.name }}</span>
                  
                </template>
              </el-checkbox>
              <el-cascader
                v-model="areaItem.selectCityList"
                :options="areaItem.cityList"
                :props="areaCascaderProps(areaItem, areaIndex)"
                :clearable="false"
                collapse-tags
                class="area-wrap-city"
                popper-class="area-city-popper"
                @visible-change="(isVisible)=>handleCascaderVisibleChangeCity(isVisible, areaItem, areaIndex)"
                @change="changeCascader"
              />
            </el-col>
          </el-row>
        </div>
        <template #footer>
          <div class="dialog-footer">
            <el-button @click="selectDeliveryAreaDialogCancel">取 消</el-button>
            <el-button type="primary" @click="selectDeliveryAreaDialogSubmitForm">确 定</el-button>
          </div>
        </template>
      </el-dialog>
      <!-- 选择配送区域对话框 End -->
    <!-- 添加或修改对话框 End -->
  </el-dialog>
</template>

<script>
// import { updateNoticeMgr } from "@/api/system/noticeMgr";
import { saveAndEdit, getSelectById } from '@/api/ticketMr/ticketMr'
import { getToken } from "@/utils/auth";
import { pageList } from '@/api/performMr/performMr'
import FreightMgrIndexMi from "./FreightMgrIndexMi"
export default {
  name: "addAndEdit",
  mixins: [FreightMgrIndexMi],
  data() {
    let validateNumber = (rule, value, callback) => {
      let regNumber=/^(([1-9]\d*)|([0][.]{1}[0-9]{0,2}[0-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g;
      if (value === '') {
        callback(new Error('请输入大于等于0的数值!!!'));
      } else if(value==0){
        callback();
      }else if (!regNumber.test(value)) {
        callback(new Error('只能大于等于0的数值!!!'));
      } else{
        callback();
      }
    };
    return {
      channelList: [
        {id: 1, name: '小程序', value: 1},
        {id: 2, name: '窗口', value: 2},
      ],
      title: "编辑",
      model: "EDIT",
      activeName: '01',
      // 演员信息弹窗
      performerVisible: false,
      // 演员信息
      performerList: [],
      // 演员上传图片索引
      performerIndex: 0,
      open: false,
      loading: false,
      form: {
        id: undefined,
        type: "",
        content: "",
        isAuth: '1',
        backTime: '1',
        goodsPerform: {}
      },
      rules: {
        goodsName: [{ required: true, message: "请输入票务名称", trigger: ["change","blur"] }],
        stopSaleTime: [
          { required: true, message: "请输入停止售卖时间", trigger: ["change","blur"] },
          { validator: validateNumber, trigger: ["blur","change"]},
        ],
        beforeTime: [{ required: true, message: "请输入核销时间", trigger: ["change","blur"] }],
        verificationSpeaker: [{ required: true, message: "请输入核销播报次数", trigger: ["change","blur"] }],
        detail: [{ required: true, message: "请输入票务说明", trigger: ["change","blur"] }],
        salePrice: [{ required: true, message: "请输入销售价", trigger: ["change","blur"] }],

        buyAstrictType: [{ required: true, message: "请选择是否限购", trigger: ["change","blur"] }],
        buyAstrict: [{ required: true, message: "请输入每个账号在每个场次限购张数", trigger: ["change","blur"] }],

        backStatus: [{ required: true, message: "请选择是否支持退票", trigger: ["change","blur"] }],
        days: [{ required: true, message: "请输入日期", trigger: ["change","blur"] }],
      },
      uploadObj: {
        url: process.env.VUE_APP_UPLOAD_FILE_API + "/upload/single/minio",
        Headers: { Authorization: "Bearer " + getToken() },
      },
      statusList: [
        {id: 1, name: '是', value: 1},
        {id: 2, name: '否', value: 2},
      ],
      performList: []
    };
  },
  created() {
    this.getList()
  },
  methods: {
    /** 查询主办方列表 */
    getList() {
      pageList({pageNum: 1, pageSize: 100})
        .then(response => {
            this.performList = response.data.rows;
          }
        );
    },
    /** 主办方选择事件 */
    changePerform(val) {
      this.performList.forEach(item => {
        if(item.id == val){
          this.form.sponsorName = item.name
        }
      })
    },
    /**
     * 打开弹框
     * @date 2023-11-22
     * @param {any} obj
     * @returns {any}
     */
    openDialog(title, obj) {
      this.open = true;
      this.reset();
      this.activeName = '01';
      if (obj){
        this.title = "编辑票务管理";
        this.getSelectByIdApi(obj)
      }else{
        this.title = "添加票务管理";
        this.$nextTick(() => {
          this.$refs["form"].clearValidate();
        });
      }
    },
    /** 获取详情 */
    getSelectByIdApi(row) {
      const id = row.id
      getSelectById(id).then(response => {
        const obj = response.data;
        this.$nextTick(() => {
          this.$set(this.form, 'id', obj.id);
          this.$set(this.form, 'goodsName', obj.goodsName);
          this.$set(this.form, 'isAuth', '1');
          this.$set(this.form, 'verificationSpeaker', obj.goodsPerform.verificationSpeaker);
          this.$set(this.form, 'beforeTime', obj.goodsPerform.beforeTime);
          this.$set(this.form, 'stopSaleTime', obj.goodsPerform.stopSaleTime);
          this.$set(this.form, 'detail', obj.goodsPerform.detail);


          this.$set(this.form, 'salePrice', obj.salePrice);
          if(obj.goodsPerform.buyAstrict > -1){
            this.$set(this.form, 'buyAstrictType', '1');
            this.$set(this.form, 'buyAstrict', obj.goodsPerform.buyAstrict);
          } else {
            this.$set(this.form, 'buyAstrictType', '2');
            this.$set(this.form, 'buyAstrict', '');
          }
          this.$set(this.form, 'channelWx', obj.goodsPerform.channelWx == 0);
          this.$set(this.form, 'channelWindow', obj.goodsPerform.channelWindow == 0);
          this.$set(this.form, 'channelAutoSale', obj.goodsPerform.channelAutoSale == 0);

          this.$set(this.form, 'backStatus', obj.goodsPerform.backStatus);
          this.$set(this.form, 'backTime', '1');
          this.$set(this.form, 'backStatus', obj.goodsPerform.backStatus.toString());
          if(obj.goodsPerform.backStatus == '0') {
            this.$set(this.form, 'days', obj.performRefundRule.days);
            this.$set(this.form, 'hour', obj.performRefundRule.hour);
          }
        });
      });
    },
    /** 价格输入事件 */
    changePriceAmount(key) {
      if(this.form[key] * 1 < 0){
        this.$message.error("输入需大于或等于0!");
        this.$set(this.form, key, '');
        return false
      }
    },
    /**
     * 保存
     * @date 2023-11-22
     * @returns {any}
     */
    submitForm() {
      this.$refs["form"].validate(async (valid) => {
        if (valid) {
          try {
            let postMap = {
              goodsPerform: {},
              performRefundRule: {}
            }
            if(this.form.id){
              postMap.id = this.form.id;
            }
            postMap.goodsName = this.form.goodsName;
            postMap.isAuth = this.form.isAuth;
            postMap.goodsPerform.verificationSpeaker = this.form.verificationSpeaker;
            postMap.goodsPerform.beforeTime = this.form.beforeTime;
            postMap.goodsPerform.detail = this.form.detail;


            postMap.salePrice = this.form.salePrice;
            postMap.goodsPerform.buyAstrict = this.form.buyAstrictType == '1' ? this.form.buyAstrict : '-1';
            if(!(this.form.channelWx || this.form.channelWindow || this.form.channelAutoSale)){
              this.$message.error("请选择销售渠道!");
              return false;
            }
            postMap.goodsPerform.channelWx = this.form.channelWx ? 0 : 1;
            postMap.goodsPerform.channelWindow = this.form.channelWindow  ? 0 : 1;
            postMap.goodsPerform.channelAutoSale = this.form.channelAutoSale  ? 0 : 1;
            postMap.goodsPerform.backStatus = this.form.backStatus;
            if(this.form.backStatus == '0') {
              postMap.performRefundRule.days = this.form.days;
              postMap.performRefundRule.hour = this.form.hour;
            }
            postMap.goodsType = 2;
            postMap.classifyId = 1;
            postMap.classifyName = "门票类";
            this.loading = true;
            const { code } = await saveAndEdit({ ...postMap });
            if (code === 200) {
              this.$message.success("操作成功!");
              this.$emit("getList");
              this.cancel();
            }
          } catch (error) {
          } finally {
            this.loading = false;
          }
        }
      });
    },
    /**
     * 重置
     * @date 2023-11-22
     * @returns {any}
     */
    reset() {
      this.$set(this.form, 'id', '');
      this.$set(this.form, 'goodsName', '');
      this.$set(this.form, 'isAuth', '1');
      this.$set(this.form, 'verificationSpeaker', '');
      this.$set(this.form, 'detail', '');
      this.$set(this.form, 'goodsPerform', {});
      this.$set(this.form, 'salePrice', '');
      this.$set(this.form, 'buyAstrictType', '1');
      this.$set(this.form, 'buyAstrict', '');
      this.$set(this.form, 'channelWx', '');
      this.$set(this.form, 'channelWindow', '');

      this.$set(this.form, 'backStatus', '');
      this.$set(this.form, 'backTime', '1');
      this.$set(this.form, 'backStatus', '');
      this.$set(this.form, 'days', '');
      this.$set(this.form, 'hour', '');
    },
    /**
     * 关闭弹框
     * @date 2023-11-22
     * @returns {any}
     */
    cancel() {
      // this.reset();
      this.open = false;
    },
  },
};
</script>

<style lang="scss" scoped>
.dialog {
  padding: 0 30px;
  max-height: 65vh;
  overflow-y: auto;
}
.dialog {
  padding: 0 30px;
  .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;
  }
}

::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;
      }
    }
  }
}
</style>