java抽奖

在这里插入图片描述

1.奖盘上的奖品在数据库配置
2.扫描用户出示的代表身份的二维码,点查询,查到用户的个人信息及他可以参与的抽奖活动。点击立即抽奖,奖盘开始转动,再次点击,转盘停止,抽奖完成。
 	/**
     * 点击抽奖
     *
     * @param drawId
     * @param userId
     * @return
     */
    @Transactional(readOnly = false)
    public AjaxJson draw(String drawId, String userId) {
        if (drawId == null || "".equals(drawId)) {
            return AjaxJson.error("请重新扫码");
        } else {
            //活动中设置的谢谢参与奖 ==》thanks
            WxMoneyDrawPrize thanks = new WxMoneyDrawPrize();
            //最终返回结果 ==》result
            Map<String, Object> result = new HashMap<>();
            //根据userId查询用户信息 ==》wxUserInfo
            Map<String, String> wxUserInfo = new HashMap<>();
            //获取抽奖活动下奖品非谢谢参与 ==》prize
            List<WxMoneyDrawPrize> prize = new ArrayList<>();
            //查询抽奖活动下奖品名称非谢谢参与 ==》strings
            List<String> strings = new ArrayList<>();
            strings.add("谢谢参与");
            //查询此用户今天是否有资格抽奖 ==》data
            Map<String, Object> data = new HashMap<>();
            if (data != null) {
                //查询这个活动的可抽奖的次数 如果此用户的抽奖记录小于等于次数 可抽
                // 根据id查询活动信息(今天可抽几次)
                WxMoneyDraw drawInfo = new WxMoneyDraw();
                //根据openid查询用户已抽奖次数 ==》count
                int count = 0;
                if (count < drawInfo.getNumber()) {
                    // 所有剩余数量大于0的奖品drawP
                    List<WxMoneyDrawPrize> drawP = new ArrayList<>();
                    // 判断库存量 如果库存量都为0 那么只能抽到谢谢参与
                    for (WxMoneyDrawPrize t : prize) {
                        if (t.getRemainNumber() > 0) {
                            drawP.add(t);
                        }
                    }
                    WxMoneyDrawResult drawResult = new WxMoneyDrawResult();
                    TWxUser wxUser = new TWxUser();
                    wxUser.setOpenId(wxUserInfo.get("openid"));
                    wxUser.setNickname(wxUserInfo.get("nikeName"));
                    wxUser.setRealName(wxUserInfo.get("userName"));
                    if (drawP != null && !drawP.isEmpty()) {
                        //有库存的商品列表
                        //商品总概率
                        double pr = 0;
                        for (WxMoneyDrawPrize d : drawP) {
                            pr += Double.parseDouble(d.getPrizeOdds());
                        }
                        //如果商品列表总几率不足100
                        if (pr < 100) {
                            //算出剩余几率
                            double nowPr = 100 - pr;
                            WxMoneyDrawPrize cyj = new WxMoneyDrawPrize();
                            cyj.setId("0");
                            cyj.setPrizeName("谢谢参与");
                            //设置参与奖
                            cyj.setPrizeOdds(String.valueOf(nowPr));
                            drawP.add(cyj);
                        }
                        //开始抽奖
                        WxMoneyDrawPrize tWxDrawPrize = startDraw(drawP);
                        //抽到了  (除谢谢参与之外的)奖品
                        //抽到奖品的序号
                        int i = strings.indexOf(tWxDrawPrize.getPrizeName());
                        result.put("prizeName", tWxDrawPrize.getPrizeName());
                        result.put("prizeId", tWxDrawPrize.getId());
                        result.put("arrayNo", i);
                        strings.remove(tWxDrawPrize.getPrizeName());
                        result.put("array", strings);
                        if (!"0".equals(tWxDrawPrize.getId()) 
                        || !"谢谢参与".equals(tWxDrawPrize.getPrizeName())) {
                            //奖品id为0时,说明奖品总概率之和不足100,额外加的参与奖
                            //减库存  存中奖记录
                            //save()
                            TWxUser u = new TWxUser();
                            u.setOpenId(wxUserInfo.get("openid"));
                            drawResult.setMember(u);
                            drawResult.setPrize(tWxDrawPrize);
                            drawResult.setDraw(new WxMoneyDraw(drawId));
                            drawResult.setResultDesc(tWxDrawPrize.getPrizeName());
                            drawResult.setIsWin(1);
                            drawResult.setIsAward(0);
                        } else {
                            //谢谢参与
                            drawResult.setPrize(thanks);
                            drawResult.setMember(wxUser);
                            drawResult.setDraw(new WxMoneyDraw(drawId));
                            drawResult.setResultDesc("谢谢参与");
                            drawResult.setIsWin(0);
                            drawResult.setIsAward(0);
                        }
                        drawResult.preInsert();
                        //保存抽奖信息
                        //save()
                        return AjaxJson.success().put("data", result);
                    } else {
                        //库存为0的话  只能抽到谢谢参与
                        drawResult.setMember(wxUser);
                        drawResult.setDraw(new WxMoneyDraw(drawId));
                        drawResult.setResultDesc("谢谢参与");
                        drawResult.setIsWin(0);
                        drawResult.setIsAward(0);
                        drawResult.preInsert();
                        //保存抽奖信息
                        //save()
                        int i = strings.indexOf(thanks.getPrizeName());
                        result.put("prizeName", thanks.getPrizeName());
                        result.put("prizeId", thanks.getId());
                        result.put("arrayNo", i);
                        strings.remove(thanks.getPrizeName());
                        result.put("array", strings);
                        return AjaxJson.success().put("data", result);
                    }
                } else {
                    return AjaxJson.error("您的抽奖次数已经用尽!");
                }
            } else {
                return AjaxJson.error("您今天无法参与抽奖!");
            }
        }
    }
    /**
     * 开始抽奖
     *
     * @param drawP
     * @return
     */
    private WxMoneyDrawPrize startDraw(List<WxMoneyDrawPrize> drawP) {
        double sumWeight = 0;
        for (WxMoneyDrawPrize p : drawP) {
            sumWeight += Double.parseDouble(p.getPrizeOdds());
        }
        //产生随机数
        double randomNumber = Math.random() * sumWeight;
        double start = 0;
        for (WxMoneyDrawPrize tWxDrawPrize : drawP) {
            double odds = Double.parseDouble(tWxDrawPrize.getPrizeOdds());
            if (odds > 0 && randomNumber >= start && randomNumber < (start + odds)) {
                return tWxDrawPrize;
            }
            start += odds;
        }
        return null;
    }
<template>
  <div id="all" style="padding: 10px 0">
    <div style="text-align: center">
      <div class="wheel-container" @click="onClickLuckyWheel">
        <LuckyWheel
          ref="LuckyWheel"
          width="600px"
          height="600px"
          :prizes="prizes"
          :default-style="defaultStyle"
          :blocks="blocks"
          :buttons="buttons"
          @end="endCallBack"
        />
      </div>
    </div>
    <div style="text-align: center">
      <div style="width: 50%; margin: 0 auto">
        <el-input
          id="openid"
          v-model="scanCode"
          placeholder="请扫码"
          @keyup.enter.native="callq"
          @keyup.space.native="onClickLuckyWheel"
        />
      </div>
      <div style="text-align: left">
        <div
          style="
            width: 50%;
            margin: 0 auto;
            background-color: #fff;
            font-size: 20px;
            border-radius: 5px;
            margin-top: 20px;
          "
        >
          <div style="text-align: left; width: 200px; display: inline">
            登记号:<span style="color: blue">{{ this.registerNo }}</span>
          </div>
          <div style="width: 200px; display: inline">
            姓名:{{ this.userName }}
          </div>
          <el-button
            style="
              background-color: #ffa723;
              border: none;
              color: white;
              padding: 15px 32px;
              text-align: center;
              text-decoration: none;
              display: inline-block;
              font-size: 16px;
              text-align: right;
            "
            @click="callq()"
            >查询
          </el-button>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import { Howl } from "howler";

export default {
  mounted() {
    document.getElementById("openid").focus();
  },
  created() {
    this.loadData();
  },
  data() {
    return {
      userName: "",
      prizeResult: null,
      drawId: "",
      userId: "",
      openId: "",
      registerNo: "",
      scanCode: "",
      state: 0, // 0 已停止 1 转动中 2 请求中 3 停止中
      prizes: [],
      defaultStyle: {
        fontColor: "#d64737",
        fontSize: "30px",
      },
      // 背景
      blocks: [{ padding: "13px", background: "#d64737" }],
      // 抽奖按钮
      buttons: [
        { radius: "50px", background: "#d64737" },
        { radius: "45px", background: "#fff" },
        { radius: "41px", background: "#d64737", pointer: true },
        {
          radius: "35px",
          background: "#ffdea0",
          imgs: [
            {
              src: require("@/assets/img/button.png"),
              width: "65%",
              top: "-50%",
            },
          ],
        },
      ],
    };
  },
  methods: {
    // 播放音频
    play() {
      var sound = new Howl({
        src: ["./audio/drawSuccess.wav"],
      });
      sound.play();
    },
    loadData() {
      this.$http({
        url: "/activity/moneyActivity/getDrawPrize",
        method: "GET",
      }).then(({ data }) => {
        if (data && data.success) {
          // 奖品
          const prizes = [];
          let prizeData = data.prize;
          prizeData.forEach((item, index) => {
            prizes.push({
              title: item,
              background: index % 2 ? "#f9e3bb" : "#f8d384",
              fonts: [{ text: item, top: "10%" }],
              imgs: [
                {
                  src: require(`@/assets/img/button.png`),
                  width: "30%",
                  top: "35%",
                },
              ],
            });
          });
          this.prizes = prizes;
        }
      });
    },
    // 查询
    callq() {
      this.$http({
        url: "/getActivity/activity/queryUserInfo",
        method: "POST",
        data: {
          scanCode: this.scanCode,
        },
      }).then(({ data }) => {
        if (data && data.success) {
          // 奖品
          const prizes = [];
          let prizeData = data.prize;
          this.drawId = data.drawId;
          this.openId = data.openId;
          this.userId = data.userId;
          this.userName = data.userName;
          this.registerNo = data.registerNo;
          prizeData.forEach((item, index) => {
            prizes.push({
              title: item,
              background: index % 2 ? "#f9e3bb" : "#f8d384",
              fonts: [{ text: item, top: "10%" }],
              imgs: [
                {
                  src: require(`@/assets/img/button.png`),
                  width: "30%",
                  top: "35%",
                },
              ],
            });
          });
          this.prizes = prizes;
        }
      });
    },
    async onClickLuckyWheel() {
      if (this.state == 0) {
        this.state = 1;
        const { data } = await this.$http({
          url: "/award/award/drawTimes",
          method: "POST",
          data: {
            drawId: this.drawId,
            openId: this.openId,
          },
        });
        if (
          this.drawId == null ||
          this.drawId == "" ||
          this.drawId == undefined ||
          this.openId == null ||
          this.openId == "" ||
          this.openId == undefined
        ) {
          this.state = 0;
          this.$message.error("请先扫码");
        } else {
          if (data.data) {
            this.$refs.LuckyWheel.play();
          } else {
            this.state = 0;
            this.$message.error("您的抽奖次数已用尽");
          }
        }
      } else if (this.state == 1) {
        this.state = 2;
        const { data } = await this.$http({
          url: "/award/award/startDraw",
          method: "POST",
          data: {
            id: this.drawId,
            userId: this.userId,
          },
        });
        this.prizeResult = data.data.prizeName;
        if (data.data.prizeName != "谢谢参与") {
          this.play();
        }
        this.$refs.LuckyWheel.stop(data.data.arrayNo + 1);
        this.state = 3;
      }
    },
    // 结束抽奖回调方法
    endCallBack(prize) {
      this.state = 0;
      let mess = `恭喜你获得${this.prizeResult}`;
      this.$alert(mess, "恭喜您", {
        confirmButtonText: "确定",
        callback: (action) => {
          this.scanCode = "";
          this.registerNo = "";
          this.userName = "";
        },
      });
    },
  },
  destroyed() {},
};
</script>
<style scoped>
.el-scrollbar {
  overflow-x: hidden;
}
#all {
  background-image: url("~@/assets/img/redPack.png");
  background-repeat: no-repeat;
  background-size: 100% 100%;
  -moz-background-size: 100% 100%;
  height: 800px;
}
.wheel-container {
  display: inline-block;
}
.jp-content {
  background-color: red;
}
</style>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值