fix: 恢复轨迹问题
This commit is contained in:
		
							parent
							
								
									575d38f2fa
								
							
						
					
					
						commit
						1016b32873
					
				| @ -1,9 +1,7 @@ | |||||||
| import { | import { | ||||||
|   JudgeConfigObjKmItems, |   JudgeConfigObjKmItems, | ||||||
|   JudgeKSJS, |  | ||||||
|   JudgePerformInfo, |   JudgePerformInfo, | ||||||
|   JudgeUI, |   JudgeUI, | ||||||
|   LANE, |  | ||||||
|   MarkRule, |   MarkRule, | ||||||
|   PLCType, |   PLCType, | ||||||
|   ProcessDataEnumType, |   ProcessDataEnumType, | ||||||
| @ -43,9 +41,6 @@ export default class JudgeBusiness { | |||||||
|   //所有的科目考试项目(大车&小车) |   //所有的科目考试项目(大车&小车) | ||||||
|   public kmItems: JudgeConfigObjKmItems |   public kmItems: JudgeConfigObjKmItems | ||||||
|   public xmmcStr: string = "" |   public xmmcStr: string = "" | ||||||
|   public lane: LANE = { |  | ||||||
|     road: '', num: 0, count: 0 |  | ||||||
|   } |  | ||||||
|   public xmmcCode: string = "" |   public xmmcCode: string = "" | ||||||
|   public xmmcSingleCode: string = "" |   public xmmcSingleCode: string = "" | ||||||
|   public xmmcEndCode?: string |   public xmmcEndCode?: string | ||||||
| @ -53,13 +48,12 @@ export default class JudgeBusiness { | |||||||
|   public xmxh: string = "" |   public xmxh: string = "" | ||||||
|   public kfArr?: MarkRule[] |   public kfArr?: MarkRule[] | ||||||
|   public carztStr: string |   public carztStr: string | ||||||
|   public ksjs?: JudgeKSJS |  | ||||||
|   public mndgStr: string | undefined |  | ||||||
|   private judgeUI: JudgeUI |   private judgeUI: JudgeUI | ||||||
|   private tempData?: PLCType |   private tempData?: PLCType | ||||||
|   private plcData?: PLCType |   private plcData?: PLCType | ||||||
|   // 是否发送udp |   // 是否发送udp | ||||||
|   private isUdpEnd: boolean = false |   private isUdpEnd: boolean = false | ||||||
|  |   private mndgStr: string | undefined | ||||||
| 
 | 
 | ||||||
|   constructor(judgeUI: JudgeUI) { |   constructor(judgeUI: JudgeUI) { | ||||||
|     this.judgeUI = judgeUI |     this.judgeUI = judgeUI | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import { JudgeCallBackData, JudgeUI, KmItem, MarkRule, ProcessDataEnumType, Proj | |||||||
| import { dConsole } from '../../utils/LogWorker'; | import { dConsole } from '../../utils/LogWorker'; | ||||||
| import JudgeBusiness from './JudgeBusiness'; | import JudgeBusiness from './JudgeBusiness'; | ||||||
| import { examJudgeArtificialItem } from './JudgeSDKUtils'; | import { examJudgeArtificialItem } from './JudgeSDKUtils'; | ||||||
| import { CurrentProjectConversion, DeductionProjectConversion, GetCarStatus } from './utils'; | import { CurrentProjectConversion, DeductionProjectConversion } from './utils'; | ||||||
| 
 | 
 | ||||||
| export const JudgingFn = async (strData: string, callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) => { | export const JudgingFn = async (strData: string, callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) => { | ||||||
|   let examData: JudgeCallBackData = JSON.parse(strData); |   let examData: JudgeCallBackData = JSON.parse(strData); | ||||||
| @ -26,9 +26,13 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju | |||||||
|   const isManualProjectIn = artSubject3ProjectsCodesArr.includes(xmdm); |   const isManualProjectIn = artSubject3ProjectsCodesArr.includes(xmdm); | ||||||
|   const examSubject = judgeUI.examSubject |   const examSubject = judgeUI.examSubject | ||||||
|   const judgeConfigObj = judgeUI.judgeConfigObj |   const judgeConfigObj = judgeUI.judgeConfigObj | ||||||
|  |   let project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) | ||||||
|  |   const xmmcCode = project.projectCodeCenter || ""; | ||||||
|  |   const kmItem: KmItem = Reflect.get(that.kmItems, xmmcCode) | ||||||
|  | 
 | ||||||
|   switch (event) { |   switch (event) { | ||||||
|     case 1: { |   //   项目开始 | ||||||
|       const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) |     case 1: | ||||||
|       project.type = '2'; |       project.type = '2'; | ||||||
|       if (isManualProjectIn) { |       if (isManualProjectIn) { | ||||||
|         //手动项目是否在进行中 |         //手动项目是否在进行中 | ||||||
| @ -39,9 +43,7 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju | |||||||
|       } |       } | ||||||
|       judgeUI.currentXmdm = xmdm; |       judgeUI.currentXmdm = xmdm; | ||||||
|       const xmmcStr = project.name || ""; |       const xmmcStr = project.name || ""; | ||||||
|       const xmmcCode = project.projectCodeCenter || ""; |  | ||||||
|       const xmmcSingleCode = project.projectCode || ""; |       const xmmcSingleCode = project.projectCode || ""; | ||||||
|       const kmItem: KmItem = Reflect.get(that.kmItems, xmmcCode) |  | ||||||
|       kmItem.status = 2; |       kmItem.status = 2; | ||||||
|       that.xmmcStr = xmmcStr; |       that.xmmcStr = xmmcStr; | ||||||
|       that.xmmcCode = xmmcCode; |       that.xmmcCode = xmmcCode; | ||||||
| @ -53,11 +55,10 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju | |||||||
|       Reflect.set(judgeUI.projectsObj, xmdm, project) |       Reflect.set(judgeUI.projectsObj, xmdm, project) | ||||||
|       Reflect.set(that.kmItems, xmmcCode || 0, kmItem) |       Reflect.set(that.kmItems, xmmcCode || 0, kmItem) | ||||||
|       break; |       break; | ||||||
|     } |   //   项目结束 | ||||||
|     case 2: { |     case 2: | ||||||
|       const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) |  | ||||||
|       const xmmcCode = project.projectCodeCenter || ""; |  | ||||||
|       project.type = (xmjs.xmhg === 0 ? '4' : '3') |       project.type = (xmjs.xmhg === 0 ? '4' : '3') | ||||||
|  |     //计算项目是否全部结束 | ||||||
|       judgeUI.isProjectIn = (Reflect.ownKeys(judgeUI.projectsObj).filter((projectKey) => { |       judgeUI.isProjectIn = (Reflect.ownKeys(judgeUI.projectsObj).filter((projectKey) => { | ||||||
|         const fillProject: ProjectInfo = Reflect.get(judgeUI.projectsObj, projectKey) |         const fillProject: ProjectInfo = Reflect.get(judgeUI.projectsObj, projectKey) | ||||||
|         return fillProject.type == '2' |         return fillProject.type == '2' | ||||||
| @ -65,9 +66,8 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju | |||||||
|       if (isManualProjectIn) { |       if (isManualProjectIn) { | ||||||
|         judgeUI.isManualProjectIn = false |         judgeUI.isManualProjectIn = false | ||||||
|       } |       } | ||||||
|       const kmItem: KmItem = Reflect.get(that.kmItems, xmmcCode) |  | ||||||
|       kmItem.status = 3; |       kmItem.status = 3; | ||||||
|       //统计必考项目数量 |     //统计必考项目数量 | ||||||
|       that.xmmcStr = '无'; |       that.xmmcStr = '无'; | ||||||
|       that.xmmcCode = ''; |       that.xmmcCode = ''; | ||||||
|       that.xmdm = ''; |       that.xmdm = ''; | ||||||
| @ -75,8 +75,8 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju | |||||||
|       Reflect.set(judgeUI.projectsObj, xmdm, project) |       Reflect.set(judgeUI.projectsObj, xmdm, project) | ||||||
|       Reflect.set(that.kmItems, xmmcCode, kmItem) |       Reflect.set(that.kmItems, xmmcCode, kmItem) | ||||||
|       break; |       break; | ||||||
|     } |   //   扣分 | ||||||
|     case 3: { |     case 3: | ||||||
|       const thisKf = DeductionProjectConversion(`${kf.xmdm}_${kf.kfdm}`, judgeUI.markRuleListObj) |       const thisKf = DeductionProjectConversion(`${kf.xmdm}_${kf.kfdm}`, judgeUI.markRuleListObj) | ||||||
|       const kfObj: MarkRule = { |       const kfObj: MarkRule = { | ||||||
|         //扣分项目名称 |         //扣分项目名称 | ||||||
| @ -103,24 +103,34 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju | |||||||
|         project.type = (type == '3' || type == '4') ? '4' : '5' |         project.type = (type == '3' || type == '4') ? '4' : '5' | ||||||
|         Reflect.set(judgeUI.projectsObj, kf.xmdm, project) |         Reflect.set(judgeUI.projectsObj, kf.xmdm, project) | ||||||
|       } |       } | ||||||
|     } |  | ||||||
|     case 4: { |  | ||||||
|       that.carztStr = GetCarStatus(carzt); |  | ||||||
|       break; |       break; | ||||||
|     } |   // 考试状态 | ||||||
|     case 5: { |     case 4: | ||||||
| 
 |       break; | ||||||
|     } |   //   考试结束 | ||||||
|     case 6: { |     case 5: | ||||||
| 
 |       break; | ||||||
|     } |   //   项目取消 | ||||||
|     case 7: { |     case 6: | ||||||
| 
 |       break; | ||||||
|     } |   //   语音播报和提示 | ||||||
|   } |     case 7: | ||||||
| 
 |       break; | ||||||
|   // 考车状态 |   //   模拟灯光事件 | ||||||
|   if (event === 4) { |     case 8: | ||||||
|  |       break; | ||||||
|  |   //   车道和路段变化 | ||||||
|  |     case 9: | ||||||
|  |       break; | ||||||
|  |   //   预进项目事件 | ||||||
|  |     case 10: | ||||||
|  |       break; | ||||||
|  |   //   差分事件 | ||||||
|  |     case 11: | ||||||
|  |       break; | ||||||
|  |     default: | ||||||
|  |       83 | ||||||
|  |       break; | ||||||
|   } |   } | ||||||
|   await callBack({ |   await callBack({ | ||||||
|     //项目名称   考车状态   扣分arr |     //项目名称   考车状态   扣分arr | ||||||
|  | |||||||
							
								
								
									
										28
									
								
								entry/src/main/ets/pages/Judge/JudgeVariable.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								entry/src/main/ets/pages/Judge/JudgeVariable.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | import { testKm2Items, testKm3Items } from '../../mock'; | ||||||
|  | import { JudgeConfigObjKmItems, ProjectInfo, ProjectInfos } from '../../model'; | ||||||
|  | 
 | ||||||
|  | class judgeVariable { | ||||||
|  |   public rmndg: 0 | 1 = 0 | ||||||
|  |   public kmItems: JudgeConfigObjKmItems = {} | ||||||
|  |   public xmmcStr: string = "" | ||||||
|  |   public xmmcEndCode?: string = "" | ||||||
|  |   public xmxh: string = "" | ||||||
|  |   public status: string = "开始" | ||||||
|  | 
 | ||||||
|  |   constructor() { | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public initKmItems(examSubject: string, projectsCenterObj: ProjectInfos) { | ||||||
|  |     (examSubject == '2' ? testKm2Items : testKm3Items).forEach(item => { | ||||||
|  |       const projectCenterObj: ProjectInfo = Reflect.get(projectsCenterObj, item.code) | ||||||
|  |       Reflect.set(this.kmItems, item.code, { | ||||||
|  |         code: item.code, | ||||||
|  |         status: projectCenterObj === undefined ? 0 : (projectCenterObj.isEnd ? 3 : 1) | ||||||
|  |       }) | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const JudgeVariable = new judgeVariable(); | ||||||
| @ -11,7 +11,7 @@ export class ProcessDataTaskPool { | |||||||
|   private readonly maxRetries = 5; |   private readonly maxRetries = 5; | ||||||
| 
 | 
 | ||||||
|   public addTask(dataItem: RegulatoryInterfaceParams): void { |   public addTask(dataItem: RegulatoryInterfaceParams): void { | ||||||
|     dConsole.log(`[Queue] 新任务已添加: ${JSON.stringify(dataItem)},当前队列长度: ${this.queue.length + 1}`); |     console.info(`[Queue] 新任务已添加: ${JSON.stringify(dataItem)},当前队列长度: ${this.queue.length + 1}`); | ||||||
|     this.queue.push(dataItem); // 将任务添加到队尾 |     this.queue.push(dataItem); // 将任务添加到队尾 | ||||||
|     this.triggerProcessing(); // 尝试启动处理流程 |     this.triggerProcessing(); // 尝试启动处理流程 | ||||||
|   } |   } | ||||||
| @ -22,7 +22,7 @@ export class ProcessDataTaskPool { | |||||||
|    */ |    */ | ||||||
|   private triggerProcessing(): void { |   private triggerProcessing(): void { | ||||||
|     if (this.isProcessing) { |     if (this.isProcessing) { | ||||||
|       dConsole.log('[Queue] 处理器正在运行中,新任务将在稍后被处理。'); |       console.log('[Queue] 处理器正在运行中,新任务将在稍后被处理。'); | ||||||
|       return; // 如果已经在处理,则直接返回,新任务会被正在运行的循环消费掉 |       return; // 如果已经在处理,则直接返回,新任务会被正在运行的循环消费掉 | ||||||
|     } |     } | ||||||
|     // 使用 Promise.resolve().then() 来确保 processQueue 在下一个事件循环中异步执行 |     // 使用 Promise.resolve().then() 来确保 processQueue 在下一个事件循环中异步执行 | ||||||
| @ -32,13 +32,13 @@ export class ProcessDataTaskPool { | |||||||
| 
 | 
 | ||||||
|   private async processQueue(): Promise<void> { |   private async processQueue(): Promise<void> { | ||||||
|     this.isProcessing = true; |     this.isProcessing = true; | ||||||
|     dConsole.log(`[Queue] 启动处理器... 待处理任务数: ${this.queue.length}`); |     console.log(`[Queue] 启动处理器... 待处理任务数: ${this.queue.length}`); | ||||||
| 
 | 
 | ||||||
|     while (this.queue.length > 0) { |     while (this.queue.length > 0) { | ||||||
|       const taskData = this.queue[0]; // 查看队首任务 |       const taskData = this.queue[0]; // 查看队首任务 | ||||||
| 
 | 
 | ||||||
|       try { |       try { | ||||||
|         dConsole.log(`[Queue] 开始处理任务: ${JSON.stringify(taskData)}`); |         console.log(`[Queue] 开始处理任务: ${JSON.stringify(taskData)}`); | ||||||
|         // 此方法若成功则正常返回,若永久失败则会抛出错误 |         // 此方法若成功则正常返回,若永久失败则会抛出错误 | ||||||
|         let obj: WuxiExamType = { |         let obj: WuxiExamType = { | ||||||
|           xtlb: taskData.xtlb, |           xtlb: taskData.xtlb, | ||||||
| @ -52,11 +52,11 @@ export class ProcessDataTaskPool { | |||||||
|         await this.processSingleTaskWithRetries(taskData); |         await this.processSingleTaskWithRetries(taskData); | ||||||
|         // 任务成功,将其从队列中移除 |         // 任务成功,将其从队列中移除 | ||||||
|         this.queue.shift(); |         this.queue.shift(); | ||||||
|         dConsole.log(`[Queue] ✅ 任务处理成功,已从队列移除。剩余任务: ${this.queue.length}`); |         console.log(`[Queue] ✅ 任务处理成功,已从队列移除。剩余任务: ${this.queue.length}`); | ||||||
|       } catch (error) { |       } catch (error) { | ||||||
|         // 捕获到永久失败的错误 |         // 捕获到永久失败的错误 | ||||||
|         dConsole.error(`[Queue] 🔥 致命错误: ${(error as Error).message}`); |         console.error(`[Queue] 🔥 致命错误: ${(error as Error).message}`); | ||||||
|         dConsole.error('[Queue] 队列已停止,后续任务将不会被处理。'); |         console.error('[Queue] 队列已停止,后续任务将不会被处理。'); | ||||||
| 
 | 
 | ||||||
|         // (可选)可以在此处清空队列,防止下次意外启动时处理旧任务 |         // (可选)可以在此处清空队列,防止下次意外启动时处理旧任务 | ||||||
|         this.queue = []; |         this.queue = []; | ||||||
| @ -67,7 +67,7 @@ export class ProcessDataTaskPool { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     this.isProcessing = false; |     this.isProcessing = false; | ||||||
|     dConsole.log('[Queue] 处理器已停止。'); |     console.log('[Queue] 处理器已停止。'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private async processSingleTaskWithRetries(taskData: RegulatoryInterfaceParams): Promise<void> { |   private async processSingleTaskWithRetries(taskData: RegulatoryInterfaceParams): Promise<void> { | ||||||
| @ -76,16 +76,16 @@ export class ProcessDataTaskPool { | |||||||
|       const attemptNum = attempt + 1; |       const attemptNum = attempt + 1; | ||||||
|       try { |       try { | ||||||
|         const attemptType = attempt === 0 ? '初次尝试' : `重试 ${attempt}`; |         const attemptType = attempt === 0 ? '初次尝试' : `重试 ${attempt}`; | ||||||
|         dConsole.log(`[Queue] 开始上传 (${attemptType}, 总共第 ${attemptNum} 次): ${JSON.stringify(taskData)}`); |         console.log(`[Queue] 开始上传 (${attemptType}, 总共第 ${attemptNum} 次): ${JSON.stringify(taskData)}`); | ||||||
|         const result: WR = await taskpool.execute(uploadWorkerTask, taskData); |         const result: WR = await taskpool.execute(uploadWorkerTask, taskData); | ||||||
|         dConsole.writeProcessData(ProcessDataEnumType.WuxiExam, JSON.stringify(result)) |         dConsole.writeProcessData(ProcessDataEnumType.WuxiExam, JSON.stringify(result)) | ||||||
|         if (result.code === 1) { |         if (result.code === 1) { | ||||||
|           dConsole.log(`[Queue] ✔️ 上传成功 (在第 ${attemptNum} 次尝试)`); |           console.log(`[Queue] ✔️ 上传成功 (在第 ${attemptNum} 次尝试)`); | ||||||
|           return; // 成功,立即返回 |           return; // 成功,立即返回 | ||||||
|         } |         } | ||||||
|         dConsole.log(`[Queue] ❌ 上传失败 (第 ${attemptNum} 次)。响应: ${result.message}`); |         console.warn(`[Queue] ❌ 上传失败 (第 ${attemptNum} 次)。响应: ${result.message}`); | ||||||
|       } catch (e) { |       } catch (e) { | ||||||
|         dConsole.error(`[Queue] ❌ TaskPool 执行错误 (第 ${attemptNum} 次): ${e}`); |         console.error(`[Queue] ❌ TaskPool 执行错误 (第 ${attemptNum} 次): ${e}`); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       // 如果这是最后一次尝试且依然失败,则不再等待,直接跳出循环去抛出错误 |       // 如果这是最后一次尝试且依然失败,则不再等待,直接跳出循环去抛出错误 | ||||||
| @ -117,7 +117,7 @@ export async function uploadWorkerTask(data: RegulatoryInterfaceParams): Promise | |||||||
|   } catch (err) { |   } catch (err) { | ||||||
|     // 捕获请求过程中可能出现的异常 |     // 捕获请求过程中可能出现的异常 | ||||||
|     const error = err as Error; |     const error = err as Error; | ||||||
|     dConsole.error(`[Worker] 上传时发生异常: ${error.message}`); |     console.error(`[Worker] 上传时发生异常: ${error.message}`); | ||||||
|     return { code: 20038 }; |     return { code: 20038 }; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,11 +6,9 @@ import { | |||||||
|   DefaultJudgeConfigObj, |   DefaultJudgeConfigObj, | ||||||
|   ExtendType, |   ExtendType, | ||||||
|   Gps, |   Gps, | ||||||
|   JudgeSound, |  | ||||||
|   LANE, |   LANE, | ||||||
|   MarkRule, |   MarkRule, | ||||||
|   PLCType, |   PLCType, | ||||||
|   ProcessDataEnumType, |  | ||||||
|   ProjectInfo, |   ProjectInfo, | ||||||
|   ProjectInfos, |   ProjectInfos, | ||||||
|   ProjectRoads, |   ProjectRoads, | ||||||
| @ -20,8 +18,6 @@ import { | |||||||
| import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common'; | import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common'; | ||||||
| import dayTs from '../../utils/Date'; | import dayTs from '../../utils/Date'; | ||||||
| import { dConsole } from '../../utils/LogWorker'; | import { dConsole } from '../../utils/LogWorker'; | ||||||
| import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements'; |  | ||||||
| import { examJudgeSoundEnd } from './JudgeSDKUtils'; |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // 中心信号转换 | // 中心信号转换 | ||||||
| @ -856,27 +852,4 @@ export const DeductionProjectConversion = (code: string, markRuleListObj: object | |||||||
| export const CurrentProjectConversion = (code: number, projectsObj: object): string => { | export const CurrentProjectConversion = (code: number, projectsObj: object): string => { | ||||||
|   const project: ProjectInfo = Reflect.get(projectsObj, code) |   const project: ProjectInfo = Reflect.get(projectsObj, code) | ||||||
|   return project?.abbreviation || '通用评判' |   return project?.abbreviation || '通用评判' | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * 获取评判语音 |  | ||||||
|  * @param sound - 评判音频对象 |  | ||||||
|  * @param avPlayer - 语音播放器实例 |  | ||||||
|  */ |  | ||||||
| export const PlayJudgeVoice = (sound: JudgeSound, avPlayer: VoiceAnnounce) => { |  | ||||||
|   if (sound.type == 1) { |  | ||||||
|     avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => { |  | ||||||
|       examJudgeSoundEnd({ |  | ||||||
|         xmdm: sound.xmdm, code: sound.code[0], type: sound.type |  | ||||||
|       }) |  | ||||||
|       dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({ |  | ||||||
|         method: 'examJudgeSoundEnd', |  | ||||||
|         itemno: sound.xmdm, |  | ||||||
|         code: sound.code[0], |  | ||||||
|         type: sound.type, |  | ||||||
|       })) |  | ||||||
|     }) |  | ||||||
|   } else { |  | ||||||
|     avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]) |  | ||||||
|   } |  | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user