<template>
  <section class="gridScoreRules">
    <!--  v-if="permissions('app_appvillagerintegralrule_detail')" -->
    <ai-list>
      <template slot="content">
        <ai-search-bar>
          <template #left>
            <el-button type="primary" icon="iconfont iconAdd" @click="dialog = true">&nbsp;添加</el-button>
            <el-cascader size="small" v-model="systemRuleIdList" :options="rulesOps" placeholder="请选择事件/类型" clearable :props="rulesProps"
                         @change="handleTypeSearch" ref="eventTypeSearch"/>
            <ai-select v-model="search.status" @change="(page.current = 1), getList()" placeholder="请选择状态" :selectList="$dict.getDict('integralRuleStatus')">
            </ai-select>
          </template>
        </ai-search-bar>
        <ai-table :tableData="tableData" :col-configs="colConfigs" :total="page.total" :dict="dict" :current.sync="page.current" :size.sync="page.size"
                  @getList="getList()">
          <el-table-column slot="integral" label="分值" align="center">
            <template slot-scope="{ row }">
              <!-- <span v-if="row.integralValueType == 1">
                {{ row.integralStart > 0 ? "+" + row.integralStart : row.integralStart }}~{{ row.integralEnd > 0 ? "+" + row.integralEnd : row.integralEnd }}
              </span> -->
              <span>{{ row.integral > 0 ? "+" : "" }}{{ row.integral }}</span>
            </template>
          </el-table-column>
          <el-table-column slot="options" label="操作" align="center" fixed="right" width="200">
            <template slot-scope="{ row }">
              <div class="table-options">
                <el-button type="text" @click="changeStatus(row.id, 0)" v-if="row.status == 1">停用</el-button>
                <el-button type="text" @click="changeStatus(row.id, 1)" v-else>启用</el-button>
                <el-button type="text" @click="toEdit(row)">编辑</el-button>
                <el-button type="text" @click="remove(row.id)">删除</el-button>
              </div>
            </template>
          </el-table-column>
        </ai-table>
      </template>
    </ai-list>
    <!-- <ai-empty v-else>暂无应用权限</ai-empty> -->
    <ai-dialog :title="dialogTitle" :visible.sync="dialog" @onConfirm="onConfirm" @closed="closed" width="900px" @open="beforeSelectTree">
      <div class="form_div">
        <el-form ref="DialogForm" :model="form" :rules="formRules" size="small" label-suffix="：" label-width="150px">
          <el-form-item label="事件类型" prop="systemRuleId">
            <el-cascader v-model="form.systemRuleId" ref="cascaderArr" :props="etOps" clearable placeholder="请选择" @change="handleTypeForm" :options="rulesOps"/>
          </el-form-item>
          <el-form-item label="自定义事件" v-if="form.systemRuleId == '自定义'" prop="ruleName">
            <el-input placeholder="请输入,周期范围内,不填写表示不限制" v-model="form.ruleName" clearable maxlength="10" show-word-limit/>
          </el-form-item>

          <el-form-item label="规则">
            <div>常规</div>
          </el-form-item>

          <!-- <el-form-item label="规则" prop="ruleType" v-if="form.ruleType>-1" required>
            <el-row type="flex" justify="space-between">
              <div v-text="$dict.getLabel('integralRuleRuleType',form.ruleType)"/>
              <el-button v-if="form.ruleType==1" type="text" icon="iconfont iconAdd"
                         @click="form.ladderRule.push({viewCount:null,integral:null})">添加
              </el-button>
            </el-row>
            <el-table v-if="form.ruleType==1" :data="form.ladderRule" size="mini" border stripe>
              <el-table-column label="查看人数(人)" align="center">
                <template slot-scope="{row}">
                  <el-input class="tableInput" v-model.number="row.viewCount" clearable placeholder="请输入"/>
                </template>
              </el-table-column>
              <el-table-column label="获得积分(分)" align="center">
                <template slot-scope="{row}">
                  <el-input class="tableInput" v-model="row.integral" clearable placeholder="请输入" type="number"
                            @keyup.native="row.integral=checkIntegral(row.integral)"/>
                </template>
              </el-table-column>
              <el-table-column label="操作" align="center">
                <template slot-scope="{$index}">
                  <el-button type="text" @click="handleDelete($index)">删除</el-button>
                </template>
              </el-table-column>
            </el-table>
          </el-form-item> -->

          <el-form-item label="周期范围" prop="scoringCycle">
            <ai-select v-model="form.scoringCycle" :selectList="$dict.getDict('integralRuleScoringCycle')" :disabled="isOneAndTen"/>
          </el-form-item>

          <el-form-item label="奖励次数">
            <el-input type="number" placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable :disabled="isOneAndTen"/>
          </el-form-item>

          <el-form-item label="积分分值" prop="integral">
            <el-input placeholder="请输入" v-model="form.integral" clearable/>
          </el-form-item>

          <el-form-item label="有效范围" prop="validRangeType" required>
            <el-radio-group v-model="form.validRangeType">
              <el-radio label="0">全局</el-radio>
              <el-radio label="1">指定网格</el-radio>
            </el-radio-group>
          </el-form-item>

          <el-form-item label="生效网格" :prop="form.validRangeType == 1 ? 'validRangeData' : ''"
                        :rules="[{ required: true, message: '请选择生效网格', trigger: 'change' }, ]" v-if="form.validRangeType == 1">
            <ai-dialog-btn dialogTitle="选择网格" append-to-body @onConfirm="getCheckedTree" :customFooter="false" :text="girdInfoList.length ? '重新选择' : '请选择'">
              <div class="grid">
                <el-tree :data="treeObj.treeList" :props="treeObj.defaultProps" node-key="id" :expand-on-click-node="false">
                  <template slot-scope="{data}">
                    <el-row class="fill" type="flex" @click.native.stop="handleTreeChecked(data)">
                      <div class="fill" v-text="data.girdName"/>
                      <div class="iconfont iconSuccess color-primary mar-r8" v-if="data.checked"/>
                    </el-row>
                  </template>
                </el-tree>
              </div>
            </ai-dialog-btn>

            <div v-if="girdInfoList.length">
              <span v-for="(e,index) in girdNameList" :key="index" class="mar-r8" v-text="e"/>
            </div>
          </el-form-item>
        </el-form>
      </div>
    </ai-dialog>
  </section>
</template>

<script>
export default {
  name: "gridScoreRules",
  label: "积分规则",
  props: {
    instance: Function,
    dict: Object,
    permissions: Function,
  },
  data() {
    var validcode = (rule, value, callback) => {
      if (value) {
        if (value != 0) {
          if (!/^([+-]?([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/.test(value)) {
            callback(new Error('请输入积分分值，可输入正数、负数、最多保留两位小数'))
          } else {
            callback();
          }
        } else {
          callback(new Error('请输入有效的积分分值'));
        }
      } else {
        callback(new Error('请输入积分分值'));
      }
    }
    return {
      search: {
        status: "",
        systemRuleId: "",
        ruleName: ""
      },
      systemRuleIdList: [],
      page: {current: 1, size: 10, total: 0},
      colConfigs: [
        {
          prop: "parentRuleName",
          label: "类型",
          dict: "integralRuleEventType",
        },
        {prop: "ruleName", label: "事件", dict: "integralRuleEvent"},
        {prop: "ruleType", label: "规则", dict: "integralRuleRuleType"},
        {
          prop: "scoringCycle",
          label: "周期范围",
          dict: "integralRuleScoringCycle",
          render: (h, {row}) => {
            return h(
                "span",
                {},
                row.numberLimit.length
                    ? $dict.getLabel("integralRuleScoringCycle", row.scoringCycle)
                    : $dict.getLabel("integralRuleScoringCycle", row.scoringCycle) +
                    row.numberLimit +
                    "次"
            );
          },
        },
        {slot: "integral", label: "积分分值", align: "center"},
        {
          prop: "validRangeType",
          label: "有效范围",
          formart: (v) => (v == 0 ? "全局" : "指定网格"),
        },
        {
          prop: "status",
          label: "状态",
          align: "center",
          width: 96,
          dict: "integralRuleStatus",
        },
        {slot: "options", label: "操作", align: "center"},
      ],
      tableData: [],
      dialog: false,
      form: {
        ruleType: "0",
        systemRuleId: "",
        ruleName: "",
        scoringCycle: "",
        numberLimit: "",
        integral: "",
        validRangeType: "0",
        validRangeData: "",
      },
      formRules: {
        systemRuleId: [
          {required: true, message: "请选择事件/类型", trigger: "change"},
        ],
        ruleName: [
          {required: true, message: "请输入自定义事件", trigger: "change"},
        ],
        scoringCycle: [
          {required: true, message: "请选择周期范围", trigger: "change"},
        ],
        integral: [{required: true, validator: validcode, trigger: "blur"},],
        validRangeType: [
          {required: true, message: "请选择有效范围", trigger: "change"},
        ],
      },
      rulesOps: [],
      rulesProps: {
        label: "ruleName",
        value: "id",
        checkStrictly: true,
      },
      radio: 0,
      treeObj: {
        treeList: [],
        defaultProps: {
          label: "girdName",
          value: "id",
          children: 'children',
          isLeaf: 'leaf'
        },
      },
      treeSelected: {},
      girdInfoList: [],
      rulueType: "0",
      girdNameList: [],
      list: [],
      isOneAndTen: false,
    };
  },
  created() {
    this.$dict.load("integralRuleStatus", "integralRuleRuleType", "integralRuleScoringCycle",
        "integralRuleEvent", "integralRuleEventType").then(() => {
      this.getList();
      this.getRulesList();
    });
  },
  methods: {
    getList() {
      this.instance
      .post(`/app/appintegralrule/list`, null, {
        params: {
          ...this.search,
          ...this.page,
        },
      })
      .then((res) => {
        if (res?.data) {
          this.tableData = res.data.records;
          this.page.total = res.data.total;
        }
      });
    },
    closed() {
      this.form = {
        ruleType: "0",
        systemRuleId: "",
        ruleName: "",
        scoringCycle: "",
        numberLimit: "",
        integral: "",
        validRangeType: "0",
        validRangeData: "",
      };
      this.girdInfoList = []
      this.treeSelected = {}
    },
    toEdit(row) {
      this.form = {...row}
      if (this.form?.validRangeData) {
        this.girdInfoList = JSON.parse(this.form.validRangeData)
        this.girdNameList = this.girdInfoList.map(e => e.girdName)
      }
      this.$nextTick(() => {
        this.dialog = true;
      });
    },
    remove(id) {
      this.$confirm("删除后不可恢复，是否要删除该规则？", {
        type: "error",
      }).then(() => {
        this.instance
        .post(`/app/appintegralrule/delete?ids=${id}`)
        .then((res) => {
          if (res.code == 0) {
            this.$message.success("删除成功！");
            this.getList();
          }
        });
      });
    },
    changeStatus(id, status) {
      let text = status == 1 ? "启用" : "停用";
      this.$confirm(`确定${text}该条规则？`).then(() => {
        this.instance
        .post(`/app/appintegralrule/enableStatus?id=${id}`)
        .then((res) => {
          if (res.code == 0) {
            this.$message.success(`${text}成功！`);
            this.getList();
          }
        });
      });
    },
    onConfirm() {
      this.$refs.DialogForm.validate((valid) => {
        if (valid) {
          let formData = this.$copy(this.form);
          // formData.ladderRule = JSON.stringify(formData.ladderRule)
          formData.integral = formData.integral || 0;
          this.instance
          .post(`/app/appintegralrule/addOrUpdate`, formData)
          .then((res) => {
            if (res.code == 0) {
              this.$message.success(
                  `${this.isEdit ? "编辑成功" : "添加成功"}`
              );
              this.dialog = false;
              this.getList();
              this.closed();
              this.girdInfoList = []
              this.girdNameList = []
            }
          });
        } else {
          return false;
        }
      });
    },
    handleTypeSearch(v) {
      this.systemRuleIdList = v
      this.search.systemRuleId = v?.[v.length - 1];
      this.search.ruleName = this.$refs.eventTypeSearch.getCheckedNodes()[0]?.label
      this.page.current = 1;
      this.$refs.eventTypeSearch.dropDownVisible = false;
      this.getList();
    },
    handleTypeForm(v) {
      if (this.dialog) {
        if(v[0] == '1' || v[0]== '10') {
          this.form.scoringCycle = '0'
          this.form.numberLimit = '1'
          this.isOneAndTen = true
        } else {
          this.form.scoringCycle = ''
          this.form.numberLimit = ''
          this.isOneAndTen = false
        }
        this.form.systemRuleId = v?.[v.length - 1];
      }
    },
    handleDelete(i) {
      this.$confirm("是否要删除该规则?")
      .then(() => {
        this.form.ladderRule.splice(i, 1);
      })
      .catch(() => 0);
    },
    checkIntegral(v) {
      return /\.\d{2,}$/.test(v) ? Math.abs(v).toFixed(1) : Math.abs(v);
    },
    getRulesList() {
      this.instance
      .post(`/app/appintegralsystemrule/list?current=1&size=3000`)
      .then((res) => {
        if (res?.data) {
          this.rulesOps = this.toTree(res.data.records);
          this.rulesOps.push({
            ruleName: "自定义",
            id: "自定义",
          });
        }
      });
    },
    // 转树形结构
    toTree(data) {
      let result = [];
      if (!Array.isArray(data)) {
        return result;
      }
      let map = {};
      data.forEach((item) => {
        map[item.id] = item;
      });
      data.forEach((item) => {
        let parent = map[item.parentRuleId];
        if (parent) {
          (parent.children || (parent.children = [])).push(item);
        } else {
          result.push(item);
        }
      });
      return result;
    },
    getCheckedTree() {
      const selected = Object.values(this.treeSelected)
      if (!selected.length) {
        return this.$message.error("请选择网格");
      }

      this.girdInfoList = selected.map((item) => {
        return {...item, checkType: true};
      });
      let validRangeData = selected.map((e) => ({id: e.id, girdName: e.girdName}))
      this.girdNameList = validRangeData.map(e => e.girdName)
      this.form.validRangeData = JSON.stringify(validRangeData)
    },
    beforeSelectTree() {
      this.instance.post(`/app/appgirdinfo/listAll3`, null, null).then((res) => {
        if (res?.data) {
          this.list = res.data.map(e => ({...e, checked: !!this.girdInfoList.find(s => s.id == e.id)}))
          this.girdInfoList.map(e => this.treeSelected[e.id] = e)
          this.treeObj.treeList = this.$arr2tree(this.list, {parent: 'parentGirdId'})
        }
      });
    },
    handleTreeChecked(data) {
      this.list.forEach(v => {
        return {
          ...v,
          checked: false
        }
      })
      data.checked = !data.checked
      if (data.checked) {
        this.treeSelected[data.id] = data
      } else {
        delete this.treeSelected[data.id]
      }
    }
  },
  computed: {
    isEdit() {
      return !!this.form.id;
    },
    dialogTitle() {
      return this.isEdit ? "编辑积分规则" : "添加积分规则";
    },
    etOps() {
      return {
        value: "id",
        label: "ruleName",
      };
    },
  },
};
</script>

<style lang="scss" scoped>
.gridScoreRules {
  height: 100%;
  background: #f3f6f9;

  ::v-deep .ai-list__content--right {
    width: 100%;
  }

  // ::v-deep .searchRightZone {
  //   display: flex;
  // }

  ::v-deep .ai-dialog {
    .el-cascader {
      width: 100%;
    }

    .tableInput {
      & > input {
        text-align: center;
        border: none;
        background: transparent;
      }
    }
  }
}
</style>
