From fc468a1c83be3997f9a7f32c6f61bc2795594579 Mon Sep 17 00:00:00 2001
From: 郑永安 <zyazyz250@sina.com>
Date: 星期一, 03 七月 2023 14:15:39 +0800
Subject: [PATCH] 版本上传异常修复
---
src/main/java/com/ruoyi/doublePrevention/scheduls/SearchReportDateSchedule.java | 275 +++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 209 insertions(+), 66 deletions(-)
diff --git a/src/main/java/com/ruoyi/doublePrevention/scheduls/SearchReportDateSchedule.java b/src/main/java/com/ruoyi/doublePrevention/scheduls/SearchReportDateSchedule.java
index e62cf34..9b8d00c 100644
--- a/src/main/java/com/ruoyi/doublePrevention/scheduls/SearchReportDateSchedule.java
+++ b/src/main/java/com/ruoyi/doublePrevention/scheduls/SearchReportDateSchedule.java
@@ -28,6 +28,8 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -38,6 +40,8 @@
private final Logger logger = LoggerFactory.getLogger(this.getClass());
+ public static SimpleDateFormat startFormat = new SimpleDateFormat("yyyy-MM-dd 06:30:00");
+ public static SimpleDateFormat endFormat = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
@Autowired
private PreventReportConfigService preventReportConfigService;
@@ -92,10 +96,23 @@
@Autowired
private PreventRiskCheckUnitService preventRiskCheckUnitService;//管控措施,任务清单对应关系。基础排查点附属表
+ @Autowired
+ private PreventRiskDangerCheckAndMeasureService riskDangerCheckAndMeasureService;//管控措施,任务清单对应关系。基础排查点附属表
+
+ @Autowired
+ private PreventTaskTypeService taskTypeService;//管控措施,任务清单对应关系。基础排查点附属表
+
+ @Autowired
+ private PreventOverhaulLogService overhaulLogService;
+ @Autowired
+ private PreventCJReportOverhaulLogService reportOverhaulLogService;
@Transactional
-// @Scheduled(cron = "0 0/1 * * * ?")
+// @Scheduled(cron = "0 0/1 * * * ? ") // 分钟
+// @Scheduled(cron = "0/30 * * * * ?") // 30秒
+ @Scheduled(cron = "0 0 0/2 * * ?") // 小时
+
public void searchReportDate(){
logger.info("【双重预防】定时检索需要上报数据...");
@@ -215,7 +232,8 @@
CJReportRiskEvent.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
CJReportRiskEvent.setReportTime(null);
CJReportRiskEvent.setDataSource((byte) 1);
- CJReportRiskEvent.setRiskUnitId(riskEvent.getRiskUnitUuid());
+ PreventRiskUnitUuid riskUnitUuidByUnitId = preventRiskUnitUuidService.getRiskUnitUuidByUnitId(riskEvent.getRiskUnitId());
+ CJReportRiskEvent.setRiskUnitId(riskUnitUuidByUnitId.getRiskUnitUuid());
CJReportRiskEvent.setRiskEventName(riskEvent.getRiskEventName());
CJReportRiskEvent.setRiskEventId(riskEvent.getId());
//封装数据
@@ -263,7 +281,6 @@
//获取上报数据对象
PreventCJReportRiskControlMeasure CJReportMeasure = new PreventCJReportRiskControlMeasure();
//转换数据
- // todo 逻辑改变
PreventRiskControlTemplate controlTemplateById = preventRiskControlTemplateService.getControlTemplateById(measure.getClassify2());
String classify2 = measure.getClassify1() + "-" + controlTemplateById.getOrderIndex();
@@ -317,7 +334,6 @@
/**
* 4、检索 任务配置 数据 prevent_report_check_record_from_task
- * 本数据以 todo
* */
//读取任务配置数据上报主配置信息
PreventReportConfig workReportConfig = preventReportConfigService.getReportConfigById(SyncEnum.REPORT_CONFIG_TASK_FROM_WORK.getCode());
@@ -337,17 +353,17 @@
HiddenDangerCheckJob jobById = trHiddenDangerCheckJobService.getJobById(work.getJobId());
//获取数据对象
PreventCJReportCheckTaskFromWork CJTaskFromWork = new PreventCJReportCheckTaskFromWork();
- //转换时间周期单位
+ //转换时间周期单位 (1小时,2日,3周,4月,5年)
if (jobById.getTroubleshootTypeCycleType() == 1){
CJTaskFromWork.setCheckCycle(Math.toIntExact(jobById.getTroubleshootTypeCycleNum()));
CJTaskFromWork.setCheckCycleUnit("小时");
}else if (jobById.getTroubleshootTypeCycleType() == 2){
+ CJTaskFromWork.setCheckCycle(Math.toIntExact(jobById.getTroubleshootTypeCycleNum()));
+ CJTaskFromWork.setCheckCycleUnit("天");
+ }else if (jobById.getTroubleshootTypeCycleType() == 3){
Long num = jobById.getTroubleshootTypeCycleNum() * 7;
CJTaskFromWork.setCheckCycle(Math.toIntExact(num));
- CJTaskFromWork.setCheckCycleUnit("日");
- }else if (jobById.getTroubleshootTypeCycleType() == 3){
- CJTaskFromWork.setCheckCycle(Math.toIntExact(jobById.getTroubleshootTypeCycleNum()));
- CJTaskFromWork.setCheckCycleUnit("日");
+ CJTaskFromWork.setCheckCycleUnit("天");
}else if (jobById.getTroubleshootTypeCycleType() == 4){
CJTaskFromWork.setCheckCycle(Math.toIntExact(jobById.getTroubleshootTypeCycleNum()));
CJTaskFromWork.setCheckCycleUnit("月");
@@ -381,6 +397,25 @@
CJTaskFromWork.setDataSource((byte) 1);
CJTaskFromWork.setRiskMeasureId(work.getMeasureUuid());
CJTaskFromWork.setWorkId(jobById.getJobId());
+
+ //第二版标准新增
+ PreventRiskControlMeasure measureById = preventRiskControlMeasureService.getPreventRiskControlMeasureById(work.getMeasureId());
+ CJTaskFromWork.setTroubleshootContent(measureById.getCheckContent());
+ CJTaskFromWork.setTaskStartTime(jobById.getStartTime());
+ if (jobById.getTroubleshootTypeCycleType() == 1){
+ Date date = new Date();
+ CJTaskFromWork.setWorkStartTime(new Date(startFormat.format(date)));//todo 这个时间如何确定?
+ CJTaskFromWork.setWorkEndTime(new Date(endFormat.format(date)));
+ }
+ CJTaskFromWork.setWorkDayType("0");
+ List<PreventTaskType> typeByJobId = taskTypeService.getInfoByJobId(work.getJobId());
+ int typeTag = 0;
+ for (PreventTaskType taskType : typeByJobId) {
+ typeTag = taskType.getType();
+ }
+ CJTaskFromWork.setWorkType(String.valueOf(typeTag));
+ CJTaskFromWork.setTaskNum("1");
+
//封装数据
CJTaskFromWorkLists.add(CJTaskFromWork);
//设置原始数据上报状态
@@ -388,7 +423,6 @@
handlerReportParam.setReportTime(new Date());
handlerReportParam.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
preventRiskJobAndMeasureService.updateWorkReportStatus(handlerReportParam);
-
}
}else {
logger.info("【双重预防】当前无任务配置数据需要处理");
@@ -419,7 +453,6 @@
//获取上报数据对象
List<PreventCJReportCheckRecordFromTask> CJRecordFromTaskLists = new ArrayList<>();
HandlerReportParam handlerReportParam = new HandlerReportParam();
-
if (ObjectUtils.isNotEmpty(tasks)){
//遍历,封装数据
for (PreventRiskDangerCheckLog task : tasks) {
@@ -427,15 +460,90 @@
HiddenDangerCheck hiddenDangerCheckById = trHiddenDangerCheckService.getHiddenDangerCheckById(task.getCheckId());
//获取任务附属表信息
PreventRiskJobAndMeasure jobAndMeasureByJobId = preventRiskJobAndMeasureService.getJobAndMeasureByJobId(task.getJobId());
- //获取上报数据对象
- PreventCJReportCheckRecordFromTask CJRecordFromTask = new PreventCJReportCheckRecordFromTask();
//转换检查结果
- /**
- * todo 结果暂时不写入,需要后续处理
- * 1.找到每个点的提交接口,进行数据处理
- * 2.写一个定时任务处理(备用)
- * */
- CJRecordFromTask.setCheckStatus("0");// 0-正常;1-存在隐患;2-未处理;3-其他
+ //如果已经执行过,进入方法
+ if (Integer.valueOf(hiddenDangerCheckById.getScheduleCheckStatus()) == 1){
+
+ List<HiddenDangerCheckPoint> hiddenDangerCheckPointList = trHiddenDangerCheckPointService.getHiddenDangerCheckPointByCheckId(task.getCheckId());
+
+ //避免个别任务无检查点的情况
+ if (ObjectUtils.isEmpty(hiddenDangerCheckPointList)) {
+ logger.info("【双重预防】排查任务记录CJ:异常,无检查点...");
+ }else {
+ for (HiddenDangerCheckPoint hiddenDangerCheckPoint : hiddenDangerCheckPointList) {
+ //获取上报数据对象
+ PreventCJReportCheckRecordFromTask CJRecordFromTask = new PreventCJReportCheckRecordFromTask();
+ CJRecordFromTask.setCheckStatus("0");// 0-正常;1-存在隐患;2-未处理;3-其他
+ if (Integer.valueOf(hiddenDangerCheckPoint.getWhetherDanger()) == 1){
+ CJRecordFromTask.setCheckStatus("1");// 0-正常;1-存在隐患;2-未处理;3-其他
+ }
+ User createUser = new User();
+ createUser = trUserService.getUserByLoginName(hiddenDangerCheckById.getCreateBy());
+ if(ObjectUtils.isEmpty(createUser)){
+ createUser = trUserService.getUserByName(hiddenDangerCheckById.getCreateBy());
+ }
+ User updateUser = trUserService.getUserByLoginName(hiddenDangerCheckById.getUpdateBy());
+
+ //封装上报昌吉州的任务数据
+// String taskUuid = UUID.randomUUID().toString();
+ CJRecordFromTask.setId(UUID.randomUUID().toString());
+ CJRecordFromTask.setCompanyCode(companyCode);
+ CJRecordFromTask.setCreateBy(createUser.getUserName());
+ CJRecordFromTask.setCreateDate(hiddenDangerCheckById.getCreateTime());
+ CJRecordFromTask.setCreateByMobile(createUser.getPhonenumber());
+ if (ObjectUtils.isEmpty(updateUser)){
+ CJRecordFromTask.setUpdateBy(createUser.getUserName());
+ CJRecordFromTask.setUpdateDate(hiddenDangerCheckById.getCreateTime());
+ CJRecordFromTask.setUpdateByMobile(createUser.getPhonenumber());
+ }else {
+ CJRecordFromTask.setUpdateBy(updateUser.getUserName());
+ CJRecordFromTask.setUpdateDate(hiddenDangerCheckById.getUpdateTime());
+ CJRecordFromTask.setUpdateByMobile(updateUser.getPhonenumber());
+ }
+
+ if (task.getReportStatus().equals(SyncEnum.SYNC_EXEC_SUCCESS.getCode())){
+ CJRecordFromTask.setDeleted("2");//数据更新状态标识,目前仅昌吉州需要 2022-08-10
+ }else {
+ CJRecordFromTask.setDeleted("0");
+ }
+ CJRecordFromTask.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
+ CJRecordFromTask.setReportTime(null);
+ CJRecordFromTask.setDataSource((byte) 1);
+ List<PreventRiskDangerCheckAndMeasure> baseCheckPointAndMeasure = riskDangerCheckAndMeasureService.getByBaseCheckPointId(hiddenDangerCheckPoint.getCheckPointId());
+ //获取该条记录对应的管控措施id,
+ Long controlMeasureId = 1L;
+ for (PreventRiskDangerCheckAndMeasure checkAndMeasure : baseCheckPointAndMeasure) {
+ controlMeasureId = checkAndMeasure.getControlMeasureId();
+ }
+ //获取该条记录对应的管控措施uuid
+ PreventRiskControlMeasure preventRiskControlMeasureById = preventRiskControlMeasureService.getPreventRiskControlMeasureById(controlMeasureId);
+ //通过管控措施uuid ,jobId(workId),在任务上报表中,找到任务对应的uuid
+ PreventCJReportCheckTaskFromWork preventCJReportCheckTaskFromWork = CJTaskFromWorkService.geByMeasureUUidAndJobId(preventRiskControlMeasureById.getUuid(), task.getJobId());
+ CJRecordFromTask.setCheckTaskId(preventCJReportCheckTaskFromWork.getId());
+ CJRecordFromTask.setCheckTime(hiddenDangerCheckById.getCheckTime());
+ CJRecordFromTask.setTaskId(task.getCheckId());
+ //第二版标准新增
+ CJRecordFromTask.setMobileCode(task.getMobileCode().toString());
+ List<PreventTaskType> typeByJobIds = taskTypeService.getInfoByJobId(jobAndMeasureByJobId.getJobId());
+ int typeTag = 0;
+ for (PreventTaskType typeByJobId : typeByJobIds) {
+ if (typeByJobId.getType()!= 0) {
+ typeTag = 1;
+ }
+ }
+
+ CJRecordFromTask.setDefend(String.valueOf(typeTag));
+ //封装数据
+ CJRecordFromTaskLists.add(CJRecordFromTask);
+ }
+ }
+
+ //设置原始数据上报状态
+ handlerReportParam.setId(task.getId());
+ handlerReportParam.setReportTime(new Date());
+ handlerReportParam.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
+ preventRiskDangerCheckLogService.updateTaskReportStatus(handlerReportParam);
+ }
// String checkStatus = null;
// if (ObjectUtils.isEmpty(task.getResult() )){
// checkStatus = "2";
@@ -444,45 +552,6 @@
// }else if (task.getResult() == 1){
// checkStatus = "0";
// }
-
- User createUser = trUserService.getUserByLoginName(hiddenDangerCheckById.getCreateBy());
- User updateUser = trUserService.getUserByLoginName(hiddenDangerCheckById.getUpdateBy());
-
- //封装上报昌吉州的任务数据
- CJRecordFromTask.setId(task.getUuid());
- CJRecordFromTask.setCompanyCode(companyCode);
- CJRecordFromTask.setCreateBy(createUser.getUserName());
- CJRecordFromTask.setCreateDate(hiddenDangerCheckById.getCreateTime());
- CJRecordFromTask.setCreateByMobile(createUser.getPhonenumber());
- if (ObjectUtils.isEmpty(updateUser)){
- CJRecordFromTask.setUpdateBy(createUser.getUserName());
- CJRecordFromTask.setUpdateDate(hiddenDangerCheckById.getCreateTime());
- CJRecordFromTask.setUpdateByMobile(createUser.getPhonenumber());
- }else {
- CJRecordFromTask.setUpdateBy(updateUser.getUserName());
- CJRecordFromTask.setUpdateDate(hiddenDangerCheckById.getUpdateTime());
- CJRecordFromTask.setUpdateByMobile(updateUser.getPhonenumber());
- }
-
- if (task.getReportStatus().equals(SyncEnum.SYNC_EXEC_SUCCESS.getCode())){
- CJRecordFromTask.setDeleted("2");//数据更新状态标识,目前仅昌吉州需要 2022-08-10
- }else {
- CJRecordFromTask.setDeleted("0");
- }
- CJRecordFromTask.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
- CJRecordFromTask.setReportTime(null);
- CJRecordFromTask.setDataSource((byte) 1);
- CJRecordFromTask.setCheckTaskId(jobAndMeasureByJobId.getJobUuid());
- CJRecordFromTask.setCheckTime(hiddenDangerCheckById.getCheckTime());
- CJRecordFromTask.setTaskId(task.getCheckId());
-
- //封装数据
- CJRecordFromTaskLists.add(CJRecordFromTask);
- //设置原始数据上报状态
- handlerReportParam.setId(task.getId());
- handlerReportParam.setReportTime(new Date());
- handlerReportParam.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
- preventRiskDangerCheckLogService.updateTaskReportStatus(handlerReportParam);
}
}else {
logger.info("【双重预防】当前无排查任务记录需要处理");
@@ -497,10 +566,12 @@
logger.info("【双重预防】排查任务记录CJ:数据处理...");
}
step = 6;
+
}else {
step = 6;
logger.info("排查任务记录数据上报已关闭");
}
+
/**
* 6、隐患信息数据
@@ -510,7 +581,7 @@
//如果安全风险管控措施主配置开启上报
if (dangerReportConfig.getReportState().equals(SyncEnum.REPORT_ON.getCode())){
- //logger.info("【##】4.检索隐患信息数据...");
+ //logger.info("【##】6.检索隐患数据...");
//查询所有 选择上报的数据 && (reportTime == null 或者 reportTime < updateReportDataTime)
List<PreventRiskDangerInfo> dangerManages = preventRiskDangerInfoService.listReportDanger();
@@ -528,7 +599,11 @@
PreventCJReportDangerInfo CJDangerInfo = new PreventCJReportDangerInfo();
//通过用户名,获取涉及到的各位用户的真实姓名
- User createUser = trUserService.getUserByLoginName(hiddenDanger.getCreateBy());
+ User createUser = new User();
+ createUser = trUserService.getUserByLoginName(hiddenDanger.getCreateBy());
+ if(ObjectUtils.isEmpty(createUser)){
+ createUser = trUserService.getUserByName(hiddenDanger.getCreateBy());
+ }
User updateUser = trUserService.getUserByLoginName(hiddenDanger.getUpdateBy());
if (ObjectUtils.isNotEmpty(hiddenDanger.getRegisterUserName())){
User registerUser = trUserService.getUserByLoginName(hiddenDanger.getRegisterUserName());
@@ -544,15 +619,15 @@
}
if (ObjectUtils.isNotEmpty(hiddenDanger.getAcceptUserName())){
- User acceptUser = trUserService.getUserByLoginName(hiddenDanger.getUpdateBy());
//验收人信息
- CJDangerInfo.setCheckAcceptPerson(acceptUser.getUserName());//验收人
+ CJDangerInfo.setCheckAcceptPerson(hiddenDanger.getAcceptUserName());//验收人
CJDangerInfo.setCheckAcceptComment(hiddenDanger.getAcceptOpinion());//验收情况
CJDangerInfo.setCheckAcceptTime(hiddenDanger.getAcceptCreateTime());//验收时间
}
+
//如果排查任务正常存在,封装任务相关数据
- HiddenDangerCheck dangerCheckById = trHiddenDangerCheckService.getHiddenDangerCheckById(hiddenDanger.getCheckId());
- if (ObjectUtils.isNotEmpty(dangerCheckById)){
+ if (Integer.parseInt(hiddenDanger.getDangerSources()) != 2){
+ HiddenDangerCheck dangerCheckById = trHiddenDangerCheckService.getHiddenDangerCheckById(hiddenDanger.getCheckId());
PreventRiskDangerCheckLog dangerCheckLogByCheckId = preventRiskDangerCheckLogService.getByDangerCheckByCheckId(hiddenDanger.getCheckId());
CJDangerInfo.setCheckRecordId(dangerCheckLogByCheckId.getUuid());//隐患排查任务记录uuid
@@ -585,7 +660,12 @@
CJDangerInfo.setUpdateBy(updateUser.getUserName());
CJDangerInfo.setUpdateDate(hiddenDanger.getUpdateTime());
}
-
+ CJDangerInfo.setHazardCategory("0");
+ if (dangerManage.getId() <= 383){
+ PreventTaskType taskTypeInfo = taskTypeService.getInfoByTaskId(dangerManage.getId());
+ int i = 1;
+ CJDangerInfo.setHazardCategory(taskTypeInfo.getType().toString());
+ }
CJDangerInfo.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
CJDangerInfo.setReportTime(null);
CJDangerInfo.setDataSource((byte) 1);
@@ -629,10 +709,73 @@
+ /**
+ * 7、检索检修记录数据
+ * */
+ //读取风险分析单元数据上报主配置信息
+ PreventReportConfig overhaulReportConfig = preventReportConfigService.getReportConfigById(SyncEnum.OVERHAUL_LOG_DANGER_INFO.getCode());
+ //如果风险事件主配置开启上报
+ if (overhaulReportConfig.getReportState().equals(SyncEnum.REPORT_ON.getCode())){
+ //logger.info("【##】2.检索检修记录...");
+ //查询所有 选择上报的数据 && (reportTime == null 或者 reportTime < updateReportDataTime)
+ List<PreventOverhaulLog> preventOverhaulLogList = overhaulLogService.listReportOverhaulLog();
+ //获取上报数据对象与list
+ List<PreventCJReportOverhaulLog> CJOverhaulLogLists = new ArrayList<>();
+ if (ObjectUtils.isNotEmpty(preventOverhaulLogList)){
+ //遍历,封装数据
+ for (PreventOverhaulLog preventOverhaulLog : preventOverhaulLogList) {
+ HandlerReportParam handlerReportParam = new HandlerReportParam();
+ PreventCJReportOverhaulLog CJOverhaulLog = new PreventCJReportOverhaulLog();
+ //封装上报昌吉州检修记录数据
+ CJOverhaulLog.setId(preventOverhaulLog.getUuid());
+ if (preventOverhaulLog.getReportStatus().equals(SyncEnum.SYNC_EXEC_SUCCESS.getCode())){
+ CJOverhaulLog.setDeleted("2");//数据更新状态标识,目前仅昌吉州需要 2022-08-10
+ }else {
+ CJOverhaulLog.setDeleted("0");
+ }
+ CJOverhaulLog.setCompanyCode(companyCode);
+ CJOverhaulLog.setHazardCode(preventOverhaulLog.getHazardCode());
+ CJOverhaulLog.setRiskUnitId(preventOverhaulLog.getRiskUnitUuid());
+ CJOverhaulLog.setStopStartTime(preventOverhaulLog.getStopStartTime());
+ CJOverhaulLog.setStopEndTime(preventOverhaulLog.getStopEndTime());
+ CJOverhaulLog.setStopReason(preventOverhaulLog.getStopReason());
+ CJOverhaulLog.setCreateBy(preventOverhaulLog.getCreateByUserName());
+ CJOverhaulLog.setCreateDate(preventOverhaulLog.getGmtCreate());
+ CJOverhaulLog.setUpdateBy(preventOverhaulLog.getCreateByUserName());
+ CJOverhaulLog.setUpdateDate(preventOverhaulLog.getGmtModitify());
+ CJOverhaulLog.setReportTime(null);
+ CJOverhaulLog.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
+ CJOverhaulLog.setDataSource((byte) 1);
-
+ //封装数据
+ CJOverhaulLogLists.add(CJOverhaulLog);
+ //设置原始数据上报状态
+ handlerReportParam.setId(preventOverhaulLog.getId());
+ handlerReportParam.setReportTime(new Date());
+ handlerReportParam.setReportStatus(SyncEnum.SYNC_WAIT_EXEC.getCode());
+ int result = overhaulLogService.updateOverhaulReportStatus(handlerReportParam);
+ if (result < 1){
+ throw new AusinessException(E.ADD_FAIL.getCode(), "检修记录数据状态修改失败");
+ }
+ }
+ }else {
+ logger.info("【检修记录】当前无检修记录数据需要处理");
+ }
+ //写入昌吉州转换表
+ for (PreventCJReportOverhaulLog cjOverhaulLog : CJOverhaulLogLists) {
+ int result = reportOverhaulLogService.insertCJOverhaulLists(cjOverhaulLog);
+ if (result < 1){
+ throw new AusinessException(E.ADD_FAIL.getCode(), "检修记录数据状态修改失败");
+ }
+ logger.info("【检修记录】2.检修记录CJ:数据处理...");
+ }
+ step = 3;
+ }else {
+ step = 3;
+ logger.info("检修记录数据上报已关闭");
+ }
--
Gitblit v1.9.2