package com.dsideal.base.DataEase.Util ;
import cn.hutool.http.HttpUtil ;
import com.alibaba.fastjson.JSONObject ;
import com.dsideal.base.DataEase.Model.DataEaseModel ;
import com.dsideal.base.Tools.Util.LocalMysqlConnectUtil ;
import com.dsideal.base.Util.CommonUtil ;
import com.dsideal.base.Util.FileUtil ;
import com.jfinal.kit.PathKit ;
import com.jfinal.plugin.activerecord.Db ;
import com.jfinal.plugin.activerecord.Record ;
import java.util.* ;
import static com.dsideal.base.DataEase.Model.DataEaseModel.DB_NAME ;
public class CopyBigScreen {
//DataEase部署的地址
public static String urlPrefix = "http://10.10.14.203" ;
public static DataEaseModel dm = new DataEaseModel ( ) ;
/ * *
* 功 能 : 获 取 DataEase 的 Token
*
* @return
* /
public static String getToken ( ) {
//读取Data目录下DataEaseLogin.json文件
JSONObject jo = FileUtil . readJsonFile ( PathKit . getRootClassPath ( ) + "/Data/DataEaseLogin.json" ) ;
String url = urlPrefix + "/de2api/login/localLogin" ;
String res = HttpUtil . createPost ( url ) . contentType ( "application/json" ) . body ( jo . toString ( ) ) . execute ( ) . body ( ) ;
return JSONObject . parseObject ( res ) . getJSONObject ( "data" ) . getString ( "token" ) ;
}
/ * *
* 清 理 指 定 名 称 大 屏 的 所 有 副 本 , 为 了 再 次 生 成 不 重 复
*
* @param bigScreenName 大 屏 名 称
* /
public static void clearScreen ( String bigScreenName ) {
//一、先删除后插入保持健康:保留:【云南省教育决策支持系统【市州】】,删除掉云南省教育决策支持系统【市州】+昆明市,云南省教育决策支持系统【市州】+楚雄州等数据
String sql = "select * from data_visualization_info where name like '%" + bigScreenName + "%' and name <>'" + bigScreenName + "'" ;
List < Record > toDelList = Db . use ( DB_NAME ) . find ( sql ) ;
for ( Record record : toDelList ) {
long id = record . getLong ( "id" ) ;
//(1) 删除关联的表core_chart_view
sql = "delete from core_chart_view where scene_id=?" ;
Db . use ( DB_NAME ) . update ( sql , id ) ;
//(2) 删除共享链接表
sql = "delete from xpack_share where resource_id=?" ;
Db . use ( DB_NAME ) . update ( sql , id ) ;
//(3) 删除可视化资源表
sql = "delete from core_opt_recent where resource_id=?" ;
Db . use ( DB_NAME ) . update ( sql , id ) ;
// (4) 跳转记录表
sql = "delete from visualization_link_jump where source_dv_id=?" ;
Db . use ( DB_NAME ) . update ( sql , id ) ;
// (5) 跳转配置表
sql = "select * from visualization_link_jump_info where target_dv_id=?" ;
List < Record > jumpList = Db . use ( DB_NAME ) . find ( sql , id ) ;
for ( Record r : jumpList ) {
long jumpId = r . getLong ( "id" ) ;
sql = "delete from visualization_link_jump_target_view_info where link_jump_info_id =?" ;
Db . use ( DB_NAME ) . update ( sql , jumpId ) ;
sql = "delete from visualization_link_jump_info where id=?" ;
Db . use ( DB_NAME ) . update ( sql , jumpId ) ;
}
// (6) 外部参数关联关系表
sql = "select params_id from visualization_outer_params where visualization_id=?" ;
String paramsId = Db . use ( DB_NAME ) . queryStr ( sql , id ) ;
sql = "select params_info_id from visualization_outer_params_info where params_id=?" ;
String params_info_id = Db . use ( DB_NAME ) . queryStr ( sql , paramsId ) ;
sql = "delete from visualization_outer_params_target_view_info where params_info_id=?" ;
Db . use ( DB_NAME ) . update ( sql , params_info_id ) ;
sql = "delete from visualization_outer_params_info where params_id=?" ;
Db . use ( DB_NAME ) . update ( sql , paramsId ) ;
sql = "delete from visualization_outer_params where visualization_id=?" ;
Db . use ( DB_NAME ) . update ( sql , id ) ;
//(7) 删除主表数据
Db . use ( DB_NAME ) . deleteById ( "data_visualization_info" , id ) ;
}
}
/ * *
* 获 取 指 定 大 屏 的 信 息
*
* @param dataVisualizationNameCity
* @return
* /
public static Record getVisualizationByName ( String dataVisualizationNameCity ) {
String sql = "select * from data_visualization_info where name =?" ;
return Db . use ( DataEaseModel . DB_NAME ) . findFirst ( sql , dataVisualizationNameCity ) ;
}
/ * *
* 调 用 API 拷 贝 大 屏
*
* @param screenName 目 标 大 屏 名 称
* @param id 源 大 屏 ID
* @param pid 源 大 屏 所 属 文 件 夹 id
* @return
* /
public static long callApiToCopy ( String screenName , long id , long pid ) throws InterruptedException {
//拷贝API
String url = urlPrefix + "/de2api/dataVisualization/copy" ;
JSONObject jo = new JSONObject ( ) ;
jo . put ( "nodeType" , "leaf" ) ;
jo . put ( "name" , screenName ) ;
jo . put ( "type" , "dataV" ) ;
jo . put ( "id" , id ) ;
jo . put ( "pid" , pid ) ;
String res = HttpUtil . createPost ( url ) . contentType ( "application/json" )
. header ( "x-de-token" , getToken ( ) ) . body ( jo . toString ( ) ) . execute ( ) . body ( ) ;
System . out . println ( res ) ;
Thread . sleep ( 1000 ) ;
long childId = Long . parseLong ( JSONObject . parseObject ( res ) . getString ( "data" ) ) ;
//更新pid,没有这步的话,在界面上看不到拷贝出来的大屏!
String sql = "update data_visualization_info set pid=? where id=?" ;
Db . use ( DB_NAME ) . update ( sql , pid , childId ) ;
return childId ;
}
/ * *
* 发 布 共 享 链 接
*
* @param motherShareRecord
* @param childId
* /
public static void publishShare ( Record motherShareRecord , long childId ) {
//发布共享链接
Record shareRecord = new Record ( ) . setColumns ( motherShareRecord ) ;
shareRecord . set ( "resource_id" , childId ) ;
shareRecord . set ( "id" , CommonUtil . getSnowId ( ) ) ;
shareRecord . set ( "uuid" , CommonUtil . randomString ( 8 ) ) ; //大小写字母和数字组合, 长度为8
Db . use ( DataEaseModel . DB_NAME ) . save ( "xpack_share" , "id" , shareRecord ) ;
}
public static List < Record > getAllViewList ( long screenId ) {
String sql = "select * from core_chart_view where scene_id=?" ;
return Db . use ( DB_NAME ) . find ( sql , screenId ) ;
}
/ * *
* 拷 贝 城 市 大 屏
*
* @param dataVisualizationNameCity
* /
public static void copyCityScreen ( String dataVisualizationNameCity ) throws InterruptedException {
//清理掉旧的数据
clearScreen ( dataVisualizationNameCity ) ;
//母屏信息
Record motherRecord = getVisualizationByName ( dataVisualizationNameCity ) ;
long motherId = motherRecord . getLong ( "id" ) ; //母屏ID
long pid = motherRecord . getLong ( "pid" ) ; //隶属文件夹
//母屏共享链接
String sql = "select * from xpack_share where resource_id=?" ;
Record motherShareRecord = Db . use ( DataEaseModel . DB_NAME ) . findFirst ( sql , motherId ) ;
//母屏的外部参数
sql = "select * from visualization_outer_params where visualization_id =?" ;
Record motherOuterParamsRecord = Db . use ( DB_NAME ) . findFirst ( sql , motherId ) ;
String motherParamsId = motherOuterParamsRecord . getStr ( "params_id" ) ;
//外部参数关联关系表
sql = "select * from visualization_outer_params_info where params_id=?" ;
Record paramsInfoRecord = Db . use ( DB_NAME ) . findFirst ( sql , motherParamsId ) ;
String params_info_id = paramsInfoRecord . getStr ( "params_info_id" ) ;
//母屏的visualization_outer_params_target_view_info
sql = "select * from visualization_outer_params_target_view_info where params_info_id=? order by id" ;
List < Record > targetViewInfoList = Db . use ( DB_NAME ) . find ( sql , params_info_id ) ;
//按16个市州进行生成
List < String > list = dm . getCityNameList ( ) ;
for ( int i = 0 ; i < list . size ( ) ; i + + ) {
String cityName = list . get ( i ) ;
String screenName = dataVisualizationNameCity + cityName ; //要拷贝出来的屏幕名称
long childId = callApiToCopy ( screenName , motherId , pid ) ;
// 修改地图中城市
List < Record > listMap = dm . getMap ( childId ) ;
//获取城市编码
String area_code = dm . getCityCode ( cityName ) ;
//core_chart_view表
for ( Record record : listMap ) {
long id = record . getLong ( "id" ) ;
JSONObject jo = JSONObject . parseObject ( record . getStr ( "custom_attr" ) ) ;
//修改城市编码
jo . getJSONObject ( "map" ) . put ( "id" , area_code ) ;
jo . getJSONObject ( "map" ) . put ( "level" , "city" ) ;
//写到数据库
String jsonString = jo . toString ( ) ;
Db . use ( DB_NAME ) . update ( "update core_chart_view set custom_attr=? where id=?" , jsonString , id ) ;
}
//修改外部参数
Record cityOuterParamsRecord = new Record ( ) . setColumns ( motherOuterParamsRecord ) ;
cityOuterParamsRecord . set ( "params_id" , UUID . randomUUID ( ) . toString ( ) ) ;
cityOuterParamsRecord . set ( "visualization_id" , childId ) ;
Db . use ( DB_NAME ) . save ( "visualization_outer_params" , "params_id" , cityOuterParamsRecord ) ;
//复制外部参数关联关系表
Record cityParamsInfoRecord = new Record ( ) . setColumns ( paramsInfoRecord ) ;
cityParamsInfoRecord . set ( "params_id" , cityOuterParamsRecord . getStr ( "params_id" ) ) ;
cityParamsInfoRecord . set ( "params_info_id" , UUID . randomUUID ( ) . toString ( ) ) ;
Db . use ( DB_NAME ) . save ( "visualization_outer_params_info" , "params_info_id" , cityParamsInfoRecord ) ;
List < Record > childChartViewMap = getAllViewList ( childId ) ;
List < Record > writeList = new ArrayList < > ( ) ;
for ( int j = 0 ; j < targetViewInfoList . size ( ) ; j + + ) {
Record record = targetViewInfoList . get ( j ) ;
record . set ( "target_view_id" , childChartViewMap . get ( j ) . getStr ( "id" ) ) ;
record . set ( "target_id" , UUID . randomUUID ( ) . toString ( ) ) ; //主键,全新生成
record . set ( "params_info_id" , cityParamsInfoRecord . getStr ( "params_info_id" ) ) ; //附本的params_info_id
writeList . add ( record ) ;
}
Db . use ( DB_NAME ) . batchSave ( "visualization_outer_params_target_view_info" , writeList , 100 ) ;
//发布共享链接
publishShare ( motherShareRecord , childId ) ;
System . out . println ( ( i + 1 ) + "、" + cityName + "修改完成,共" + ( list . size ( ) ) + "个。" ) ;
}
System . out . println ( list . size ( ) + "个城市大屏拷贝完成!" ) ;
}
/ * *
* 拷 贝 省 级 大 屏
*
* @param dataVisualizationProvince 省 级 大 屏 的 名 称
* /
public static void copyProvinceScreen ( String dataVisualizationProvince ) throws InterruptedException {
//清理掉旧的数据
clearScreen ( dataVisualizationProvince ) ;
//母屏信息
Record motherRecord = getVisualizationByName ( dataVisualizationProvince ) ;
long motherId = motherRecord . getLong ( "id" ) ; //母屏ID
long pid = motherRecord . getLong ( "pid" ) ; //隶属文件夹
//母屏共享链接
String sql = "select * from xpack_share where resource_id=?" ;
Record motherShareRecord = Db . use ( DataEaseModel . DB_NAME ) . findFirst ( sql , motherId ) ;
String screenName = dataVisualizationProvince + "【黄海】" ; //要拷贝出来的屏幕名称
//拷贝API
long childId = callApiToCopy ( screenName , motherId , pid ) ;
//发布共享链接
publishShare ( motherShareRecord , childId ) ;
System . out . println ( "省级大屏拷贝完成!" ) ;
}
/ * *
* 获 取 城 市 的 共 享 链 接
*
* @param dataVisualizationName
* @param cityName
* @return
* /
public static String getCityShare ( String dataVisualizationName , String cityName ) {
String screenName = dataVisualizationName + cityName ;
String sql = "select * from data_visualization_info where name =?" ;
Record record = Db . use ( DataEaseModel . DB_NAME ) . findFirst ( sql , screenName ) ;
long id = record . getLong ( "id" ) ;
sql = "select * from xpack_share where resource_id=?" ;
Record shareRecord = Db . use ( DataEaseModel . DB_NAME ) . findFirst ( sql , id ) ;
System . out . println ( cityName + "的共享链接:" + shareRecord . getStr ( "uuid" ) ) ;
return shareRecord . getStr ( "uuid" ) ;
}
public static void main ( String [ ] args ) throws InterruptedException {
//连接本地数据库系统
LocalMysqlConnectUtil . Init ( ) ;
//获取省级大屏名称
String dataVisualizationProvince = LocalMysqlConnectUtil . PropKit . get ( "dataEase.dataVisualizationProvince" ) ;
//获取市州级大屏名称
String dataVisualizationNameCity = LocalMysqlConnectUtil . PropKit . get ( "dataEase.dataVisualizationNameCity" ) ;
//拷贝省级大屏
copyProvinceScreen ( dataVisualizationProvince ) ;
//拷贝市州级大屏
copyCityScreen ( dataVisualizationNameCity ) ;
//更新复制出的省级大屏的链接路由
Record motherRecord = getVisualizationByName ( dataVisualizationProvince + "【黄海】" ) ;
long motherId = motherRecord . getLong ( "id" ) ; //母屏ID
String sql = "update visualization_link_jump_info set content=REPLACE(content,'/dsBase/dataease/route?city_name=','/dsBase/dataease/routeV2?city_name=') where link_jump_id in (select id from visualization_link_jump where source_dv_id=?)" ;
Db . use ( DB_NAME ) . update ( sql , motherId ) ;
System . out . println ( "恭喜,所有操作成功完成~~~" ) ;
}
}