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 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 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 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 targetViewInfoList = Db.use(DB_NAME).find(sql, params_info_id); //按16个市州进行生成 List 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 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 childChartViewMap = getAllViewList(childId); List 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("恭喜,所有操作成功完成~~~"); } }