135 changed files with 4529 additions and 902 deletions
			
			
		@ -0,0 +1,20 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.dto; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.io.Serializable; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:48 | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
@ApiModel(value = "实时画面同步DTO对象",description = "实时画面同步DTO对象") | 
				
			||||
public class CanvasSyncDTO extends SyncDTO implements Serializable { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,20 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.dto; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.io.Serializable; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:51 | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
@ApiModel(value = "遥控同步DTO对象",description = "遥控同步DTO对象") | 
				
			||||
public class ControlSyncDTO extends SyncDTO implements Serializable { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,50 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.dto; | 
				
			||||
 | 
				
			||||
import com.alibaba.fastjson.annotation.JSONField; | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.io.Serializable; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:33 | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
@ApiModel(value = "视频同步DTO",description = "视频同步DTO") | 
				
			||||
public class SyncDTO implements Serializable { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("数据ID") | 
				
			||||
    private String id; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("在问答流程中使用的数据ID") | 
				
			||||
    @JSONField(name = "item_id") | 
				
			||||
    private String itemId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("用于匹配的名字。应包含所有匹配相关信息") | 
				
			||||
    @JSONField(name = "item_name") | 
				
			||||
    private String itemName; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("类型,可为'平台'或'业务'") | 
				
			||||
    private String type; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("站点I,平台yk必须有,否则可为null") | 
				
			||||
    @JSONField(name = "station_id") | 
				
			||||
    private String stationId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("站点名称,平台yk必须有,否则可为null") | 
				
			||||
    @JSONField(name = "station_name") | 
				
			||||
    private String stationName; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("设备ID,平台yk必须有,否则可为null") | 
				
			||||
    @JSONField(name = "device_id") | 
				
			||||
    private String deviceId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("设备名称,平台yk必须有,否则可为null") | 
				
			||||
    @JSONField(name = "device_name") | 
				
			||||
    private String deviceName; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,20 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.dto; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.io.Serializable; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:42 | 
				
			||||
 */ | 
				
			||||
@ApiModel(value = "视频同步DTO对象",description = "视频同步DTO对象") | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
public class VideoSyncDTO extends SyncDTO implements Serializable { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,12 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.api.dto.CanvasSyncDTO; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:53 | 
				
			||||
 */ | 
				
			||||
public interface ICanvasSyncClient extends ISyncClient<CanvasSyncDTO> { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,11 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.api.dto.ControlSyncDTO; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:55 | 
				
			||||
 */ | 
				
			||||
public interface IControlSyncClient extends ISyncClient<ControlSyncDTO> { | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,40 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.api.dto.SyncDTO; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.web.bind.annotation.RequestBody; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:32 | 
				
			||||
 */ | 
				
			||||
public interface ISyncClient<T extends SyncDTO> { | 
				
			||||
 | 
				
			||||
    String SAVE_BATCH = "/saveBatch"; | 
				
			||||
    String UPDATE_BY_ID = "/updateById"; | 
				
			||||
    String DELETE_BY_IDS = "/deleteByIds"; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 同步 - 新增对象 | 
				
			||||
     * @param syncDTO 同步对象列表 | 
				
			||||
     * @return 同步结果 | 
				
			||||
     */ | 
				
			||||
    R saveBatch(List<T> syncDTO); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 同步 - 更新对象 | 
				
			||||
     * @param syncDTO 同步对象 | 
				
			||||
     * @return 同步结果 | 
				
			||||
     */ | 
				
			||||
    R updateById(T syncDTO); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 同步 - 删除对象 | 
				
			||||
     * @param ids 主键id按逗号分隔 | 
				
			||||
     * @return 删除结果 | 
				
			||||
     */ | 
				
			||||
    R deleteByIds(String ids); | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,33 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.BigModelConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.api.dto.SyncDTO; | 
				
			||||
import com.hnac.hzims.bigmodel.api.dto.VideoSyncDTO; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.cloud.openfeign.FeignClient; | 
				
			||||
import org.springframework.web.bind.annotation.*; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 19:31 | 
				
			||||
 */ | 
				
			||||
@FeignClient(name = BigModelConstants.APP_NAME) | 
				
			||||
public interface IVideoSyncClient extends ISyncClient<VideoSyncDTO> { | 
				
			||||
 | 
				
			||||
    String PREFIX_API = "/feign/sync/video"; | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    @PostMapping(PREFIX_API + SAVE_BATCH) | 
				
			||||
    R saveBatch(@RequestBody List<VideoSyncDTO> syncDTO); | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    @PutMapping(PREFIX_API + UPDATE_BY_ID) | 
				
			||||
    R updateById(@RequestBody VideoSyncDTO syncDTO); | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    @DeleteMapping(PREFIX_API + DELETE_BY_IDS) | 
				
			||||
    R deleteByIds(@RequestParam String ids); | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,23 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.dto; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.dto.ControlDeviceDTO; | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.io.Serializable; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 09:43 | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
@ApiModel(value = "遥控设备鉴权DTO",description = "遥控设备鉴权DTO") | 
				
			||||
public class ControlDeviceAuthDTO extends ControlDeviceDTO implements Serializable { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("用户ID") | 
				
			||||
    private String userId; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,45 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.business.dto.ControlDeviceAuthDTO; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 09:11 | 
				
			||||
 * 鉴权接口 - 业务实现 | 
				
			||||
 */ | 
				
			||||
public interface IAuthClient { | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 遥控鉴权 | 
				
			||||
     * @param req 遥控信息 | 
				
			||||
     * @return 鉴权结果 | 
				
			||||
     */ | 
				
			||||
    R remoteAuth(ControlDeviceAuthDTO req); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 站点鉴权 | 
				
			||||
     * @param userId 用户ID | 
				
			||||
     * @param stationId 站点ID | 
				
			||||
     * @return 鉴权结果 | 
				
			||||
     */ | 
				
			||||
    R stationAuth(String userId,String stationId); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 机构鉴权 | 
				
			||||
     * @param userId 用户ID | 
				
			||||
     * @param deptId 站点ID | 
				
			||||
     * @return 鉴权结果 | 
				
			||||
     */ | 
				
			||||
    R deptAuth(String userId,String deptId); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 获取用户权限数据 | 
				
			||||
     * @param userId 用户ID | 
				
			||||
     * @return 权限数据 | 
				
			||||
     */ | 
				
			||||
    R<Map<String, String[]>> getAuthData(String userId); | 
				
			||||
} | 
				
			||||
@ -0,0 +1,24 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.entity; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.annotation.TableName; | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
import org.springblade.core.tenant.mp.TenantEntity; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @author ysj | 
				
			||||
 */ | 
				
			||||
@EqualsAndHashCode(callSuper = true) | 
				
			||||
@TableName("hzims_whitelist") | 
				
			||||
@ApiModel(value = "白名单实体类",description = "大模型白名单") | 
				
			||||
@Data | 
				
			||||
public class WhitelistEntity extends TenantEntity { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "用户Id") | 
				
			||||
    private Long userId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "用户登录账号") | 
				
			||||
    private String account; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,36 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.dto; | 
				
			||||
 | 
				
			||||
import com.alibaba.fastjson.annotation.JSONField; | 
				
			||||
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; | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/08 09:20 | 
				
			||||
 */ | 
				
			||||
@ApiModel("设备控制DTO") | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
public class ControlDTO implements Serializable { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("用户ID") | 
				
			||||
    @NotBlank | 
				
			||||
    private String userId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("会话ID") | 
				
			||||
    @NotBlank | 
				
			||||
    private String chatId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("value目前有值、'大' '小' '最大' '最小' ‘开’ '关'") | 
				
			||||
    private String value; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("遥控点位") | 
				
			||||
    private List<ControlDeviceDTO> yks; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,38 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.dto; | 
				
			||||
 | 
				
			||||
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/07/08 16:22 | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
@ApiModel(value = "",description = "") | 
				
			||||
@EqualsAndHashCode | 
				
			||||
public class ControlDeviceDTO implements Serializable { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "站点ID") | 
				
			||||
    private String stationId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "设备ID") | 
				
			||||
    @NotBlank | 
				
			||||
    private String deviceId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "控制ID") | 
				
			||||
    @NotBlank | 
				
			||||
    private String itemId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "控制名称") | 
				
			||||
    private String itemName; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty(value = "遥控类型,平台、业务") | 
				
			||||
    @NotBlank | 
				
			||||
    private String type; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -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 = "itemId") | 
				
			||||
    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,23 @@
					 | 
				
			||||
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 16:30 | 
				
			||||
 */ | 
				
			||||
@Data | 
				
			||||
public class SelectionVO implements Serializable { | 
				
			||||
 | 
				
			||||
    /**选项ID**/ | 
				
			||||
    @JSONField(name = "item_id") | 
				
			||||
    private String itemId; | 
				
			||||
 | 
				
			||||
    /**选项名称**/ | 
				
			||||
    @JSONField(name = "item_name") | 
				
			||||
    private String itemName; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -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; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -1,31 +1,39 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel; | 
				
			||||
 | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.mybatis.spring.annotation.MapperScan; | 
				
			||||
import org.springblade.core.cloud.feign.EnableBladeFeign; | 
				
			||||
import org.springblade.core.jwt.JwtUtil; | 
				
			||||
import org.springblade.core.launch.BladeApplication; | 
				
			||||
import org.springframework.boot.SpringApplication; | 
				
			||||
import org.springframework.boot.autoconfigure.SpringBootApplication; | 
				
			||||
import org.springframework.boot.builder.SpringApplicationBuilder; | 
				
			||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; | 
				
			||||
import org.springframework.cloud.client.SpringCloudApplication; | 
				
			||||
import org.springframework.cloud.openfeign.EnableFeignClients; | 
				
			||||
import org.springframework.context.annotation.ComponentScan; | 
				
			||||
import org.springframework.scheduling.annotation.EnableScheduling; | 
				
			||||
import org.springframework.data.redis.core.RedisTemplate; | 
				
			||||
 | 
				
			||||
import javax.annotation.Resource; | 
				
			||||
 | 
				
			||||
@SpringBootApplication(scanBasePackages = {"org.springblade", "com.hnac.*"}) | 
				
			||||
@MapperScan(basePackages = {"com.hnac.hzinfo.**.mapper","com.hnac.hzims.**.mapper"}) | 
				
			||||
@EnableFeignClients(basePackages = {"org.springblade", "com.hnac"}) | 
				
			||||
public class HzimsBigModelApplication { | 
				
			||||
import static com.hnac.hzims.bigmodel.schedule.XxlJobHandlerConstant.HZIMS_BIGMODEL_ASK_KEY; | 
				
			||||
 | 
				
			||||
@EnableBladeFeign(basePackages = {"org.springblade","com.hnac"}) | 
				
			||||
@SpringCloudApplication | 
				
			||||
@MapperScan("com.hnac.hzims.**.mapper.**") | 
				
			||||
@Resource | 
				
			||||
@ComponentScan(basePackages = {"com.hnac.hzims.**"}) | 
				
			||||
@Slf4j | 
				
			||||
public class HzimsBigModelApplication extends SpringBootServletInitializer { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    public static void main(String[] args) { | 
				
			||||
        BladeApplication.run(BigModelConstants.APP_NAME, HzimsBigModelApplication.class, args); | 
				
			||||
        RedisTemplate<String, Object> redisTemplate = JwtUtil.getRedisTemplate(); | 
				
			||||
        redisTemplate.delete(HZIMS_BIGMODEL_ASK_KEY); | 
				
			||||
        log.info("服务重启删除问题reids缓存:{}",HZIMS_BIGMODEL_ASK_KEY); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
//    @Override
 | 
				
			||||
//    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
 | 
				
			||||
//        return BladeApplication.createSpringApplicationBuilder(builder, BigModelConstants.APP_NAME, HzimsBigModelApplication.class);
 | 
				
			||||
//    }
 | 
				
			||||
    @Override | 
				
			||||
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { | 
				
			||||
        return BladeApplication.createSpringApplicationBuilder(builder, BigModelConstants.APP_NAME, HzimsBigModelApplication.class); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
					 | 
				
			||||
@ -0,0 +1,35 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.api.dto.VideoSyncDTO; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.web.bind.annotation.*; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 20:17 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class VideoSyncClient implements IVideoSyncClient{ | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    @PostMapping(PREFIX_API + SAVE_BATCH) | 
				
			||||
    public R saveBatch(@RequestBody List<VideoSyncDTO> syncDTO) { | 
				
			||||
        return null; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    @PutMapping(PREFIX_API + UPDATE_BY_ID) | 
				
			||||
    public R updateById(@RequestBody VideoSyncDTO syncDTO) { | 
				
			||||
        return null; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    @DeleteMapping(PREFIX_API + DELETE_BY_IDS) | 
				
			||||
    public R deleteByIds(@RequestParam String ids) { | 
				
			||||
        return null; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,16 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.api.service; | 
				
			||||
 | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/10 09:03 | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@Slf4j | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class SyncService { | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,33 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.control; | 
				
			||||
 | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.business.service.DataSourceService; | 
				
			||||
import com.hnac.hzims.bigmodel.business.vo.SqlVO; | 
				
			||||
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; | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/06/28 14:07 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/dataSource/execute") | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class DataSourceExecuteController { | 
				
			||||
 | 
				
			||||
    private final DataSourceService dataSourceService; | 
				
			||||
 | 
				
			||||
    @PostMapping("/executeQuery") | 
				
			||||
    @ApiOperation("执行大模型sql") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    public R<List<Map<String, Object>>> executeQuery(@RequestBody @Valid SqlVO sqlVO) { | 
				
			||||
        return R.data(dataSourceService.queryListOnSpecificDataSource(sqlVO)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,36 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.control; | 
				
			||||
 | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.BigModelConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.business.service.RemoteService; | 
				
			||||
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.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,87 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.feign; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.business.dto.ControlDeviceAuthDTO; | 
				
			||||
import com.hnac.hzims.bigmodel.business.service.AuthenticationService; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.StringUtil; | 
				
			||||
import org.springblade.system.dto.DeptStationDTO; | 
				
			||||
import org.springframework.stereotype.Component; | 
				
			||||
 | 
				
			||||
import java.util.HashMap; | 
				
			||||
import java.util.List; | 
				
			||||
import java.util.Map; | 
				
			||||
import java.util.Optional; | 
				
			||||
import java.util.stream.Collectors; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/09 09:31 | 
				
			||||
 */ | 
				
			||||
@Component | 
				
			||||
@AllArgsConstructor | 
				
			||||
@Slf4j | 
				
			||||
public class AuthClient implements IAuthClient { | 
				
			||||
 | 
				
			||||
    private final AuthenticationService authenticationService; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 设备控制鉴权 | 
				
			||||
     * @param req 遥控信息 | 
				
			||||
     * @return 鉴权结果 | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public R remoteAuth(ControlDeviceAuthDTO req) { | 
				
			||||
        // 若站点不为空 则对站点进行鉴权
 | 
				
			||||
        if(StringUtil.isNotBlank(req.getStationId())) { | 
				
			||||
            if(!authenticationService.stationAuthentication(req.getStationId(), req.getUserId())) { | 
				
			||||
                return R.fail("站点鉴权失败!"); | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
        if("业务".equals(req.getType())) { | 
				
			||||
 | 
				
			||||
        } | 
				
			||||
        return R.success("鉴权成功"); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 站点鉴权 | 
				
			||||
     * @param userId 用户ID | 
				
			||||
     * @param stationId 站点ID | 
				
			||||
     * @return 鉴权结果 | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public R stationAuth(String userId, String stationId) { | 
				
			||||
        return R.status(authenticationService.stationAuthentication(stationId,userId)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 机构鉴权 | 
				
			||||
     * @param userId 用户ID | 
				
			||||
     * @param deptId 站点ID | 
				
			||||
     * @return 鉴权结果 | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public R deptAuth(String userId, String deptId) { | 
				
			||||
        List<DeptStationDTO> deptStationDTOList = authenticationService.getStationPermissionsById(userId); | 
				
			||||
        boolean result = deptStationDTOList.stream().map(DeptStationDTO::getDeptId).anyMatch(d -> Long.valueOf(deptId).equals(d)); | 
				
			||||
        return R.status(result); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 获取用户权限数据 | 
				
			||||
     * @param userId 用户ID | 
				
			||||
     * @return 权限数据 - 站点、机构 | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public R<Map<String,String[]>> getAuthData(String userId) { | 
				
			||||
        Map<String,String[]> result = new HashMap<>(2); | 
				
			||||
        List<DeptStationDTO> deptStationDTOList = authenticationService.getStationPermissionsById(userId); | 
				
			||||
        String[] stationIds = deptStationDTOList.stream().map(DeptStationDTO::getStationId).filter(StringUtil::isNotBlank).toArray(String[]::new); | 
				
			||||
        String[] deptIds = deptStationDTOList.stream().map(DeptStationDTO::getDeptId).map(String::valueOf).toArray(String[]::new); | 
				
			||||
        result.put("stationids",stationIds); | 
				
			||||
        result.put("projectids",deptIds); | 
				
			||||
        return R.data(result); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,119 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.service; | 
				
			||||
 | 
				
			||||
import com.google.common.collect.Lists; | 
				
			||||
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; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/05/21 16:10 | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class AuthenticationService { | 
				
			||||
 | 
				
			||||
    private final IDeptClient deptClient; | 
				
			||||
    private final ProjectClient projectClient; | 
				
			||||
    private final IRemoteClient remoteClient; | 
				
			||||
    private final RedisTemplate redisTemplate; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 站点鉴权 | 
				
			||||
     * @param stationId 站点ID | 
				
			||||
     * @param userId 用户ID | 
				
			||||
     */ | 
				
			||||
    public Boolean stationAuthentication(String stationId, String userId) { | 
				
			||||
        List<DeptStationDTO> deptStationDTOList = this.getStationPermissionsById(userId); | 
				
			||||
        return deptStationDTOList.stream().map(DeptStationDTO::getStationId).anyMatch(stationId::equals); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 菜单鉴权 | 
				
			||||
     * @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() == 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,121 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.service; | 
				
			||||
 | 
				
			||||
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; | 
				
			||||
import com.hnac.hzims.bigmodel.business.vo.SqlVO; | 
				
			||||
import com.hnac.hzims.bigmodel.business.vo.TableAuthVO; | 
				
			||||
import com.hnac.hzims.common.service.UserAuthDataService; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.springblade.core.log.exception.ServiceException; | 
				
			||||
import org.springframework.jdbc.core.JdbcTemplate; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
import org.springframework.util.Assert; | 
				
			||||
 | 
				
			||||
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 final UserAuthDataService userAuthDataService; | 
				
			||||
 | 
				
			||||
    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); | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    public List<Map<String, Object>> queryListOnSpecificDataSource(SqlVO sqlVO) { | 
				
			||||
        // 过滤更新、删除语句
 | 
				
			||||
        Assert.isTrue(!DataSourceService.isUpdateOrDelete(sqlVO.getSql()),() -> { | 
				
			||||
            throw new ServiceException("执行sql语句包含更新/删除操作,执行失败!"); | 
				
			||||
        }); | 
				
			||||
        String sql = sqlVO.getSql(); | 
				
			||||
        String userAuthDataSQL = userAuthDataService.getUserAuthDataSQL(Long.parseLong(sqlVO.getUserId())); | 
				
			||||
        for (TableAuthVO tableAuthVO : sqlVO.getTableAuthVOList()) { | 
				
			||||
            String tableSubStr = "(SELECT * FROM " + tableAuthVO.getTableName() + " where" + userAuthDataSQL +") temp"; | 
				
			||||
            sql = sql.replace(tableAuthVO.getTableName(),tableSubStr); | 
				
			||||
        } | 
				
			||||
        log.info("执行sql:{}",sql); | 
				
			||||
        return this.queryListOnSpecificDataSource(sql, sqlVO.getTableAuthVOList().get(0).getDatasourceName()); | 
				
			||||
        // 过滤更新、删除语句
 | 
				
			||||
//        Assert.isTrue(!DataSourceService.isUpdateOrDelete(sqlVO.getSql()),() -> {
 | 
				
			||||
//            throw new ServiceException("执行sql语句包含更新/删除操作,执行失败!");
 | 
				
			||||
//        });
 | 
				
			||||
//        String sql = sqlVO.getSql();
 | 
				
			||||
//        String userAuthDataSQL = userAuthDataService.getUserAuthDataSQL(Long.parseLong(sqlVO.getUserId()));
 | 
				
			||||
//        List<Map<String,String>> tempViewList = Lists.newArrayList();
 | 
				
			||||
//        try {
 | 
				
			||||
//            for (TableAuthVO tableAuthVO : sqlVO.getTableAuthVOList()) {
 | 
				
			||||
//                // 创建视图语句
 | 
				
			||||
//                String viewName = "V_TEMP_" + UUID.randomUUID().toString().replace("-", "");
 | 
				
			||||
//                String createView = "CREATE VIEW " + viewName + " AS SELECT * FROM " + tableAuthVO.getTableName() + " where " + userAuthDataSQL;
 | 
				
			||||
//                this.updateOnSpecificDataSource(createView,tableAuthVO.getDatasourceName());
 | 
				
			||||
//                Map<String,String> viewMap = new HashMap(2);
 | 
				
			||||
//                viewMap.put("datasource",tableAuthVO.getDatasourceName());
 | 
				
			||||
//                viewMap.put("viewName",viewName);
 | 
				
			||||
//                tempViewList.add(viewMap);
 | 
				
			||||
//                sql = sql.replace(tableAuthVO.getTableName(),viewName);
 | 
				
			||||
//            }
 | 
				
			||||
//            log.info("执行sql:{}",sql);
 | 
				
			||||
//            return this.queryListOnSpecificDataSource(sql, sqlVO.getTableAuthVOList().get(0).getDatasourceName());
 | 
				
			||||
//        }
 | 
				
			||||
//        catch(Exception e) {
 | 
				
			||||
//            log.error("An Error occurred!",e);
 | 
				
			||||
//            throw new ServiceException("sql执行失败!");
 | 
				
			||||
//        }
 | 
				
			||||
//        finally {
 | 
				
			||||
//            if(CollectionUtil.isNotEmpty(tempViewList)) {
 | 
				
			||||
//                tempViewList.forEach(viewMap -> {
 | 
				
			||||
//                    this.updateOnSpecificDataSource("DROP VIEW IF EXISTS `" + viewMap.get("viewName")+"`;",viewMap.get("datasource"));
 | 
				
			||||
//                });
 | 
				
			||||
//            }
 | 
				
			||||
//        }
 | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * sql | 
				
			||||
     * @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(); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 过滤更新、删除语法的sql脚本 | 
				
			||||
     * @param sql 待执行sql脚本 | 
				
			||||
     * @return 执行结果 | 
				
			||||
     */ | 
				
			||||
    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,97 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.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.business.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,32 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.vo; | 
				
			||||
 | 
				
			||||
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; | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/05 08:19 | 
				
			||||
 */ | 
				
			||||
@ApiModel(value = "",description = "") | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
public class SqlVO implements Serializable { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("执行sql") | 
				
			||||
    @NotBlank | 
				
			||||
    private String sql; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("执行人") | 
				
			||||
    @NotBlank | 
				
			||||
    private String userId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("执行sql设计表信息") | 
				
			||||
    private List<TableAuthVO> tableAuthVOList; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,28 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.business.vo; | 
				
			||||
 | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
import lombok.Data; | 
				
			||||
import lombok.EqualsAndHashCode; | 
				
			||||
 | 
				
			||||
import java.io.Serializable; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/04 17:29 | 
				
			||||
 */ | 
				
			||||
@ApiModel(value = "表鉴权对象",description = "表鉴权对象") | 
				
			||||
@Data | 
				
			||||
@EqualsAndHashCode | 
				
			||||
public class TableAuthVO implements Serializable { | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("鉴权类型,目前不为空即为平台数据权限") | 
				
			||||
    private String auth; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("数据源名称") | 
				
			||||
    private String datasourceName; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("数据表名称") | 
				
			||||
    private String tableName; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,73 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.controller; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
				
			||||
import com.baomidou.mybatisplus.core.metadata.IPage; | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.BigModelConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FunctionEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.function.service.IFunctionService; | 
				
			||||
import com.hnac.hzims.common.utils.Condition; | 
				
			||||
import com.hnac.hzinfo.log.annotation.Business; | 
				
			||||
import io.swagger.annotations.Api; | 
				
			||||
import io.swagger.annotations.ApiModel; | 
				
			||||
import io.swagger.annotations.ApiOperation; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.mp.support.Query; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.BeanUtil; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springframework.validation.annotation.Validated; | 
				
			||||
import org.springframework.web.bind.annotation.*; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/29 14:39 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/function") | 
				
			||||
@Api(value = "大模型函数管理",tags = "大模型函数管理") | 
				
			||||
@Business(module = BigModelConstants.MODULE_NAME,value = "大模型函数管理") | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class FunctionController { | 
				
			||||
 | 
				
			||||
    private final IFunctionService functionService; | 
				
			||||
 | 
				
			||||
    @PostMapping("/save") | 
				
			||||
    @ApiOperation("保存函数") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    public R save(@RequestBody @Validated FunctionEntity req) { | 
				
			||||
        return R.status(functionService.save(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @PutMapping("/save") | 
				
			||||
    @ApiOperation("编辑函数") | 
				
			||||
    @ApiOperationSupport(order = 2) | 
				
			||||
    public R updateById(@RequestBody FunctionEntity req) { | 
				
			||||
        return R.status(functionService.save(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @GetMapping("/list") | 
				
			||||
    @ApiOperation("列表查询") | 
				
			||||
    @ApiOperationSupport(order = 3) | 
				
			||||
    public R<List<FunctionEntity>> list(FunctionEntity req) { | 
				
			||||
        return R.data(functionService.list(Condition.getQueryWrapper(BeanUtil.toMap(req),FunctionEntity.class))); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @GetMapping("/page") | 
				
			||||
    @ApiOperation("分页查询") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    public R<IPage<FunctionEntity>> page(FunctionEntity req, Query query) { | 
				
			||||
        QueryWrapper<FunctionEntity> queryWrapper = Condition.getQueryWrapper(BeanUtil.toMap(req), FunctionEntity.class); | 
				
			||||
        return R.data(functionService.page(Condition.getPage(query),queryWrapper)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @DeleteMapping("/remove") | 
				
			||||
    @ApiOperation("删除函数") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    public R remove(String ids) { | 
				
			||||
        return R.data(functionService.removeByIds(Func.toLongList(",",ids))); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,74 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.controller; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
				
			||||
import com.baomidou.mybatisplus.core.metadata.IPage; | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.BigModelConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FuncParamEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FunctionEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.function.service.IFuncParamService; | 
				
			||||
import com.hnac.hzims.bigmodel.function.service.IFunctionService; | 
				
			||||
import com.hnac.hzims.common.utils.Condition; | 
				
			||||
import com.hnac.hzinfo.log.annotation.Business; | 
				
			||||
import io.swagger.annotations.Api; | 
				
			||||
import io.swagger.annotations.ApiOperation; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.mp.support.Query; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.BeanUtil; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springframework.validation.annotation.Validated; | 
				
			||||
import org.springframework.web.bind.annotation.*; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/29 15:46 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/function/param") | 
				
			||||
@Api(value = "大模型函数参数管理",tags = "大模型函数参数管理") | 
				
			||||
@Business(module = BigModelConstants.MODULE_NAME,value = "大模型函数参数管理") | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class FunctionParamController { | 
				
			||||
 | 
				
			||||
    private final IFuncParamService funcParamService; | 
				
			||||
 | 
				
			||||
    @PostMapping("/save") | 
				
			||||
    @ApiOperation("保存函数参数") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    public R save(@RequestBody @Validated FuncParamEntity req) { | 
				
			||||
        return R.status(funcParamService.save(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @PutMapping("/save") | 
				
			||||
    @ApiOperation("编辑函数参数") | 
				
			||||
    @ApiOperationSupport(order = 2) | 
				
			||||
    public R updateById(@RequestBody FuncParamEntity req) { | 
				
			||||
        return R.status(funcParamService.save(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @GetMapping("/list") | 
				
			||||
    @ApiOperation("列表查询") | 
				
			||||
    @ApiOperationSupport(order = 3) | 
				
			||||
    public R<List<FuncParamEntity>> list(FuncParamEntity req) { | 
				
			||||
        return R.data(funcParamService.list(Condition.getQueryWrapper(BeanUtil.toMap(req),FuncParamEntity.class))); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @GetMapping("/page") | 
				
			||||
    @ApiOperation("分页查询") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    public R<IPage<FuncParamEntity>> page(FuncParamEntity req, Query query) { | 
				
			||||
        QueryWrapper<FuncParamEntity> queryWrapper = Condition.getQueryWrapper(BeanUtil.toMap(req), FuncParamEntity.class); | 
				
			||||
        return R.data(funcParamService.page(Condition.getPage(query),queryWrapper)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @DeleteMapping("/remove") | 
				
			||||
    @ApiOperation("删除函数参数") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    public R remove(String ids) { | 
				
			||||
        return R.data(funcParamService.removeByIds(Func.toLongList(",",ids))); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,11 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.mapper; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FuncParamEntity; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:11 | 
				
			||||
 */ | 
				
			||||
public interface FuncParamMapper extends BaseMapper<FuncParamEntity> { | 
				
			||||
} | 
				
			||||
@ -1,12 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.mapper; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FunctionEntity; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:10 | 
				
			||||
 */ | 
				
			||||
public interface FunctionMapper extends BaseMapper<FunctionEntity> { | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,22 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.service; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.extension.service.IService; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FuncParamEntity; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:12 | 
				
			||||
 */ | 
				
			||||
public interface IFuncParamService extends IService<FuncParamEntity> { | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 根据函数ID获取参数列表 | 
				
			||||
     * @param funcId 函数ID | 
				
			||||
     * @return 参数列表 | 
				
			||||
     */ | 
				
			||||
    List<FuncParamEntity> getParamsByFuncId(Long funcId); | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,15 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.service; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.extension.service.IService; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FunctionEntity; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:08 | 
				
			||||
 */ | 
				
			||||
public interface IFunctionService extends IService<FunctionEntity> { | 
				
			||||
 | 
				
			||||
    FunctionEntity getFunctionByCode(String code); | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,28 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.service.impl; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
				
			||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FuncParamEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.function.mapper.FuncParamMapper; | 
				
			||||
import com.hnac.hzims.bigmodel.function.service.IFuncParamService; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:13 | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@Slf4j | 
				
			||||
public class FuncParamServiceImpl extends ServiceImpl<FuncParamMapper, FuncParamEntity> implements IFuncParamService { | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public List<FuncParamEntity> getParamsByFuncId(Long funcId) { | 
				
			||||
        LambdaQueryWrapper<FuncParamEntity> queryWrapper = Wrappers.<FuncParamEntity>lambdaQuery().eq(FuncParamEntity::getFuncId, funcId); | 
				
			||||
        return this.list(queryWrapper); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,27 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.function.service.impl; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
				
			||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FunctionEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.function.mapper.FunctionMapper; | 
				
			||||
import com.hnac.hzims.bigmodel.function.service.IFunctionService; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:09 | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@Slf4j | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class FunctionServiceImpl extends ServiceImpl<FunctionMapper, FunctionEntity> implements IFunctionService { | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public FunctionEntity getFunctionByCode(String code) { | 
				
			||||
        LambdaQueryWrapper<FunctionEntity> queryWrapper = Wrappers.<FunctionEntity>lambdaQuery().eq(FunctionEntity::getCode, code); | 
				
			||||
        return this.getOne(queryWrapper); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -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,72 @@
					 | 
				
			||||
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.IResultCode; | 
				
			||||
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> hotQuestions() { | 
				
			||||
        return R.data(hznlmInvokeService.hotQuestions()); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("获取问答sessionId") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    @GetMapping("/getSessionId") | 
				
			||||
    public R<String> getSessionId() { | 
				
			||||
        return R.data(IdWorker.get32UUID()); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("中断当前的问答") | 
				
			||||
    @ApiOperationSupport(order = 5) | 
				
			||||
    @GetMapping("/interruptSession") | 
				
			||||
    public R interruptSession(@RequestParam(value = "id") String sessionId) { | 
				
			||||
        hznlmInvokeService.askAbort(sessionId); | 
				
			||||
        return R.success("操作成功!"); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,65 @@
					 | 
				
			||||
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.business.service.DataSourceService; | 
				
			||||
import com.hnac.hzims.bigmodel.business.vo.SqlVO; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.dto.AuthDataDTO; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.dto.ControlDTO; | 
				
			||||
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.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; | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @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; | 
				
			||||
    private final DataSourceService dataSourceService; | 
				
			||||
 | 
				
			||||
    @PostMapping(value = "/get_auth_data") | 
				
			||||
    @ApiOperation("获取鉴权数据") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    public R<List<AuthDataVO>> getAuthData(@RequestBody AuthDataDTO req) { | 
				
			||||
        return R.data(interactiveService.getAuthData(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("解析大模型函数") | 
				
			||||
    @ApiOperationSupport(order = 2) | 
				
			||||
    @PostMapping("/resolve") | 
				
			||||
    public R<ExtraVO> resolve(@RequestBody ModelFunctionReq req) { | 
				
			||||
        return R.data(interactiveService.resolve(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @PostMapping("/execute_query") | 
				
			||||
    @ApiOperation("执行大模型sql") | 
				
			||||
    @ApiOperationSupport(order = 3) | 
				
			||||
    public R<List<Map<String, Object>>> executeQuery(@RequestBody @Valid SqlVO sqlVO) { | 
				
			||||
        return R.data(dataSourceService.queryListOnSpecificDataSource(sqlVO)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @PostMapping("/control_device") | 
				
			||||
    @ApiOperation("控制设备") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    public R<ExtraVO> controlDevice(@RequestBody @Valid ControlDTO req) { | 
				
			||||
        return R.data(interactiveService.controlDevice(req)); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -1,62 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.controller; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker; | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.BigModelConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.service.IInteractiveService; | 
				
			||||
import com.hnac.hzinfo.log.annotation.Business; | 
				
			||||
import io.swagger.annotations.Api; | 
				
			||||
import io.swagger.annotations.ApiModelProperty; | 
				
			||||
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.*; | 
				
			||||
 | 
				
			||||
import javax.servlet.http.HttpServletRequest; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 14:51 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@AllArgsConstructor | 
				
			||||
@Api(value = "FDP大模型交互层",tags = "FDP大模型交互层") | 
				
			||||
@RequestMapping("/interactive") | 
				
			||||
@Business(module = BigModelConstants.MODULE_NAME,value = "FDP大模型交互层") | 
				
			||||
public class InteractiveController { | 
				
			||||
 | 
				
			||||
    private final IInteractiveService interactiveService; | 
				
			||||
 | 
				
			||||
    @ApiOperation("解析大模型函数") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    @PostMapping("/resolve") | 
				
			||||
    public R resolve(@RequestBody ModelFunctionReq req) { | 
				
			||||
        return interactiveService.resolve(req); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("提问") | 
				
			||||
    @ApiOperationSupport(order = 2) | 
				
			||||
    @GetMapping("/ask") | 
				
			||||
    public R ask(@RequestParam @ApiParam("用户提出问题") String question,@RequestParam @ApiParam("问答sessionId") String sessionId) { | 
				
			||||
        return interactiveService.ask(question, sessionId); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("站点、菜单鉴权") | 
				
			||||
    @ApiOperationSupport(order = 3) | 
				
			||||
    @RequestMapping(value = "/authentication",method = {RequestMethod.GET,RequestMethod.POST}) | 
				
			||||
    public R authentication(@RequestParam(required = false) @ApiParam("站点编号") String stationId, | 
				
			||||
                            @RequestParam @ApiParam("用户ID") String userId, | 
				
			||||
                            @RequestParam(required = false) @ApiParam("菜单ID") String menuId) { | 
				
			||||
        return R.status(interactiveService.authentication(stationId,userId,menuId)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("获取问答sessionId") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    @GetMapping("/getSessionId") | 
				
			||||
    public R<String> getSessionId() { | 
				
			||||
        return R.data(IdWorker.get32UUID()); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,35 @@
					 | 
				
			||||
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("chatId") | 
				
			||||
    @ApiModelProperty("问答ID,用于获取前端发起问答传入缓存中数据") | 
				
			||||
    @NotBlank | 
				
			||||
    private String sessionId; | 
				
			||||
 | 
				
			||||
    @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,41 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.factory; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; | 
				
			||||
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,26 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.dto.AuthDataDTO; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.dto.ControlDTO; | 
				
			||||
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(AuthDataDTO req); | 
				
			||||
 | 
				
			||||
    ExtraVO resolve(ModelFunctionReq req); | 
				
			||||
 | 
				
			||||
    ExtraVO controlDevice(ControlDTO req); | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,77 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; | 
				
			||||
import com.hnac.hzims.bigmodel.question.dto.QuestionDTO; | 
				
			||||
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 提问结果 | 
				
			||||
     */ | 
				
			||||
    @Deprecated | 
				
			||||
    void ask(String question, String sessionId, String userId); | 
				
			||||
 | 
				
			||||
    void ask(QuestionDTO question); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 特殊问题 | 
				
			||||
     * @param sessionId 会话ID | 
				
			||||
     * @param userId 提问人ID | 
				
			||||
     * @param extra 特殊问题内容 | 
				
			||||
     * @return 提问结果 | 
				
			||||
     */ | 
				
			||||
    @Deprecated | 
				
			||||
    void specialAsk(String sessionId, String userId, Map<String,Object> extra); | 
				
			||||
 | 
				
			||||
    void specialAsk(QuestionDTO questionDTO); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 知识库问题 | 
				
			||||
     * @param question 问题名称 | 
				
			||||
     * @param sessionId 会话ID | 
				
			||||
     * @param userId 提问人ID | 
				
			||||
     * @param knowledge 知识库名称 | 
				
			||||
     */ | 
				
			||||
    @Deprecated | 
				
			||||
    void knowledgeAsk(String question, String sessionId, String userId, String knowledge); | 
				
			||||
 | 
				
			||||
    void knowledgeAsk(QuestionDTO questionDTO); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 删除对话记录 | 
				
			||||
     * @param sessionId 会话ID | 
				
			||||
     */ | 
				
			||||
    void removeSessionId(String sessionId); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 获取热点问题 | 
				
			||||
     * @return 热点问题 | 
				
			||||
     */ | 
				
			||||
    List hotQuestions(); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 查询问答状态 | 
				
			||||
     * @param sessionIds 会话ID,按逗号分隔 | 
				
			||||
     * @return 答案列表 | 
				
			||||
     */ | 
				
			||||
    List<AnswerVO> getAnswerBySessionIds(String sessionIds); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 中断当前的问答 | 
				
			||||
     * @param sessionId 会话ID | 
				
			||||
     */ | 
				
			||||
    void askAbort(String sessionId); | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,26 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; | 
				
			||||
import io.swagger.annotations.ApiParam; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springframework.web.bind.annotation.RequestParam; | 
				
			||||
 | 
				
			||||
import javax.servlet.http.HttpServletRequest; | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 14:51 | 
				
			||||
 */ | 
				
			||||
public interface IInteractiveService { | 
				
			||||
 | 
				
			||||
    R resolve(ModelFunctionReq req); | 
				
			||||
 | 
				
			||||
    R ask(String question,String sessionId); | 
				
			||||
 | 
				
			||||
    List<AnswerVO> getAnswerBySessionIds(String sessionIds); | 
				
			||||
 | 
				
			||||
    Boolean authentication(String stationId, String userId, String menuId); | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,16 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FunctionEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.vo.ExtraVO; | 
				
			||||
 | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:46 | 
				
			||||
 */ | 
				
			||||
public interface IJumpPageService { | 
				
			||||
 | 
				
			||||
    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,89 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service.impl; | 
				
			||||
 | 
				
			||||
import com.google.common.collect.Lists; | 
				
			||||
import com.hnac.hzims.bigmodel.business.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.vo.ReductionDataVO; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.tool.utils.CollectionUtil; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springblade.core.tool.utils.StringUtil; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
 | 
				
			||||
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.getFunc()); | 
				
			||||
        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,129 @@
					 | 
				
			||||
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.operational.station.entity.StationEntity; | 
				
			||||
import com.hnac.hzims.operational.station.feign.IStationClient; | 
				
			||||
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.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.getItem(); | 
				
			||||
        String id = args.get("itemId"); | 
				
			||||
        String name = args.get("itemName"); | 
				
			||||
        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); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public ExtraVO resolve(String id) { | 
				
			||||
        ExtraVO extraVO = new ExtraVO(); | 
				
			||||
        extraVO.setImmediatelyJump(true); | 
				
			||||
        extraVO.setFunc(FuncRouteEnum.OPEN_CANVAS.getFunc()); | 
				
			||||
        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")); | 
				
			||||
        int picResource = Integer.parseInt(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}&itemName={itemName}", 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,43 @@
					 | 
				
			||||
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); | 
				
			||||
        result.setType(FuncRouteEnum.getEnumByFuncCode(result.getFunc()).getType().getType()); | 
				
			||||
        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,100 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service.impl; | 
				
			||||
 | 
				
			||||
import com.hnac.hzims.bigmodel.business.dto.ControlDeviceAuthDTO; | 
				
			||||
import com.hnac.hzims.bigmodel.business.feign.IAuthClient; | 
				
			||||
import com.hnac.hzims.bigmodel.business.service.AuthenticationService; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.constants.DataAuthTypeEnum; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.constants.FuncRouteEnum; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.dto.AuthDataDTO; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.dto.ControlDTO; | 
				
			||||
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 groovy.util.logging.Slf4j; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.log.exception.ServiceException; | 
				
			||||
import org.springblade.core.tool.utils.BeanUtil; | 
				
			||||
import org.springblade.core.tool.utils.DateUtil; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springblade.system.dto.DeptStationDTO; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
import org.springframework.util.Assert; | 
				
			||||
 | 
				
			||||
import java.util.HashMap; | 
				
			||||
import java.util.List; | 
				
			||||
import java.util.Map; | 
				
			||||
import java.util.Optional; | 
				
			||||
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; | 
				
			||||
    private final IAuthClient authClient; | 
				
			||||
 | 
				
			||||
    @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.getFunc()); | 
				
			||||
        return resolveService.resolve(req); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public ExtraVO controlDevice(ControlDTO req) { | 
				
			||||
        ExtraVO result = new ExtraVO(); | 
				
			||||
        Optional<ControlDeviceAuthDTO> optional = req.getYks().stream().map(controlDeviceDTO -> { | 
				
			||||
            ControlDeviceAuthDTO deviceAuthDTO = BeanUtil.copy(controlDeviceDTO, ControlDeviceAuthDTO.class); | 
				
			||||
            deviceAuthDTO.setUserId(req.getUserId()); | 
				
			||||
            return deviceAuthDTO; | 
				
			||||
        }).filter(d -> authClient.remoteAuth(d).isSuccess()).findFirst(); | 
				
			||||
        Assert.isTrue(optional.isPresent(),() -> { | 
				
			||||
            throw new ServiceException("鉴权失败!!"); | 
				
			||||
        }); | 
				
			||||
        // 封装返回的extra
 | 
				
			||||
        result.setFunc(FuncRouteEnum.CONTROL_DEVICE.getFunc()); | 
				
			||||
        result.setType(FuncRouteEnum.CONTROL_DEVICE.getType().getType()); | 
				
			||||
        Map<String,Object> params = BeanUtil.toMap(optional.get()); | 
				
			||||
        params.put("value", req.getValue()); | 
				
			||||
        result.setParams(params); | 
				
			||||
        return result; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    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.getItemId())).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,143 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service.impl; | 
				
			||||
 | 
				
			||||
import com.alibaba.fastjson.JSON; | 
				
			||||
import com.alibaba.fastjson.TypeReference; | 
				
			||||
import com.google.common.collect.Lists; | 
				
			||||
import com.hnac.hzims.bigmodel.business.feign.IAuthClient; | 
				
			||||
import com.hnac.hzims.bigmodel.business.service.AuthenticationService; | 
				
			||||
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.question.dto.QuestionDTO; | 
				
			||||
import com.hnac.hzims.bigmodel.utils.RequestClientUtil; | 
				
			||||
import com.hnac.hzims.bigmodel.websocket.sessionManager.InteractiveSessionManager; | 
				
			||||
import lombok.RequiredArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.springblade.core.log.logger.BladeLogger; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.BeanUtil; | 
				
			||||
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 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 BigModelInvokeUrl bigModelInvokeUrl; | 
				
			||||
    private final BladeLogger logger; | 
				
			||||
    private final SessionRedisManager sessionRedisManager; | 
				
			||||
    private final IAuthClient authClient; | 
				
			||||
 | 
				
			||||
    @Value("${fdp.host}") | 
				
			||||
    private String fdpHost; | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public void ask(String question, String sessionId, String userId) { | 
				
			||||
        Map<String,Object> params = new HashMap<>(); | 
				
			||||
        params.put("chat_id",sessionId); | 
				
			||||
        params.put("user_id", 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 ask(QuestionDTO question) { | 
				
			||||
        RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantAsk(), JSON.toJSONString(question)); | 
				
			||||
        sessionRedisManager.addSessionId(question.getChatId()); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public void specialAsk(String sessionId, String userId, Map<String, Object> extra) { | 
				
			||||
        Map<String,Object> params = new HashMap<>(); | 
				
			||||
        params.put("chat_id",sessionId); | 
				
			||||
        params.put("user_id", 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 specialAsk(QuestionDTO question) { | 
				
			||||
        RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantSpecialAsk(), JSON.toJSONString(question)); | 
				
			||||
        sessionRedisManager.addSessionId(question.getChatId()); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public void knowledgeAsk(String question, String sessionId, String userId, String knowledge) { | 
				
			||||
        Map<String,Object> params = new HashMap<>(); | 
				
			||||
        params.put("chat_id", sessionId); | 
				
			||||
        params.put("user_id", 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 knowledgeAsk(QuestionDTO question) { | 
				
			||||
        RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantKnowledgeAsk(), JSON.toJSONString(question)); | 
				
			||||
        sessionRedisManager.addSessionId(question.getChatId()); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public void removeSessionId(String sessionId) { | 
				
			||||
        this.askAbort(sessionId); | 
				
			||||
        // 移除内存sessionId
 | 
				
			||||
        InteractiveSessionManager.SESSION_POOL.remove(sessionId); | 
				
			||||
        sessionRedisManager.removeSessionId(sessionId); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public void askAbort(String sessionId) { | 
				
			||||
        Map<String,Object> params = new HashMap<>(); | 
				
			||||
        params.put("id",sessionId); | 
				
			||||
        RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAskAbort(), params); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @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("chat_ids",Func.toStrList(",",sessionIds).toArray()); | 
				
			||||
        return RequestClientUtil.postCall(fdpHost + bigModelInvokeUrl.getAssistantStatus(), params, new TypeReference<List<AnswerVO>>(){}); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    private Map<String,String[]> getAuthDataIds(String userId) { | 
				
			||||
        Map<String, String[]> result = new HashMap<>(2); | 
				
			||||
        R<Map<String, String[]>> authDataR = authClient.getAuthData(userId); | 
				
			||||
        result.putAll(authDataR.getData()); | 
				
			||||
        return result; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -1,105 +0,0 @@
					 | 
				
			||||
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.JSONObject; | 
				
			||||
import com.hnac.hzims.bigmodel.configuration.BigModelInvokeUrl; | 
				
			||||
import com.hnac.hzims.bigmodel.entity.FunctionEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.req.ModelFunctionReq; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.service.IInteractiveService; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.service.IJumpPageService; | 
				
			||||
import com.hnac.hzims.bigmodel.function.service.IFunctionService; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.vo.AnswerVO; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import lombok.RequiredArgsConstructor; | 
				
			||||
import lombok.extern.slf4j.Slf4j; | 
				
			||||
import org.springblade.core.log.exception.ServiceException; | 
				
			||||
import org.springblade.core.secure.utils.AuthUtil; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springblade.core.tool.utils.StringUtil; | 
				
			||||
import org.springframework.beans.factory.annotation.Value; | 
				
			||||
import org.springframework.data.redis.core.RedisTemplate; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
import org.springframework.util.Assert; | 
				
			||||
 | 
				
			||||
import javax.servlet.http.HttpServletRequest; | 
				
			||||
import javax.servlet.http.HttpServletResponse; | 
				
			||||
import javax.servlet.http.HttpSession; | 
				
			||||
 | 
				
			||||
import java.util.HashMap; | 
				
			||||
import java.util.List; | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
import static com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants.*; | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 14:51 | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@Slf4j | 
				
			||||
@RequiredArgsConstructor | 
				
			||||
public class InteractiveServiceImpl implements IInteractiveService { | 
				
			||||
 | 
				
			||||
    private final IJumpPageService jumpPageService; | 
				
			||||
    private final IFunctionService functionService; | 
				
			||||
    private final BigModelInvokeUrl bigModelInvokeUrl; | 
				
			||||
    @Value("${fdp.host}") | 
				
			||||
    private String fdpHost; | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public R resolve(ModelFunctionReq req) { | 
				
			||||
        //TODO 数据鉴权
 | 
				
			||||
        FunctionEntity function = functionService.getFunctionByCode(req.getFunctionName()); | 
				
			||||
        TypeEnum typeEnum = TypeEnum.getTypeEnumByType(function.getType()); | 
				
			||||
        switch (typeEnum) { | 
				
			||||
            // 页面跳转
 | 
				
			||||
            case JUMP: | 
				
			||||
                String extra = jumpPageService.dealJumpTypeFunction(function, req.getFunctionArgs()); | 
				
			||||
                Assert.isTrue(StringUtil.isNotBlank(extra) && Func.isNotEmpty(extra), () -> { | 
				
			||||
                    throw new ServiceException("解析" + function.getName() + "函数失败!"); | 
				
			||||
                }); | 
				
			||||
                return R.data(extra); | 
				
			||||
            default: | 
				
			||||
                throw new ServiceException("函数解析失败!"); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public R ask(String question,String sessionId) { | 
				
			||||
        Long userId = AuthUtil.getUserId(); | 
				
			||||
        //TODO 保存问题
 | 
				
			||||
        Map<String,String> params = new HashMap<>(); | 
				
			||||
        params.put("id",sessionId); | 
				
			||||
        params.put("userid",userId.toString()); | 
				
			||||
        params.put("query",question); | 
				
			||||
        HttpResponse response = HttpRequest.post(fdpHost + bigModelInvokeUrl.getAssistantAsk()) | 
				
			||||
                .body(JSON.toJSONString(params)).execute(); | 
				
			||||
        Assert.isTrue(response.getStatus() == HttpServletResponse.SC_OK && "1".equals(JSONObject.parseObject(response.body()).getString("success")), () -> { | 
				
			||||
            throw new ServiceException("远程调用大模型【发起问答】接口失败!"); | 
				
			||||
        }); | 
				
			||||
        return R.data(JSONObject.parseObject(response.body()).getString("data")); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public List<AnswerVO> getAnswerBySessionIds(String sessionIds) { | 
				
			||||
        Map<String,String> params = new HashMap<>(); | 
				
			||||
        params.put("ids",sessionIds); | 
				
			||||
        HttpResponse response = HttpRequest.post(fdpHost + bigModelInvokeUrl.getAssistantStatus()) | 
				
			||||
                .body(JSON.toJSONString(params)).execute(); | 
				
			||||
        Assert.isTrue(response.getStatus() == HttpServletResponse.SC_OK && "1".equals(JSONObject.parseObject(response.body()).getString("success")), () -> { | 
				
			||||
            throw new ServiceException("远程调用大模型【发起问答】接口失败!"); | 
				
			||||
        }); | 
				
			||||
        String data = JSONObject.parseObject(response.body()).getString("data"); | 
				
			||||
        return JSONArray.parseArray(data,AnswerVO.class); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public Boolean authentication(String stationId, String userId, String menuId) { | 
				
			||||
        //TODO 鉴权逻辑完善
 | 
				
			||||
        return true; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -1,45 +0,0 @@
					 | 
				
			||||
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.function.service.IFuncParamService; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.constants.FunctionConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.interactive.service.IJumpPageService; | 
				
			||||
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.springblade.core.tool.utils.StringUtil; | 
				
			||||
import org.springframework.stereotype.Service; | 
				
			||||
import org.springframework.util.Assert; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
import java.util.Map; | 
				
			||||
import java.util.Optional; | 
				
			||||
import java.util.Set; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/26 11:46 | 
				
			||||
 */ | 
				
			||||
@Service | 
				
			||||
@AllArgsConstructor | 
				
			||||
@Slf4j | 
				
			||||
public class JumpPageServiceImpl implements IJumpPageService { | 
				
			||||
 | 
				
			||||
    private final IFuncParamService paramService; | 
				
			||||
    private final JumpRouteJoinStrategy strategy; | 
				
			||||
 | 
				
			||||
    @Override | 
				
			||||
    public String dealJumpTypeFunction(FunctionEntity function,Map<String,String> args) { | 
				
			||||
        List<FuncParamEntity> params = paramService.getParamsByFuncId(function.getId()); | 
				
			||||
        Optional<FuncParamEntity> paramOptional = params.stream().filter(p -> p.getIsRequire()).filter(p -> !args.containsKey(p.getAlias())).findAny(); | 
				
			||||
        Assert.isTrue(!paramOptional.isPresent(), () -> { | 
				
			||||
            throw new ServiceException("解析参数失败,缺少参数:" + paramOptional.get().getName()); | 
				
			||||
        }); | 
				
			||||
        // 跳转页面逻辑
 | 
				
			||||
        ExtraVO extraVO = strategy.resolve(function,args); | 
				
			||||
        return JSON.toJSONString(extraVO); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -1,134 +0,0 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.interactive.service.impl; | 
				
			||||
 | 
				
			||||
import com.alibaba.fastjson.JSON; | 
				
			||||
import com.alibaba.fastjson.JSONObject; | 
				
			||||
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 org.springblade.core.log.exception.ServiceException; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springblade.core.tool.utils.StringUtil; | 
				
			||||
import org.springframework.stereotype.Component; | 
				
			||||
import org.springframework.util.Assert; | 
				
			||||
 | 
				
			||||
import java.util.HashMap; | 
				
			||||
import java.util.List; | 
				
			||||
import java.util.Map; | 
				
			||||
import java.util.Set; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/04/30 11:38 | 
				
			||||
 */ | 
				
			||||
@Component | 
				
			||||
public class JumpRouteJoinStrategy { | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 解析大模型传参 | 
				
			||||
     * @param args 大模型传参 | 
				
			||||
     * @return 跳转path所需要的参数 | 
				
			||||
     */ | 
				
			||||
    public ExtraVO resolve(FunctionEntity function,Map<String,String> args) { | 
				
			||||
        FuncRouteEnum routeEnum = FuncRouteEnum.getEnumByFuncCode(function.getCode()); | 
				
			||||
        if(Func.isNotEmpty(routeEnum)) { | 
				
			||||
            switch(routeEnum) { | 
				
			||||
                case OPEN_SCADA: | 
				
			||||
                    return this.getScadaExtra(args,function); | 
				
			||||
                default: | 
				
			||||
                    break; | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
        return null; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    private ExtraVO getScadaExtra(Map<String,String> args,FunctionEntity function) { | 
				
			||||
        // 跳转页面逻辑
 | 
				
			||||
        ExtraVO extraVO = new ExtraVO(); | 
				
			||||
        Map<String, String> params = this.scadaResolve(args); | 
				
			||||
        // 根据hz3000画面版本获取path
 | 
				
			||||
        Integer picResource = Integer.valueOf(params.get("picResource")); | 
				
			||||
        JSONObject pathObject = JSONObject.parseObject(function.getPath()); | 
				
			||||
        // 云组态
 | 
				
			||||
        if(picResource == 0) { | 
				
			||||
            String scada = pathObject.getString("scada"); | 
				
			||||
            extraVO.setRoute(this.replacePath(scada, params)); | 
				
			||||
            extraVO.setRoute(scada); | 
				
			||||
        } | 
				
			||||
        // v3.0
 | 
				
			||||
        else if (picResource == 1) { | 
				
			||||
            String v3 = pathObject.getString("v3"); | 
				
			||||
            extraVO.setRoute(this.replacePath(v3, params)); | 
				
			||||
        } | 
				
			||||
        // v4.0
 | 
				
			||||
        else if (picResource == 2) { | 
				
			||||
            String v4 = pathObject.getString("v4"); | 
				
			||||
            // pic_name 去掉头部的/ 以及尾部的.js
 | 
				
			||||
            String context = params.get("context"); | 
				
			||||
            context = this.removeHeadChars(context,"/"); | 
				
			||||
            context = this.removeTailChars(context,".js"); | 
				
			||||
            params.put("context",context); | 
				
			||||
            extraVO.setRoute(this.replacePath(v4, params)); | 
				
			||||
        } | 
				
			||||
        else { | 
				
			||||
            throw new ServiceException("解析出来的画面类型在云组态、v3、v4类型之外,无法解析路由"); | 
				
			||||
        } | 
				
			||||
        extraVO.setType(FunctionConstants.TypeEnum.JUMP.getType()); | 
				
			||||
        return extraVO; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 打开实时画面 | 
				
			||||
     * @param args 大模型解析参数 | 
				
			||||
     * @return 实时画面路径拼接所需参数 | 
				
			||||
     */ | 
				
			||||
    private Map<String,String> scadaResolve(Map<String,String> args) { | 
				
			||||
        Map<String,String> result = new HashMap<>(); | 
				
			||||
        Assert.isTrue(args.containsKey("params"), () -> { | 
				
			||||
            throw new ServiceException("大模型传参缺少params参数"); | 
				
			||||
        }); | 
				
			||||
        // 参数格式为:picResource^context^stationNum^projectId^taskId^name^id
 | 
				
			||||
        List<String> params = Func.toStrList("\\^", args.get("params")); | 
				
			||||
        Assert.isTrue(params.size() == 7,() -> { | 
				
			||||
            throw new ServiceException("大模型传参params长度错误,传参为:" + args.get("params")); | 
				
			||||
        }); | 
				
			||||
        result.put("picResource",params.get(0)); | 
				
			||||
        result.put("context",params.get(1)); | 
				
			||||
        result.put("stationNum",params.get(2)); | 
				
			||||
        result.put("projectId",params.get(3)); | 
				
			||||
        result.put("taskId",params.get(4)); | 
				
			||||
        result.put("name",params.get(5)); | 
				
			||||
        result.put("id",params.get(6)); | 
				
			||||
        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,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,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,73 @@
					 | 
				
			||||
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.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.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.getItem(); | 
				
			||||
        String id = args.get("itemId"); | 
				
			||||
        String name = args.get("itemName"); | 
				
			||||
        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.getFunc()); | 
				
			||||
            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 itemId; | 
				
			||||
 | 
				
			||||
    @ApiModelProperty("数据名称") | 
				
			||||
    private String itemName; | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -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 = "itemId") | 
				
			||||
    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,76 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.maintenance.controller; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.metadata.IPage; | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.maintenance.entity.DatasourceEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.maintenance.service.DataSourceService; | 
				
			||||
import io.swagger.annotations.Api; | 
				
			||||
import io.swagger.annotations.ApiOperation; | 
				
			||||
import io.swagger.annotations.ApiParam; | 
				
			||||
import lombok.AllArgsConstructor; | 
				
			||||
import org.springblade.core.mp.support.Condition; | 
				
			||||
import org.springblade.core.mp.support.Query; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springframework.beans.factory.annotation.Autowired; | 
				
			||||
import org.springframework.beans.factory.annotation.Qualifier; | 
				
			||||
import org.springframework.web.bind.annotation.*; | 
				
			||||
 | 
				
			||||
import java.util.List; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/05 16:55 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/datasource") | 
				
			||||
@Api(value = "数据源管理",tags = "数据源管理") | 
				
			||||
public class DataSourceController { | 
				
			||||
 | 
				
			||||
    @Autowired | 
				
			||||
    @Qualifier("dataSourceMaintenanceService") | 
				
			||||
    private DataSourceService dataSourceService; | 
				
			||||
 | 
				
			||||
    @GetMapping("/listPage") | 
				
			||||
    @ApiOperation(value = "分页查询") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    public R<IPage<DatasourceEntity>> listPage(Query query, DatasourceEntity req) { | 
				
			||||
        return R.data(dataSourceService.page(Condition.getPage(query),Condition.getQueryWrapper(req).lambda())); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @GetMapping("/detail") | 
				
			||||
    @ApiOperation(value = "查看详情") | 
				
			||||
    @ApiOperationSupport(order = 2) | 
				
			||||
    public R<DatasourceEntity> detail(@RequestParam @ApiParam("主键ID") Long id) { | 
				
			||||
        return R.data(dataSourceService.getById(id)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @PostMapping("/save") | 
				
			||||
    @ApiOperation(value = "保存数据源配置") | 
				
			||||
    @ApiOperationSupport(order = 3) | 
				
			||||
    public R save(@RequestBody DatasourceEntity req) { | 
				
			||||
        return R.status(dataSourceService.save(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @DeleteMapping("/remove") | 
				
			||||
    @ApiOperation(value = "删除数据源配置") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    public R remove(@RequestParam @ApiParam("主键ID,按逗号分隔") String ids) { | 
				
			||||
        return R.status(dataSourceService.removeByIds(Func.toLongList(",",ids))); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @PutMapping("/update") | 
				
			||||
    @ApiOperation(value = "编辑数据源配置") | 
				
			||||
    @ApiOperationSupport(order = 5) | 
				
			||||
    public R update(@RequestBody DatasourceEntity req) { | 
				
			||||
        return R.status(dataSourceService.updateById(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @GetMapping("/list") | 
				
			||||
    @ApiOperation(value = "列表查询") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    public R<List<DatasourceEntity>> list(DatasourceEntity req) { | 
				
			||||
        return R.data(dataSourceService.list(Condition.getQueryWrapper(req).lambda())); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,56 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.maintenance.controller; | 
				
			||||
 | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.BigModelConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.maintenance.service.TableColumnService; | 
				
			||||
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; | 
				
			||||
import java.util.Map; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/04 09:28 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/table/info") | 
				
			||||
@Api(value = "数据库表、列信息查询管理",tags = "数据库表、列信息查询管理") | 
				
			||||
@Business(module = BigModelConstants.APP_NAME,value = "数据库表、列信息查询管理",ignore = false) | 
				
			||||
@AllArgsConstructor | 
				
			||||
public class TableColumnController { | 
				
			||||
 | 
				
			||||
    private final TableColumnService tableColumnService; | 
				
			||||
 | 
				
			||||
    @ApiOperation("获取数据库") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    @GetMapping("/getDatabase") | 
				
			||||
    public R<List<Map<String,Object>>> getDatabase(@RequestParam @ApiParam(value = "数据源名") String datasource) { | 
				
			||||
        return R.data(tableColumnService.getDatabase(datasource)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("获取数据库表列表") | 
				
			||||
    @ApiOperationSupport(order = 2) | 
				
			||||
    @GetMapping("/getTables") | 
				
			||||
    public R<List<Map<String,Object>>> getTables(@RequestParam @ApiParam(value = "数据源名") String datasource, | 
				
			||||
                                                 @RequestParam @ApiParam(value = "数据库名") String database) { | 
				
			||||
        return R.data(tableColumnService.getTables(datasource,database)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @ApiOperation("获取数据库表列列表") | 
				
			||||
    @ApiOperationSupport(order = 3) | 
				
			||||
    @GetMapping("/getColumns") | 
				
			||||
    public R<List<Map<String,Object>>> getColumns(String datasource, | 
				
			||||
                                                  @RequestParam @ApiParam(value = "数据源名") String database, | 
				
			||||
                                                  @RequestParam @ApiParam(value = "数据库表名") String tableName) { | 
				
			||||
        return R.data(tableColumnService.getColumns(datasource,database,tableName)); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,61 @@
					 | 
				
			||||
package com.hnac.hzims.bigmodel.maintenance.controller; | 
				
			||||
 | 
				
			||||
import com.baomidou.mybatisplus.core.metadata.IPage; | 
				
			||||
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; | 
				
			||||
import com.hnac.hzims.bigmodel.BigModelConstants; | 
				
			||||
import com.hnac.hzims.bigmodel.maintenance.entity.TableInfoEntity; | 
				
			||||
import com.hnac.hzims.bigmodel.maintenance.service.TableInfoService; | 
				
			||||
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.mp.support.Condition; | 
				
			||||
import org.springblade.core.mp.support.Query; | 
				
			||||
import org.springblade.core.tool.api.R; | 
				
			||||
import org.springblade.core.tool.utils.Func; | 
				
			||||
import org.springframework.web.bind.annotation.*; | 
				
			||||
 | 
				
			||||
import javax.validation.Valid; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @Author: huangxing | 
				
			||||
 * @Date: 2024/07/04 15:26 | 
				
			||||
 */ | 
				
			||||
@RestController | 
				
			||||
@RequestMapping("/tableInfo") | 
				
			||||
@Api(value = "数据库信息管理",tags = "数据库信息管理") | 
				
			||||
@AllArgsConstructor | 
				
			||||
@Business(module = BigModelConstants.APP_NAME,value = "数据库信息管理",ignore = false) | 
				
			||||
public class TableInfoController { | 
				
			||||
 | 
				
			||||
    private final TableInfoService tableInfoService; | 
				
			||||
 | 
				
			||||
    @PostMapping("/save") | 
				
			||||
    @ApiOperation("保存数据库信息") | 
				
			||||
    @ApiOperationSupport(order = 1) | 
				
			||||
    public R save(@RequestBody @Valid TableInfoEntity req) { | 
				
			||||
        return R.data(tableInfoService.save(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @PostMapping("/update") | 
				
			||||
    @ApiOperation("编辑数据库信息") | 
				
			||||
    @ApiOperationSupport(order = 2) | 
				
			||||
    public R update(@RequestBody TableInfoEntity req) { | 
				
			||||
        return R.data(tableInfoService.updateById(req)); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @GetMapping("/listPage") | 
				
			||||
    @ApiOperation("数据库信息列表查询") | 
				
			||||
    @ApiOperationSupport(order = 3) | 
				
			||||
    public R<IPage<TableInfoEntity>> listPage(Query query, TableInfoEntity req) { | 
				
			||||
        return R.data(tableInfoService.page(Condition.getPage(query),Condition.getQueryWrapper(req).lambda())); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    @DeleteMapping("/removeByIds") | 
				
			||||
    @ApiOperation("删除数据库信息") | 
				
			||||
    @ApiOperationSupport(order = 4) | 
				
			||||
    public R removeByIds(@RequestParam @ApiParam("id,按逗号分隔") String ids) { | 
				
			||||
        return R.status(tableInfoService.removeByIds(Func.toLongList(",",ids))); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue