日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時間:2024/9/27 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java6个人抽奖抽三个人,基于Java的抽奖逻辑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

小組在做一個抽獎系統(tǒng),現(xiàn)在給我分配到了抽獎邏輯這方面的實(shí)現(xiàn)。

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

老大給的需求圖

給的關(guān)鍵表結(jié)構(gòu)

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-已經(jīng)核銷 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 '抽獎總?cè)藬?shù)',

`prize_count` varchar(100) NOT NULL COMMENT '每次中獎人數(shù)',

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

`prize_state` varchar(100) DEFAULT NULL COMMENT '狀態(tài): 0-待抽 1-抽中 2-已抽',

`prize_date` varchar(255) DEFAULT NULL COMMENT '狀態(tài)時間',

`leader_id` int(10) NOT NULL COMMENT '抽獎領(lǐng)導(dǎo)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-領(lǐng)導(dǎo) 2-工作人員',

`user_state` varchar(100) DEFAULT NULL COMMENT '狀態(tài): 1-已領(lǐng)取0-未領(lǐng)取',

`state_date` varchar(255) DEFAULT NULL COMMENT '狀態(tài)時間',

`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 '剩余次數(shù)',

`record_count` int(10) NOT NULL COMMENT '每次中獎數(shù)',

`record_state` varchar(100) NOT NULL COMMENT '進(jìn)行狀態(tài) 0-未開始 1-已結(jié)束',

PRIMARY KEY (`record_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

-- Records of dd_annual_meeting_record

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

沒有多余講解,就一句話,“需求是這樣,怎樣實(shí)現(xiàn)我不管。”這是老大的座右銘。

可我特么的是新手啊,難受啊,馬飛!

好吧,其實(shí)是說業(yè)務(wù)流程和其他表結(jié)構(gòu)并沒有最終確定,先做個大概的抽獎邏輯出來,咱就按照表結(jié)構(gòu)和自己的意思做一把思想上的巨人。

先從第一個開始(一二三等獎不能重復(fù)獲得)

分析下表結(jié)構(gòu):

一共三張表,中獎池信息表dd_annual_meeting_check,這個比較容易理解,就是將得到的中獎人的id和獎 項id插入這張表。

抽獎池信息表dd_annual_meeting_prize,這張表看來是獲取抽獎信息的來源。

人員信息表dd_annual_meeting_user,這個就是用來得到抽獎人集合的表了。

分析下抽獎的過程:

抽獎池信息表里面信息已經(jīng)定好了不用我管 ,假設(shè)人員信息表有100個人參與活動。

第一次抽獎(一等獎) 從100人中抽5個人來中獎,但是要分5次抽完,每次抽1人。

第二次抽獎(二等獎)從95人(中了一次獎的人,不參與抽獎)中抽10個人來中獎,每次抽5人出來,要抽2次。

第三次抽獎(二等獎)從85人(中了一次獎的人,不參與抽獎)中抽5個人來中獎,每次抽1人,抽5次。

來個圖:

思路圖

實(shí)現(xiàn)邏輯大致思路:

1.從人員信息表獲得所有參與人員的數(shù)量

2.根據(jù)頁面數(shù)據(jù)判斷抽的什么獎勵

3.從抽獎池信息表中獲得抽獎主鍵id(prize_id),抽獎總?cè)藬?shù)(prize_num),每次中獎人數(shù)(prize_count),抽獎人領(lǐng)導(dǎo)id(leader_id)

4.進(jìn)行抽獎,從人數(shù)中抽出對應(yīng)的數(shù)字,根據(jù)數(shù)字去人員表中得到對應(yīng)的人員信息

5.將中獎人信息與獎項信息綁定,添加到中獎池信息表

簡單的分析后,有了大致思路,細(xì)節(jié)什么的就在代碼中完成:

一,先弄兩個頁面出來,一個是顯示中獎信息的頁面,另外一個是發(fā)送抽獎指令的頁面(因?yàn)槭穷I(lǐng)導(dǎo)來點(diǎn)擊抽獎,所以有一個領(lǐng)導(dǎo)信息需要發(fā)送過來)。

抽獎頁面

獎品列表!!!!!!!!!!!!

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;

}

}

});

}

}

//發(fā)送消息測試頁面

發(fā)送消息測試頁面

Sorry,瀏覽器不支持WebSocket

發(fā)送

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來實(shí)時傳值的兩個頁面,稍微改了改。

二,寫Controller層代碼

先把兩個頁面的請求寫出來

@Controller

@RequestMapping("/hello")

public class WsController {

//測試頁面

@RequestMapping("/test1")

public String test() throws IOException{

return "showlist";

}

//消息發(fā)送頁面

@RequestMapping("/test3")

public String test2() throws IOException{

return "ws2";

}

剩下的就是抽獎邏輯代碼 和數(shù)據(jù)庫腳本代碼了,細(xì)節(jié)如何構(gòu)思的就不說了,腦殼疼,一邊想著怎么做,然后老大那邊又說這個流程這么走,不不不,那么走,嗯嗯嗯,還是這么走。

//抽獎測試

@Autowired

private TestDao testDao;

@ResponseBody

@RequestMapping("/test2")

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

String prize_name = "第一輪抽獎";

//收到頁面?zhèn)鱽頂?shù)據(jù)msg(抽獎人id),prize_name(抽取的獎項)獲得抽獎信息

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

//定義一個最終傳回值的集合

Map m1 = new HashMap();

if(priz_info != null) {

//判斷peo數(shù)據(jù)如果沒人數(shù)數(shù)據(jù) 添加數(shù)據(jù)

if(peo.isEmpty()) {

//n為人員總數(shù)

int n = testDao.findAll();

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

peo.add(i);

}

}

System.out.println("當(dāng)前抽獎總?cè)藬?shù)為:"+peo);

//定義一個最終獲獎人id的集合

ArrayList dIdList = new ArrayList();

//定義一個獲取抽獎結(jié)果的集合

Map m2 = new HashMap();

//得到抽獎次數(shù)

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

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

//進(jìn)行抽獎并獲得結(jié)果集

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

//得到中獎人id集合

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

//得到剩余人數(shù)

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

//將每一次抽獎的狀態(tài)改變

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

}

System.out.println("獲獎id:"+dIdList);

System.out.println("最后人數(shù):"+peo);

//循環(huán)獲得LIST 中獎人信息

ArrayList infoList = new ArrayList();

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

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

}

//為返回值傳入?yún)?shù)

//獲獎信息

m1.put("list", infoList);

//未中獎人

m1.put("poe", peo);

}

return m1;

}

//抽獎 傳參 1.總?cè)藬?shù) 3,幾人中獎

Map luck(List idList,int n) {

//取得中獎人id

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

System.out.println("中獎的數(shù)字為"+a);

//獲獎id臨時存儲集合

ArrayList eidList = new ArrayList();

//排序

Object[] b = a.toArray();

Arrays.sort(b);

//定義一個中獎人數(shù)據(jù)集合

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]));

}

//總?cè)藬?shù)中移除中獎人數(shù)據(jù)

idList.removeAll(t);

//寫到Map集合回傳

Map m = new HashMap();

//剩余id

m.put("idList", idList);

//獲獎id

m.put("eidList", eidList);

return m;

}

//從x-y 取num個隨機(jī)數(shù)

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

{

//創(chuàng)建一個integer的動態(tài)數(shù)組

ArrayList a = new ArrayList();

int index = 0;

//往數(shù)組里面逐一加取到不重復(fù)的元素

while(index < num)

{

//產(chǎn)生x-y的隨機(jī)數(shù)

Random r = new Random();

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

//設(shè)置是否重復(fù)的標(biāo)記變量為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 {

//查詢抽獎人數(shù)

@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);

//修改中獎人與獎池練聯(lián)系(暫時不寫)

@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);

//更改抽獎狀態(tài)

@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);

}

現(xiàn)在來測試效果:

點(diǎn)擊前

這邊自己在數(shù)據(jù)庫中添加了數(shù)據(jù),傳1后會進(jìn)行抽獎

第一次點(diǎn)擊

第二次點(diǎn)擊

點(diǎn)了兩次 共抽了10人出來,并沒有重復(fù)。

講真,全程靠著表結(jié)構(gòu)自己想邏輯,真的皮,有些字段都不確定是來干什么的,去問同組做這個的人,她說她不清楚,我服了,然后知道了個大概的流程,把這個簡單的邏輯弄完給她看了看,她說差不多了,好吧,我不管了,后面都做完了我再修改細(xì)節(jié)。現(xiàn)在可以摸魚了,摸個兩三天再交差。

總結(jié)

以上是生活随笔為你收集整理的java6个人抽奖抽三个人,基于Java的抽奖逻辑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。