index.vue 18.7 KB
Newer Older
1 2
<template>
  <div class="app-container">
3
    <el-button type="success" @click="handleSelectMember"> {{ $t("添加会员") }}</el-button>
4
    <div class="container exchangeBulkOperation">
5
      <div v-if="memberList.length > 0">
6 7
        <div class="formBox" v-for="(item, index) in queryParamsList" :key="item.memberId">
          <el-form :model="queryParamsList[index]" :ref="`queryForm${item.memberId}`" size="small" :inline="true" :rules="rules" label-width="168px">
8 9 10 11
            <el-card class="box-card">
              <div slot="header" class="clearfix">
                <el-row :gutter="10">
                  <span class="card-title">{{ $t("基础信息") }}</span>
12 13
                  <el-button style="padding: 0 10px" @click="handleExpand(item)" type="text">{{ item.expand ? $t("收起") : $t("展开") }}<i :class="item.expand ? 'el-icon-caret-top' : 'el-icon-caret-bottom'"></i></el-button>
                  <el-button type="text" @click="handleDelete(index, item)" class="del-btn">{{ $t("删除") }}</el-button>
14 15 16
                </el-row>
                <el-row :gutter="10">
                  <el-form-item :label="$t('会员名称')">
17
                    <el-input :placeholder="$t('请输入会员名称')" clearable :disabled="true" v-model="item.memberName" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
18 19
                  </el-form-item>
                  <el-form-item :label="$t('当前积分')">
20
                    <el-input :placeholder="$t('请输入当前积分')" clearable :disabled="true" v-model="item.holdScore" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
21 22
                  </el-form-item>
                  <el-form-item :label="$t('礼品选择')">
23
                    <el-input :placeholder="$t('请选择礼品')" clearable :disabled="true" v-model="item.rewardName" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
24 25
                  </el-form-item>
                  <el-form-item :label="$t('礼品积分')">
26
                    <el-input :placeholder="$t('请输入礼品积分')" clearable :disabled="true" v-model="item.pointsRequire" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
27 28 29 30 31 32 33 34
                  </el-form-item>
                  <el-form-item :label="$t('兑换数量')" prop="rewardCount">
                    <el-input
                      :placeholder="$t('请输入兑换数量')"
                      clearable
                      v-model.number="item.rewardCount"
                      @change="
                        (val) => {
35
                          handleRewardCount(item, index, val)
36 37 38 39 40 41
                        }
                      "
                      onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')"
                    />
                  </el-form-item>
                  <el-form-item :label="$t('本次兑换积分')">
42
                    <el-input :placeholder="$t('请输入本次兑换积分')" clearable :disabled="true" v-model="item.spendCredit" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
43 44
                  </el-form-item>
                  <el-form-item :label="$t('兑换后剩余积分')">
45
                    <el-input :placeholder="$t('兑换后剩余积分')" clearable :disabled="true" v-model="item.remainingPoints" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
46 47 48 49 50 51 52 53
                  </el-form-item>
                </el-row>
                <el-row :gutter="10" v-show="item.expand">
                  <el-row>
                    <span class="card-title">{{ $t("详细信息") }}</span>
                  </el-row>
                  <el-row>
                    <el-form-item :label="$t('兑换方式')" prop="redeemType">
54
                      <dict-selector clearable :type="DICT_TYPE.WAY_OF_RECEIVING" :filter="(e) => filterDicRedeemTypeList(e)" v-model="item.redeemType" @change="handleRedeemType(item)"> </dict-selector>
55 56
                    </el-form-item>
                    <el-form-item :label="$t('兑换入口')">
57
                      <dict-selector clearable :disabled="true" v-model="item.entrance" :type="DICT_TYPE.PLATFORM_TYPE"> </dict-selector>
58
                    </el-form-item>
59 60
                    <el-form-item class="expenses" :label="$t('费用')">
                      <el-row>
61
                        <el-col :span="12">
chenwei's avatar
chenwei committed
62
                          <el-form-item prop="expenses" :rules="rules.expenses" v-show="item.currency">
63
                            <el-input v-model="item.expenses" :placeholder="$t('请输入数字')" clearable onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
chenwei's avatar
chenwei committed
64 65
                          </el-form-item>
                          <el-form-item v-show="!item.currency">
66
                            <el-input v-model="item.expenses" :placeholder="$t('请输入数字')" clearable onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
67 68
                          </el-form-item>
                        </el-col>
69
                        <el-col :span="12">
70 71 72 73 74 75 76 77 78 79 80 81
                          <div>
                            <el-form-item prop="currency" :rules="rules.currency" v-show="item.expenses">
                              <el-select clearable v-model="item.currency" :placeholder="$t('请选择币种')">
                                <el-option v-for="nodeItem in currencyList" :key="nodeItem.id" :label="isChinese ? nodeItem.titleZh : nodeItem.titleEn" :value="nodeItem.id" />
                              </el-select>
                            </el-form-item>
                            <el-form-item v-show="!item.expenses">
                              <el-select clearable v-model="item.currency" :placeholder="$t('请选择币种')">
                                <el-option v-for="nodeItem in currencyList" :key="nodeItem.id" :label="isChinese ? nodeItem.titleZh : nodeItem.titleEn" :value="nodeItem.id" />
                              </el-select>
                            </el-form-item>
                          </div>
82 83 84
                        </el-col>
                      </el-row>
                    </el-form-item>
85 86 87
                    <el-form-item :label="$t('收件人姓名')"><el-input :placeholder="$t('请输入收件人姓名')" clearable v-model="item.recipientName" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" /> </el-form-item>
                    <el-form-item :label="$t('收件人电话')">
                      <el-input :placeholder="$t('请输入收件人电话')" clearable v-model="item.recipientPhoneNum" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
88
                    </el-form-item>
89 90
                    <el-form-item :label="$t('收件人地址')" v-if="item.redeemType != '1'">
                      <el-input :placeholder="$t('请输入收件人地址')" clearable v-model="item.recipientAddress" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
91 92
                    </el-form-item>
                    <el-form-item :label="$t('兑换人')">
93
                      <el-input :placeholder="$t('请输入兑换人')" clearable v-model="item.redeemer" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
94 95
                    </el-form-item>
                    <el-form-item :label="$t('兑换时间')">
96
                      <el-date-picker type="datetime" placement="bottom-start" value-format="yyyy-MM-dd HH:mm:ss" :placeholder="$t('选择兑换时间')" v-model="item.redemptionTime"></el-date-picker>
97
                    </el-form-item>
98 99 100
                    <el-form-item :label="$t('快递公司')" v-if="item.redeemType != '1'">
                      <el-select v-model="item.courierCompany" :placeholder="$t('请选择快递公司')">
                        <el-option v-for="nodeItem in expressList" :key="nodeItem.id" :label="nodeItem.companyName" :value="nodeItem.id" />
101 102
                      </el-select>
                    </el-form-item>
103 104
                    <el-form-item :label="$t('快递单号')" v-if="item.redeemType != '1'">
                      <el-input :placeholder="$t('请输入快递单号')" clearable v-model="item.expressNo" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
105
                    </el-form-item>
106 107
                    <el-form-item :label="$t('快递日期')" v-if="item.redeemType != '1'">
                      <el-date-picker type="date" :placeholder="$t('选择快递日期')" v-model="item.expressDate" value-format="yyyy-MM-dd HH:mm:ss" placement="bottom-start"></el-date-picker>
108 109
                    </el-form-item>
                    <el-form-item :label="$t('快递寄出人')">
110
                      <el-input :placeholder="$t('请输入快递寄出人')" clearable v-model="item.expressSender" onkeyup="this.value=this.value.replace(/(^\s*)|(\s*$)/g,'')" />
111 112
                    </el-form-item>
                    <el-form-item :label="$t('上传附件')">
113
                      <file-upload v-model="item.annex" :fileType="['doc', 'docx', 'xls', 'xlsx', 'txt', 'pdf', 'jpg', 'jpeg', 'png']"></file-upload>
114 115
                    </el-form-item>
                    <el-form-item :label="$t('备注')">
116
                      <el-input style="width: 500px" type="textarea" v-model="item.remark"></el-input>
117 118 119 120 121 122 123 124 125 126 127 128 129
                    </el-form-item>
                  </el-row>
                </el-row>
              </div>
            </el-card>
          </el-form>
        </div>
      </div>
      <div v-else class="emptyText">
        {{ $t("请先添加准备兑换礼品的会员") }}
      </div>
      <el-row justify="end" :gutter="20" type="flex" class="handleButton">
        <el-col :span="2">
130
          <el-button v-if="memberList.length > 0" type="primary" @click="handleBulkConversion">{{ $t("确认兑换") }}</el-button>
131 132 133 134 135 136 137
        </el-col>
        <el-col :span="2">
          <el-button @click="handleBack">{{ $t("返回") }}</el-button>
        </el-col>
      </el-row>
    </div>

138
    <choose-Member :dialogVisible.sync="dialogVisible" @transferSelectMemberInfo="onGetSelectMemberInfo" :memberSelectList="memberList" :giftScore.sync="rewardsDetails.pointsRequire"> </choose-Member>
139 140 141
  </div>
</template>
<script>
142 143 144 145 146 147 148
import { getRewardsDetails, bulkConversion } from "@/api/ecw/giftManagement"
import FileUpload from "@/components/FileUpload"
import chooseMember from "./components/chooseMember.vue"
import { getExpressPage } from "@/api/ecw/express"
import { getCurrencyList } from "@/api/ecw/currency"
import { getNowDateTime } from "@/utils/ruoyi"
import { handleError } from "@vue/runtime-dom"
149 150 151 152

export default {
  name: "giftManagementList",
  components: {
153
    chooseMember,
154
    FileUpload
155 156 157 158
  },
  data() {
    var validatePass2 = (rule, value, callback) => {
      if (!this.quantityComputation) {
159
        return callback(new Error(this.$t("兑换积分大于当前总积分,请重新输入兑换数量")))
160
      } else {
161
        return callback()
162
      }
163
    }
164 165 166 167 168 169 170 171 172 173 174 175 176 177
    return {
      env: process.env.NODE_ENV,
      // 是否显示弹出层
      dialogVisible: false,
      // 查询参数
      queryParamsList: [],
      // 网点
      nodeList: [],
      //快递公司列表
      expressList: [],
      memberList: [],
      currencyList: [],
      quantityComputation: null,
      checkFormResult: [],
178
      rewardsDetails: {},
179 180 181 182 183
      rules: {
        rewardCount: [
          {
            required: true,
            message: this.$t("请输入兑换数量"),
184
            trigger: "blur"
185 186 187
          },
          {
            validator: validatePass2,
188 189
            trigger: ["blur", "change"]
          }
190 191 192 193 194
        ],
        expenses: [
          {
            required: true,
            message: this.$t("请输入费用"),
195
            trigger: "blur"
196 197 198 199
          },
          {
            pattern: /^\d+(\.\d{1,2})?$/,
            message: this.$t("请输入整数或保留小数点后两位"),
200 201
            trigger: "blur"
          }
202 203 204 205 206
        ],
        currency: [
          {
            required: true,
            message: this.$t("请选择币种"),
207 208
            trigger: "change"
          }
209 210 211 212 213
        ],
        redeemType: [
          {
            required: true,
            message: this.$t("请选择兑换方式"),
214 215
            trigger: "change"
          }
216 217 218 219 220
        ],
        recipientName: [
          {
            required: true,
            message: this.$t("请输入收件人姓名"),
221 222
            trigger: "blur"
          }
223 224 225 226 227
        ],
        recipientPhoneNum: [
          {
            required: true,
            message: this.$t("请输入收件人电话"),
228 229
            trigger: "blur"
          }
230 231 232 233 234
        ],
        recipientAddress: [
          {
            required: true,
            message: this.$t("请输入收件人地址"),
235 236 237 238 239
            trigger: "blur"
          }
        ]
      }
    }
240 241 242
  },
  computed: {
    isChinese() {
243 244
      return this.$i18n.locale === "zh_CN"
    }
245 246
  },
  created() {
247 248 249
    this.getRewardsDetailsAPI()
    this.getExpressList()
    this.currencyListAPI()
250 251 252
  },
  activated() {},
  methods: {
253 254 255 256
    //兑换方式下拉列表默认关联礼品
    filterDicRedeemTypeList(e) {
      return this.rewardsDetails.pickMethod.split(",").some((val) => e.value == val)
    },
257 258
    handleRedeemType(item) {
      this.$nextTick(() => {
259 260
        this.$refs[`queryForm${item.memberId}`][0].clearValidate()
      })
261
    },
262
    handleRewardCount(item, index, value) {
263 264 265
      this.queryParamsList[index].spendCredit = this.queryParamsList[index].pointsRequire * value
      this.queryParamsList[index].remainingPoints = this.queryParamsList[index].holdScore - this.queryParamsList[index].spendCredit
      this.quantityComputation = this.queryParamsList[index].remainingPoints >= 0 ? true : false
266 267 268 269 270 271
    },

    handleDelete(index, item) {
      this.$modal
        .confirm(this.$t("是否确认删除此数据"))
        .then(() => {
272
          this.queryParamsList.splice(index, 1)
273

274
          this.memberList = this.memberList.filter((res) => res.id != item.memberId)
275

276
          this.$modal.msgSuccess(this.$t("删除成功"))
277
        })
278
        .catch(() => {})
279 280 281 282
    },
    handleExpand(item) {
      this.queryParamsList.forEach((element) => {
        if (element.memberId == item.memberId) {
283
          element.expand = !item.expand
284
        }
285
      })
286 287 288
    },
    currencyListAPI() {
      getCurrencyList().then((res) => {
289 290
        this.currencyList = res.data
      })
291 292 293 294 295
    },
    onGetSelectMemberInfo(data) {
      if (data.length > 0) {
        data.filter((item) => {
          let inculde = this.queryParamsList.some((itemQuery) => {
296 297
            return item.id == itemQuery.memberId
          })
298 299 300 301 302 303 304
          if (!inculde) {
            let queryParams = {
              expand: true,
              memberId: item.id,
              holdScore: item.holdScore,
              rewardId: this.rewardsDetails.id,
              pointsRequire: this.rewardsDetails.pointsRequire,
305
              rewardCount: 1,
306 307 308 309 310 311 312 313 314 315
              spendCredit: null, //本次兑换花费积分
              remainingPoints: null, //剩余积分
              redeemType: null,
              entrance: 1,
              expenses: null,
              currency: null,
              recipientName: null,
              recipientPhoneNum: null,
              recipientAddress: null,
              redeemer: this.$store.getters.name,
316
              redemptionTime: getNowDateTime(),
317 318 319 320 321
              courierCompany: null,
              expressNo: null,
              expressSender: this.$store.getters.name,
              expressDate: null,
              remark: null,
322 323
              annex: null
            }
324
            if (this.isChinese) {
325 326
              queryParams.memberName = item.memberNameZh
              queryParams.rewardName = this.rewardsDetails.titleZh
327
            } else {
328 329
              queryParams.memberName = item.memberNameEn
              queryParams.rewardName = this.rewardsDetails.titleEn
330
            }
331 332 333 334 335 336 337 338 339
            queryParams.spendCredit = queryParams.pointsRequire
            queryParams.remainingPoints = queryParams.holdScore - queryParams.spendCredit
            this.quantityComputation = queryParams.remainingPoints >= 0 ? true : false
            this.memberList.push(item)
            this.queryParamsList.push({ ...queryParams })
            this.$nextTick(() => {
              this.$refs[`queryForm${item.id}`][0].clearValidate()
              this.$refs[`queryForm${item.id}`][0].validateField("rewardCount")
            })
340
          }
341
        })
342 343 344
      }
    },
    handleSelectMember() {
345
      this.dialogVisible = true
346 347 348 349
    },
    getExpressList() {
      let params = {
        pageNo: 1,
350 351
        pageSize: 1000
      }
352
      getExpressPage(params).then((res) => {
353 354
        this.expressList = res.data.list
      })
355 356 357
    },
    getRewardsDetailsAPI() {
      let params = {
358 359
        id: this.$route.query.rewardsID
      }
360
      getRewardsDetails(params).then((res) => {
361 362
        this.rewardsDetails = res.data
      })
363 364
    },
    handleBack() {
365
      this.$store.dispatch("tagsView/delCurrentView")
366 367 368 369 370
    },
    checkForm(formName) {
      const result = new Promise((resolve, reject) => {
        this.$refs[formName][0].validate((valid) => {
          if (valid) {
371
            resolve()
372
          } else {
373
            reject()
374
          }
375 376 377
        })
      })
      this.checkFormResult.push(result)
378 379 380
    },
    handleBulkConversion() {
      this.queryParamsList.forEach((element) => {
381 382
        this.checkForm(`queryForm${element.memberId}`)
      })
383 384
      Promise.all(this.checkFormResult)
        .then((res) => {
385
          this.checkFormResult = []
386 387
          let params = this.queryParamsList.map((item) => {
            if (item.redeemType == "1") {
388 389
              let { recipientAddress, expressNo, expressDate, courierCompany, ...itemNew } = item
              return itemNew
390
            } else {
391
              return item
392
            }
393
          })
394
          bulkConversion(params).then((res) => {
chenwei's avatar
chenwei committed
395
            if (res.code == "0") {
396 397 398
              this.queryParamsList = []
              this.memberList = []
              this.$message.success(this.$t("兑换成功"))
399
            }
400
          })
401 402
        })
        .catch(() => {
403 404 405 406 407 408
          this.checkFormResult = []
          this.$message.error(this.$t("兑换失败,请填写必要的信息"))
        })
    }
  }
}
409 410
</script>
<style scoped lang="scss">
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
::v-deep .exchangeBulkOperation {
  .formBox {
    .el-date-editor.el-input,
    .el-input,
    .upload-file {
      width: 286px;
    }
  }

  .expenses {
    .el-form-item {
      margin-right: 0;
    }
    .el-row {
      width: 286px;
    }
    .el-input {
428
      width: 141px;
429 430 431 432 433 434
    }
    .el-form-item--small.el-form-item {
      margin-bottom: 0;
    }
  }
}
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
.card-title {
  padding-right: 10px;
  border-right: 4px solid rgb(64, 158, 255);
  font-size: 16px;
  font-weight: 600;
}
.del-btn {
  color: red;
}
.app-container .el-date-editor.el-input,
.el-date-editor.el-input__inner {
  width: 194px;
}
.container {
  padding: 20px 0;
}
.emptyText {
  font-size: 20px;
  padding: 20px;
  line-height: 200px;
  text-align: center;
  color: #97a8be;
}
.handleButton {
  padding-right: 160px;
  margin-top: 50px;
  button {
    width: 100%;
  }
}
</style>