package com.slibra.business.service.impl; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.slibra.business.domain.*; import com.slibra.business.mapper.*; import com.slibra.business.req.ChatReq; import com.slibra.business.req.WorkOrderReq; import com.slibra.business.res.*; import com.slibra.business.service.IFrontService; import com.slibra.common.DecimalUtils; import com.slibra.common.core.domain.TXinyiDaily; import com.slibra.common.core.redis.RedisCache; import com.slibra.common.enums.BusinessEnum; import com.slibra.common.exception.ServiceException; import com.slibra.common.utils.DateUtils; import com.slibra.common.utils.SecurityUtils; import com.slibra.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.stream.RecordId; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import static com.slibra.common.constant.MyConstants.*; import static com.slibra.common.enums.BusinessEnum.BigModelBizEnum.DECISION_REPORT; import static com.slibra.common.utils.DateUtils.getAllDatesBetween; @Service @Slf4j public class FrontServiceImpl implements IFrontService { @Autowired private TXinyiIndustryMapper xinyiIndustryMapper; @Autowired private TXinyiDailyMapper xinyiDailyMapper; @Autowired private TXinyiRobotMapper xinyiRobotMapper; @Autowired private TXinyiNormConfigMapper tXinyiNormConfigMapper; @Autowired private TXinyiWarningRecordMapper xinyiWarningRecordMapper; @Autowired private TXinyiRecommendQaMapper xinyiRecommendQaMapper; @Autowired private TXinyiChatRecordMapper xinyiChatRecordMapper; @Autowired private RedisCache redisCache; @Autowired private TXinyiForecastComparisonMapper xinyiForecastComparisonMapper; @Autowired private AutoFeedbackMapper autoFeedbackMapper; @Autowired private TJlPredictMapper jlPredictMapper; @Autowired private XsyFeedbackMapper xsyFeedbackMapper; @Override public XinyiIndustrySimple countInfo() { //查询基本的工业库数据 XinyiIndustrySimple xinyiIndustrySimple = new XinyiIndustrySimple(); LocalDateTime nowTime = LocalDateTime.now(); //调用接口查询指标 String[] queryTags = {"信义污水厂JS_COD_Value", "信义污水厂升级出水COD", "信义污水厂JS_AD_Value", "信义污水厂升级出水氨氮", "信义污水厂JS_ZA_Value", "信义污水厂升级出水TN", "信义污水厂JS_ZL_Value", "信义污水厂升级出水TP", "信义污水厂JS_SS_Value", "信义污水厂升级出水SS", "信义污水厂JS_PH_Value", "信义污水厂升级出水PH", "信义污水厂FT101_Value", "信义污水厂出水瞬时流量"}; xinyiIndustrySimple = this.getRealTimeData(queryTags, nowTime); //处理日报数据 this.addDailyData(xinyiIndustrySimple, nowTime); //处理配置信息 this.addConfigData(xinyiIndustrySimple); //计算 this.calculateData(xinyiIndustrySimple, nowTime); //当前的小事数 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_CHINESE); xinyiIndustrySimple.setTestHour(formatter.format(nowTime) + ":00");//只要小时 但是要后面的:00 //2024年12月24日14:01:42 新增字段,累计出水总量【统计的是今日的所有的工业库的出水水量】 xinyiIndustrySimple.setTotalTodayCSL(this.xinyiIndustryMapper.getTotalTodayCSL(nowTime.format(DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS)))); return xinyiIndustrySimple; } @Override public List warningCount() { ArrayList result = new ArrayList<>(); //获取告警的统计数量 int count = this.xinyiWarningRecordMapper.getWarningCountByType(1); if(count > 0)//2024年5月26日19:01:39 有告警记录再返回 result.add(WARNING_TEMPLATE.replace("#", String.valueOf(count))); //获取报警警的统计数量 count = this.xinyiWarningRecordMapper.getWarningCountByType(2); if(count > 0)//2024年5月26日19:01:39 有告警记录再返回 result.add(FORECAST_WARNING_TEMPLATE.replace("#", String.valueOf(count))); return result; } @Override public List homeWarningList() { return this.xinyiWarningRecordMapper.homeWarningList(); } @Override public List recommendQAList(Integer type) { return this.xinyiRecommendQaMapper.selectTXinyiRecommendQaList(TXinyiRecommendQa.builder().type(type).build()); } /** * 2024年6月23日17:30:07 因为只展示一条数据,所以判断是不是最后一条数据是report类型的,如果是就返回; 如果不是,获取是定时任务生成的最近的一条数据 * 2024年6月23日20:13:34 因为决策和预测走的同一个接口,所以把type去掉,否则type为1获取不到预测数据 * 2024年09月20日10:50:04 因为大模型返回不再有alert类型的了,所以下面可以再次优化 * @param warningId * @return */ @Override public TXinyiChatRecord qaDetailByWarningId(String warningId) { //2024年5月28日19:10:21 只获取决策的 因为决策和仿真预测是一个接口,所以通过类型区分 List tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).type(1).build()); if(CollectionUtils.isEmpty(tXinyiChatRecords)) return null; //2024年09月20日10:50:04 直接返回最新一条记录接口,否则判断回答内容,包含太多字段,查询会非常慢 return tXinyiChatRecords.get(0); /*TXinyiChatRecord tXinyiChatRecord = tXinyiChatRecords.get(0); //todo 表增肌一个字段,记录类型,否则查询速度会慢 if(tXinyiChatRecord.getAnswer().contains(DECISION_REPORT.getCode())) return tXinyiChatRecord; else{ tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).type(1).userId(WARNING_DEFAULT_CREATE).build()); return CollectionUtils.isEmpty(tXinyiChatRecords) ? null : tXinyiChatRecords.get(0); }*/ } @Override public String isSatisfiedAnswer(ChatReq chatReq) { Long id = chatReq.getId(); Integer isSatisfied = chatReq.getIsSatisfied(); if(Objects.isNull(id) || Objects.isNull(isSatisfied)) throw new ServiceException("请输入正确的参数"); TXinyiChatRecord tXinyiChatRecord = this.xinyiChatRecordMapper.selectTXinyiChatRecordById(id); if(!Objects.isNull(tXinyiChatRecord)){ tXinyiChatRecord.setIsSatisfied(isSatisfied); tXinyiChatRecord.setUpdateBy(SecurityUtils.getUsername()); tXinyiChatRecord.setUpdateTime(DateUtils.getNowDate()); this.xinyiChatRecordMapper.updateTXinyiChatRecord(tXinyiChatRecord); } return "操作成功"; } @Override public String handleWarningByMan(TXinyiWarningRecord warningRecordReq) { Long id = warningRecordReq.getId(); if(Objects.isNull(id)) throw new ServiceException("请输入告警记录id"); TXinyiWarningRecord tXinyiWarningRecord = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordById(id); if(Objects.isNull(tXinyiWarningRecord)) throw new ServiceException("请输入正确的告警记录id"); warningRecordReq.setUpdateBy(SecurityUtils.getUsername()); warningRecordReq.setUpdateTime(DateUtils.getNowDate()); xinyiWarningRecordMapper.updateTXinyiWarningRecord(warningRecordReq); return "操作成功"; } @Override public TXinyiChatRecord getLeastShortReport() { /*List tXinyiChatRecords = this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().module(4).build()); return CollectionUtils.isEmpty(tXinyiChatRecords) ? null : tXinyiChatRecords.get(0);*/ return this.xinyiChatRecordMapper.getLeastShortReport(); } @Override public List forecastList(String warningId) { return this.xinyiChatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().warningId(warningId).type(3).build()); } @Override public XinyiDailyFeeSimple recentlyOneFeeInfo() { //获取最新的一条日报 TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData(); XinyiDailyFeeSimple xinyiDailyFeeSimple = new XinyiDailyFeeSimple(); if(!Objects.isNull(tXinyiDaily)) BeanUtils.copyProperties(tXinyiDaily, xinyiDailyFeeSimple); return xinyiDailyFeeSimple; } /** * 自定义工单接口 获取数据接口 * @param workOrderReq * @return * * 2024年6月23日17:12:12 小数处理,所有的小数均保留两位小数处理 */ @Override public List customWorkOrder(WorkOrderReq workOrderReq) { checkCustomWorkOrder(workOrderReq); //两个日期之间所有的时间-天 List allDatesBetween = getAllDatesBetween(LocalDate.parse(workOrderReq.getTimeBegin()), LocalDate.parse(workOrderReq.getTimeEnd())); //返回结果 List result = new ArrayList<>(allDatesBetween.size()); for (String date : allDatesBetween) { //查询机器人数据 WorkOrderRes workOrderRes = new WorkOrderRes(); workOrderRes.setTime(date); TXinyiRobot xinyiRobot = this.xinyiRobotMapper.selectRebotAvgByDate(date); if(!Objects.isNull(xinyiRobot)) this.buildRobotData(xinyiRobot, workOrderRes, workOrderReq); //判断数据来源(进出水情况) if(workOrderReq.getWhichWay() == 0){// 0:日报 1:工业库(在线仪表) List tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(date).build()); if(!CollectionUtils.isEmpty(tXinyiDailies)){ TXinyiDaily tXinyiDaily = tXinyiDailies.get(0); this.buildDailyData(tXinyiDaily, workOrderRes, workOrderReq); } }else { TXinyiIndustry industry = this.xinyiIndustryMapper.selectIndustryAvgByDate(date); if(!Objects.isNull(industry)) this.buildIndustryData(industry, workOrderRes, workOrderReq); } result.add(workOrderRes); } return result; } @Override public JSONObject customWorkOrderHandle(WorkOrderReq workOrderReq) { List workOrderRes = this.customWorkOrder(workOrderReq); JSONObject jsonObject = new JSONObject(); List jsGroup = new ArrayList<>(); List csGroup = new ArrayList<>(); List hyGroup = new ArrayList<>(); //处理成前端响应的结构 if(!CollectionUtils.isEmpty(workOrderRes)){ for (WorkOrderRes workOrderRe : workOrderRes) { //处理进水 if(workOrderReq.getJsSlq() || workOrderReq.getJsCod() || workOrderReq.getJsTn() || workOrderReq.getJsTp() || workOrderReq.getJsNh3() || workOrderReq.getJsSs()){ JSONObject jsonObjectJS = new JSONObject(); jsonObjectJS.put("time", workOrderRe.getTime()); if(workOrderReq.getJsSlq()) jsonObjectJS.put("jsSlq", workOrderRe.getJsSlq()); if(workOrderReq.getJsCod()) jsonObjectJS.put("jsCod", workOrderRe.getJsCod()); if(workOrderReq.getJsTn()) jsonObjectJS.put("jsTn", workOrderRe.getJsTn()); if(workOrderReq.getJsTp()) jsonObjectJS.put("jsTp", workOrderRe.getJsTp()); if(workOrderReq.getJsNh3()) jsonObjectJS.put("jsNh3", workOrderRe.getJsNh3()); if(workOrderReq.getJsSs()) jsonObjectJS.put("jsSs", workOrderRe.getJsSs()); jsGroup.add(jsonObjectJS); } //处理出水 if(workOrderReq.getCsSlqc() || workOrderReq.getCsCod() || workOrderReq.getCsTn() || workOrderReq.getCsTp() || workOrderReq.getCsNh3() || workOrderReq.getCsSs()){ JSONObject jsonObjectCS = new JSONObject(); jsonObjectCS.put("time", workOrderRe.getTime()); if(workOrderReq.getCsSlqc()) jsonObjectCS.put("csSlqc", workOrderRe.getCsSlqc()); if(workOrderReq.getCsCod()) jsonObjectCS.put("csCod", workOrderRe.getCsCod()); if(workOrderReq.getCsTn()) jsonObjectCS.put("csTn", workOrderRe.getCsTn()); if(workOrderReq.getCsTp()) jsonObjectCS.put("csTp", workOrderRe.getCsTp()); if(workOrderReq.getCsNh3()) jsonObjectCS.put("csNh3", workOrderRe.getCsNh3()); if(workOrderReq.getCsSs()) jsonObjectCS.put("csSs", workOrderRe.getCsSs()); csGroup.add(jsonObjectCS); } //处理化验 if(workOrderReq.getNo3Hlj1Jqr() || workOrderReq.getNo3Hlj2Jqr() || workOrderReq.getNh31Jqr() || workOrderReq.getNh32Jqr() || workOrderReq.getNo3Qyc1Jqr() || workOrderReq.getNo3Qyc2Jqr() || workOrderReq.getTpRccJqr()){ JSONObject jsonObjectHY = new JSONObject(); jsonObjectHY.put("time", workOrderRe.getTime()); if(workOrderReq.getNo3Hlj1Jqr()) jsonObjectHY.put("no3Hlj1Jqr", workOrderRe.getNo3Hlj1Jqr()); if(workOrderReq.getNo3Hlj2Jqr()) jsonObjectHY.put("no3Hlj2Jqr", workOrderRe.getNo3Hlj2Jqr()); if(workOrderReq.getNh31Jqr()) jsonObjectHY.put("nh31Jqr", workOrderRe.getNh31Jqr()); if(workOrderReq.getNh32Jqr()) jsonObjectHY.put("nh32Jqr", workOrderRe.getNh32Jqr()); if(workOrderReq.getNo3Qyc1Jqr()) jsonObjectHY.put("no3Qyc1Jqr", workOrderRe.getNo3Qyc1Jqr()); if(workOrderReq.getNo3Qyc2Jqr()) jsonObjectHY.put("no3Qyc2Jqr", workOrderRe.getNo3Qyc2Jqr()); if(workOrderReq.getTpRccJqr()) jsonObjectHY.put("tpRccJqr", workOrderRe.getTpRccJqr()); hyGroup.add(jsonObjectHY); } } } jsonObject.put("jsGroup", jsGroup); jsonObject.put("csGroup", csGroup); jsonObject.put("hyGroup", hyGroup); return jsonObject; } @Override public JSONObject customWorkOrderHandleByData(WorkOrderReq workOrderReq, List workOrderRes) { JSONObject jsonObject = new JSONObject(); List jsGroup = new ArrayList<>(); List csGroup = new ArrayList<>(); List hyGroup = new ArrayList<>(); //处理成前端响应的结构 if(!CollectionUtils.isEmpty(workOrderRes)){ for (WorkOrderRes workOrderRe : workOrderRes) { //处理进水 if(workOrderReq.getJsSlq() || workOrderReq.getJsCod() || workOrderReq.getJsTn() || workOrderReq.getJsTp() || workOrderReq.getJsNh3() || workOrderReq.getJsSs()){ JSONObject jsonObjectJS = new JSONObject(); jsonObjectJS.put("time", workOrderRe.getTime()); if(workOrderReq.getJsSlq()) jsonObjectJS.put("jsSlq", workOrderRe.getJsSlq()); if(workOrderReq.getJsCod()) jsonObjectJS.put("jsCod", workOrderRe.getJsCod()); if(workOrderReq.getJsTn()) jsonObjectJS.put("jsTn", workOrderRe.getJsTn()); if(workOrderReq.getJsTp()) jsonObjectJS.put("jsTp", workOrderRe.getJsTp()); if(workOrderReq.getJsNh3()) jsonObjectJS.put("jsNh3", workOrderRe.getJsNh3()); if(workOrderReq.getJsSs()) jsonObjectJS.put("jsSs", workOrderRe.getJsSs()); jsGroup.add(jsonObjectJS); } //处理出水 if(workOrderReq.getCsSlqc() || workOrderReq.getCsCod() || workOrderReq.getCsTn() || workOrderReq.getCsTp() || workOrderReq.getCsNh3() || workOrderReq.getCsSs()){ JSONObject jsonObjectCS = new JSONObject(); jsonObjectCS.put("time", workOrderRe.getTime()); if(workOrderReq.getCsSlqc()) jsonObjectCS.put("csSlqc", workOrderRe.getCsSlqc()); if(workOrderReq.getCsCod()) jsonObjectCS.put("csCod", workOrderRe.getCsCod()); if(workOrderReq.getCsTn()) jsonObjectCS.put("csTn", workOrderRe.getCsTn()); if(workOrderReq.getCsTp()) jsonObjectCS.put("csTp", workOrderRe.getCsTp()); if(workOrderReq.getCsNh3()) jsonObjectCS.put("csNh3", workOrderRe.getCsNh3()); if(workOrderReq.getCsSs()) jsonObjectCS.put("csSs", workOrderRe.getCsSs()); csGroup.add(jsonObjectCS); } //处理化验 if(workOrderReq.getNo3Hlj1Jqr() || workOrderReq.getNo3Hlj2Jqr() || workOrderReq.getNh31Jqr() || workOrderReq.getNh32Jqr() || workOrderReq.getNo3Qyc1Jqr() || workOrderReq.getNo3Qyc2Jqr() || workOrderReq.getTpRccJqr()){ JSONObject jsonObjectHY = new JSONObject(); jsonObjectHY.put("time", workOrderRe.getTime()); if(workOrderReq.getNo3Hlj1Jqr()) jsonObjectHY.put("no3Hlj1Jqr", workOrderRe.getNo3Hlj1Jqr()); if(workOrderReq.getNo3Hlj2Jqr()) jsonObjectHY.put("no3Hlj2Jqr", workOrderRe.getNo3Hlj2Jqr()); if(workOrderReq.getNh31Jqr()) jsonObjectHY.put("nh31Jqr", workOrderRe.getNh31Jqr()); if(workOrderReq.getNh32Jqr()) jsonObjectHY.put("nh32Jqr", workOrderRe.getNh32Jqr()); if(workOrderReq.getNo3Qyc1Jqr()) jsonObjectHY.put("no3Qyc1Jqr", workOrderRe.getNo3Qyc1Jqr()); if(workOrderReq.getNo3Qyc2Jqr()) jsonObjectHY.put("no3Qyc2Jqr", workOrderRe.getNo3Qyc2Jqr()); if(workOrderReq.getTpRccJqr()) jsonObjectHY.put("tpRccJqr", workOrderRe.getTpRccJqr()); hyGroup.add(jsonObjectHY); } } } jsonObject.put("jsGroup", jsGroup); jsonObject.put("csGroup", csGroup); jsonObject.put("hyGroup", hyGroup); //2024年6月25日13:45:48 新增逻辑 区分是在线仪表的还是日报的,方便前端展示单位 jsonObject.put("whichWay", workOrderReq.getWhichWay()); return jsonObject; } @Override public String stopChat(String sessionId) { HashMap map = new HashMap<>(); map.put(SESSION_ID, sessionId); RecordId stopGenStream = redisCache.streamXadd(STOP_GEN_STREAM, map); log.info("返回结果是{}", JSON.toJSONString(stopGenStream)); return "操作成功"; } @Override public SmartAdd smartAddDataInfo() { SmartAdd build = SmartAdd.builder().build(); //处理需要的数据 //获取最新的日报数据 TXinyiIndustry tXinyiIndustry = this.xinyiIndustryMapper.selectTXinyiIndustryNewest(); if(!Objects.isNull(tXinyiIndustry)){ build.setJslYB(tXinyiIndustry.getJsSlq()); build.setJsCodYB(tXinyiIndustry.getJsCod()); build.setJsTnYB(tXinyiIndustry.getJsTn()); build.setTytjzl(tXinyiIndustry.getSJTYJLY()); } //获取最新的化验室数据 TXinyiRobot tXinyiRobot = this.xinyiRobotMapper.selectNewest(); if(!Objects.isNull(tXinyiRobot)){ build.setJsCodHY(tXinyiRobot.getCodJqr()); build.setHyXsyHYOne(tXinyiRobot.getNo3Hlj1Jqr()); build.setHyXsyHYTwo(tXinyiRobot.getNo3Hlj2Jqr()); build.setQyXsyHYOne(tXinyiRobot.getNo3Qyc1Jqr()); build.setQyXsyHYTwo(tXinyiRobot.getNo3Qyc2Jqr()); build.setQyAdHYOne(tXinyiRobot.getNh31Jqr()); build.setQyAdHYTwo(tXinyiRobot.getNh32Jqr()); } //获取最新的预测数据 TXinyiForecastComparison tXinyiForecastComparison = this.xinyiForecastComparisonMapper.selectNewestForecastComparison(BusinessEnum.BigModelForecastEnum.XSY1.getCode()); if(!Objects.isNull(tXinyiForecastComparison)){ build.setHyXsyYCOne(tXinyiForecastComparison.getHsForecastOne()); } tXinyiForecastComparison = this.xinyiForecastComparisonMapper.selectNewestForecastComparison(BusinessEnum.BigModelForecastEnum.XSY2.getCode()); if(!Objects.isNull(tXinyiForecastComparison)){ build.setHyXsyYCTwo(tXinyiForecastComparison.getHsForecastOne()); } //获取最新的计算数据 return build; } @Override public Map> smartAddCharList(int type, String timeBegin, String timeEnd) { //日期兜底处理 Date nowDate = DateUtils.getNowDate(); Date dayBefore7 = DateUtils.plusDate(-7, nowDate); //2024年09月13日17:02:59 支持前段自定义起止时间 //先用日期获取当天和前一天的数据,如果获取不到,则提示错误信息 String nowDateStr = StringUtils.isBlank(timeEnd) ? DateUtils.parseDateToStr(DateUtils.YYYYMMDD_TS, nowDate) : timeEnd; String dayBefore3Str = StringUtils.isBlank(timeBegin) ? DateUtils.parseDateToStr(DateUtils.YYYYMMDD_TS, dayBefore7) : timeBegin; //返回的对象 Map> result = new HashMap<>(); List list = new ArrayList<>(); //先判断类型,然后根据不同类型,查询不同的数据 if(BusinessEnum.SmartAddMedicineReqEnum.JSLL.getCode() == type){ //查询仪表即可 list = this.xinyiIndustryMapper.selectJSLByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list); }else if(BusinessEnum.SmartAddMedicineReqEnum.HY_1_XSY.getCode() == type){ //查询化验室 list = this.xinyiRobotMapper.selectXSY1ByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list); //查询预测 list = this.xinyiForecastComparisonMapper.selectOneValAndTimeByDate(BusinessEnum.BigModelForecastEnum.XSY1.getCode());//SQL中处理日期 否则索引失效 result.put(BusinessEnum.DataSourceEnum.YC.getCode(), list); }else if(BusinessEnum.SmartAddMedicineReqEnum.HY_2_XSY.getCode() == type){ //查询化验室 list = this.xinyiRobotMapper.selectXSY2ByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list); //查询预测 list = this.xinyiForecastComparisonMapper.selectOneValAndTimeByDate(BusinessEnum.BigModelForecastEnum.XSY2.getCode());//SQL中处理日期 否则索引失效 result.put(BusinessEnum.DataSourceEnum.YC.getCode(), list); }else if(BusinessEnum.SmartAddMedicineReqEnum.QY_1_AD.getCode() == type){ //查询化验室 list = this.xinyiRobotMapper.selectAD1ByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list); }else if(BusinessEnum.SmartAddMedicineReqEnum.QY_2_AD.getCode() == type){ //查询化验室 list = this.xinyiRobotMapper.selectAD2ByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list); }else if(BusinessEnum.SmartAddMedicineReqEnum.JSCOD.getCode() == type){ //查询仪表即可 list = this.xinyiIndustryMapper.selectJsCodByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list); //查询化验室 list = this.xinyiRobotMapper.selectCodByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.HY.getCode(), list); }else if(BusinessEnum.SmartAddMedicineReqEnum.JSTN.getCode() == type){ //查询仪表即可 list = this.xinyiIndustryMapper.selectJsTnByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list); }else if(BusinessEnum.SmartAddMedicineReqEnum.TYTJL.getCode() == type){ //查询仪表即可 list = this.xinyiIndustryMapper.selectTytzjlByDate(dayBefore3Str, nowDateStr); result.put(BusinessEnum.DataSourceEnum.YB.getCode(), list); }else{ log.info("暂不支持的类型~~~"); } return result; } @Override // @Transactional(rollbackFor = Exception.class) public List configPredict(List tJlPredicts) { if(CollectionUtils.isEmpty(tJlPredicts)) throw new ServiceException("必须输入至少一条数据"); //先清除2个表 autoFeedbackMapper.deleteAll(); jlPredictMapper.deleteAll(); xsyFeedbackMapper.deleteAll(); //再保存数据 for (TJlPredict tJlPredict : tJlPredicts) { jlPredictMapper.insertTJlPredict(tJlPredict); } //休眠2分钟 try { TimeUnit.MINUTES.sleep(3); } catch (InterruptedException e) { throw new RuntimeException(e); } //查询新结果 并返回 return autoFeedbackMapper.selectAutoFeedbackList(null); } private void buildIndustryData(TXinyiIndustry industry, WorkOrderRes workOrderRes, WorkOrderReq workOrderReq) { if(workOrderReq.getJsSlq()) workOrderRes.setJsSlq(DecimalUtils.getAbsAndScale(industry.getJsSlq(), 2)); if(workOrderReq.getJsCod()) workOrderRes.setJsCod(DecimalUtils.getAbsAndScale(industry.getJsCod(), 2)); if(workOrderReq.getJsTn()) workOrderRes.setJsTn(DecimalUtils.getAbsAndScale(industry.getJsTn(), 2)); if(workOrderReq.getJsTp()) workOrderRes.setJsTp(DecimalUtils.getAbsAndScale(industry.getJsTp(), 2)); if(workOrderReq.getJsNh3()) workOrderRes.setJsNh3(DecimalUtils.getAbsAndScale(industry.getJsNh3(), 2)); if(workOrderReq.getJsSs()) workOrderRes.setJsSs(DecimalUtils.getAbsAndScale(industry.getJsSs(), 2)); if(workOrderReq.getCsSlqc()) workOrderRes.setCsSlqc(DecimalUtils.getAbsAndScale(industry.getCsSlqc(), 2)); if(workOrderReq.getCsCod()) workOrderRes.setCsCod(DecimalUtils.getAbsAndScale(industry.getCsCod(), 2)); if(workOrderReq.getCsTn()) workOrderRes.setCsTn(DecimalUtils.getAbsAndScale(industry.getCsTn(), 2)); if(workOrderReq.getCsTp()) workOrderRes.setCsTp(DecimalUtils.getAbsAndScale(industry.getCsTp(), 2)); if(workOrderReq.getCsNh3()) workOrderRes.setCsNh3(DecimalUtils.getAbsAndScale(industry.getCsNh3(), 2)); if(workOrderReq.getCsSs()) workOrderRes.setCsSs(DecimalUtils.getAbsAndScale(industry.getCsSs(), 2)); } private void buildDailyData(TXinyiDaily tXinyiDaily, WorkOrderRes workOrderRes, WorkOrderReq workOrderReq) { if(workOrderReq.getJsSlq()) workOrderRes.setJsSlq(DecimalUtils.getAbsAndScale(tXinyiDaily.getJSL(), 2)); if(workOrderReq.getJsCod()) workOrderRes.setJsCod(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsCod(), 2)); if(workOrderReq.getJsTn()) workOrderRes.setJsTn(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsTn(), 2)); if(workOrderReq.getJsTp()) workOrderRes.setJsTp(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsTp(), 2)); if(workOrderReq.getJsNh3()) workOrderRes.setJsNh3(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsNh3(), 2)); if(workOrderReq.getJsSs()) workOrderRes.setJsSs(DecimalUtils.getAbsAndScale(tXinyiDaily.getJsSs(), 2)); if(workOrderReq.getCsSlqc()) workOrderRes.setCsSlqc(DecimalUtils.getAbsAndScale(tXinyiDaily.getCSL(), 2)); if(workOrderReq.getCsCod()) workOrderRes.setCsCod(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsCod(), 2)); if(workOrderReq.getCsTn()) workOrderRes.setCsTn(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsTn(), 2)); if(workOrderReq.getCsTp()) workOrderRes.setCsTp(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsTp(), 2)); if(workOrderReq.getCsNh3()) workOrderRes.setCsNh3(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsNh3(), 2)); if(workOrderReq.getCsSs()) workOrderRes.setCsSs(DecimalUtils.getAbsAndScale(tXinyiDaily.getCsSs(), 2)); } private void buildRobotData(TXinyiRobot xinyiRobot, WorkOrderRes workOrderRes, WorkOrderReq workOrderReq) { if(workOrderReq.getNo3Hlj1Jqr()) workOrderRes.setNo3Hlj1Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Hlj1Jqr(), 2)); if(workOrderReq.getNo3Hlj2Jqr()) workOrderRes.setNo3Hlj2Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Hlj2Jqr(), 2)); if(workOrderReq.getNh31Jqr()) workOrderRes.setNh31Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNh31Jqr(), 2)); if(workOrderReq.getNh32Jqr()) workOrderRes.setNh32Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNh32Jqr(), 2)); if(workOrderReq.getNo3Qyc1Jqr()) workOrderRes.setNo3Qyc1Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Qyc1Jqr(), 2)); if(workOrderReq.getNo3Qyc2Jqr()) workOrderRes.setNo3Qyc2Jqr(DecimalUtils.getAbsAndScale(xinyiRobot.getNo3Qyc2Jqr(), 2)); if(workOrderReq.getTpRccJqr()) workOrderRes.setTpRccJqr(DecimalUtils.getAbsAndScale(xinyiRobot.getTpRccJqr(), 2)); } private void checkCustomWorkOrder(WorkOrderReq workOrderReq) { if(StringUtils.isBlank(workOrderReq.getTimeBegin()) || StringUtils.isBlank(workOrderReq.getTimeEnd())) throw new ServiceException("输入的参数不合法"); } /*** * 将工业库数据计算出结果 * @param xinyiIndustrySimple * @param nowTime * @return */ private XinyiIndustrySimple calculateData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowTime) { LocalDateTime yesterdaySameTime = nowTime.plusDays(-1); DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHH_TS); String testTime = formatter.format(yesterdaySameTime); //处理昨日同时期的进水 获取环比 List tXinyiIndustries = this.xinyiIndustryMapper.selectTXinyiIndustryList(TXinyiIndustry.builder().testTime(testTime).build()); if(!CollectionUtils.isEmpty(tXinyiIndustries)){ TXinyiIndustry industry = tXinyiIndustries.get(0); BigDecimal jsSlqYesterday = industry.getJsSlq(); BigDecimal csSlqcYesterday = industry.getCsSlqc(); BigDecimal jsSlqToday = xinyiIndustrySimple.getJsSlq(); BigDecimal csSlqcToday = xinyiIndustrySimple.getCsSlqc(); if(!Objects.isNull(jsSlqYesterday) && !Objects.isNull(jsSlqToday)) xinyiIndustrySimple.setSsJsHb((jsSlqToday.subtract(jsSlqYesterday)).divide(jsSlqYesterday, 4, RoundingMode.HALF_UP)); if(!Objects.isNull(csSlqcYesterday) && !Objects.isNull(csSlqcToday)) xinyiIndustrySimple.setSsJsHb((csSlqcToday.subtract(csSlqcYesterday)).divide(csSlqcYesterday, 4, RoundingMode.HALF_UP)); } //通过sql查询上周的平均值和环比情况 DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS); //获取上周的统计进出水品均值 String begin = formatterDate.format(nowTime.plusDays(-7)); String end = formatterDate.format(nowTime.plusDays(-1)); HashMap lastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end); if(!Objects.isNull(lastWeek)){ BigDecimal lastJSL = lastWeek.get("JSL"); BigDecimal lastCSL = lastWeek.get("CSL"); //获取上上周的统计进出水品均值 begin = formatterDate.format(nowTime.plusDays(-14)); end = formatterDate.format(nowTime.plusDays(-8)); HashMap beforeLastWeek = this.xinyiDailyMapper.selectAvgWater(begin, end); if(!Objects.isNull(beforeLastWeek)){ BigDecimal beforeLastJSL = beforeLastWeek.get("JSL"); BigDecimal beforeLastCSL = beforeLastWeek.get("CSL"); if(!Objects.isNull(lastJSL)){ xinyiIndustrySimple.setSzZJSAvg(lastJSL); if(!Objects.isNull(beforeLastJSL)) xinyiIndustrySimple.setSzZJSHb((lastJSL.subtract(beforeLastJSL)).divide(beforeLastJSL, 4, RoundingMode.HALF_UP)); } if(!Objects.isNull(lastCSL)){ xinyiIndustrySimple.setSzZCSAvg(lastCSL); if(!Objects.isNull(beforeLastCSL)) xinyiIndustrySimple.setSzZCSHb((lastCSL.subtract(beforeLastCSL)).divide(beforeLastCSL, 4, RoundingMode.HALF_UP)); } } } return xinyiIndustrySimple; } private XinyiIndustrySimple addConfigData(XinyiIndustrySimple xinyiIndustrySimple) { //获取配置表 List tXinyiNormConfigs = this.tXinyiNormConfigMapper.selectTXinyiNormConfigList(null); if(!CollectionUtils.isEmpty(tXinyiNormConfigs)){ TXinyiNormConfig normConfig = tXinyiNormConfigs.get(0); BeanUtils.copyProperties(normConfig, xinyiIndustrySimple); } return xinyiIndustrySimple; } private XinyiIndustrySimple addDailyData(XinyiIndustrySimple xinyiIndustrySimple, LocalDateTime nowDate) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS); String nowDateStr = nowDate.format(formatter); String yesterdayStr = nowDate.plusDays(-1).format(formatter);//昨天 String beforeYesterdayStr = nowDate.plusDays(-2).format(formatter);//前天 List tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(nowDateStr).build()); if(!CollectionUtils.isEmpty(tXinyiDailies)){ TXinyiDaily tXinyiDaily = tXinyiDailies.get(0); BeanUtils.copyProperties(tXinyiDaily, xinyiIndustrySimple); } //昨日数据 List tXinyiDailiesYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(yesterdayStr).build()); if(!CollectionUtils.isEmpty(tXinyiDailiesYesterday)){ TXinyiDaily tXinyiDailyYesterday = tXinyiDailiesYesterday.get(0); BigDecimal zrJsl = tXinyiDailyYesterday.getJSL(); xinyiIndustrySimple.setZrZJSL(zrJsl); BigDecimal zrCsl = tXinyiDailyYesterday.getCSL(); xinyiIndustrySimple.setZrZCSL(zrCsl); //有可能今日获取不到日报数据,相关信息从昨天获取 if(CollectionUtils.isEmpty(tXinyiDailies)) BeanUtils.copyProperties(tXinyiDailyYesterday, xinyiIndustrySimple); //获取前日数据 并计算环比 List tXinyiDailiesBeforeYesterday = this.xinyiDailyMapper.selectTXinyiDailyList(TXinyiDaily.builder().testDate(beforeYesterdayStr).build()); if(!CollectionUtils.isEmpty(tXinyiDailiesBeforeYesterday)){ TXinyiDaily tXinyiDailyBeforeYesterday = tXinyiDailiesBeforeYesterday.get(0); BigDecimal qrZJSL = tXinyiDailyBeforeYesterday.getJSL(); if(!Objects.isNull(qrZJSL) && !Objects.isNull(zrJsl)) xinyiIndustrySimple.setZrZJsHb((zrJsl.subtract(qrZJSL)).divide(qrZJSL, 4, RoundingMode.HALF_UP)); BigDecimal qrZCSL = tXinyiDailyBeforeYesterday.getCSL(); if(!Objects.isNull(qrZCSL) && !Objects.isNull(zrCsl)) xinyiIndustrySimple.setZrZCsHb((zrCsl.subtract(qrZCSL)).divide(qrZCSL, 4, RoundingMode.HALF_UP)); } } return xinyiIndustrySimple; } private XinyiIndustrySimple getRealTimeData(String[] queryTags, LocalDateTime nowTime) { /*AtomicReference result = new AtomicReference<>(); *//*String time = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate()); time = time + ":00:00";*//* DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS); //获取当前的时间 LocalDateTime beginTime = nowTime.plusMinutes(-1); //调用工业库接口 String url = INDUSTRY_INTERFACE_ADDR; HashMap req = new HashMap<>(); req.put("tagNames", queryTags); req.put("startTime", formatter.format(beginTime)); req.put("endTime", formatter.format(nowTime)); req.put("recordNumbers", 100000); String body = HttpRequest.post(url).header("Authorization", "c2E6c2E=").header("clientName", "hongshan").body(JSON.toJSONString(req)).execute().body(); // System.out.println("body = " + body); log.info("实时数据返回的结果是{}", body); //2024年5月31日13:43:24 新增解析内容,判断是否正常返回 String errorCode = (String) JSON.parseObject(body).get("errorCode"); if("-1".equals(errorCode)){ log.info("工业库数据返回错误"); return new XinyiIndustrySimple(); } List> list = new ArrayList<>(); //行转列数据处理 for (String queryTag : queryTags) { JSONArray array = JSON.parseObject(body).getJSONArray(queryTag); //特殊数据处理一 if(Objects.isNull(array) || array.isEmpty()){ System.out.println(queryTag + "查询到了空的数据,跳过本次循环"); continue; } int size = array.size(); //特殊数据处理二 if("0".equals(array.get(1) + "")){ System.out.println(queryTag + "查询到了数据,但是数据集合只有一条,且都是0"); continue; } //存放的数据集 //利用map去重 HashMap map = new LinkedHashMap<>(); for (int i = 2; i < size; i++) { // System.out.println(i + "" + array.get(i)); JSONArray oneRecord = JSON.parseArray(JSON.toJSONString(array.get(i))); //处理为空或者为0的数据 Object timeStampValue = oneRecord.get(2); if(Objects.isNull(timeStampValue) || "0".equals(timeStampValue + "")) continue; BigDecimal value = Objects.isNull(oneRecord.get(0)) ? null : new BigDecimal(oneRecord.get(0) + ""); long timestamp = (long) timeStampValue; String format = DateUtil.format(new Date(timestamp), DateUtils.YYYYMMDDHH_TS); map.put(format, queryTag + "-" + value); } list.add(map); } Set recordTimeSet = new HashSet<>(); Map recordMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) { HashMap map = list.get(i); int finalJ = i; map.forEach((k, v) ->{ XinyiIndustrySimple xinyiIndustrySimple = null; if(!recordTimeSet.contains(k)){//第一次 xinyiIndustrySimple = new XinyiIndustrySimple(); recordTimeSet.add(k); recordMap.put(k, xinyiIndustrySimple); }else{ xinyiIndustrySimple = recordMap.get(k); } xinyiIndustrySimple.setTestTime(k); //解析值 String[] split = v.split("-"); String type = split[0]; BigDecimal value = new BigDecimal(split[1]); if ("信义污水厂JS_COD_Value".equals(type)) { xinyiIndustrySimple.setJsCod(value); } else if ("信义污水厂JS_PH_Value".equals(type)) { xinyiIndustrySimple.setJsPh(value); } else if ("信义污水厂JS_SS_Value".equals(type)) { xinyiIndustrySimple.setJsSs(value); } else if ("信义污水厂JS_ZL_Value".equals(type)) { xinyiIndustrySimple.setJsTp(value); } else if ("信义污水厂JS_ZA_Value".equals(type)) { xinyiIndustrySimple.setJsTn(value); } else if ("信义污水厂JS_AD_Value".equals(type)) { xinyiIndustrySimple.setJsNh3(value); } else if ("信义污水厂出水瞬时流量".equals(type)) { xinyiIndustrySimple.setCsSlqc(value); } else if ("信义污水厂升级出水COD".equals(type)) { xinyiIndustrySimple.setCsCod(value); } else if ("信义污水厂升级出水PH".equals(type)) { xinyiIndustrySimple.setCsPh(value); } else if ("信义污水厂升级出水SS".equals(type)) { xinyiIndustrySimple.setCsSs(value); } else if ("信义污水厂升级出水TN".equals(type)) { xinyiIndustrySimple.setCsTn(value); } else if ("信义污水厂升级出水TP".equals(type)) { xinyiIndustrySimple.setCsTp(value); } else if ("信义污水厂升级出水氨氮".equals(type)) { xinyiIndustrySimple.setCsNh3(value); } else if ("信义污水厂FT101_Value".equals(type)) { xinyiIndustrySimple.setJsSlq(value); } //只有最后一次才执行数据库添加 if(finalJ == list.size()-1){ //赋值完毕返回数据 result.set(xinyiIndustrySimple); } }); } XinyiIndustrySimple xinyiIndustrySimple = result.get(); return Objects.isNull(xinyiIndustrySimple) ? new XinyiIndustrySimple() : xinyiIndustrySimple;*/ //2024年6月11日16:16:17 逻辑调整,获取最新的那条工业库的数据 TXinyiIndustry tXinyiIndustry = this.xinyiIndustryMapper.selectTXinyiIndustryNewest(); XinyiIndustrySimple xinyiIndustrySimple = new XinyiIndustrySimple(); if(!Objects.isNull(tXinyiIndustry)) BeanUtils.copyProperties(tXinyiIndustry, xinyiIndustrySimple); //获取化验室的最新的一条数据 TXinyiRobot tXinyiRobot = this.xinyiRobotMapper.selectNewest(); if(!Objects.isNull(tXinyiRobot)) BeanUtils.copyProperties(tXinyiRobot, xinyiIndustrySimple); return xinyiIndustrySimple; } public static void main(String[] args) { String s = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH, DateUtils.getNowDate()); s = s + ":00:00"; System.out.println("s = " + s); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime endTime = LocalDateTime.now(); LocalDateTime begin = endTime.plusMinutes(-1); System.out.println(formatter.format(endTime)); System.out.println(formatter.format(begin)); LocalDate parse = LocalDate.parse("2024-02-26"); System.out.println("parse = " + parse); System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern(DateUtils.YYYYMMDD_TS))); String req = "{\"data\": [\n" + " {\n" + " \"test_hour\": \"2025/04/22 10\",\n" + " \"no3Hlj1Jqr\": \"2\",\n" + " \"no3Qyc1Jqr\": \"3\",\n" + " \"nh31Jqr\": \"4\"\n" + " },\n" + " {\n" + " \"test_hour\": \"2025/04/23 11\",\n" + " \"no3Hlj1Jqr\": \"5\",\n" + " \"no3Qyc1Jqr\": \"6\",\n" + " \"nh31Jqr\": \"7\"\n" + " },\n" + " {\n" + " \"test_hour\": \"2025/04/22 12\",\n" + " \"no3Hlj1Jqr\": \"2\",\n" + " \"no3Qyc1Jqr\": \"3\",\n" + " \"nh31Jqr\": \"4\"\n" + " },\n" + " {\n" + " \"test_hour\": \"2025/04/23 13\",\n" + " \"no3Hlj1Jqr\": \"5\",\n" + " \"no3Qyc1Jqr\": \"6\",\n" + " \"nh31Jqr\": \"7\"\n" + " },\n" + " {\n" + " \"test_hour\": \"2025/04/22 14\",\n" + " \"no3Hlj1Jqr\": \"2\",\n" + " \"no3Qyc1Jqr\": \"3\",\n" + " \"nh31Jqr\": \"4\"\n" + " },\n" + " {\n" + " \"test_hour\": \"2025/04/23 16\",\n" + " \"no3Hlj1Jqr\": \"5\",\n" + " \"no3Qyc1Jqr\": \"6\",\n" + " \"nh31Jqr\": \"7\"\n" + " }\n" + " ]}"; String post = HttpUtil.post("http://192.168.40.21:30076/setfeedback", req); System.out.println(post); } }