haungxing
5 months ago
93 changed files with 3960 additions and 170 deletions
@ -0,0 +1,14 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/24 15:55 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class AttrSelectionVO extends SelectionVO implements Serializable { |
||||||
|
private DataItemVO item; |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/22 10:20 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class DataItemVO implements Serializable { |
||||||
|
|
||||||
|
private String name; |
||||||
|
|
||||||
|
@JSONField(name = "id") |
||||||
|
private String attrId; |
||||||
|
|
||||||
|
@JSONField(name = "record_name") |
||||||
|
private String attrName; |
||||||
|
|
||||||
|
@JSONField(name = "device_name") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@JSONField(name = "device_id") |
||||||
|
private String deviceId; |
||||||
|
|
||||||
|
@JSONField(name = "station_id") |
||||||
|
private String projectId; |
||||||
|
|
||||||
|
@JSONField(name = "station_name") |
||||||
|
private String projectName; |
||||||
|
|
||||||
|
@JSONField(name = "record_id") |
||||||
|
private String signage; |
||||||
|
|
||||||
|
private String units; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/22 10:28 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class DataVO implements Serializable { |
||||||
|
|
||||||
|
/**数据查询类型:实时、历史**/ |
||||||
|
private String type; |
||||||
|
|
||||||
|
@JSONField(name = "time_begin") |
||||||
|
private String startTime; |
||||||
|
|
||||||
|
@JSONField(name = "time_end") |
||||||
|
private String endTime; |
||||||
|
|
||||||
|
/**实时数据结果集**/ |
||||||
|
private RealDataVO real; |
||||||
|
|
||||||
|
private DataItemVO item; |
||||||
|
|
||||||
|
/**包括:"其它"、"最大值"、"最小值"、"总和值"、"平均值"**/ |
||||||
|
private String method; |
||||||
|
|
||||||
|
@JSONField(name = "data_type") |
||||||
|
private String dataType; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/16 15:10 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@EqualsAndHashCode |
||||||
|
public class FaultSelectionVO extends SelectionVO implements Serializable { |
||||||
|
|
||||||
|
private Object item; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||||
|
import lombok.Data; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/24 10:26 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class RealDataVO implements Serializable { |
||||||
|
|
||||||
|
private String time; |
||||||
|
|
||||||
|
private String value; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/31 09:15 |
||||||
|
*/ |
||||||
|
public class RemoteSelectionVO extends SelectionVO implements Serializable { |
||||||
|
|
||||||
|
private Object item; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/11 16:21 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@EqualsAndHashCode |
||||||
|
public class ScadaSelectionVO extends SelectionVO implements Serializable { |
||||||
|
|
||||||
|
private Object item; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/09 16:30 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class SelectionVO implements Serializable { |
||||||
|
|
||||||
|
/**选项ID**/ |
||||||
|
private String id; |
||||||
|
|
||||||
|
/**选项名称**/ |
||||||
|
private String name; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.SelectionVO; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/09 16:32 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class StationSelectionVO extends SelectionVO implements Serializable { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/11 16:20 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@EqualsAndHashCode |
||||||
|
public class VideoSelectionVO extends SelectionVO implements Serializable { |
||||||
|
|
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.hnac.hzims.operational.fill.feign; |
||||||
|
|
||||||
|
import com.hnac.hzims.operational.OperationalConstants; |
||||||
|
import org.springframework.cloud.openfeign.FeignClient; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@FeignClient( |
||||||
|
value = OperationalConstants.APP_NAME, |
||||||
|
fallback = IGenerateClientFallback.class |
||||||
|
) |
||||||
|
public interface IGenerateClient { |
||||||
|
|
||||||
|
String API_PREFIX = "/feign/generate/"; |
||||||
|
|
||||||
|
String STATION_GENERATE_BY_TIME = API_PREFIX + "/stationGenerateByTime"; |
||||||
|
|
||||||
|
|
||||||
|
@GetMapping(STATION_GENERATE_BY_TIME) |
||||||
|
Double stationGenerateByTime(@RequestParam("stationId") String stationId, |
||||||
|
@RequestParam("startTime") String startTime, |
||||||
|
@RequestParam("endTime") String endTime); |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package com.hnac.hzims.operational.fill.feign; |
||||||
|
|
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author hx |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
public class IGenerateClientFallback implements IGenerateClient { |
||||||
|
|
||||||
|
@Override |
||||||
|
public Double stationGenerateByTime(String stationId, String startTime, String endTime) { |
||||||
|
return 0.0; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.data.controller; |
||||||
|
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; |
||||||
|
import com.hnac.hzims.bigmodel.BigModelConstants; |
||||||
|
import com.hnac.hzims.bigmodel.data.service.RemoteService; |
||||||
|
import com.hnac.hzinfo.log.annotation.Business; |
||||||
|
import io.swagger.annotations.Api; |
||||||
|
import io.swagger.annotations.ApiOperation; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.system.dto.ControlDTO; |
||||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/24 14:42 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
@RequestMapping("/remote") |
||||||
|
@RestController |
||||||
|
@Api(value = "数据平台遥控指令管理",tags = "数据平台遥控指令管理") |
||||||
|
@Business(module = BigModelConstants.APP_NAME,value = "数据平台遥控指令管理") |
||||||
|
public class RemoteController { |
||||||
|
|
||||||
|
private final RemoteService remoteService; |
||||||
|
|
||||||
|
@ApiOperation("下发遥控指令") |
||||||
|
@ApiOperationSupport(order = 1) |
||||||
|
@PostMapping("/sendRemoteControl") |
||||||
|
public R<Object> sendRemoteControl(ControlDTO controlDTO) { |
||||||
|
return remoteService.sendRemoteControl(controlDTO); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.data.service; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.google.common.collect.Lists; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.DataMethodEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.DateEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.HistoryDataSearchVO; |
||||||
|
import com.hnac.hzinfo.sdk.core.response.Result; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.DeviceDataClient; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.dto.ReductionAttrDataDTO; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.dto.ReductionDataDTO; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.vo.ReductionDataVO; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import java.time.Duration; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.time.temporal.ChronoUnit; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/24 14:57 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
public class HistoryDataService { |
||||||
|
|
||||||
|
private final DeviceDataClient deviceDataClient; |
||||||
|
private final BladeLogger logger; |
||||||
|
public static final int DATA_COUNT_MAX = 1000; |
||||||
|
|
||||||
|
public Result<ReductionDataVO> getPolymerizationData(HistoryDataSearchVO searchVO) { |
||||||
|
DataMethodEnum enumByMethod = DataMethodEnum.getEnumByMethod(searchVO.getMethod()); |
||||||
|
Assert.isTrue(Func.isNotEmpty(enumByMethod),() -> { |
||||||
|
throw new ServiceException("数据查询聚合方式传参有误,查询失败!"); |
||||||
|
}); |
||||||
|
// 聚合数据方式处理
|
||||||
|
DateEnum dateEnum = DateEnum.getDateEnumByType(searchVO.getDataType()); |
||||||
|
ReductionDataDTO dataDTO = new ReductionDataDTO(); |
||||||
|
ReductionAttrDataDTO reductionAttrData = new ReductionAttrDataDTO(); |
||||||
|
reductionAttrData.setSignage(searchVO.getSignage()); |
||||||
|
reductionAttrData.setAccessRules(enumByMethod.getAccessRule()); |
||||||
|
reductionAttrData.setKeepFigures(2); |
||||||
|
dataDTO.setBeginTime(LocalDateTime.parse(searchVO.getStartTime(), DateUtil.DATETIME_FORMATTER)); |
||||||
|
dataDTO.setEndTime(LocalDateTime.parse(searchVO.getEndTime(),DateUtil.DATETIME_FORMATTER)); |
||||||
|
dataDTO.setDeviceCode(searchVO.getDeviceCode()); |
||||||
|
dataDTO.setNeedPage(false); |
||||||
|
dataDTO.setSaveTimeType(dateEnum.getSaveTimeType()); |
||||||
|
dataDTO.setTimeInterval(1); |
||||||
|
dataDTO.setDtos(Lists.newArrayList(reductionAttrData)); |
||||||
|
logger.info("interactive:getPolymerizationData","config传参为:" + JSON.toJSONString(dataDTO)); |
||||||
|
return deviceDataClient.pageDeviceCodeAndSignages(dataDTO); |
||||||
|
} |
||||||
|
|
||||||
|
public DateEnum getDateEnumByDuration(String startTime,String endTime,DateEnum dateEnum) { |
||||||
|
LocalDateTime start = LocalDateTime.parse(startTime, DateUtil.DATETIME_FORMATTER); |
||||||
|
LocalDateTime end = LocalDateTime.parse(endTime, DateUtil.DATETIME_FORMATTER); |
||||||
|
Duration duration = Duration.between(start, end); |
||||||
|
int count; |
||||||
|
switch(dateEnum) { |
||||||
|
case YEAR: |
||||||
|
count = Long.valueOf(ChronoUnit.YEARS.between(start.toLocalDate(), end.toLocalDate())).intValue(); |
||||||
|
break; |
||||||
|
case MONTH: |
||||||
|
count = Long.valueOf(ChronoUnit.MONTHS.between(start.toLocalDate(), end.toLocalDate())).intValue(); |
||||||
|
break; |
||||||
|
case DAY: |
||||||
|
count = Long.valueOf(ChronoUnit.DAYS.between(start.toLocalDate(), end.toLocalDate())).intValue(); |
||||||
|
break; |
||||||
|
case HOUR: |
||||||
|
count = Long.valueOf(duration.toHours()).intValue(); |
||||||
|
break; |
||||||
|
case MINUTE: |
||||||
|
count = Long.valueOf(duration.toMinutes()).intValue(); |
||||||
|
break; |
||||||
|
case SECOND: |
||||||
|
count = Long.valueOf(duration.getSeconds()).intValue(); |
||||||
|
break; |
||||||
|
default: |
||||||
|
throw new ServiceException("未找到相关时间类型,查询失败!"); |
||||||
|
} |
||||||
|
if(count <= DATA_COUNT_MAX) { |
||||||
|
return dateEnum; |
||||||
|
} |
||||||
|
else { |
||||||
|
return getDateEnumByDuration(startTime, endTime, DateEnum.getDateEnumByOrder(dateEnum.getOrder() + 1)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.data.service; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.system.dto.ControlDTO; |
||||||
|
import org.springblade.system.feign.IRemoteClient; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/24 14:36 |
||||||
|
* @Descirbe: 数据平台 - 遥控服务类 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
public class RemoteService { |
||||||
|
|
||||||
|
private final IRemoteClient remoteClient; |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送遥控指令 |
||||||
|
* @param controlDTO 遥控指令 |
||||||
|
* @return 结果 |
||||||
|
*/ |
||||||
|
public R<Object> sendRemoteControl(ControlDTO controlDTO) { |
||||||
|
return remoteClient.sendCtrl(controlDTO); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.datasource.controller; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.datasource.service.DataSourceService; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/28 14:07 |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@RequestMapping("/dataSource/execute") |
||||||
|
@AllArgsConstructor |
||||||
|
public class DataSourceExecuteController { |
||||||
|
|
||||||
|
private final DataSourceService dataSourceService; |
||||||
|
|
||||||
|
@GetMapping("/executeQuery") |
||||||
|
public R executeQuery(String sql,String dataSourceName) { |
||||||
|
return R.data(dataSourceService.queryListOnSpecificDataSource(sql,dataSourceName)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.datasource.service; |
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.jdbc.core.JdbcTemplate; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/28 15:24 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@AllArgsConstructor |
||||||
|
@Slf4j |
||||||
|
public class DataSourceService { |
||||||
|
|
||||||
|
private final JdbcTemplate jdbcTemplate; |
||||||
|
|
||||||
|
private static final Pattern UPDATE_PATTERN = Pattern.compile("^UPDATE\\s", Pattern.CASE_INSENSITIVE); |
||||||
|
private static final Pattern DELETE_PATTERN = Pattern.compile("^DELETE\\s", Pattern.CASE_INSENSITIVE); |
||||||
|
|
||||||
|
/** |
||||||
|
* 指定 |
||||||
|
* @param sql |
||||||
|
* @param dataSourceName |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public List<Map<String, Object>> queryListOnSpecificDataSource(String sql,String dataSourceName) { |
||||||
|
// 切换到指定的数据源
|
||||||
|
DynamicDataSourceContextHolder.push(dataSourceName); |
||||||
|
try { |
||||||
|
return jdbcTemplate.queryForList(sql); |
||||||
|
} finally { |
||||||
|
// 清除,恢复默认数据源
|
||||||
|
DynamicDataSourceContextHolder.clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public Integer updateOnSpecificDataSource(String sql,String dataSourceName) { |
||||||
|
// 切换到指定的数据源
|
||||||
|
DynamicDataSourceContextHolder.push(dataSourceName); |
||||||
|
try { |
||||||
|
return jdbcTemplate.update(sql); |
||||||
|
} finally { |
||||||
|
// 清除,恢复默认数据源
|
||||||
|
DynamicDataSourceContextHolder.clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isUpdateOrDelete(String sql) { |
||||||
|
if (sql == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return UPDATE_PATTERN.matcher(sql).find() || DELETE_PATTERN.matcher(sql).find(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.datasource.service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/28 14:22 |
||||||
|
*/ |
||||||
|
public interface IDataSourceService { |
||||||
|
|
||||||
|
List<Map<String,Object>> queryList(String sql); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Optional; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 10:49 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
@Getter |
||||||
|
public enum DataAuthTypeEnum { |
||||||
|
/**站点鉴权**/ |
||||||
|
STATION("station"), |
||||||
|
DEPT("dept"), |
||||||
|
; |
||||||
|
private final String type; |
||||||
|
|
||||||
|
public static DataAuthTypeEnum getEnumByType(String type) { |
||||||
|
Optional<DataAuthTypeEnum> typeEnumOptional = Arrays.stream(DataAuthTypeEnum.class.getEnumConstants()).filter(e -> e.getType().equals(type)).findFirst(); |
||||||
|
return typeEnumOptional.orElse(null); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/29 08:31 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
public enum DataMethodEnum { |
||||||
|
USUAL("详情",6,"详情"), |
||||||
|
EARLIEST("最早值",0,"最早值"), |
||||||
|
MAX("最大值",1,"最大值"), |
||||||
|
MIN("最小值",2,"最小值"), |
||||||
|
AVERAGE("平均值",3,"平均值"), |
||||||
|
SUM("累计值/和值",4,"总和值"), |
||||||
|
DIFFERENCE("变化值/差值",5,"变化值"), |
||||||
|
LATEST("最新值",6,"最新值"), |
||||||
|
; |
||||||
|
@Getter |
||||||
|
private String name; |
||||||
|
@Getter |
||||||
|
private Integer accessRule; |
||||||
|
@Getter |
||||||
|
private String method; |
||||||
|
|
||||||
|
public static DataMethodEnum getEnumByMethod(String method) { |
||||||
|
return Arrays.stream(DataMethodEnum.class.getEnumConstants()) |
||||||
|
.filter(e -> e.getMethod().equals(method)) |
||||||
|
.findFirst().orElse(null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/28 11:37 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
public enum DateEnum { |
||||||
|
YEAR("year","每年","按年",5,6), |
||||||
|
MONTH("month","每月","按月",4,5), |
||||||
|
DAY("day","每天","按天",3,3), |
||||||
|
HOUR("hour","每小时","按小时",2,2), |
||||||
|
MINUTE("minute","每分钟","按分钟",1,1), |
||||||
|
SECOND("second","每秒","按秒",0,0), |
||||||
|
USUAL("usual","详情","按秒",0,0) |
||||||
|
; |
||||||
|
@Getter |
||||||
|
private String code; |
||||||
|
@Getter |
||||||
|
private String name; |
||||||
|
@Getter |
||||||
|
private String dateType; |
||||||
|
@Getter |
||||||
|
private int order; |
||||||
|
@Getter |
||||||
|
private Integer saveTimeType; |
||||||
|
|
||||||
|
public static DateEnum getDateEnumByType(String dateType) { |
||||||
|
return Arrays.stream(DateEnum.class.getEnumConstants()).filter(d -> d.getDateType().equals(dateType)).findFirst().orElse(null); |
||||||
|
} |
||||||
|
|
||||||
|
public static DateEnum getDateEnumByOrder(int order) { |
||||||
|
return Arrays.stream(DateEnum.class.getEnumConstants()).filter(d -> d.getOrder() == order).findFirst().orElse(null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 16:35 |
||||||
|
*/ |
||||||
|
public interface InfoMessageConstant { |
||||||
|
|
||||||
|
String ERROR_MESSAGE = "非常抱歉,系统在处理您的请求时遇到了问题。请稍后再试或联系我们的客服团队。"; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/07/01 14:26 |
||||||
|
* @Describe: 参数key管理 |
||||||
|
*/ |
||||||
|
public interface ParamKeyConstants { |
||||||
|
|
||||||
|
/**实时画面host**/ |
||||||
|
String CANVAS_HOST = "hzims:bigModel:canvas:host"; |
||||||
|
/**实时画面v3路径 {context}&stationNum={stationNum}&projectId={projectId}**/ |
||||||
|
String CANVAS_V3_PATH = "hzims:bigModel:canvas:v3:path"; |
||||||
|
/**实时画面v4路径 other/v4/canvas/index.html?hzinfowebkit=true&taskId={taskId}&stationNum={stationNum}&projectId={projectId}&source=app&picName={context}&name={name}**/ |
||||||
|
String CANVAS_V4_PATH = "hzims:bigModel:canvas:v4:path"; |
||||||
|
/**实时画面云组态路径 hzinfo-data-scada/view/{projectId}/{id}?source=app**/ |
||||||
|
String CANVAS_YZT_PATH = "hzims:bigModel:canvas:yzt:path"; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/21 16:34 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
public enum ProjectRemoteTypeEnum { |
||||||
|
/**不允许发送遥控**/ |
||||||
|
NOT_ALLOW(0), |
||||||
|
/**运行发送遥控并且需要校验权限**/ |
||||||
|
VALID(1), |
||||||
|
/**运行发送遥控并免校验权限**/ |
||||||
|
ALLOW(2), |
||||||
|
; |
||||||
|
@Getter |
||||||
|
private Integer ctrlType; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/24 17:14 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
public enum SearchStationTypeEnum { |
||||||
|
STATION_TOTAL("电站总数量",null,"智能运维平台接入电站总数为:%s"), |
||||||
|
SET_TOTAL("站点总数量",null,"智能运维平台接入站点总数为:%s"), |
||||||
|
HYDROPOWER_TOTAL("水电站总数量","0","智能运维平台接入水电站总数为:%s"), |
||||||
|
WIND_POWER_TOTAL("风电场总数量","1","智能运维平台接入风电场总数为:%s"), |
||||||
|
ENERGY_STORAGE_TOTAL("储能站总数量","3","智能运维平台接入储能站总数为:%s"), |
||||||
|
PHOTOVOLTAIC_TOTAL("光伏站总数量","5","智能运维平台接入光伏站总数为:%s"), |
||||||
|
CHARGE_TOTAL("充电站总数量","7","智能运维平台接入充电站总数为:%s"), |
||||||
|
STATION_NUM("电站接入量",null,"智能运维平台接入电站总数为:%s"), |
||||||
|
SET_NUM("站点接入量",null,"智能运维平台接入站点总数为:%s"), |
||||||
|
HYDROPOWER_NUM("水电站接入量","0","智能运维平台接入水电站接入量为:%s"), |
||||||
|
WIND_POWER_NUM("风电场接入量","1","智能运维平台接入风电场接入量为:%s"), |
||||||
|
ENERGY_STORAGE_NUM("储能站接入量","3","智能运维平台接入储能站接入量为:%s"), |
||||||
|
PHOTOVOLTAIC_NUM("光伏站接入量","5","智能运维平台接入光伏站接入量为:%s"), |
||||||
|
CHARGE_NUM("充电站接入量","7","智能运维平台接入充电站接入量为:%s"), |
||||||
|
; |
||||||
|
|
||||||
|
@Getter |
||||||
|
private String searchStationType; |
||||||
|
@Getter |
||||||
|
private String stationType; |
||||||
|
@Getter |
||||||
|
private String label; |
||||||
|
|
||||||
|
public static SearchStationTypeEnum getTypeEnum(String searchStationType) { |
||||||
|
return Arrays.stream(SearchStationTypeEnum.class.getEnumConstants()) |
||||||
|
.filter(e -> e.getSearchStationType().equals(searchStationType)) |
||||||
|
.findFirst() |
||||||
|
.orElse(null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.constants; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/24 17:13 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
public enum SearchTypeEnum { |
||||||
|
REAL("实时"), |
||||||
|
HISTORY("历史") |
||||||
|
; |
||||||
|
@Getter |
||||||
|
private String searchType; |
||||||
|
|
||||||
|
public static SearchTypeEnum getSearchType(String searchType) { |
||||||
|
return Arrays.stream(SearchTypeEnum.class.getEnumConstants()) |
||||||
|
.filter(e -> e.getSearchType().equals(searchType)) |
||||||
|
.findFirst() |
||||||
|
.orElse(null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.controller; |
||||||
|
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnalyseDataService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.HistoryDataSearchVO; |
||||||
|
import io.swagger.annotations.Api; |
||||||
|
import io.swagger.annotations.ApiOperation; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springframework.validation.annotation.Validated; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/29 09:22 |
||||||
|
*/ |
||||||
|
@RequestMapping("/analyse/data") |
||||||
|
@AllArgsConstructor |
||||||
|
@Api(value = "数据查询管理",tags = "数据查询管理") |
||||||
|
@RestController |
||||||
|
@Deprecated |
||||||
|
public class AnalyseDataController { |
||||||
|
|
||||||
|
private final IAnalyseDataService analyseDataService; |
||||||
|
|
||||||
|
@GetMapping("/getHistoryData") |
||||||
|
@ApiOperation("获取历史数据") |
||||||
|
@ApiOperationSupport(order = 1) |
||||||
|
public R getHistoryData(@Validated HistoryDataSearchVO searchVO) { |
||||||
|
return R.data(analyseDataService.getHistoryData(searchVO)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.controller; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker; |
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; |
||||||
|
import com.google.common.collect.Lists; |
||||||
|
import com.hnac.hzims.bigmodel.BigModelConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IHznlmInvokeService; |
||||||
|
import com.hnac.hzinfo.log.annotation.Business; |
||||||
|
import io.swagger.annotations.Api; |
||||||
|
import io.swagger.annotations.ApiOperation; |
||||||
|
import io.swagger.annotations.ApiParam; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/24 14:19 |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@RequestMapping("/fontEnd/interactive") |
||||||
|
@Api(value = "前端交互控制层",tags = "前端交互控制层") |
||||||
|
@AllArgsConstructor |
||||||
|
@Business(module = BigModelConstants.APP_NAME,value = "前端交互层管理",ignore = false) |
||||||
|
public class FontEndInteractiveController { |
||||||
|
|
||||||
|
private final IHznlmInvokeService hznlmInvokeService; |
||||||
|
|
||||||
|
@ApiOperation("提问") |
||||||
|
@ApiOperationSupport(order = 1) |
||||||
|
@GetMapping("/ask") |
||||||
|
public R ask(@RequestParam @ApiParam("用户提出问题") String question, @RequestParam @ApiParam("问答sessionId") String sessionId, @RequestParam @ApiParam("用户Id") String userId) { |
||||||
|
hznlmInvokeService.ask(question, sessionId, userId); |
||||||
|
return R.success("操作成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation("删除对话sessionId") |
||||||
|
@ApiOperationSupport(order = 2) |
||||||
|
@GetMapping("/removeSessionId") |
||||||
|
public R<Boolean> removeSessionId(@RequestParam(value = "id") String sessionId) { |
||||||
|
hznlmInvokeService.removeSessionId(sessionId); |
||||||
|
return R.success("操作成功!"); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation("获取热点问题") |
||||||
|
@ApiOperationSupport(order = 3) |
||||||
|
@GetMapping("/hotQuestions") |
||||||
|
public R<List<String>> hotQuestions() { |
||||||
|
return R.data(hznlmInvokeService.hotQuestions()); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation("获取问答sessionId") |
||||||
|
@ApiOperationSupport(order = 4) |
||||||
|
@GetMapping("/getSessionId") |
||||||
|
public R<String> getSessionId() { |
||||||
|
return R.data(IdWorker.get32UUID()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.controller; |
||||||
|
|
||||||
|
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; |
||||||
|
import com.hnac.hzims.bigmodel.BigModelConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.dto.AuthDataDTO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IHznlmInteractiveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AuthDataVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ResolveResultVO; |
||||||
|
import com.hnac.hzinfo.log.annotation.Business; |
||||||
|
import io.swagger.annotations.Api; |
||||||
|
import io.swagger.annotations.ApiOperation; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springframework.web.bind.annotation.*; |
||||||
|
|
||||||
|
import javax.validation.Valid; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 10:21 |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@AllArgsConstructor |
||||||
|
@Api(value = "HZLLM大模型交互层",tags = "HZLLM大模型交互层") |
||||||
|
@RequestMapping("/hzn_lm/interactive") |
||||||
|
@Business(module = BigModelConstants.MODULE_NAME,value = "HZLLM大模型交互层") |
||||||
|
public class HznlmInteractiveController { |
||||||
|
|
||||||
|
private final IHznlmInteractiveService interactiveService; |
||||||
|
|
||||||
|
@RequestMapping(value = "/get_auth_data",method = {RequestMethod.GET,RequestMethod.POST}) |
||||||
|
@ApiOperation("获取鉴权数据") |
||||||
|
@ApiOperationSupport(order = 1) |
||||||
|
public R<List<AuthDataVO>> getAuthData(@RequestBody @Valid AuthDataDTO req) { |
||||||
|
return R.data(interactiveService.getAuthData(req)); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation("解析大模型函数") |
||||||
|
@ApiOperationSupport(order = 2) |
||||||
|
@PostMapping("/resolve") |
||||||
|
public R<ExtraVO> resolve(@RequestBody @Valid ModelFunctionReq req) { |
||||||
|
return R.data(interactiveService.resolve(req)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.dto; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank; |
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 10:39 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@ApiModel(value = "获取权限接口传参格式",description = "获取权限接口传参格式") |
||||||
|
@EqualsAndHashCode |
||||||
|
public class AuthDataDTO implements Serializable { |
||||||
|
|
||||||
|
@JsonProperty("chat_id") |
||||||
|
@ApiModelProperty("问答ID,用于获取前端发起问答传入缓存中数据") |
||||||
|
@NotBlank |
||||||
|
private String sessionId; |
||||||
|
|
||||||
|
@JsonProperty("user_id") |
||||||
|
@ApiModelProperty("提问用户ID") |
||||||
|
@NotBlank |
||||||
|
private String userId; |
||||||
|
|
||||||
|
@ApiModelProperty("鉴权类型") |
||||||
|
@NotBlank |
||||||
|
private String type; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.factory; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnswerResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.SpringUtil; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 18:44 |
||||||
|
*/ |
||||||
|
public class AnswerResolveFactory { |
||||||
|
|
||||||
|
public static final String DIAGNOSE_ANSWER_SERVICE = "diagnoseAnswerResolveService"; |
||||||
|
public static final String CHOICE_ANSWER_SERVICE = "choiceAnswerResolveService"; |
||||||
|
public static final String REMOTE_ANSWER_SERVICE = "remoteAnswerResolveService"; |
||||||
|
public static final String PARAM_ANSWER_SERVICE = "paramAnswerResolveService"; |
||||||
|
public static final String PRE_ANSWER_SERVICE = "preAnswerResolveService"; |
||||||
|
|
||||||
|
public static IAnswerResolveService getResolveService(Object extra) { |
||||||
|
String funcCode = JSONObject.parseObject(JSON.toJSONString(extra)).getString("func"); |
||||||
|
return AnswerResolveFactory.getResolveService(funcCode); |
||||||
|
} |
||||||
|
|
||||||
|
public static IAnswerResolveService getResolveService(String funcCode) { |
||||||
|
FuncRouteEnum funcRouteEnum = FuncRouteEnum.getEnumByFuncCode(funcCode); |
||||||
|
if(Func.isNotEmpty(funcRouteEnum)) { |
||||||
|
switch (funcRouteEnum) { |
||||||
|
case DIAGNOSE: |
||||||
|
return SpringUtil.getBean(DIAGNOSE_ANSWER_SERVICE); |
||||||
|
case CHOOSE_VIDEO: |
||||||
|
case CHOOSE_CANVAS: |
||||||
|
case CHOOSE_STATION: |
||||||
|
case CHOOSE_FAULT: |
||||||
|
case CHOOSE_YC: |
||||||
|
case CHOOSE_YK: |
||||||
|
return SpringUtil.getBean(CHOICE_ANSWER_SERVICE); |
||||||
|
case CONFIRM_YK: |
||||||
|
return SpringUtil.getBean(REMOTE_ANSWER_SERVICE); |
||||||
|
case SHOW_PARAM: |
||||||
|
return SpringUtil.getBean(PARAM_ANSWER_SERVICE); |
||||||
|
default: |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
throw new ServiceException("service解析失败!"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.factory; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.entity.FunctionEntity; |
||||||
|
import com.hnac.hzims.bigmodel.function.service.IFunctionService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IResolveService; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.SpringUtil; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 15:53 |
||||||
|
*/ |
||||||
|
public class ResolveFactory { |
||||||
|
|
||||||
|
public static final String CANVAS_RESOLVE_SERVICE = "canvasResolveService"; |
||||||
|
public static final String VIDEO_RESOLVE_SERVICE = "videoResolveService"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取解析函数需要的service |
||||||
|
* @param funcCode 函数编号 |
||||||
|
* @return 解析函数所需service |
||||||
|
*/ |
||||||
|
public static IResolveService getResolveService(String funcCode) { |
||||||
|
BladeLogger logger = SpringUtil.getBean(BladeLogger.class); |
||||||
|
FuncRouteEnum funcRouteEnum = FuncRouteEnum.getEnumByFuncCode(funcCode); |
||||||
|
if(Func.isNotEmpty(funcRouteEnum)) { |
||||||
|
switch(funcRouteEnum) { |
||||||
|
case OPEN_CANVAS: |
||||||
|
return SpringUtil.getBean("canvasResolveService"); |
||||||
|
case OPEN_VIDEO: |
||||||
|
return SpringUtil.getBean("videoResolveService"); |
||||||
|
default: |
||||||
|
logger.error("hzims:bigModel:getResolveService","函数解析失败,函数编号为:" + funcCode); |
||||||
|
throw new ServiceException("service解析失败"); |
||||||
|
} |
||||||
|
} |
||||||
|
throw new ServiceException("service解析失败"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.HistoryDataSearchVO; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/28 11:29 |
||||||
|
*/ |
||||||
|
public interface IAnalyseDataService { |
||||||
|
|
||||||
|
ExtraVO getHistoryData(HistoryDataSearchVO searchVO); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.stream.Stream; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 18:39 |
||||||
|
*/ |
||||||
|
public interface IAnswerResolveService { |
||||||
|
|
||||||
|
AnswerVO resolve(AnswerVO answer); |
||||||
|
|
||||||
|
/** |
||||||
|
* 解析 extra |
||||||
|
* @param originExtra 大模型传入 extra |
||||||
|
* @return 解析后的 extra |
||||||
|
*/ |
||||||
|
ExtraVO getExtra(JSONObject originExtra); |
||||||
|
|
||||||
|
/*** |
||||||
|
* |
||||||
|
* @param answer |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
default Stream<JSONObject> extraStream(AnswerVO answer) { |
||||||
|
return Arrays.stream(answer.getExtras()).map(JSON::toJSONString).map(JSONObject::parseObject); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.interactive.dto.AuthDataDTO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AuthDataVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ResolveResultVO; |
||||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||||
|
|
||||||
|
import javax.validation.Valid; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 10:23 |
||||||
|
*/ |
||||||
|
public interface IHznlmInteractiveService { |
||||||
|
|
||||||
|
List<AuthDataVO> getAuthData(@RequestBody @Valid AuthDataDTO req); |
||||||
|
|
||||||
|
ExtraVO resolve(ModelFunctionReq req); |
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 17:20 |
||||||
|
*/ |
||||||
|
public interface IHznlmInvokeService { |
||||||
|
|
||||||
|
/** |
||||||
|
* 基础问题 |
||||||
|
* @param question 提问问题 |
||||||
|
* @param sessionId 会话ID |
||||||
|
* @param userId 提问人ID |
||||||
|
* @return 提问结果 |
||||||
|
*/ |
||||||
|
void ask(String question, String sessionId, String userId); |
||||||
|
|
||||||
|
/** |
||||||
|
* 特殊问题 |
||||||
|
* @param sessionId 会话ID |
||||||
|
* @param userId 提问人ID |
||||||
|
* @param extra 特殊问题内容 |
||||||
|
* @return 提问结果 |
||||||
|
*/ |
||||||
|
void specialAsk(String sessionId, String userId, Map<String,Object> extra); |
||||||
|
|
||||||
|
/** |
||||||
|
* 知识库问题 |
||||||
|
* @param question 问题名称 |
||||||
|
* @param sessionId 会话ID |
||||||
|
* @param userId 提问人ID |
||||||
|
* @param knowledge 知识库名称 |
||||||
|
*/ |
||||||
|
void knowledgeAsk(String question, String sessionId, String userId, String knowledge); |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除对话记录 |
||||||
|
* @param sessionId 会话ID |
||||||
|
*/ |
||||||
|
void removeSessionId(String sessionId); |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取热点问题 |
||||||
|
* @return 热点问题 |
||||||
|
*/ |
||||||
|
List hotQuestions(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询问答状态 |
||||||
|
* @param sessionIds 会话ID,按逗号分隔 |
||||||
|
* @return 答案列表 |
||||||
|
*/ |
||||||
|
List<AnswerVO> getAnswerBySessionIds(String sessionIds); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.entity.FunctionEntity; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/09 08:50 |
||||||
|
*/ |
||||||
|
@Deprecated |
||||||
|
public interface IParamsService { |
||||||
|
String dealJumpTypeFunction(FunctionEntity function, Map<String,String> args); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ResolveResultVO; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 15:39 |
||||||
|
*/ |
||||||
|
public interface IResolveService { |
||||||
|
|
||||||
|
ExtraVO resolve(String id); |
||||||
|
|
||||||
|
ExtraVO resolve(ModelFunctionReq req); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,100 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.google.common.collect.Lists; |
||||||
|
import com.hnac.hzims.bigmodel.data.service.HistoryDataService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.DataMethodEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.DateEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnalyseDataService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.HistoryDataSearchVO; |
||||||
|
import com.hnac.hzinfo.sdk.core.response.Result; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.DeviceDataClient; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.dto.ReductionAttrDataDTO; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.dto.ReductionDataDTO; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.vo.ReductionDataVO; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.utils.CollectionUtil; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import java.time.Duration; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.time.temporal.ChronoUnit; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/28 11:29 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@AllArgsConstructor |
||||||
|
public class AnalyseDataServiceImpl implements IAnalyseDataService { |
||||||
|
|
||||||
|
private final HistoryDataService historyDataService; |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO getHistoryData(HistoryDataSearchVO searchVO) { |
||||||
|
if(Func.isEmpty(searchVO.getDataType()) || StringUtil.isBlank(searchVO.getDataType()) |
||||||
|
|| DataMethodEnum.USUAL.getMethod().equals(searchVO.getMethod())) { |
||||||
|
searchVO.setDataType(DateEnum.SECOND.getDateType()); |
||||||
|
} |
||||||
|
// 聚合数据方式处理
|
||||||
|
DateEnum dateEnum = DateEnum.getDateEnumByType(searchVO.getDataType()); |
||||||
|
searchVO.setDataType(dateEnum.getDateType()); |
||||||
|
// 获取最适配时间段
|
||||||
|
DateEnum adapterDate = historyDataService.getDateEnumByDuration(searchVO.getStartTime(), searchVO.getEndTime(), dateEnum); |
||||||
|
String note = adapterDate.getDateType().equals(searchVO.getDataType()) ? "" : "(由于数据量过大,只能帮您" + adapterDate.getDateType() + "查询)"; |
||||||
|
searchVO.setDataType(adapterDate.getDateType()); |
||||||
|
ExtraVO extraVO = new ExtraVO(); |
||||||
|
extraVO.setType(FuncRouteEnum.HISTORY_DATA.getType().getType()); |
||||||
|
extraVO.setFunc(FuncRouteEnum.HISTORY_DATA.getFuncCode()); |
||||||
|
Map<String,Object> params = new HashMap<>(1); |
||||||
|
Result<ReductionDataVO> reductionDataVOR = historyDataService.getPolymerizationData(searchVO); |
||||||
|
String label; |
||||||
|
if(!reductionDataVOR.isSuccess()) { |
||||||
|
params.put("errorInfo",reductionDataVOR.getMsg()); |
||||||
|
label = "查询数据失败!"; |
||||||
|
} |
||||||
|
else { |
||||||
|
ReductionDataVO dataVO = reductionDataVOR.getData(); |
||||||
|
label = "暂未查到数据"; |
||||||
|
params.put("data",Lists.newArrayList()); |
||||||
|
if(Func.isNotEmpty(dataVO) && CollectionUtil.isNotEmpty(dataVO.getDataList())) { |
||||||
|
List<Map> datalist = dataVO.getDataList().stream().map(m -> { |
||||||
|
m.put("val", m.get(searchVO.getSignage())); |
||||||
|
m.remove(searchVO.getSignage()); |
||||||
|
return m; |
||||||
|
}).collect(Collectors.toList()); |
||||||
|
DataMethodEnum enumByMethod = DataMethodEnum.getEnumByMethod(searchVO.getMethod()); |
||||||
|
if(CollectionUtil.isNotEmpty(datalist)) { |
||||||
|
label = searchVO.getStationName() + "_" |
||||||
|
+ searchVO.getDeviceName() + "_" |
||||||
|
+ dataVO.getFieldMap().get(searchVO.getSignage()) + "_" |
||||||
|
+ (DataMethodEnum.USUAL.getMethod().equals(enumByMethod.getMethod()) ? "" : adapterDate.getName()) |
||||||
|
+ enumByMethod.getMethod() |
||||||
|
+ (DataMethodEnum.USUAL.getMethod().equals(enumByMethod.getMethod()) ? "" : note) |
||||||
|
+ ":"; |
||||||
|
} |
||||||
|
params.put("data",datalist); |
||||||
|
} |
||||||
|
} |
||||||
|
extraVO.setLabel(label); |
||||||
|
params.put("deviceName",searchVO.getDeviceName()); |
||||||
|
params.put("attrName",searchVO.getAttrName()); |
||||||
|
params.put("stationName",searchVO.getStationName()); |
||||||
|
params.put("beginTime",searchVO.getStartTime()); |
||||||
|
params.put("endTime",searchVO.getEndTime()); |
||||||
|
extraVO.setParams(params); |
||||||
|
return extraVO; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,128 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.google.common.collect.Lists; |
||||||
|
import com.hnac.hzims.bigmodel.entity.FunctionEntity; |
||||||
|
import com.hnac.hzims.bigmodel.function.service.IFunctionService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.ProjectRemoteTypeEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.SessionContentVO; |
||||||
|
import com.hnac.hzims.bigmodel.websocket.constants.RedisKeyConstants; |
||||||
|
import com.hnac.hzinfo.sdk.core.response.Result; |
||||||
|
import com.hnac.hzinfo.sdk.v5.project.ProjectClient; |
||||||
|
import com.hnac.hzinfo.sdk.v5.project.vo.ProjectVO; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.core.tool.utils.CollectionUtil; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springblade.system.dto.DeptStationDTO; |
||||||
|
import org.springblade.system.entity.CtrlAuth; |
||||||
|
import org.springblade.system.feign.IDeptClient; |
||||||
|
import org.springblade.system.feign.IRemoteClient; |
||||||
|
import org.springblade.system.user.feign.IUserClient; |
||||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Optional; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/21 16:10 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@AllArgsConstructor |
||||||
|
public class AuthenticationService { |
||||||
|
|
||||||
|
private final IDeptClient deptClient; |
||||||
|
private final IFunctionService functionService; |
||||||
|
private final IUserClient userClient; |
||||||
|
private final ProjectClient projectClient; |
||||||
|
private final IRemoteClient remoteClient; |
||||||
|
private final RedisTemplate redisTemplate; |
||||||
|
|
||||||
|
/** |
||||||
|
* 站点鉴权 |
||||||
|
* @param stationId 站点ID |
||||||
|
* @param userId 用户ID |
||||||
|
*/ |
||||||
|
public void stationAuthentication(String stationId, String userId) { |
||||||
|
List<String> stations = this.getStationPermissionsById(userId).stream().map(DeptStationDTO::getStationId) |
||||||
|
.filter(StringUtil::isNotBlank).filter(Func::isNotEmpty).collect(Collectors.toList()); |
||||||
|
Assert.isTrue(stations.contains(stationId),() -> { |
||||||
|
throw new ServiceException("人员站点鉴权失败!"); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 菜单鉴权 |
||||||
|
* @param userId 用户ID |
||||||
|
* @param func 函数编号 |
||||||
|
*/ |
||||||
|
public void menuAuthentication(String userId, String func) { |
||||||
|
FunctionEntity function = functionService.getFunctionByCode(func); |
||||||
|
if(Func.isNotEmpty(function) && Func.isNotEmpty(function.getRoute()) && StringUtil.isNotBlank(function.getRoute())) { |
||||||
|
R<Boolean> authenticationR = userClient.permissionMenuById(Long.valueOf(userId), function.getRoute()); |
||||||
|
Assert.isTrue(authenticationR.isSuccess() && authenticationR.getData(), () -> { |
||||||
|
throw new ServiceException("人员菜单鉴权失败!"); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 遥控鉴权 |
||||||
|
* @param stationId 站点ID |
||||||
|
* @param userId 用户ID |
||||||
|
*/ |
||||||
|
public void remoteAuthentication(String stationId, String userId,String sessionId) { |
||||||
|
// 查询数据平台站点是否可被遥控
|
||||||
|
Result<List<ProjectVO>> projectR = projectClient.getProjectIds(Lists.newArrayList(stationId)); |
||||||
|
Assert.isTrue(projectR.isSuccess() && CollectionUtil.isNotEmpty(projectR.getData()) && projectR.getData().size() == 1,() -> { |
||||||
|
throw new ServiceException("未查询到站点,鉴权失败!"); |
||||||
|
}); |
||||||
|
ProjectVO project = projectR.getData().get(0); |
||||||
|
if(ProjectRemoteTypeEnum.NOT_ALLOW.getCtrlType().equals(project.getCtrlType())) { |
||||||
|
// 不允许发送遥控
|
||||||
|
throw new ServiceException("该站点不允许发送遥控指令,校验失败!"); |
||||||
|
} |
||||||
|
else if(ProjectRemoteTypeEnum.VALID.getCtrlType().equals(project.getCtrlType())) { |
||||||
|
// 运行发送遥控并且需要校验权限
|
||||||
|
R<List<CtrlAuth>> ctrlAuthR = remoteClient.getCtrlAuth(Optional.ofNullable(userId).filter(StringUtil::isNotBlank).map(Long::parseLong).orElse(null)); |
||||||
|
Assert.isTrue(ctrlAuthR.isSuccess(),() -> { |
||||||
|
throw new ServiceException("该站点未设置鉴权用户,校验失败!"); |
||||||
|
}); |
||||||
|
List<CtrlAuth> ctrlAuthList = ctrlAuthR.getData(); |
||||||
|
Optional<CtrlAuth> authOptional = ctrlAuthList.stream().filter(c -> c.getProjectId().equals(stationId)).findFirst(); |
||||||
|
Assert.isTrue(authOptional.isPresent() && Func.isNotEmpty(authOptional.get().getIsLimitMachine()), () -> { |
||||||
|
throw new ServiceException("该用户不存在相应站点权限,校验不通过!"); |
||||||
|
}); |
||||||
|
CtrlAuth ctrlAuth = authOptional.get(); |
||||||
|
// 如限制机器发送遥控指令
|
||||||
|
if(ctrlAuth.getIsLimitMachine().intValue() == 1) { |
||||||
|
SessionContentVO sessionContent = (SessionContentVO) redisTemplate.opsForHash().get(RedisKeyConstants.SESSION_CONTENT_KEY, sessionId); |
||||||
|
Assert.isTrue(Func.isNotEmpty(sessionContent),() -> { |
||||||
|
throw new ServiceException("获取问题机器码失败,校验不通过!"); |
||||||
|
}); |
||||||
|
String machineCode = sessionContent.getMachineCode(); |
||||||
|
Assert.isTrue(StringUtil.isNotBlank(machineCode) && Func.isNotEmpty(machineCode) ,() -> { |
||||||
|
throw new ServiceException("获取问题机器码失败,校验不通过!"); |
||||||
|
}); |
||||||
|
Assert.isTrue(machineCode.equals(ctrlAuth.getMachineCode()),() -> { |
||||||
|
throw new ServiceException("站点校验码校验失败,校验不通过!"); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public List<DeptStationDTO> getStationPermissionsById(String userId) { |
||||||
|
R<List<DeptStationDTO>> deptSattionR = deptClient.getStationPermissionsById(Long.valueOf(userId)); |
||||||
|
Assert.isTrue(deptSattionR.isSuccess() && CollectionUtil.isNotEmpty(deptSattionR.getData()),() -> { |
||||||
|
throw new ServiceException("获取人员站点权限失败!"); |
||||||
|
}); |
||||||
|
return deptSattionR.getData(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,135 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.ParamKeyConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.ResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ResolveResultVO; |
||||||
|
import com.hnac.hzims.operational.station.entity.StationEntity; |
||||||
|
import com.hnac.hzims.operational.station.feign.IStationClient; |
||||||
|
import com.hnac.hzinfo.sdk.v5.scada.ScadaClient; |
||||||
|
import groovy.util.logging.Slf4j; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springblade.system.cache.ParamCache; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import java.util.*; |
||||||
|
import java.util.stream.IntStream; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 15:39 |
||||||
|
*/ |
||||||
|
@Service(ResolveFactory.CANVAS_RESOLVE_SERVICE) |
||||||
|
@AllArgsConstructor |
||||||
|
@Slf4j |
||||||
|
public class CanvasResolveServiceImpl implements IResolveService { |
||||||
|
|
||||||
|
private final IStationClient stationClient; |
||||||
|
private final BladeLogger logger; |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO resolve(ModelFunctionReq req) { |
||||||
|
Map<String, String> args = req.getFunctionArgs(); |
||||||
|
String id = args.get("id"); |
||||||
|
String name = args.get("name"); |
||||||
|
Assert.isTrue(StringUtil.isNotBlank(id) && StringUtil.isNotBlank(name),() -> { |
||||||
|
logger.error("hzims:video:resolve","解析传参错误,缺少必要参数video_id,传参内容为:" + JSON.toJSONString(req)); |
||||||
|
throw new ServiceException("解析传参错误,缺少必要参数video_id"); |
||||||
|
}); |
||||||
|
return this.resolve(id); |
||||||
|
// ExtraVO extra = this.resolve(id);
|
||||||
|
// String message = "已成功打开" + name + ";";
|
||||||
|
// return new ResolveResultVO(message,extra);
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO resolve(String id) { |
||||||
|
ExtraVO extraVO = new ExtraVO(); |
||||||
|
extraVO.setImmediatelyJump(true); |
||||||
|
extraVO.setFunc(FuncRouteEnum.OPEN_CANVAS.getFuncCode()); |
||||||
|
final String[] SCADA_PARAMS_SOLVE = new String[]{"picResource","context","stationNum","projectId","taskId","name","id"}; |
||||||
|
String canvasHost = ParamCache.getValue(ParamKeyConstants.CANVAS_HOST); |
||||||
|
// 将ID解析为
|
||||||
|
Map<String, String> resolveMap = this.resolve(id, SCADA_PARAMS_SOLVE); |
||||||
|
R<StationEntity> stationR = stationClient.getStationByCode(resolveMap.get("projectId")); |
||||||
|
extraVO.setLabel(Optional.ofNullable(stationR).filter(r -> r.isSuccess()).map(R::getData).map(StationEntity::getName).orElse("") + "_" + resolveMap.get("name")); |
||||||
|
Integer picResource = Integer.valueOf(resolveMap.get("picResource")); |
||||||
|
Map<String,Object> extraParams = new HashMap<>(1); |
||||||
|
extraParams.put("picResource",picResource); |
||||||
|
extraVO.setParams(extraParams); |
||||||
|
// 云组态
|
||||||
|
if(picResource == 0) { |
||||||
|
String path = this.replacePath(ParamCache.getValue(ParamKeyConstants.CANVAS_YZT_PATH), resolveMap); |
||||||
|
extraVO.setRoute(canvasHost + path); |
||||||
|
} |
||||||
|
// v3.0
|
||||||
|
else if(picResource == 1) { |
||||||
|
String path = this.replacePath(ParamCache.getValue(ParamKeyConstants.CANVAS_V3_PATH), resolveMap); |
||||||
|
extraVO.setRoute(canvasHost + path); |
||||||
|
} |
||||||
|
// v4.0
|
||||||
|
else if (picResource == 2) { |
||||||
|
// pic_name 去掉头部的/ 以及尾部的.js
|
||||||
|
String context = resolveMap.get("context"); |
||||||
|
context = this.removeHeadChars(context,"/"); |
||||||
|
context = this.removeTailChars(context,".js"); |
||||||
|
resolveMap.put("context",context); |
||||||
|
extraVO.setRoute(this.replacePath("other/v4/canvas/index.html?hzinfowebkit=true&taskId={taskId}&stationNum={stationNum}&projectId={projectId}&source=app&picName={context}&name={name}", resolveMap)); |
||||||
|
} |
||||||
|
else { |
||||||
|
throw new ServiceException("解析出来的画面类型在云组态、v3、v4类型之外,无法解析路由"); |
||||||
|
} |
||||||
|
return extraVO; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<String,String> resolve(String paramsStr, String... keys) { |
||||||
|
Map<String,String> result = new HashMap<>(); |
||||||
|
List<String> params = Func.toStrList("\\^", paramsStr); |
||||||
|
Assert.isTrue(params.size() == keys.length, () -> { |
||||||
|
throw new ServiceException("大模型传参params长度错误,传参为:" + paramsStr); |
||||||
|
}); |
||||||
|
IntStream.iterate(0, index -> index + 1).limit(params.size()).forEach(index -> result.put(keys[index],params.get(index))); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
private String replacePath(String path,Map<String,String> params) { |
||||||
|
Set<Map.Entry<String, String>> entries = params.entrySet(); |
||||||
|
// 替换path中变量
|
||||||
|
for (Map.Entry<String, String> entry : entries) { |
||||||
|
String replaceVariables = "{" + entry.getKey() + "}"; |
||||||
|
path = StringUtil.replace(path,replaceVariables,entry.getValue()); |
||||||
|
} |
||||||
|
return path; |
||||||
|
} |
||||||
|
|
||||||
|
public String removeHeadChars(String str, String charsToRemove) { |
||||||
|
if (str == null || charsToRemove == null || charsToRemove.isEmpty()) { |
||||||
|
return str; |
||||||
|
} |
||||||
|
while (str.startsWith(charsToRemove)) { |
||||||
|
str = str.substring(charsToRemove.length()); |
||||||
|
} |
||||||
|
return str; |
||||||
|
} |
||||||
|
|
||||||
|
public String removeTailChars(String str, String charsToRemove) { |
||||||
|
if (str == null || charsToRemove == null || charsToRemove.isEmpty()) { |
||||||
|
return str; |
||||||
|
} |
||||||
|
while (str.endsWith(charsToRemove)) { |
||||||
|
str = str.substring(0, str.length() - charsToRemove.length()); |
||||||
|
} |
||||||
|
return str; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONArray; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.AnswerResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnswerResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import groovy.util.logging.Slf4j; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.List; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 19:02 |
||||||
|
* @Describe 选项答案解析服务层 |
||||||
|
*/ |
||||||
|
@AllArgsConstructor |
||||||
|
@Service(AnswerResolveFactory.CHOICE_ANSWER_SERVICE) |
||||||
|
@Slf4j |
||||||
|
public class ChoiceAnswerResolveServiceImpl implements IAnswerResolveService { |
||||||
|
|
||||||
|
@Override |
||||||
|
public AnswerVO resolve(AnswerVO answer) { |
||||||
|
Object[] extraArray = this.extraStream(answer).map(this::getExtra).toArray(); |
||||||
|
answer.setExtras(extraArray); |
||||||
|
return answer; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO getExtra(JSONObject originExtra) { |
||||||
|
ExtraVO result = JSONObject.parseObject(JSON.toJSONString(originExtra),ExtraVO.class); |
||||||
|
result.setSpecial(true); |
||||||
|
String funcCode = originExtra.getString("func"); |
||||||
|
result.setFunc(funcCode); |
||||||
|
result.setType(FuncRouteEnum.getEnumByFuncCode(funcCode).getType().getType()); |
||||||
|
JSONArray selections = JSONArray.parseArray(JSON.toJSONString(originExtra.get("data"))); |
||||||
|
result.setSelection(selections); |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.AnswerResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnswerResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import groovy.util.logging.Slf4j; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 18:59 |
||||||
|
*/ |
||||||
|
@Service(AnswerResolveFactory.DIAGNOSE_ANSWER_SERVICE) |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
public class DiagnoseAnswerResolveServiceImpl implements IAnswerResolveService { |
||||||
|
|
||||||
|
@Override |
||||||
|
public AnswerVO resolve(AnswerVO answer) { |
||||||
|
Object[] extraArray = this.extraStream(answer).map(this::getExtra).toArray(); |
||||||
|
answer.setExtras(extraArray); |
||||||
|
return answer; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO getExtra(JSONObject originExtra) { |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
JSONObject data = JSONObject.parseObject(JSON.toJSONString(originExtra.get("data"))); |
||||||
|
Map<String,Object> params = new HashMap<>(5); |
||||||
|
params.put("faultId",data.getString("fault_id")); |
||||||
|
params.put("name",data.getString("fault_name")); |
||||||
|
params.put("station",data.getString("station_id")); |
||||||
|
params.put("fdpDeviceName",data.getString("device_name")); |
||||||
|
params.put("fdpOrd",data.getString("ord")); |
||||||
|
result.setParams(params); |
||||||
|
String funcCode = originExtra.getString("func"); |
||||||
|
result.setFunc(funcCode); |
||||||
|
result.setType(FuncRouteEnum.getEnumByFuncCode(funcCode).getType().getType()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,259 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONArray; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.SearchTypeEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnalyseDataService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.*; |
||||||
|
import com.hnac.hzims.operational.station.entity.StationVideoTypeEntity; |
||||||
|
import com.hnac.hzims.operational.station.feign.IStationClient; |
||||||
|
import com.hnac.hzims.operational.station.feign.IStationVideoTypeClient; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.client.DeviceClient; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.vo.DeviceInstanceFuncVO; |
||||||
|
import com.xxl.job.core.log.XxlJobLogger; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.core.tool.utils.*; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.time.format.DateTimeFormatter; |
||||||
|
import java.util.*; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/08 16:19 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@AllArgsConstructor |
||||||
|
@Deprecated |
||||||
|
public class ExtraResolveStrategyService { |
||||||
|
|
||||||
|
public static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss.SSS"; |
||||||
|
|
||||||
|
public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN_DATETIME); |
||||||
|
|
||||||
|
private final IStationClient stationClient; |
||||||
|
private final IStationVideoTypeClient videoTypeClient; |
||||||
|
private final JumpRouteJoinStrategy jumpRouteJoinStrategy; |
||||||
|
private final DeviceClient deviceClient; |
||||||
|
private final IAnalyseDataService analyseDataService; |
||||||
|
|
||||||
|
/** |
||||||
|
* 解析DFP返回extra |
||||||
|
* @param extraStr DFP返回extra |
||||||
|
* @return 与前端交互extra |
||||||
|
*/ |
||||||
|
public ExtraVO resolve(String extraStr) { |
||||||
|
JSONObject extra = JSONObject.parseObject(extraStr); |
||||||
|
String functionCode = Optional.ofNullable(extra.get("func")).map(String::valueOf).orElse(""); |
||||||
|
if(StringUtil.isNotBlank(functionCode)) { |
||||||
|
XxlJobLogger.log("函数编号为:" + functionCode); |
||||||
|
FuncRouteEnum funcRouteEnum = FuncRouteEnum.getEnumByFuncCode(functionCode); |
||||||
|
if(Func.isNotEmpty(funcRouteEnum)) { |
||||||
|
switch (funcRouteEnum) { |
||||||
|
case DIAGNOSE: |
||||||
|
return this.resolveDiagnose(extra); |
||||||
|
case CHOOSE_VIDEO: |
||||||
|
case CHOOSE_CANVAS: |
||||||
|
case CHOOSE_STATION: |
||||||
|
case CHOOSE_FAULT: |
||||||
|
case CHOOSE_YC: |
||||||
|
case CHOOSE_YK: |
||||||
|
return this.resolveChooseSelection(extra,funcRouteEnum); |
||||||
|
case CONFIRM_YK: |
||||||
|
return this.resolveConfirmRemote(extra); |
||||||
|
case SHOW_PARAM: |
||||||
|
return this.resolveShowParam(extra); |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
else if(extra.containsKey("extra")){ |
||||||
|
return extra.getObject("extra",ExtraVO.class); |
||||||
|
} |
||||||
|
return JSONObject.parseObject(JSON.toJSONString(extra),ExtraVO.class); |
||||||
|
} |
||||||
|
|
||||||
|
private ExtraVO resolveChooseSelection(JSONObject extra,FuncRouteEnum funcRouteEnum) { |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
JSONArray selections = JSONArray.parseArray(JSON.toJSONString(extra.get("data"))); |
||||||
|
result.setFunc(funcRouteEnum.getFuncCode()); |
||||||
|
result.setSpecial(true); |
||||||
|
result.setSelection(selections); |
||||||
|
result.setType(funcRouteEnum.getType().getType()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
// private ExtraVO resolveChooseYc(JSONObject extra) {
|
||||||
|
// ExtraVO result = new ExtraVO();
|
||||||
|
// JSONObject data = JSONObject.parseObject(JSON.toJSONString(extra.get("data")));
|
||||||
|
// if(data.containsKey("yks")) {
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// List<AttrSelectionVO> attrs = JSONArray.parseArray(JSON.toJSONString(data.get("yks")), AttrSelectionVO.class);
|
||||||
|
// result.setSelection(attrs);
|
||||||
|
// }
|
||||||
|
// result.setFuncCode(FuncRouteEnum.CHOOSE_YC.getFuncCode());
|
||||||
|
// result.setSpecial(true);
|
||||||
|
// result.setType(FuncRouteEnum.CHOOSE_YC.getType().getType());
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
|
||||||
|
private ExtraVO resolveShowParam(Map<String,Object> extra) { |
||||||
|
DataVO data = JSONObject.parseObject(JSON.toJSONString(extra.get("data")),DataVO.class); |
||||||
|
if(Func.isNotEmpty(data)) { |
||||||
|
if(Func.isNotEmpty(data.getReal())) { |
||||||
|
if(Func.isNotEmpty(data.getReal().getTime()) && StringUtil.isNotBlank(data.getReal().getTime())) { |
||||||
|
RealDataVO real = data.getReal(); |
||||||
|
Date date = DateUtil.parse(real.getTime(), PATTERN_DATETIME); |
||||||
|
real.setTime(DateUtil.format(date,DateUtil.PATTERN_DATETIME)); |
||||||
|
} |
||||||
|
} |
||||||
|
if(Func.isNotEmpty(data.getItem()) && StringUtil.isNotBlank(data.getMethod())) { |
||||||
|
if(SearchTypeEnum.HISTORY.getSearchType().equals(data.getType()) && Func.isNotEmpty(data.getItem())) { |
||||||
|
DataItemVO item = data.getItem(); |
||||||
|
HistoryDataSearchVO searchVO = new HistoryDataSearchVO(); |
||||||
|
searchVO.setDataType(data.getDataType()); |
||||||
|
searchVO.setAttrName(item.getAttrName()); |
||||||
|
searchVO.setDeviceCode(item.getDeviceId()); |
||||||
|
searchVO.setDeviceName(item.getDeviceName()); |
||||||
|
searchVO.setStationName(item.getProjectName()); |
||||||
|
searchVO.setMethod(data.getMethod()); |
||||||
|
searchVO.setSignage(item.getSignage()); |
||||||
|
searchVO.setStartTime(data.getStartTime()); |
||||||
|
searchVO.setEndTime(data.getEndTime()); |
||||||
|
return analyseDataService.getHistoryData(searchVO); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
result.setFunc(FuncRouteEnum.SHOW_PARAM.getFuncCode()); |
||||||
|
result.setType(FuncRouteEnum.SHOW_PARAM.getType().getType()); |
||||||
|
Map<String,Object> param = new HashMap(1); |
||||||
|
param.put("data", data); |
||||||
|
result.setParams(param); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
@Deprecated |
||||||
|
private ExtraVO resolveConfirmRemote(Map<String,Object> extra) { |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
RemoteParamVO remoteParam = JSONObject.parseObject(JSON.toJSONString(extra.get("data")), RemoteParamVO.class); |
||||||
|
result.setFunc(FuncRouteEnum.CONFIRM_YK.getFuncCode()); |
||||||
|
result.setType(FuncRouteEnum.CONFIRM_YK.getType().getType()); |
||||||
|
R<DeviceInstanceFuncVO> funcVOR = deviceClient.getFuncById(remoteParam.getFuncId()); |
||||||
|
if(funcVOR.isSuccess()) { |
||||||
|
Map<String,Object> param = new HashMap(); |
||||||
|
param.put("control",funcVOR.getData()); |
||||||
|
param.put("deviceName",remoteParam.getDeviceName()); |
||||||
|
param.put("projectName",remoteParam.getProjectName()); |
||||||
|
param.put("deviceCode",remoteParam.getDeviceId()); |
||||||
|
param.put("value",remoteParam.getValue()); |
||||||
|
result.setParams(param); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
// private ExtraVO resolveChooseFault(Map<String,Object> extra) {
|
||||||
|
// ExtraVO result = new ExtraVO();
|
||||||
|
// JSONObject data = JSONObject.parseObject(JSON.toJSONString(extra.get("data")));
|
||||||
|
// if(data.containsKey("faults")) {
|
||||||
|
// List<FaultSelectionVO> faults = JSONArray.parseArray(JSON.toJSONString(data.get("faults")), FaultSelectionVO.class);
|
||||||
|
// result.setSelection(faults);
|
||||||
|
// }
|
||||||
|
// result.setFuncCode(FuncRouteEnum.CHOOSE_FAULT.getFuncCode());
|
||||||
|
// result.setSpecial(true);
|
||||||
|
// result.setType(FunctionConstants.TypeEnum.CHOOSE.getType());
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
|
||||||
|
private ExtraVO resolveDiagnose(Map<String,Object> extra) { |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
JSONObject data = JSONObject.parseObject(JSON.toJSONString(extra.get("data"))); |
||||||
|
Map<String,Object> params = new HashMap<>(5); |
||||||
|
params.put("faultId",data.getString("fault_id")); |
||||||
|
params.put("name",data.getString("fault_name")); |
||||||
|
params.put("station",data.getString("station_id")); |
||||||
|
params.put("fdpDeviceName",data.getString("device_name")); |
||||||
|
params.put("fdpOrd",data.getString("ord")); |
||||||
|
result.setParams(params); |
||||||
|
result.setFunc(FuncRouteEnum.DIAGNOSE.getFuncCode()); |
||||||
|
result.setType(FunctionConstants.TypeEnum.PARAMS.getType()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param extra |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
// private ExtraVO resolveChooseStation(Map<String,Object> extra) {
|
||||||
|
// ExtraVO result = new ExtraVO();
|
||||||
|
// JSONObject data = JSONObject.parseObject(JSON.toJSONString(extra.get("data")));
|
||||||
|
// if(data.containsKey("stations")) {
|
||||||
|
// List<String> stations = JSONArray.parseArray(JSON.toJSONString(data.get("stations")), String.class);
|
||||||
|
// List<StationSelectionVO> selectionList = stations.stream().map(stationId -> {
|
||||||
|
// StationSelectionVO selectionVO = new StationSelectionVO();
|
||||||
|
// R<StationEntity> stationR = stationClient.getStationByCode(stationId);
|
||||||
|
// if (stationR.isSuccess() && Func.isNotEmpty(stationR.getData())) {
|
||||||
|
// selectionVO.setId(stationId);
|
||||||
|
// selectionVO.setName(stationR.getData().getName());
|
||||||
|
// }
|
||||||
|
// return selectionVO;
|
||||||
|
// }).collect(Collectors.toList());
|
||||||
|
// result.setSelection(selectionList);
|
||||||
|
// result.setFuncCode(FuncRouteEnum.CHOOSE_STATION.getFuncCode());
|
||||||
|
// result.setSpecial(true);
|
||||||
|
// result.setType(FunctionConstants.TypeEnum.CHOOSE.getType());
|
||||||
|
// }
|
||||||
|
// result.setType(FunctionConstants.TypeEnum.CHOOSE.getType());
|
||||||
|
// return result;
|
||||||
|
// }
|
||||||
|
|
||||||
|
private ExtraVO resolveChooseVideo(Map<String,Object> extra) { |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
JSONObject data = JSONObject.parseObject(JSON.toJSONString(extra.get("data"))); |
||||||
|
if(data.containsKey("videos")) { |
||||||
|
List<JSONObject> videoIds = JSONArray.parseArray(JSON.toJSONString(data.get("videos")), JSONObject.class); |
||||||
|
List<VideoSelectionVO> selections = videoIds.stream().map(video -> { |
||||||
|
R<StationVideoTypeEntity> videoR = videoTypeClient.getById(Long.valueOf(video.getString("id"))); |
||||||
|
VideoSelectionVO selectionVO = new VideoSelectionVO(); |
||||||
|
if (videoR.isSuccess() && Func.isNotEmpty(videoR.getData())) { |
||||||
|
selectionVO.setId(video.getString("id")); |
||||||
|
selectionVO.setName(videoR.getData().getName()); |
||||||
|
} |
||||||
|
return selectionVO; |
||||||
|
}).collect(Collectors.toList()); |
||||||
|
result.setFunc(FuncRouteEnum.CHOOSE_VIDEO.getFuncCode()); |
||||||
|
result.setSpecial(true); |
||||||
|
result.setSelection(selections); |
||||||
|
} |
||||||
|
result.setType(FunctionConstants.TypeEnum.CHOOSE.getType()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
private ExtraVO resolveChooseScada(Map<String,Object> extra) { |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
JSONObject data = JSONObject.parseObject(JSON.toJSONString(extra.get("data"))); |
||||||
|
if(data.containsKey("canvases")) { |
||||||
|
List<JSONObject> canvases = JSONArray.parseArray(JSON.toJSONString(data.get("canvases")), JSONObject.class); |
||||||
|
List<ScadaSelectionVO> selections = canvases.stream().map(canvas -> { |
||||||
|
ScadaSelectionVO selectionVO = new ScadaSelectionVO(); |
||||||
|
Map<String, String> resolve = jumpRouteJoinStrategy.resolve(canvas.getString("id"), JumpRouteJoinStrategy.SCADA_PARAMS_SOLVE); |
||||||
|
selectionVO.setId(canvas.getString("id")); |
||||||
|
selectionVO.setName(resolve.get("name")); |
||||||
|
return selectionVO; |
||||||
|
}).collect(Collectors.toList()); |
||||||
|
result.setFunc(FuncRouteEnum.CHOOSE_CANVAS.getFuncCode()); |
||||||
|
result.setSpecial(true); |
||||||
|
result.setSelection(selections); |
||||||
|
} |
||||||
|
result.setType(FunctionConstants.TypeEnum.CHOOSE.getType()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.DataAuthTypeEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.dto.AuthDataDTO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.ResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IHznlmInteractiveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AuthDataVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ResolveResultVO; |
||||||
|
import groovy.util.logging.Slf4j; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.system.dto.DeptStationDTO; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 10:24 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@AllArgsConstructor |
||||||
|
@Slf4j |
||||||
|
public class HznlmInteractiveServiceImpl implements IHznlmInteractiveService { |
||||||
|
|
||||||
|
private final AuthenticationService authenticationService; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<AuthDataVO> getAuthData(AuthDataDTO req) { |
||||||
|
DataAuthTypeEnum authTypeEnum = DataAuthTypeEnum.getEnumByType(req.getType()); |
||||||
|
switch(authTypeEnum) { |
||||||
|
case STATION: |
||||||
|
return this.getStationAuthData(req.getUserId()); |
||||||
|
case DEPT: |
||||||
|
return this.getDeptAuthData(req.getUserId()); |
||||||
|
default: |
||||||
|
throw new ServiceException(req.getType() + "改类型获取权限数据暂不支持"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO resolve(ModelFunctionReq req) { |
||||||
|
IResolveService resolveService = ResolveFactory.getResolveService(req.getFunctionName()); |
||||||
|
return resolveService.resolve(req); |
||||||
|
} |
||||||
|
|
||||||
|
public List<AuthDataVO> getDeptAuthData(String userId) { |
||||||
|
List<DeptStationDTO> deptStationDTOs = authenticationService.getStationPermissionsById(userId); |
||||||
|
return deptStationDTOs.stream().map(this::convertDeptAuthData).collect(Collectors.toList()); |
||||||
|
} |
||||||
|
|
||||||
|
public List<AuthDataVO> getStationAuthData(String userId) { |
||||||
|
List<DeptStationDTO> deptStationDTOs = authenticationService.getStationPermissionsById(userId); |
||||||
|
return deptStationDTOs.stream().map(this::convertStationAuthData).filter(d -> Func.isNotBlank(d.getId())).collect(Collectors.toList()); |
||||||
|
} |
||||||
|
|
||||||
|
private AuthDataVO convertStationAuthData(DeptStationDTO req) { |
||||||
|
return new AuthDataVO(req.getStationId(),req.getDeptName()); |
||||||
|
} |
||||||
|
|
||||||
|
private AuthDataVO convertDeptAuthData(DeptStationDTO req) { |
||||||
|
return new AuthDataVO(String.valueOf(req.getDeptId()),req.getDeptName()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,131 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import cn.hutool.http.HttpRequest; |
||||||
|
import cn.hutool.http.HttpResponse; |
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONArray; |
||||||
|
import com.alibaba.fastjson.TypeReference; |
||||||
|
import com.google.common.collect.Lists; |
||||||
|
import com.hnac.hzims.bigmodel.configuration.BigModelInvokeUrl; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IHznlmInvokeService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import com.hnac.hzims.bigmodel.manager.SessionRedisManager; |
||||||
|
import com.hnac.hzims.bigmodel.utils.RequestClientUtil; |
||||||
|
import com.hnac.hzims.bigmodel.websocket.sessionManager.InteractiveSessionManager; |
||||||
|
import com.xxl.job.core.log.XxlJobLogger; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.core.tool.utils.CollectionUtil; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springblade.system.dto.DeptStationDTO; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 17:20 |
||||||
|
* @Describe HZN_LM大模型接口调用服务层 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@RequiredArgsConstructor |
||||||
|
@Slf4j |
||||||
|
public class HznlmInvokeServiceImpl implements IHznlmInvokeService { |
||||||
|
|
||||||
|
private final AuthenticationService authenticationService; |
||||||
|
private final BigModelInvokeUrl bigModelInvokeUrl; |
||||||
|
private final BladeLogger logger; |
||||||
|
private final SessionRedisManager sessionRedisManager; |
||||||
|
|
||||||
|
@Value("${fdp.host}") |
||||||
|
private String fdpHost; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void ask(String question, String sessionId, String userId) { |
||||||
|
Map<String,Object> params = new HashMap<>(); |
||||||
|
params.put("id",sessionId); |
||||||
|
params.put("userid", userId); |
||||||
|
params.put("query",question); |
||||||
|
Map<String, String[]> authDataIds = this.getAuthDataIds(userId); |
||||||
|
params.putAll(authDataIds); |
||||||
|
RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantAsk(), params); |
||||||
|
sessionRedisManager.addSessionId(sessionId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void specialAsk(String sessionId, String userId, Map<String, Object> extra) { |
||||||
|
Map<String,Object> params = new HashMap<>(); |
||||||
|
params.put("id",sessionId); |
||||||
|
params.put("userid", userId); |
||||||
|
params.put("extra",extra); |
||||||
|
Map<String, String[]> authDataIds = this.getAuthDataIds(userId); |
||||||
|
params.putAll(authDataIds); |
||||||
|
log.info("调用大模型接口:{},传参为:{}",fdpHost + bigModelInvokeUrl.getAssistantSpecialAsk(),JSON.toJSONString(params)); |
||||||
|
RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantSpecialAsk(), params); |
||||||
|
sessionRedisManager.addSessionId(sessionId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void knowledgeAsk(String question, String sessionId, String userId, String knowledge) { |
||||||
|
Map<String,Object> params = new HashMap<>(); |
||||||
|
params.put("id", sessionId); |
||||||
|
params.put("userid", userId); |
||||||
|
params.put("query", question); |
||||||
|
params.put("knowledge", knowledge); |
||||||
|
Map<String, String[]> authDataIds = this.getAuthDataIds(userId); |
||||||
|
params.putAll(authDataIds); |
||||||
|
RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantKnowledgeAsk(), params); |
||||||
|
sessionRedisManager.addSessionId(sessionId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void removeSessionId(String sessionId) { |
||||||
|
Map<String,Object> params = new HashMap<>(); |
||||||
|
params.put("id",sessionId); |
||||||
|
RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAskAbort(), params); |
||||||
|
// 移除内存sessionId
|
||||||
|
InteractiveSessionManager.SESSION_POOL.remove(sessionId); |
||||||
|
sessionRedisManager.removeSessionId(sessionId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List hotQuestions() { |
||||||
|
try { |
||||||
|
return RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getHotQuestion(), null, new TypeReference<List<String>>(){}); |
||||||
|
} |
||||||
|
catch (Exception e) { |
||||||
|
log.error("An error occurred",e); |
||||||
|
return Lists.newArrayList(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<AnswerVO> getAnswerBySessionIds(String sessionIds) { |
||||||
|
Map<String,Object> params = new HashMap<>(); |
||||||
|
params.put("ids",Func.toStrList(",",sessionIds).toArray()); |
||||||
|
List<AnswerVO> answerVOList = RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantStatus(), params, new TypeReference<List<AnswerVO>>(){}); |
||||||
|
return answerVOList; |
||||||
|
} |
||||||
|
|
||||||
|
private Map<String,String[]> getAuthDataIds(String userId) { |
||||||
|
List<DeptStationDTO> authDatas = authenticationService.getStationPermissionsById(userId); |
||||||
|
Map<String, String[]> result = new HashMap<>(2); |
||||||
|
String[] stationIds = authDatas.stream().map(DeptStationDTO::getStationId) |
||||||
|
.filter(StringUtil::isNotBlank).toArray(String[]::new); |
||||||
|
String[] projectIds = authDatas.stream().map(DeptStationDTO::getDeptId) |
||||||
|
.filter(Func::isNotEmpty).map(String::valueOf).toArray(String[]::new); |
||||||
|
result.put("stationids", stationIds); |
||||||
|
result.put("projectids", projectIds); |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.SearchTypeEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.AnswerResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnalyseDataService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnswerResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.*; |
||||||
|
import com.xxl.job.core.log.XxlJobLogger; |
||||||
|
import groovy.util.logging.Slf4j; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 19:02 |
||||||
|
*/ |
||||||
|
@Service(AnswerResolveFactory.PARAM_ANSWER_SERVICE) |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
public class ParamAnswerResolveServiceImpl implements IAnswerResolveService { |
||||||
|
|
||||||
|
private final IAnalyseDataService analyseDataService; |
||||||
|
|
||||||
|
public static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss.SSS"; |
||||||
|
|
||||||
|
@Override |
||||||
|
public AnswerVO resolve(AnswerVO answer) { |
||||||
|
Object[] extraArray = this.extraStream(answer).map(this::getExtra).toArray(); |
||||||
|
answer.setExtras(extraArray); |
||||||
|
return answer; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO getExtra(JSONObject originExtra) { |
||||||
|
DataVO data = JSONObject.parseObject(JSON.toJSONString(originExtra.get("data")),DataVO.class); |
||||||
|
Assert.isTrue(Func.isNotEmpty(data),() -> { |
||||||
|
XxlJobLogger.log("解析参数答案失败,extra不能为空!"); |
||||||
|
throw new ServiceException("解析参数答案失败,extra不能为空!"); |
||||||
|
}); |
||||||
|
if(Func.isNotEmpty(data.getReal())) { |
||||||
|
// 处理查询实时数据
|
||||||
|
RealDataVO real = data.getReal(); |
||||||
|
Date date = DateUtil.parse(real.getTime(), PATTERN_DATETIME); |
||||||
|
real.setTime(DateUtil.format(date,DateUtil.PATTERN_DATETIME)); |
||||||
|
} |
||||||
|
else if(StringUtil.isNotBlank(data.getType()) && SearchTypeEnum.HISTORY.getSearchType().equals(data.getType())) { |
||||||
|
// 处理查询历史数据
|
||||||
|
return this.getHistoryData(data); |
||||||
|
} |
||||||
|
String funcCode = originExtra.getString("func"); |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
result.setFunc(funcCode); |
||||||
|
result.setType(FuncRouteEnum.getEnumByFuncCode(funcCode).getType().getType()); |
||||||
|
Map<String,Object> param = new HashMap(1); |
||||||
|
param.put("data", data); |
||||||
|
result.setParams(param); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 查询历史数据 |
||||||
|
* @param data 大模型识别数据信息 |
||||||
|
* @return 历史数据 |
||||||
|
*/ |
||||||
|
private ExtraVO getHistoryData(DataVO data) { |
||||||
|
// 确认查询聚合方式传入
|
||||||
|
Assert.isTrue(Func.isNotEmpty(data.getItem()) && StringUtil.isNotBlank(data.getMethod()),() -> { |
||||||
|
XxlJobLogger.log("历史数据查询方式为空,查询失败!"); |
||||||
|
throw new ServiceException("历史数据查询方式为空,查询失败!"); |
||||||
|
}); |
||||||
|
return analyseDataService.getHistoryData(this.convertHistoryDataSearch(data)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取历史数据查询对象 |
||||||
|
* @param data 大模型解析点位信息 |
||||||
|
* @return 历史数据查询对象 |
||||||
|
*/ |
||||||
|
private HistoryDataSearchVO convertHistoryDataSearch(DataVO data) { |
||||||
|
HistoryDataSearchVO searchVO = new HistoryDataSearchVO(); |
||||||
|
DataItemVO item = data.getItem(); |
||||||
|
searchVO.setDataType(data.getDataType()); |
||||||
|
searchVO.setAttrName(item.getAttrName()); |
||||||
|
searchVO.setDeviceCode(item.getDeviceId()); |
||||||
|
searchVO.setDeviceName(item.getDeviceName()); |
||||||
|
searchVO.setStationName(item.getProjectName()); |
||||||
|
searchVO.setMethod(data.getMethod()); |
||||||
|
searchVO.setSignage(item.getSignage()); |
||||||
|
searchVO.setStartTime(data.getStartTime()); |
||||||
|
searchVO.setEndTime(data.getEndTime()); |
||||||
|
return searchVO; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,73 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.entity.FunctionEntity; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.operational.station.entity.StationVideoTypeEntity; |
||||||
|
import com.hnac.hzims.operational.station.feign.IStationVideoTypeClient; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/09 08:56 |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
@Deprecated |
||||||
|
public class ParamStrategy { |
||||||
|
|
||||||
|
private final IStationVideoTypeClient videoClient; |
||||||
|
|
||||||
|
/** |
||||||
|
* 解析发送参数方式函数 |
||||||
|
* @param function 函数 |
||||||
|
* @param args 大模型识别参数 |
||||||
|
* @return 前端传参EXTRA |
||||||
|
*/ |
||||||
|
public ExtraVO resolve(FunctionEntity function, Map<String,String> args) { |
||||||
|
FuncRouteEnum routeEnum = FuncRouteEnum.getEnumByFuncCode(function.getCode()); |
||||||
|
if(Func.isNotEmpty(routeEnum)) { |
||||||
|
switch(routeEnum) { |
||||||
|
case OPEN_VIDEO: |
||||||
|
return this.getVideoExtra(args); |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public ExtraVO getVideoExtra(Map<String,String> args) { |
||||||
|
// 跳转页面逻辑
|
||||||
|
ExtraVO extraVO = new ExtraVO(); |
||||||
|
String id = args.get("canvas_id"); |
||||||
|
if(StringUtil.isNotBlank(id) && Func.isNotEmpty(id)) { |
||||||
|
R<StationVideoTypeEntity> videoR = videoClient.getById(Long.valueOf(id)); |
||||||
|
if(videoR.isSuccess()) { |
||||||
|
StationVideoTypeEntity video = videoR.getData(); |
||||||
|
extraVO.setType(FunctionConstants.TypeEnum.PARAMS.getType()); |
||||||
|
extraVO.setImmediatelyJump(true); |
||||||
|
extraVO.setFunc(FuncRouteEnum.OPEN_VIDEO.getFuncCode()); |
||||||
|
Map<String,Object> params = new HashMap<>(); |
||||||
|
params.put("name", video.getName()); |
||||||
|
params.put("videoHost", video.getVideoHost()); |
||||||
|
params.put("pointCode", video.getPointCode()); |
||||||
|
params.put("appKey", video.getAppKey()); |
||||||
|
params.put("appSecret", video.getAppSecret()); |
||||||
|
params.put("liveSourceAddress",video.getLiveSourceAddress()); |
||||||
|
extraVO.setParams(params); |
||||||
|
} |
||||||
|
} |
||||||
|
return extraVO; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.hnac.hzims.bigmodel.entity.FuncParamEntity; |
||||||
|
import com.hnac.hzims.bigmodel.entity.FunctionEntity; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IParamsService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Optional; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/09 08:51 |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
@Deprecated |
||||||
|
public class ParamsServiceImpl implements IParamsService { |
||||||
|
|
||||||
|
private final ParamStrategy strategy; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String dealJumpTypeFunction(FunctionEntity function, Map<String, String> args) { |
||||||
|
// 跳转页面逻辑
|
||||||
|
ExtraVO extraVO = strategy.resolve(function,args); |
||||||
|
return JSON.toJSONString(extraVO); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONArray; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.AnswerResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnswerResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.RemoteParamVO; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.client.DeviceClient; |
||||||
|
import com.hnac.hzinfo.sdk.v5.device.vo.DeviceInstanceFuncVO; |
||||||
|
import groovy.util.logging.Slf4j; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 19:02 |
||||||
|
*/ |
||||||
|
@Service(AnswerResolveFactory.REMOTE_ANSWER_SERVICE) |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
public class RemoteAnswerResolveServiceImpl implements IAnswerResolveService { |
||||||
|
|
||||||
|
private final DeviceClient deviceClient; |
||||||
|
|
||||||
|
@Override |
||||||
|
public AnswerVO resolve(AnswerVO answer) { |
||||||
|
Object[] extraArray = this.extraStream(answer).map(this::getExtra).toArray(); |
||||||
|
answer.setExtras(extraArray); |
||||||
|
return answer; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO getExtra(JSONObject originExtra) { |
||||||
|
ExtraVO result = new ExtraVO(); |
||||||
|
RemoteParamVO remoteParam = JSONObject.parseObject(JSON.toJSONString(originExtra.get("data")), RemoteParamVO.class); |
||||||
|
String funcCode = originExtra.getString("func"); |
||||||
|
result.setFunc(funcCode); |
||||||
|
result.setType(FuncRouteEnum.getEnumByFuncCode(funcCode).getType().getType()); |
||||||
|
R<DeviceInstanceFuncVO> funcVOR = deviceClient.getFuncById(remoteParam.getFuncId()); |
||||||
|
if(funcVOR.isSuccess()) { |
||||||
|
Map<String,Object> param = new HashMap(); |
||||||
|
param.put("control",funcVOR.getData()); |
||||||
|
param.put("deviceName",remoteParam.getDeviceName()); |
||||||
|
param.put("projectName",remoteParam.getProjectName()); |
||||||
|
param.put("deviceCode",remoteParam.getDeviceId()); |
||||||
|
param.put("value",remoteParam.getValue()); |
||||||
|
result.setParams(param); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,75 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.service.impl; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.ResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.ResolveResultVO; |
||||||
|
import com.hnac.hzims.operational.station.entity.StationVideoTypeEntity; |
||||||
|
import com.hnac.hzims.operational.station.feign.IStationVideoTypeClient; |
||||||
|
import groovy.util.logging.Slf4j; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.api.R; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.StringUtil; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 16:17 |
||||||
|
*/ |
||||||
|
@Service(ResolveFactory.VIDEO_RESOLVE_SERVICE) |
||||||
|
@AllArgsConstructor |
||||||
|
@Slf4j |
||||||
|
public class VideoResolveServiceImpl implements IResolveService { |
||||||
|
|
||||||
|
private final IStationVideoTypeClient videoClient; |
||||||
|
private final BladeLogger logger; |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO resolve(ModelFunctionReq req) { |
||||||
|
Map<String, String> args = req.getFunctionArgs(); |
||||||
|
String id = args.get("id"); |
||||||
|
String name = args.get("name"); |
||||||
|
Assert.isTrue(StringUtil.isNotBlank(id) && StringUtil.isNotBlank(name),() -> { |
||||||
|
logger.error("hzims:video:resolve","解析传参错误,缺少必要参数video_id,传参内容为:" + JSON.toJSONString(req)); |
||||||
|
throw new ServiceException("解析传参错误,缺少必要参数video_id"); |
||||||
|
}); |
||||||
|
return this.resolve(id); |
||||||
|
// ExtraVO extra = this.resolve(id);
|
||||||
|
// String message = "已成功打开" + name + ";";
|
||||||
|
// return new ResolveResultVO(message,extra);
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExtraVO resolve(String idStr) { |
||||||
|
Long id = Long.valueOf(idStr); |
||||||
|
// 跳转页面逻辑
|
||||||
|
ExtraVO extraVO = new ExtraVO(); |
||||||
|
R<StationVideoTypeEntity> videoR = videoClient.getById(Long.valueOf(id)); |
||||||
|
if(videoR.isSuccess()) { |
||||||
|
StationVideoTypeEntity video = videoR.getData(); |
||||||
|
extraVO.setType(FunctionConstants.TypeEnum.PARAMS.getType()); |
||||||
|
extraVO.setImmediatelyJump(true); |
||||||
|
extraVO.setFunc(FuncRouteEnum.OPEN_VIDEO.getFuncCode()); |
||||||
|
Map<String,Object> params = new HashMap<>(); |
||||||
|
params.put("name", video.getName()); |
||||||
|
params.put("videoHost", video.getVideoHost()); |
||||||
|
params.put("pointCode", video.getPointCode()); |
||||||
|
params.put("appKey", video.getAppKey()); |
||||||
|
params.put("appSecret", video.getAppSecret()); |
||||||
|
params.put("liveSourceAddress",video.getLiveSourceAddress()); |
||||||
|
extraVO.setParams(params); |
||||||
|
} |
||||||
|
return extraVO; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 10:26 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@AllArgsConstructor |
||||||
|
@ApiModel(value = "鉴权数据VO",description = "鉴权数据VO,包含站点、机构、遥控权限") |
||||||
|
@EqualsAndHashCode |
||||||
|
public class AuthDataVO implements Serializable { |
||||||
|
|
||||||
|
@ApiModelProperty("数据ID") |
||||||
|
private String id; |
||||||
|
|
||||||
|
@ApiModelProperty("数据名称") |
||||||
|
private String name; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/28 11:48 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class HistoryDataSearchVO { |
||||||
|
|
||||||
|
@NotBlank |
||||||
|
private String startTime; |
||||||
|
|
||||||
|
@NotBlank |
||||||
|
private String endTime; |
||||||
|
|
||||||
|
@NotBlank |
||||||
|
private String deviceCode; |
||||||
|
|
||||||
|
@NotBlank |
||||||
|
private String signage; |
||||||
|
|
||||||
|
private String attrName; |
||||||
|
|
||||||
|
@NotBlank |
||||||
|
private String method; |
||||||
|
|
||||||
|
private String dataType; |
||||||
|
|
||||||
|
private String stationName; |
||||||
|
|
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/20 14:46 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@EqualsAndHashCode |
||||||
|
public class RemoteParamVO implements Serializable { |
||||||
|
|
||||||
|
@JSONField(name = "id") |
||||||
|
private String funcId; |
||||||
|
|
||||||
|
@JSONField(name = "yk_name") |
||||||
|
private String remoteName; |
||||||
|
|
||||||
|
@JSONField(name = "device_id") |
||||||
|
private String deviceId; |
||||||
|
|
||||||
|
@JSONField(name = "device_name") |
||||||
|
private String deviceName; |
||||||
|
|
||||||
|
@JSONField(name = "station_id") |
||||||
|
private String projectId; |
||||||
|
|
||||||
|
@JSONField(name = "station_name") |
||||||
|
private String projectName; |
||||||
|
|
||||||
|
private String signage; |
||||||
|
|
||||||
|
private String value; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.interactive.constants.InfoMessageConstant; |
||||||
|
import io.swagger.annotations.ApiModel; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 16:31 |
||||||
|
*/ |
||||||
|
@EqualsAndHashCode |
||||||
|
@Data |
||||||
|
@AllArgsConstructor |
||||||
|
@ApiModel(value = "解析结果",description = "解析结果") |
||||||
|
public class ResolveResultVO implements Serializable { |
||||||
|
|
||||||
|
private String content; |
||||||
|
|
||||||
|
private ExtraVO extraVO; |
||||||
|
|
||||||
|
public static ResolveResultVO error() { |
||||||
|
return new ResolveResultVO(InfoMessageConstant.ERROR_MESSAGE,null); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import lombok.EqualsAndHashCode; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/20 19:31 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@EqualsAndHashCode |
||||||
|
public class SessionContentVO implements Serializable { |
||||||
|
|
||||||
|
/**机器码**/ |
||||||
|
private String machineCode; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank; |
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/25 14:03 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class StationSearchVO implements Serializable { |
||||||
|
|
||||||
|
private String startTime; |
||||||
|
|
||||||
|
private String endTime; |
||||||
|
|
||||||
|
@NotBlank(message = "查询类型不能为空") |
||||||
|
private String type; |
||||||
|
|
||||||
|
private String enumType; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/09 09:50 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class UpdateStationVO implements Serializable { |
||||||
|
|
||||||
|
/**站点ID**/ |
||||||
|
private String id; |
||||||
|
|
||||||
|
/**站点名称**/ |
||||||
|
private String name; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.interactive.vo; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/09 09:53 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class UpdateUsualVO implements Serializable { |
||||||
|
|
||||||
|
/**站点ID**/ |
||||||
|
@JSONField(name = "station_id") |
||||||
|
private String stationId; |
||||||
|
|
||||||
|
/**业务ID**/ |
||||||
|
private String id; |
||||||
|
|
||||||
|
/**业务名称**/ |
||||||
|
private String name; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.manager; |
||||||
|
|
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import static com.hnac.hzims.bigmodel.schedule.XxlJobHandlerConstant.HZIMS_BIGMODEL_ASK_KEY; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 18:23 |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
public class SessionRedisManager { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private RedisTemplate redisTemplate; |
||||||
|
|
||||||
|
public void addSessionId(String sessionId) { |
||||||
|
redisTemplate.opsForList().leftPush(HZIMS_BIGMODEL_ASK_KEY,sessionId); |
||||||
|
} |
||||||
|
|
||||||
|
public void removeSessionId(String sessionId) { |
||||||
|
redisTemplate.opsForList().remove(HZIMS_BIGMODEL_ASK_KEY,1,sessionId); |
||||||
|
} |
||||||
|
|
||||||
|
public List<String> getSessionIds() { |
||||||
|
return redisTemplate.opsForList().range(HZIMS_BIGMODEL_ASK_KEY, 0, -1); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.schedule; |
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.factory.AnswerResolveFactory; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IAnswerResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IHznlmInteractiveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IHznlmInvokeService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.service.IResolveService; |
||||||
|
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; |
||||||
|
import com.hnac.hzims.bigmodel.manager.SessionRedisManager; |
||||||
|
import com.hnac.hzims.bigmodel.websocket.service.InteractiveWsService; |
||||||
|
import com.hnac.hzims.bigmodel.websocket.sessionManager.InteractiveSessionManager; |
||||||
|
import com.xxl.job.core.biz.model.ReturnT; |
||||||
|
import com.xxl.job.core.handler.annotation.XxlJob; |
||||||
|
import com.xxl.job.core.log.XxlJobLogger; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.log.logger.BladeLogger; |
||||||
|
import org.springblade.core.tool.utils.CollectionUtil; |
||||||
|
import org.springblade.core.tool.utils.Func; |
||||||
|
import org.springblade.core.tool.utils.ObjectUtil; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.springframework.web.socket.TextMessage; |
||||||
|
import org.springframework.web.socket.WebSocketSession; |
||||||
|
|
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.List; |
||||||
|
import java.util.concurrent.CompletableFuture; |
||||||
|
import java.util.concurrent.ThreadPoolExecutor; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
import static com.hnac.hzims.bigmodel.schedule.XxlJobHandlerConstant.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/24 09:53 |
||||||
|
*/ |
||||||
|
@Component |
||||||
|
@AllArgsConstructor |
||||||
|
@Slf4j |
||||||
|
public class FrontEndInteractiveSchedule { |
||||||
|
|
||||||
|
private final SessionRedisManager sessionRedisManager; |
||||||
|
private final InteractiveWsService wsService; |
||||||
|
private final ThreadPoolExecutor getAnswerPoolExecutor; |
||||||
|
private final IHznlmInvokeService hznlmInvokeService; |
||||||
|
private final BladeLogger logger; |
||||||
|
|
||||||
|
@XxlJob(GET_INTERACTIVE_RESULT) |
||||||
|
public ReturnT getInteractiveResult(String params) { |
||||||
|
List<String> sessionIds = sessionRedisManager.getSessionIds(); |
||||||
|
if(CollectionUtil.isEmpty(sessionIds)){ |
||||||
|
XxlJobLogger.log("问题都已经回答完毕!"); |
||||||
|
return ReturnT.SUCCESS; |
||||||
|
} |
||||||
|
List<AnswerVO> answerList = hznlmInvokeService.getAnswerBySessionIds(String.join(",", sessionIds)); |
||||||
|
answerList.stream().parallel().forEach(answerVO -> CompletableFuture.runAsync(() -> { |
||||||
|
// 如果已经获取到答案 则删除缓存
|
||||||
|
if(answerVO.getRunning() == 0) { |
||||||
|
logger.info("hzims:bigmodel:getInteractiveResult:answer","获取大模型解析答案:" + JSON.toJSONString(answerVO)); |
||||||
|
sessionRedisManager.removeSessionId(answerVO.getSessionId()); |
||||||
|
} |
||||||
|
Object[] extras = answerVO.getExtras(); |
||||||
|
if(ObjectUtil.isNotEmpty(answerVO.getExtras()) && extras.length > 0){ |
||||||
|
try { |
||||||
|
// 解析答案
|
||||||
|
Object[] resolveExtras = Arrays.stream(extras).map(extra -> { |
||||||
|
IAnswerResolveService answerResolveService = AnswerResolveFactory.getResolveService(extra); |
||||||
|
if(Func.isNotEmpty(answerResolveService)) { |
||||||
|
JSONObject extraObject = JSONObject.parseObject(JSON.toJSONString(extra)); |
||||||
|
return answerResolveService.getExtra(extraObject); |
||||||
|
} |
||||||
|
return extra; |
||||||
|
}).map(JSON::toJSONString).toArray(); |
||||||
|
answerVO.setExtras(resolveExtras); |
||||||
|
} |
||||||
|
catch(Exception e) { |
||||||
|
log.error("An error occurred",e); |
||||||
|
AnswerVO.error(answerVO.getSessionId(), answerVO.getUserId(), answerVO.getQuery()); |
||||||
|
} |
||||||
|
} |
||||||
|
TextMessage message = InteractiveSessionManager.getTextMessage("1",JSON.toJSONString(answerVO)); |
||||||
|
wsService.sendMessage(answerVO.getSessionId(),message); |
||||||
|
}, getAnswerPoolExecutor)); |
||||||
|
return ReturnT.SUCCESS; |
||||||
|
} |
||||||
|
} |
@ -1,13 +1,25 @@ |
|||||||
package com.hnac.hzims.bigmodel.schedule; |
package com.hnac.hzims.bigmodel.schedule; |
||||||
|
|
||||||
|
import com.hnac.hzims.common.constant.CommonConstant; |
||||||
|
|
||||||
/** |
/** |
||||||
* @Author: huangxing |
* @Author: huangxing |
||||||
* @Date: 2024/04/28 16:19 |
* @Date: 2024/04/28 16:19 |
||||||
*/ |
*/ |
||||||
public interface XxlJobHandlerConstant { |
public interface XxlJobHandlerConstant { |
||||||
|
|
||||||
|
/**获取问答结果**/ |
||||||
String GET_INTERACTIVE_RESULT = "getInteractiveResult"; |
String GET_INTERACTIVE_RESULT = "getInteractiveResult"; |
||||||
|
|
||||||
|
String SYNCHRONOUS_FAULT_INSTRUCT = "synchronousFaultInstruct"; |
||||||
|
|
||||||
|
/**同步视频指令**/ |
||||||
|
String SYNCHRONOUS_VIDEO_INSTRUCT = "synchronousVideoInstruct"; |
||||||
|
|
||||||
|
String SYNCHRONOUS_SCADA_INSTRUCT = "synchronousScadaInstruct"; |
||||||
|
|
||||||
String INTERACTIVE_RESULT_KEY = "hzllm:interactive:result"; |
String INTERACTIVE_RESULT_KEY = "hzllm:interactive:result"; |
||||||
|
|
||||||
|
String HZIMS_BIGMODEL_ASK_KEY = CommonConstant.TENANT_ID + ":hzims:bigmodel:ask:key"; |
||||||
|
|
||||||
} |
} |
||||||
|
@ -0,0 +1,50 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.utils; |
||||||
|
|
||||||
|
import cn.hutool.http.HttpRequest; |
||||||
|
import cn.hutool.http.HttpResponse; |
||||||
|
import com.alibaba.fastjson.JSON; |
||||||
|
import com.alibaba.fastjson.JSONObject; |
||||||
|
import com.alibaba.fastjson.TypeReference; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.log.exception.ServiceException; |
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/06/21 17:12 |
||||||
|
*/ |
||||||
|
@Slf4j |
||||||
|
public class RequestClientUtil { |
||||||
|
|
||||||
|
/** |
||||||
|
* 无返回结果远程调用http接口 |
||||||
|
* @param url 接口url |
||||||
|
* @param body 传参body |
||||||
|
*/ |
||||||
|
public static void postCall(String url, Map body) { |
||||||
|
HttpResponse response = HttpRequest.post(url).body(JSON.toJSONString(body)).execute(); |
||||||
|
Assert.isTrue(response.getStatus() == HttpServletResponse.SC_OK, () -> { |
||||||
|
throw new ServiceException("远程调用大模型接口" + url + "失败!"); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 远程调用http接口 |
||||||
|
* @param url 接口url |
||||||
|
* @param body 传参 |
||||||
|
* @param typeRef 结果解析对象 |
||||||
|
* @return 结果 |
||||||
|
* @param <T> 结果解析对象类型 |
||||||
|
*/ |
||||||
|
public static <T> T postCall(String url, Map body, TypeReference<T> typeRef) { |
||||||
|
HttpResponse response = HttpRequest.post(url).body(JSON.toJSONString(body)).execute(); |
||||||
|
Assert.isTrue(response.getStatus() == HttpServletResponse.SC_OK, () -> { |
||||||
|
throw new ServiceException("远程调用大模型接口" + url + "失败!"); |
||||||
|
}); |
||||||
|
return JSONObject.parseObject(response.body(), typeRef); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package com.hnac.hzims.bigmodel.websocket.constants; |
||||||
|
|
||||||
|
import com.hnac.hzims.common.constant.CommonConstant; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: huangxing |
||||||
|
* @Date: 2024/05/20 19:11 |
||||||
|
*/ |
||||||
|
public interface RedisKeyConstants { |
||||||
|
|
||||||
|
String SESSION_CONTENT_KEY = CommonConstant.TENANT_ID + ":hzims:bigModel:session:content"; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.hnac.hzims.operational.fill.feign; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
||||||
|
import com.hnac.hzims.operational.fill.entity.GenerateEntity; |
||||||
|
import com.hnac.hzims.operational.fill.service.GenerateService; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springblade.core.tool.utils.CollectionUtil; |
||||||
|
import org.springblade.core.tool.utils.DateUtil; |
||||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||||
|
import org.springframework.web.bind.annotation.RestController; |
||||||
|
|
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @author ysj |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@Slf4j |
||||||
|
@AllArgsConstructor |
||||||
|
public class GenerateClient implements IGenerateClient { |
||||||
|
|
||||||
|
private final GenerateService generateService; |
||||||
|
|
||||||
|
@Override |
||||||
|
@GetMapping(STATION_GENERATE_BY_TIME) |
||||||
|
public Double stationGenerateByTime(@RequestParam("stationId") String stationId, |
||||||
|
@RequestParam("startTime") String startTime, |
||||||
|
@RequestParam("endTime") String endTime) { |
||||||
|
Date start = DateUtil.parse(startTime,DateUtil.PATTERN_DATETIME); |
||||||
|
List<GenerateEntity> generates = generateService.list(Wrappers.<GenerateEntity>lambdaQuery() |
||||||
|
.eq(GenerateEntity::getStationCode,stationId) |
||||||
|
.ge(GenerateEntity::getFillDate,DateUtil.format(start,DateUtil.PATTERN_DATE)) |
||||||
|
.le(GenerateEntity::getFillDate,endTime) |
||||||
|
); |
||||||
|
if(CollectionUtil.isEmpty(generates)){ |
||||||
|
return 0.0; |
||||||
|
} |
||||||
|
return generates.stream().mapToDouble(GenerateEntity::getGenerate).sum(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue