java6个人抽奖抽三个人,基于Java的抽奖逻辑

小组在做一个抽奖系统,现在给我分配到了抽奖逻辑这方面的实现。

EMMM,拿到分配的时候是懵B的。

3e6887be1d8a

老大给的需求图

给的关键表结构

DROP TABLE IF EXISTS `dd_annual_meeting_check`;

CREATE TABLE `dd_annual_meeting_check` (

`check_id` int(255) NOT NULL AUTO_INCREMENT COMMENT '主键',

`check_prize_id` varchar(255) NOT NULL COMMENT '抽奖Id',

`emp_id` int(10) NOT NULL COMMENT '中奖员工id',

`emp_prize_time` varchar(255) NOT NULL COMMENT '中奖时间',

`check_receive` varchar(100) NOT NULL COMMENT '核销 0-已经核销 1-未核销',

`check_user_id` int(10) DEFAULT NULL COMMENT '核销工作人员(对于员工id)',

`check_time` varchar(255) DEFAULT NULL COMMENT '核销时间',

PRIMARY KEY (`check_id`)

) ENGINE=InnoDB AUTO_INCREMENT=158 DEFAULT CHARSET=utf8 COMMENT='中奖池信息表';

DROP TABLE IF EXISTS `dd_annual_meeting_prize`;

CREATE TABLE `dd_annual_meeting_prize` (

`prize_id` varchar(255) NOT NULL COMMENT '主键',

`prize_name` varchar(100) NOT NULL COMMENT '抽奖名称',

`prize_num` varchar(100) NOT NULL COMMENT '抽奖总人数',

`prize_count` varchar(100) NOT NULL COMMENT '每次中奖人数',

`prize_range` varchar(100) DEFAULT NULL COMMENT '抽奖范围: 0-all 1-未中奖',

`prize_state` varchar(100) DEFAULT NULL COMMENT '状态: 0-待抽 1-抽中 2-已抽',

`prize_date` varchar(255) DEFAULT NULL COMMENT '状态时间',

`leader_id` int(10) NOT NULL COMMENT '抽奖领导Id',

`giver_id` int(10) DEFAULT NULL COMMENT '加奖人Id',

`prize_detial` varchar(100) NOT NULL COMMENT '抽奖详情',

`giver_state` varchar(255) DEFAULT '0' COMMENT '是否加奖 0-否 1-是',

PRIMARY KEY (`prize_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='抽奖池信息表';

DROP TABLE IF EXISTS `dd_annual_meeting_user`;

CREATE TABLE `dd_annual_meeting_user` (

`u_id` int(10) NOT NULL AUTO_INCREMENT,

`user_id` varchar(100) NOT NULL COMMENT '员工工号',

`user_name` varchar(100) NOT NULL COMMENT '员工姓名',

`user_time` varchar(255) DEFAULT NULL COMMENT '扫码时间',

`user_type` varchar(100) DEFAULT NULL COMMENT '身份: 0-普通员工 1-领导 2-工作人员',

`user_state` varchar(100) DEFAULT NULL COMMENT '状态: 1-已领取0-未领取',

`state_date` varchar(255) DEFAULT NULL COMMENT '状态时间',

`user_prize` varchar(255) NOT NULL COMMENT '奖票号',

PRIMARY KEY (`u_id`)

) ENGINE=InnoDB AUTO_INCREMENT=3423 DEFAULT CHARSET=utf8 COMMENT='人员信息表';

追加:

-- ----------------------------

-- Table structure for dd_annual_meeting_record

-- ----------------------------

DROP TABLE IF EXISTS `dd_annual_meeting_record`;

CREATE TABLE `dd_annual_meeting_record` (

`record_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',

`record_prize_id` int(10) NOT NULL COMMENT '抽奖id',

`record_times` int(10) NOT NULL COMMENT '第几轮',

`record_over` int(10) NOT NULL COMMENT '剩余次数',

`record_count` int(10) NOT NULL COMMENT '每次中奖数',

`record_state` varchar(100) NOT NULL COMMENT '进行状态 0-未开始 1-已结束',

PRIMARY KEY (`record_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of dd_annual_meeting_record

-- ----------------------------

没有多余讲解,就一句话,“需求是这样,怎样实现我不管。”这是老大的座右铭。

可我特么的是新手啊,难受啊,马飞!

好吧,其实是说业务流程和其他表结构并没有最终确定,先做个大概的抽奖逻辑出来,咱就按照表结构和自己的意思做一把思想上的巨人。

先从第一个开始(一二三等奖不能重复获得)

分析下表结构:

一共三张表,中奖池信息表dd_annual_meeting_check,这个比较容易理解,就是将得到的中奖人的id和奖 项id插入这张表。

抽奖池信息表dd_annual_meeting_prize,这张表看来是获取抽奖信息的来源。

人员信息表dd_annual_meeting_user,这个就是用来得到抽奖人集合的表了。

分析下抽奖的过程:

抽奖池信息表里面信息已经定好了不用我管 ,假设人员信息表有100个人参与活动。

第一次抽奖(一等奖) 从100人中抽5个人来中奖,但是要分5次抽完,每次抽1人。

第二次抽奖(二等奖)从95人(中了一次奖的人,不参与抽奖)中抽10个人来中奖,每次抽5人出来,要抽2次。

第三次抽奖(二等奖)从85人(中了一次奖的人,不参与抽奖)中抽5个人来中奖,每次抽1人,抽5次。

来个图:

3e6887be1d8a

思路图

实现逻辑大致思路:

1.从人员信息表获得所有参与人员的数量

2.根据页面数据判断抽的什么奖励

3.从抽奖池信息表中获得抽奖主键id(prize_id),抽奖总人数(prize_num),每次中奖人数(prize_count),抽奖人领导id(leader_id)

4.进行抽奖,从人数中抽出对应的数字,根据数字去人员表中得到对应的人员信息

5.将中奖人信息与奖项信息绑定,添加到中奖池信息表

简单的分析后,有了大致思路,细节什么的就在代码中完成:

一,先弄两个页面出来,一个是显示中奖信息的页面,另外一个是发送抽奖指令的页面(因为是领导来点击抽奖,所以有一个领导信息需要发送过来)。

抽奖页面

奖品列表!!!!!!!!!!!!

var psel = document.getElementById("poe");

window.οnlοad=function (){

websocket = new WebSocket("ws://127.0.0.1:8080/websocket");

websocket.onmessage = function(msg) {

console.log(msg.data);

$.ajax({

url:"test2",

type:"POST",

data:{

msg:msg.data,

peo:psel.value

},

dataType : "json",

success : function (rtn) {

console.log("Successfully");

console.log(rtn);

if(rtn.list != null){

var inf = '

inf += "

获奖人id获奖人姓名获奖人奖券号"

/*

for(var i=0; i

/*]]>*/

var stu = rtn.list[i];

inf += "

"+stu.user_id+""+stu.user_name+""+stu.user_prize+""

}

inf += "

"

$("#showData").html(inf);

}

if(rtn.poe != null){

psel.value = rtn.poe;

}

}

});

}

}

//发送消息测试页面

发送消息测试页面

Sorry,浏览器不支持WebSocket

发送

var websocket=null;

window.οnlοad=function (){

if ('WebSocket' in window) {

console.log("1");

websocket = new WebSocket("ws://127.0.0.1:8080/websocket");

} else if ('MozWebSocket' in window) {

console.log("2");

websocket = new MozWebSocket("ws://127.0.0.1:8080/websocket");

} else {

websocket = new SockJS("ws://127.0.0.1:8080/websocket");

}

//websocket = new WebSocket("ws://127.0.0.1:8080/websocket");

websocket.onmessage = function(msg) {

console.log(msg.data);

}

}

function send() {

var message = document.getElementById('text').value;

console.log(message);

websocket.send(message);

}

这是之前写的用websocket来实时传值的两个页面,稍微改了改。

二,写Controller层代码

先把两个页面的请求写出来

@Controller

@RequestMapping("/hello")

public class WsController {

//测试页面

@RequestMapping("/test1")

public String test() throws IOException{

return "showlist";

}

//消息发送页面

@RequestMapping("/test3")

public String test2() throws IOException{

return "ws2";

}

剩下的就是抽奖逻辑代码 和数据库脚本代码了,细节如何构思的就不说了,脑壳疼,一边想着怎么做,然后老大那边又说这个流程这么走,不不不,那么走,嗯嗯嗯,还是这么走。

//抽奖测试

@Autowired

private TestDao testDao;

@ResponseBody

@RequestMapping("/test2")

public Map test(@RequestParam("msg") String msg,@RequestParam("peo") List peo) throws IOException {

String prize_name = "第一轮抽奖";

//收到页面传来数据msg(抽奖人id),prize_name(抽取的奖项)获得抽奖信息

Map priz_info = testDao.findPrizinfo(msg,prize_name);

//定义一个最终传回值的集合

Map m1 = new HashMap();

if(priz_info != null) {

//判断peo数据如果没人数数据 添加数据

if(peo.isEmpty()) {

//n为人员总数

int n = testDao.findAll();

for(int i = 0; i < n;i++) {

peo.add(i);

}

}

System.out.println("当前抽奖总人数为:"+peo);

//定义一个最终获奖人id的集合

ArrayList dIdList = new ArrayList();

//定义一个获取抽奖结果的集合

Map m2 = new HashMap();

//得到抽奖次数

int count = Integer.parseInt(priz_info.get("prize_num")) / Integer.parseInt(priz_info.get("prize_count")) ;

for(int i = 0; i < count;i++) {

//进行抽奖并获得结果集

m2 = luck(peo,Integer.parseInt( priz_info.get("prize_count")));

//得到中奖人id集合

dIdList.addAll((List)m2.get("eidList"));

//得到剩余人数

peo = (List) m2.get("idList");

//将每一次抽奖的状态改变

testDao.update(priz_info.get("prize_id"), i+1);

}

System.out.println("获奖id:"+dIdList);

System.out.println("最后人数:"+peo);

//循环获得LIST 中奖人信息

ArrayList infoList = new ArrayList();

for(int i = 0;i < dIdList.size();i++) {

infoList.add(testDao.findById(dIdList.get(i)));

}

//为返回值传入参数

//获奖信息

m1.put("list", infoList);

//未中奖人

m1.put("poe", peo);

}

return m1;

}

//抽奖 传参 1.总人数 3,几人中奖

Map luck(List idList,int n) {

//取得中奖人id

ArrayList a = makeRandom(0,idList.size(), n);

System.out.println("中奖的数字为"+a);

//获奖id临时存储集合

ArrayList eidList = new ArrayList();

//排序

Object[] b = a.toArray();

Arrays.sort(b);

//定义一个中奖人数据集合

List t = new ArrayList();

for(int i = 0; i < b.length;i++)

{

eidList.add(idList.get((int) b[i]));

System.out.println("中奖的id为"+idList.get((int) b[i]));

t.add(idList.get((int) b[i]));

}

//总人数中移除中奖人数据

idList.removeAll(t);

//写到Map集合回传

Map m = new HashMap();

//剩余id

m.put("idList", idList);

//获奖id

m.put("eidList", eidList);

return m;

}

//从x-y 取num个随机数

ArrayList makeRandom(int x, int y, int num)

{

//创建一个integer的动态数组

ArrayList a = new ArrayList();

int index = 0;

//往数组里面逐一加取到不重复的元素

while(index < num)

{

//产生x-y的随机数

Random r = new Random();

int temp = r.nextInt(y-x)+x ;

//设置是否重复的标记变量为false

boolean flag = false;

for(int i =0; i

{

if(temp == a.get(i))

{

flag = true;

break;

}

}

if(flag==false)

{

a.add(temp);

index++;

}

}

return a;

}

}

Dao

@Mapper

public interface TestDao {

//查询抽奖人数

@Select("select count(*) from dd_annual_meeting_user where user_state = 1")

int findAll();

//查询中奖人信息

@Select("select * from dd_annual_meeting_user where user_state = 1 limit ${id},1")

User findById(@Param("id") int id);

//修改中奖人与奖池练联系(暂时不写)

@Insert("INSERT INTO dd_annual_meeting_check VALUES ( #{check_prize_id}, #{emp_id},curdate(),'1')")

void inset(@Param("check_prize_id") String check_prize_id,@Param("emp_id") int emp_id);

//获取抽奖信息

@Select("select prize_id,prize_num,prize_count from dd_annual_meeting_prize where leader_id=#{msg} and prize_name=#{prize_name} and prize_state=0")

Map findPrizinfo(@Param("msg") String msg, @Param("prize_name") String prize_name);

//更改抽奖状态

@Update("update dd_annual_meeting_record set record_state=1 where record_prize_id = #{prize_id} and record_times = #{record_times}")

void update(@Param("prize_id") Object prize_id, @Param("record_times") int record_times);

}

现在来测试效果:

3e6887be1d8a

点击前

这边自己在数据库中添加了数据,传1后会进行抽奖

3e6887be1d8a

第一次点击

3e6887be1d8a

第二次点击

点了两次 共抽了10人出来,并没有重复。

讲真,全程靠着表结构自己想逻辑,真的皮,有些字段都不确定是来干什么的,去问同组做这个的人,她说她不清楚,我服了,然后知道了个大概的流程,把这个简单的逻辑弄完给她看了看,她说差不多了,好吧,我不管了,后面都做完了我再修改细节。现在可以摸鱼了,摸个两三天再交差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自动化教程_Python 任务自动化工具 tox 教程

1、tox 能做什么&#xff1f; 细分的用途包括&#xff1a; 创建开发环境 运行静态代码分析与测试工具 自动化构建包 针对 tox 构建的软件包运行测试 检查软件包是否能在不同的 Python 版本/解释器中顺利安装 统一持续集成&#xff08;CI&#xff09;和基于命令行的测试 创建和部…

php 添加inotify扩展,php inotify 扩展的安装

一、安装1) 从内核和目录里面查看是否支持inotify[rootnfs01 ~]# uname -r2.6.32-573.el6.x86_64[rootnfs01 ~]#** ls -l /proc/sys/fs/inotify/** -→主要查看下面有没有三个目录总用量 0-rw-r--r-- 1 root root 0 1月 21 13:03 max_queued_events-rw-r--r-- 1 root root…

简述python执行原理_Python程序的执行原理(1)(2)

Python程序的执行原理(1)&#xff08;2&#xff09; 1. 过程概述 Python先把代码&#xff08;.py文件&#xff09;编译成字节码&#xff0c;交给字节码虚拟机&#xff0c;然后虚拟机一条一条执行字节码指令&#xff0c;从而完成程序的执行。 2. 字节码 字节码在Python虚拟机程序…

python文本特征选择,机器学习--特征选择(Python实现)

特征选择就是从原始特征中选取一些最有效的特征来降低维度,&#xff0c;提高模型泛化能力减低过拟合的过程&#xff0c;主要目的是剔除掉无关特征和冗余特征&#xff0c;选出最优特征子集&#xff1b;常见的特征选择方法可以分为3类&#xff1a;过滤式(filter)、包裹式(wrapper…

用python画风车_python接口自动化()一)(实现一款简单的接口自动化框架)

python接口自动化一&#xff08;设计一款自己的接口自动化框架&#xff09; 一、起因&#xff1a; 前面学习过了python接口requests来进行接口测试&#xff0c;但是在框架选择上还是选择的unittest。当接口数量不怎么多时还好&#xff0c;但是当接口的量上去了&#xff0c;一切…

系统新模块增加需要哪些步骤_防锈高效型干式地暖模块解决了装修施工配合的哪些难点?...

通过前面的讲解&#xff0c;我们知道铝板干式地暖末端应用于地暖、辐射冷暖等系统的技术优势非常明显&#xff0c;即省层高、省费用、效果好、空调舒适、业主使用满意度高等&#xff0c;随着水泥黄沙的大幅涨价&#xff0c;其成本优势也突显出来&#xff0c;越来越多的暖通公司…

python爬取网站数据步骤_python怎么爬取数据

在学习python的过程中&#xff0c;学会获取网站的内容是我们必须要掌握的知识和技能&#xff0c;今天就分享一下爬虫的基本流程&#xff0c;只有了解了过程&#xff0c;我们再慢慢一步步的去掌握它所包含的知识Python网络爬虫大概需要以下几个步骤&#xff1a; 一、获取网站的地…

matlab chan算法定位,MATLAB实现基于Chan氏算法的三维TDOA定位

% 功能&#xff1a;基于chan算法的TDOA三维定位function [zp] Chan_3(Noise,MS)%基站数目BSN 7;%基站位置,每一列为一个基站位置BS [0, 2*sqrt(3), -2*sqrt(3), sqrt(3), -sqrt(3), -sqrt(3), sqrt(3);0, 0, 0, 3, 3, -3, -3;0, 0, 0, 0, 2, 2, 0];%无噪声情况下BS到MS的距离…

Redis源码精读:字符串

文章目录 前言代码位置核心类型SDS结构获取sds字符串的元数据的宏获取字符串长度重新设置sds长度创建字符串感悟最后 前言 Redis中实现了sds&#xff08;simple dynamic string&#xff09;这种字符串&#xff0c;它比c语言标准库的char*字符串更加实用 代码位置 src/sdc.h …

python自动化测试脚本可以测php吗_python unittest实现api自动化测试_python

这篇文章主要为大家详细介绍了python unittest实现api自动化测试的方法&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 项目测试对于一个项目的重要性&#xff0c;大家应该都知道吧&#xff0c;写python的朋友&#xff0c;应该都写过自动化测试脚本。…

Linux服务器版本鼠标,安装GPM给Linux虚拟控制台提供配置鼠标支持

给你的 Linux 系统安装 GPM&#xff0c;这样我们就可以在虚拟控制台中配置鼠标&#xff0c;比如进行复制与粘贴操作。GPM 是一个守护程序&#xff0c;是通用鼠标的首字母的缩写&#xff0c;它可以帮助你配置 Linux 虚拟控制台的鼠标支持。GPM 在以下场景中特别有用&#xff1a;…

valgrind 内存泄漏_应用 AddressSanitizer 发现程序内存错误

应用 AddressSanitizer 发现程序内存错误作为 C/ C 工程师&#xff0c;在开发过程中会遇到各类问题&#xff0c;最常见便是内存使用问题&#xff0c;比如&#xff0c;越界&#xff0c;泄漏。过去常用的工具是 Valgrind&#xff0c;但使用 Valgrind 最大问题是它会极大地降低程序…

配置文件存int类型_Redis详解(五)------ redis的五大数据类型实现原理

> 本系列教程持续更新&#xff0c;可以微信搜索「 IT可乐 」第一时间阅读。回复《电子书》有我为大家特别筛选的书籍资料前面两篇博客&#xff0c;第一篇介绍了五大数据类型的基本用法&#xff0c;第二篇介绍了Redis底层的六种数据结构。在Redis中&#xff0c;并没有直接使用…

java list 占用内存不释放_性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise...

对于动辄上百 M 大小的神经网络来说&#xff0c;模型压缩能够减少它们的内存占用、通信带宽和计算复杂度等&#xff0c;以便更好地进行应用部署。最近&#xff0c;来自 Facebook AI 的研究者提出了一种新的模型量化压缩技术 Quant-Noise&#xff0c;让神经网络在不降低性能的前…

苹果系统安装python环境_如何在mac下配置python虚拟环境

安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip install virtualenv # 安装虚拟环境 2. sudo pip install virtualenvwrapper # 安装虚拟环境扩展包 3. vim .bash_profile …

linux程序无法获取cpu资源,Linux系统编程获取系统的CPU资源

还是纯干货&#xff0c;代码拿来&#xff1a;#include #include #include #include #include #include #include void work(){FILE *f;int i;double x 4.5;f tmpfile();for(i 0; i < 10000;i){fprintf(f,"Do some output\n");if (ferror(f)){fprintf(stderr,&q…

dbnetlib sqlserver不存在或拒绝访问_404:对不起,您访问的网页不存在

404&#xff1a;对不起您访问的网页不存在https://www.zhihu.com/video/1101123296195723264你可能在上网时也好奇过&#xff0c;为什么点开一个无法显示信息的页面&#xff0c;上面会出现数字404&#xff1f;要解释这个问题&#xff0c;我们需要从互联网诞生之初说起。20世纪8…

linux中控和安卓中控哪个比较好,原厂中控和改装中控有什么区别?哪个更好?...

很多人都喜欢车辆上有一个大屏的中控。那种大屏的中控不仅功能很多&#xff0c;而且还很实用。但是有很多车需要高配才能有中控。而且还需要加钱。很多人在买车的时候都会选择一些低配的车&#xff0c;然后自己去安装中控。有些人认为原厂的中控不仅价格贵&#xff0c;而且还有…

bufferedreader读取中文乱码_python之pandas模块关于csv文件乱码问题解决

介绍相信部分小伙伴们在处理windows系统生成的csv文件时会遇到中文显示乱码的问题&#xff0c;尤其是使用Excel打开这类文件时这类问题尤为突出。解决如图&#xff0c;我们通过Excel工具打开该csv文件时&#xff0c;中文展示为乱码。此时&#xff0c;只需要我们通过功能强大的数…

linux mint python3.6,Linux 上如何安装并切换最新版本的 Python 3.6

原标题&#xff1a;Linux 上如何安装并切换最新版本的 Python 3.6如果你安装了 Linux 系统&#xff0c;正在学习 Python 并想要使用最新的版本的话&#xff0c;那么这篇文章就是为你而写的。-- ShekinPython是 Linux 中一种最流行的编程语言。它被写成了各种工具和库。除此之外…