[add] 改成撈每周
This commit is contained in:
		
							
								
								
									
										14
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -11,6 +11,7 @@ | |||||||
|         "@ant-design/icons-vue": "^6.1.0", |         "@ant-design/icons-vue": "^6.1.0", | ||||||
|         "axios": "^0.26.1", |         "axios": "^0.26.1", | ||||||
|         "bootstrap": "^5.1.3", |         "bootstrap": "^5.1.3", | ||||||
|  |         "moment": "^2.29.2", | ||||||
|         "vue": "^3.2.25" |         "vue": "^3.2.25" | ||||||
|       }, |       }, | ||||||
|       "devDependencies": { |       "devDependencies": { | ||||||
| @@ -1061,6 +1062,14 @@ | |||||||
|         "sourcemap-codec": "^1.4.8" |         "sourcemap-codec": "^1.4.8" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/moment": { | ||||||
|  |       "version": "2.29.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", | ||||||
|  |       "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": "*" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/nanoid": { |     "node_modules/nanoid": { | ||||||
|       "version": "3.3.2", |       "version": "3.3.2", | ||||||
|       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", |       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", | ||||||
| @@ -2348,6 +2357,11 @@ | |||||||
|         "sourcemap-codec": "^1.4.8" |         "sourcemap-codec": "^1.4.8" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "moment": { | ||||||
|  |       "version": "2.29.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", | ||||||
|  |       "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" | ||||||
|  |     }, | ||||||
|     "nanoid": { |     "nanoid": { | ||||||
|       "version": "3.3.2", |       "version": "3.3.2", | ||||||
|       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", |       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ | |||||||
|     "@ant-design/icons-vue": "^6.1.0", |     "@ant-design/icons-vue": "^6.1.0", | ||||||
|     "axios": "^0.26.1", |     "axios": "^0.26.1", | ||||||
|     "bootstrap": "^5.1.3", |     "bootstrap": "^5.1.3", | ||||||
|  |     "moment": "^2.29.2", | ||||||
|     "vue": "^3.2.25" |     "vue": "^3.2.25" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ import BJ_Casino_Rank from './components/BJ_Casino_Rank.vue'; | |||||||
|     -moz-osx-font-smoothing: grayscale; |     -moz-osx-font-smoothing: grayscale; | ||||||
|     text-align: center; |     text-align: center; | ||||||
|     color: #2c3e50; |     color: #2c3e50; | ||||||
|     margin-top: 60px; |     margin-top: 0px; | ||||||
|     font-family: 'Zen Maru Gothic', sans-serif; |     font-family: 'Zen Maru Gothic', sans-serif; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|   | |||||||
| @@ -6,7 +6,8 @@ import { BJ_Casino_Rank } from "../script/BJ_Casino_Rank"; | |||||||
| let Title = ref("BJ_Casino_Rank"); | let Title = ref("BJ_Casino_Rank"); | ||||||
| let RankData = ref([]); | let RankData = ref([]); | ||||||
| const self = { | const self = { | ||||||
|     RankData: RankData |     Title: Title, | ||||||
|  |     RankData: RankData, | ||||||
| } | } | ||||||
| const Script = new BJ_Casino_Rank(self); | const Script = new BJ_Casino_Rank(self); | ||||||
|  |  | ||||||
| @@ -23,6 +24,7 @@ const Script = new BJ_Casino_Rank(self); | |||||||
|                     <th align="left">倍率</th> |                     <th align="left">倍率</th> | ||||||
|                     <th align="left">機台</th> |                     <th align="left">機台</th> | ||||||
|                     <th align="left">桌號</th> |                     <th align="left">桌號</th> | ||||||
|  |                     <th align="left">日期</th> | ||||||
|                 </tr> |                 </tr> | ||||||
|             </thead> |             </thead> | ||||||
|             <tbody> |             <tbody> | ||||||
| @@ -43,8 +45,12 @@ const Script = new BJ_Casino_Rank(self); | |||||||
|                     <td align="left"> |                     <td align="left"> | ||||||
|                         <font size="5"><b>{{ item[3][1] }}</b></font> |                         <font size="5"><b>{{ item[3][1] }}</b></font> | ||||||
|                     </td> |                     </td> | ||||||
|  |                     <td align="left"> | ||||||
|  |                         <font size="5"><b>{{ item[4] }}</b></font> | ||||||
|  |                     </td> | ||||||
|                 </tr> |                 </tr> | ||||||
|  |  | ||||||
|             </tbody> |             </tbody> | ||||||
|         </table>  </div> |         </table> | ||||||
|  |     </div> | ||||||
| </template> | </template> | ||||||
| @@ -1,12 +1,36 @@ | |||||||
|  | import moment from 'moment'; | ||||||
|  |  | ||||||
| export class BJ_Casino_Rank { | export class BJ_Casino_Rank { | ||||||
|  |  | ||||||
|  |     //#region public | ||||||
|  |  | ||||||
|  |     public ContestData: string[] = ["4/7~4/13", "4/14~4/20", "4/21~4/27"]; | ||||||
|  |  | ||||||
|  |     //#endregion | ||||||
|  |  | ||||||
|     //#region private |     //#region private | ||||||
|  |  | ||||||
|     private _client: any; |     private _client: any; | ||||||
|  |  | ||||||
|     private _ws: any; |     private _ws: any; | ||||||
|  |  | ||||||
|     private _rankdata: any = null; |     private _rankdata: any[] = []; | ||||||
|  |  | ||||||
|  |     private _nowSearchContestID: number = 0; | ||||||
|  |  | ||||||
|  |     private _nowContestIndex: number = 0; | ||||||
|  |  | ||||||
|  |     private _nowContestStartIndex: number = 0; | ||||||
|  |  | ||||||
|  |     private _nowContestEndIndex: number = 0; | ||||||
|  |  | ||||||
|  |     private _nowContestID: number = 0; | ||||||
|  |  | ||||||
|  |     private _nowContestDate: string = ""; | ||||||
|  |  | ||||||
|  |     private _nowContestStart: string = ""; | ||||||
|  |  | ||||||
|  |     private _nowContestEnd: string = ""; | ||||||
|  |  | ||||||
|     //#endregion |     //#endregion | ||||||
|  |  | ||||||
| @@ -109,7 +133,12 @@ export class BJ_Casino_Rank { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             case "rank.info": { |             case "rank.info": { | ||||||
|                 this.SetRankData(Data); |                 this.RankDataCallBack(Data); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             case "rank.history": { | ||||||
|  |                 this.ParseRankData(Data); | ||||||
|                 this._ws.close(); |                 this._ws.close(); | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
| @@ -119,13 +148,139 @@ export class BJ_Casino_Rank { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public SetRankData(data: any) { |     public RankDataCallBack(data: any) { | ||||||
|         let rankdata = data["rank"]; |         let id = +data["id"]; | ||||||
|  |         this._nowSearchContestID = id; | ||||||
|  |         this._nowContestID = id; | ||||||
|  |         this._nowContestDate = moment().format("MM/DD"); | ||||||
|  |         for (let i = 0; i < this.ContestData.length; i++) { | ||||||
|  |             const contest: string = this.ContestData[i]; | ||||||
|  |             let str = contest.split("~"); | ||||||
|  |             let my = moment(this._nowContestDate); | ||||||
|  |             let start = moment(str[0]); | ||||||
|  |             let end = moment(str[1]); | ||||||
|  |             let diff: number = my.diff(end, "days"); | ||||||
|  |             if (diff < 0) { | ||||||
|  |                 this._nowContestIndex = i; | ||||||
|  |                 this._nowContestStart = moment(start).format("MM/DD"); | ||||||
|  |                 this._nowContestEnd = moment(end).format("MM/DD"); | ||||||
|  |                 this._nowContestStartIndex = this._contestIDFormDate(this._nowContestStart); | ||||||
|  |                 this._nowContestEndIndex = this._contestIDFormDate(this._nowContestEnd); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         this._client.Title.value = `${this._nowContestStart}~${this._nowContestEnd}`; | ||||||
|  |         this.ParseRankData(data); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public ParseRankData(data: any) { | ||||||
|  |         let id = this._nowSearchContestID; | ||||||
|  |         this.RankDataAddDate(id, data["rank"]); | ||||||
|  |         this._rankdata = this._rankdata.concat(data["rank"]); | ||||||
|  |         if (id !== this._nowContestStartIndex) { | ||||||
|  |             this._nowSearchContestID = id - 1; | ||||||
|  |             this.SendData("rank.history", { "id": this._nowSearchContestID, "t": 12, "p": 2 }); | ||||||
|  |         } else { | ||||||
|  |             this.OrganizeRankData(this._rankdata); | ||||||
|  |             this.SetRankData(this._rankdata); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public RankDataAddDate(id: number, rankdata: any) { | ||||||
|  |         let date: string = this._contestDateFormID(id); | ||||||
|  |         for (let i = 0; i < rankdata.length; i++) { | ||||||
|  |             rankdata[i].push(date); | ||||||
|  |         } | ||||||
|  |         return rankdata; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public OrganizeRankData(rankdata: any) { | ||||||
|  |         rankdata.sort((a: any, b: any) => { | ||||||
|  |             return b[1] - a[1]; | ||||||
|  |         }); | ||||||
|  |         rankdata = rankdata.filter((rankdata: any, index: any, arr: any) => { | ||||||
|  |             return arr.findIndex((s: any) => rankdata[2][1] === s[2][1]) === index; | ||||||
|  |         }); | ||||||
|  |         for (let i = 0; i < rankdata.length; i++) { | ||||||
|  |             rankdata[i][0] = i + 1; | ||||||
|  |         } | ||||||
|  |         this._rankdata = rankdata; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public SetRankData(rankdata: any) { | ||||||
|         this._client.RankData.value = rankdata; |         this._client.RankData.value = rankdata; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     //#endregion |     //#endregion | ||||||
|  |  | ||||||
|  |     //#region Get | ||||||
|  |  | ||||||
|  |     private _contestIDFormDate(date: string): number { | ||||||
|  |         let my = moment(this._nowContestDate); | ||||||
|  |         let target = moment(date); | ||||||
|  |         let diffday: number = my.diff(target, "days"); | ||||||
|  |         let id = this._nowContestID - diffday; | ||||||
|  |         if (id < 0) { | ||||||
|  |             return 0; | ||||||
|  |         } else { | ||||||
|  |             return id; | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     private _contestDateFormID(id: number): string { | ||||||
|  |         let my: number = this._nowContestID; | ||||||
|  |         let target: number = id; | ||||||
|  |         let diffid: number = my - target; | ||||||
|  |         if (diffid < 0) { | ||||||
|  |             diffid = 0; | ||||||
|  |         } | ||||||
|  |         let date: string = moment().subtract(diffid, "days").format("MM/DD"); | ||||||
|  |         return date; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     //#endregion | ||||||
|  |  | ||||||
|  |     //#region Tools Function | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 陣列排序,asc&key陣列長度請一樣 | ||||||
|  |      * PS. boolean 帶false是先true在false | ||||||
|  |      * @link JavaScript Object 排序 http://www.eion.com.tw/Blogger/?Pid=1170#:~:text=JavaScript%20Object%20排序 | ||||||
|  |      * @param Arr 需排序陣列 | ||||||
|  |      * @param asc 是否升序排列(小到大) | ||||||
|  |      * @param key 需排序的key(優先順序左到右)(沒有就放空) | ||||||
|  |      */ | ||||||
|  |     public ObjectSort(Arr: any[], asc: boolean[] = [true], key?: string[]): any[] { | ||||||
|  |         if (!key || key.length === 0 || Arr.length === 0 || Arr[0][key[0]] === undefined) { | ||||||
|  |             console.error(`ObjectSort key error`); | ||||||
|  |             return Arr; | ||||||
|  |         } else if (asc.length !== key.length) { | ||||||
|  |             console.error(`ObjectSort key asc error asc.length: ${asc.length}, key.length: ${key.length}`); | ||||||
|  |             return Arr; | ||||||
|  |         } | ||||||
|  |         let count: number = key ? key.length : 1; | ||||||
|  |         for (let i: number = count - 1; i >= 0; i--) { | ||||||
|  |             Arr = Arr.sort(function (a: any, b: any): 1 | -1 { | ||||||
|  |                 let mya: any = a; | ||||||
|  |                 let myb: any = b; | ||||||
|  |                 if (key) { | ||||||
|  |                     mya = a[key[i]]; | ||||||
|  |                     myb = b[key[i]]; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // 加個等於數字相同不要再去排序到 | ||||||
|  |                 if (asc[i]) { | ||||||
|  |                     return mya >= myb ? 1 : -1; | ||||||
|  |                 } else { | ||||||
|  |                     return mya <= myb ? 1 : -1; | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |         return Arr; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     //#endregion | ||||||
|  |  | ||||||
|     //#region WebSocke |     //#region WebSocke | ||||||
|  |  | ||||||
|     public OnWebSocketMessage(e: any) { |     public OnWebSocketMessage(e: any) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user