You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

298 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
//母屏的target_view_id
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("恭喜,所有操作成功完成~~~");
}
}