<template>
  <ai-list class="gridScoreRules">
    <ai-title
      slot="title"
      title="积分规则"
      isShowBottomBorder>
    </ai-title>
    <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>
          <ai-picker
            :instance="instance"
            dialogTitle="选择网格"
            :ops="{label: 'girdName', id: 'girdCode'}"
            pageTitle="网格"
            :action="'/app/appgirdinfo/girdList?idType=1'"
            v-model="searchGirdList"
            @pick="onGirdChange">
            <div class="userSelcet">
              <span style="color: #606266;" v-if="search.girdCode">{{ girdName }}</span>
              <span v-else>有效地区</span>
              <i class="el-icon-arrow-up"  v-if="!search.girdCode"></i>
              <i class="el-icon-circle-close" v-if="search.girdCode" @click.stop="searchGirdList = [], search.girdCode = '', name = '', search.current = 1, getList()"></i>
            </div>
          </ai-picker>
        </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>{{ row.integral > 0 ? "+" : "" }}{{ row.integral }}</span>
          </template>
        </el-table-column>
        <el-table-column slot="options" label="操作" align="center" fixed="right" width="160">
          <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>
      <ai-dialog :title="dialogTitle" :visible.sync="dialog" @onConfirm="onConfirm" @close="closed" width="900px">
        <div class="form_div" v-if="dialog">
          <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="自定义事件" prop="ruleName" v-if="form.systemRuleId !== '17'">
              <ai-select v-model="form.ruleName" @change="change" placeholder="请选择自定义事件" :selectList="dict.getDict('appIntegralApplyEventType')">
            </ai-select>
            </el-form-item>

            <el-form-item label="规则">
              <div>常规</div>
            </el-form-item>
            <el-form-item label="周期范围" prop="scoringCycle">
              <ai-select v-model="form.scoringCycle" :selectList="dict.getDict('integralRuleScoringCycle')" />
            </el-form-item>
            <el-form-item label="奖励次数">
              <el-input type="number" placeholder="请输入,周期范围内,不填写表示不限制" v-model.number="form.numberLimit" clearable />
            </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="girdName" required>
              <ai-picker
                :instance="instance"
                dialogTitle="选择网格"
                :ops="{label: 'girdName', id: 'girdCode'}"
                pageTitle="网格"
                :action="'/app/appgirdinfo/girdList?idType=1'"
                v-model="form.girdCode"
                @pick="onPick">
                <div class="AppAnnounceDetail-select">
                  <el-input size="small" class="AppAnnounceDetail-select__input" placeholder="请选择..." disabled v-model="form.girdName"></el-input>
                  <div class="select-left" v-if="girdList.length">
                    <span v-for="(item, index) in girdList" :key="index">{{ item.girdName }}</span>
                  </div>
                  <i v-if="!girdList.length">请选择</i>
                  <div class="select-right">{{ girdList.length ? '重新选择' : '选择' }}</div>
                </div>
              </ai-picker>
            </el-form-item>
          </el-form>
        </div>
      </ai-dialog>
    </template>
  </ai-list>
</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 {
        girdList: [],
        girdName: '',
        search: {
          status: "",
          systemRuleId: "",
          ruleName: "",
          girdCode: ''
        },
        searchGirdList: [],
        systemRuleIdList: [],
        page: {current: 1, size: 10, total: 0},
        colConfigs: [
          {
            prop: "parentRuleName",
            label: "类型",
            dict: "integralRuleEventType",
          },
          {prop: "ruleName", label: "事件", dict: "integralRuleEvent", align: "center"},
          {prop: "ruleType", label: "规则", dict: "integralRuleRuleType", align: "center"},
          {
            prop: "scoringCycle",
            label: "周期范围",
            align: "center",
            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: "validRangeData",
            label: "有效地区",
            align: "center",
            format: v => JSON.parse(v).girdName
          },
          {
            prop: "status",
            label: "状态",
            align: "center",
            dict: "integralRuleStatus",
          },
          {slot: "options", label: "操作", align: "center"},
        ],
        tableData: [],
        dialog: false,
        form: {
          ruleType: "0",
          systemRuleId: "",
          ruleName: "",
          scoringCycle: "",
          numberLimit: "",
          integral: "",
          validRangeType: "1",
          validRangeData: "",
          girdName: '',
          girdCode: []
        },
        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"},],
          girdName: [
            {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.form.areaId = this.$store.state.user.info.areaId
      this.$dict.load("integralRuleStatus", "integralRuleRuleType", "integralRuleScoringCycle",
          "integralRuleEvent", "integralRuleEventType", 'appIntegralApplyEventType').then(() => {
        this.getList();
        this.getRulesList();
      });
    },
    methods: {
      onGirdChange (e) {
        if (e.length) {
          this.girdName = e[0].girdName
          this.search.girdCode = e[0].girdCode
        } else {
          this.girdName = ''
        }

        this.searchGirdList = e

        this.page.current = 1

        this.$nextTick(() => {
          this.getList()
        })
      },
      onPick (e) {
        if (e.length) {
          this.form.girdName = e[0].girdName
        } else {
          this.form.girdName = ''
          this.form.girdCode = []
        }

        this.girdList = e
      },

      getList() {
        this.instance
        .post(`/app/appintegralrule/listByAppletFD`, null, {
          params: {
            ...this.search,
            ...this.page,
          },
        })
        .then((res) => {
          if (res?.data) {
            this.tableData = res.data.records;
            this.page.total = res.data.total;
          }
        });
      },

      change (e) {
      },
      closed () {
        this.form.ruleType = '0'
        this.form.systemRuleId = ''
        this.form.ruleName = ''
        this.form.scoringCycle = ''
        this.form.numberLimit = ''
        this.form.integral = ''
        this.form.validRangeType = '1'
        this.form.validRangeData = ''
        this.form.girdName = ''
        this.form.girdCode = []
        this.girdList = []
      },
      toEdit(row) {
        this.form = {...row}
        if (this.form?.validRangeData) {
          this.form.girdName = JSON.parse(this.form.validRangeData).girdName
          this.form.girdCode = [JSON.parse(this.form.validRangeData).girdCode]
          this.girdList = [JSON.parse(this.form.validRangeData)]
        }
        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,
              appCodeType: '2',
              girdCode: '',
              validRangeData: JSON.stringify({
                id: this.girdList[0].id,
                girdName: this.girdList[0].girdName,
                girdCode: this.girdList[0].girdCode
              })
            })
            .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[1] == '17') {
            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/listByAppletFD?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;
      }
    },
    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;

    .userSelcet {
      display: flex;
      align-items: center;
      justify-content: space-between;
      width: 215px;
      height: 32px;
      line-height: 32px;
      border-radius: 4px;
      border: 1px solid #d0d4dc;
      overflow: hidden;
      cursor: pointer;
      transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);

      &:hover {
        border-color: $placeholderColor;
      }

      i {
        display: flex;
        position: relative;
        align-items: center;
        justify-content: center;
        width: 30px;
        height: 100%;
        line-height: 32px;
        font-size: 14px;
        text-align: center;
        color: #d0d4dc;
        transform: rotateZ(180deg);
      }

      .el-icon-circle-close:hover {
        opacity: 0.6;
      }

      span {
        flex: 1;
        padding: 0 15px;
        font-size: 12px;
        color: $placeholderColor;
      }
    }

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

    // :deep( .searchRightZone ){
    //   display: flex;
    // }

    .AppAnnounceDetail-select {
      display: flex;
      align-items: center;
      min-height: 32px;
      line-height: 1;
      background: #F5F5F5;
      border-radius: 4px;
      border: 1px solid #D0D4DC;
      cursor: pointer;
      overflow: hidden;
      transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);

      &:hover {
        border-color: #26f;
      }

      & > i {
        flex: 1;
        height: 100%;
        line-height: 32px;
        padding: 0 12px;
        color: #888888;
        font-size: 14px;
        font-style: normal;
        border-right: 1px solid #D0D4DC;
        background: #fff;
      }

      .AppAnnounceDetail-select__input {
        position: absolute;
        left: 0;
        top: 0;
        z-index: -1;
        opacity: 0;
        height: 100%;
      }

      .select-right {
        height: 100%;
        padding: 0 12px;
        color: #222222;
        font-size: 12px;
        cursor: pointer;
        transition: all ease 0.3s;

        &:hover {
          opacity: 0.5;
        }
      }

      .select-left {
        display: flex;
        flex-wrap: wrap;
        flex: 1;
        padding: 5px 0 0px 12px;
        border-right: 1px solid #D0D4DC;
        border-radius: 4px 0 0 4px;
        background: #fff;

        em {
          height: 22px;
          line-height: 22px;
          margin: 0 4px 5px 0;
          color: #222222;
          font-size: 12px;
          font-style: normal;
        }

        span {
          height: 22px;
          line-height: 22px;
          margin: 0 4px 5px 0;
          padding: 0 8px;
          font-size: 12px;
          color: #222222;
          background: #F3F4F7;
          border-radius: 2px;
          border: 1px solid #D0D4DC;
        }
      }
    }
    :deep( .ai-dialog ){
      .el-cascader {
        width: 100%;
      }

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