sign.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. export default class ch_sign{
  2. private static _instance:ch_sign;
  3. public static getInstance():ch_sign{
  4. if(!this._instance) this._instance = new ch_sign();
  5. return this._instance;
  6. }
  7. private _sign_data:Set<number>=new Set();
  8. private _max:number = 7;
  9. private _creat_date:number=0;
  10. private _sign_count:number=0;
  11. private _mode:number=1;
  12. /**设定的签到天数*/
  13. public get max_day():number{return this._max;}
  14. private getCreatDayCount():number{
  15. if(this._creat_date==0){
  16. chsdk.log.warn("签到模块没有初始化");
  17. return 0;
  18. }
  19. return chsdk.date.getDiffDayNum(this._creat_date,chsdk.date.now())+1;
  20. }
  21. /**
  22. * 签到初始化
  23. * @param mode =1可以补签 =2不可补签
  24. * @param data 签到存档数据,可以为空为第一天
  25. * @param max_day 签到最大天数
  26. */
  27. public init(mode:1|2,data:{sign_list:number[],creat_date:number}|{sign_count:number,last_date:number}|null,max_day:number=7):void{
  28. this._mode=mode;
  29. if(this._mode==1){
  30. if(data){
  31. data =data as {sign_list:number[],creat_date:number};
  32. const sign_list=data.sign_list ?? [];
  33. const creat_date=data.creat_date ?? chsdk.date.now();
  34. for(let i=0;i<sign_list.length;i++)this._sign_data.add(sign_list[i]);
  35. this._sign_count=this._sign_data.size;
  36. this._creat_date=creat_date;
  37. }else{
  38. this._sign_count=0;
  39. this._sign_data.clear();
  40. this._creat_date=chsdk.date.now();
  41. }
  42. }else{
  43. if(data){
  44. data = data as {sign_count:number,last_date:number};
  45. this._sign_count=data.sign_count ?? 0;
  46. this._creat_date=data.last_date ?? 0;
  47. }else{
  48. this._sign_count=0;
  49. this._creat_date=0;
  50. }
  51. }
  52. this._max=max_day;
  53. }
  54. /**已签到的数据,用于存档*/
  55. public getSignData():{sign_list:number[],creat_date:number}|{sign_count:number,last_date:number}{
  56. if(this._mode==1){
  57. return {sign_list:Array.from(this._sign_data.keys()),creat_date:this._creat_date};
  58. }else if(this._mode==2){
  59. return {sign_count:this._sign_count,last_date:this._creat_date};
  60. }
  61. }
  62. /** 返回某一天的状态
  63. * 0 等待签到
  64. * 1 已经签到
  65. * 2 失效等待补签
  66. * */
  67. public checkSigineState(day:number):number{
  68. if(this._mode==1){
  69. if(day<1 || day>this._max)return 0;
  70. if(this._sign_data.has(day))return 1;
  71. const count = this.getCreatDayCount();
  72. if(count <=0) return 0;
  73. if(day <count) return 2;
  74. }else if(this._mode==2){
  75. if(day<=this._sign_count) return 1;
  76. }
  77. return 0;
  78. }
  79. /**今天是否可以签到*/
  80. public checkSigin():boolean{
  81. if(this._mode==1){
  82. const count = this.getCreatDayCount();
  83. if(count<=0 || count>this._max)return false;
  84. return !this._sign_data.has(count);
  85. }else if(this._mode==2){
  86. const count = this._sign_count;
  87. if(count>=this._max)return false;
  88. return !chsdk.date.isSameDate(this._creat_date,chsdk.date.now());
  89. }
  90. return false;
  91. }
  92. /**签到是否全部完成*/
  93. public checkSiginComplete():boolean{
  94. const count = this._sign_count;
  95. return count>=this._max;
  96. }
  97. /**
  98. * 是否能补签
  99. * 不能返回0,
  100. * 可以补签返回可以补签的那一天*/
  101. public checkReSigin():number{
  102. if(this._mode!=1) return 0;
  103. let count = this.getCreatDayCount()-1;
  104. if(count<=0)return 0;
  105. if(count>this._max)count=this._max;
  106. for(let i=1;i<=count;i++){
  107. if(!this._sign_data.has(i)) return i;
  108. }
  109. return 0;
  110. }
  111. /**签到
  112. * 失败返回 0
  113. * 成功返回签到当天
  114. */
  115. public signIn(): number {
  116. if (!this.checkSigin()) {
  117. return 0;
  118. }
  119. if(this._mode==1){
  120. const day = this.getCreatDayCount();
  121. this._sign_data.add(day);
  122. this._sign_count=this._sign_data.size;
  123. return day;
  124. }else if(this._mode==2){
  125. this._sign_count++;
  126. this._creat_date=chsdk.date.now();
  127. return this._sign_count;
  128. }
  129. return 0;
  130. }
  131. /**补签
  132. * 失败返回 0
  133. * 成功返回补签那天
  134. */
  135. public reSignIn():number{
  136. if(this._mode!=1)return 0;
  137. const index = this.checkReSigin();
  138. if(index<=0 || index>this._max){
  139. return 0;
  140. }
  141. this._sign_data.add(index);
  142. this._sign_count=this._sign_data.size;
  143. return index;
  144. }
  145. //
  146. }