SagaFileMoveApp.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. package com.persagy.filemove.app;
  2. import com.persagy.filemove.dto.SagaFileMoveDTO;
  3. import com.persagy.filemove.service.SagaFileMoveService;
  4. import com.persagy.filemove.util.StringTools;
  5. import javafx.application.Application;
  6. import javafx.collections.FXCollections;
  7. import javafx.geometry.Insets;
  8. import javafx.geometry.Pos;
  9. import javafx.scene.Node;
  10. import javafx.scene.Scene;
  11. import javafx.scene.control.*;
  12. import javafx.scene.control.Label;
  13. import javafx.scene.control.Menu;
  14. import javafx.scene.control.MenuBar;
  15. import javafx.scene.control.MenuItem;
  16. import javafx.scene.control.TextField;
  17. import javafx.scene.layout.BorderPane;
  18. import javafx.scene.layout.HBox;
  19. import javafx.scene.layout.Pane;
  20. import javafx.scene.layout.VBox;
  21. import javafx.scene.paint.Color;
  22. import javafx.stage.Stage;
  23. import javax.sound.midi.Soundbank;
  24. import java.lang.reflect.Field;
  25. import java.util.LinkedHashMap;
  26. public class SagaFileMoveApp extends Application {
  27. private static int appWidth = 600;
  28. private static int appHeight = 500;
  29. private SagaFileMoveDTO dto = new SagaFileMoveDTO();
  30. private SagaFileMoveService service = new SagaFileMoveService(dto);
  31. /** 文件服务上传下载接口类型 */
  32. private static final String[] apiTypes = {"file", "image"};
  33. /** 对象类型 */
  34. private static String[] objTypes;
  35. /** 对象类型对应信息点 */
  36. private static final LinkedHashMap<String, String[]> objToInfoCode = new LinkedHashMap<>();
  37. static {
  38. objToInfoCode.put("Fl", new String[]{"FloorMap"});
  39. objToInfoCode.put("Eq", new String[]{"EquipQRCode"});
  40. objToInfoCode.put("Sp", new String[]{"RoomQRCode"});
  41. objToInfoCode.put("Sy", new String[]{"EquipQRCode"});
  42. objToInfoCode.put("Ec", new String[]{"EquipQRCode"});
  43. objTypes = objToInfoCode.keySet().stream().toArray(n -> new String[n]);
  44. }
  45. /** 数据平台地址 */
  46. private TextField tfDPF = new TextField("http://api.sagacloud.cn/data-platform-3");
  47. /** 项目id */
  48. private TextField tfPjId = new TextField("Pj1101010001");
  49. /** 项目密码 */
  50. private TextField tfPjSecret = new TextField();
  51. /** 对象类型 */
  52. private ChoiceBox cbObjType = new ChoiceBox();
  53. /** 对象信息点 */
  54. private ChoiceBox cbObjInfoCodeArray = new ChoiceBox();
  55. /** 文件服务from地址 */
  56. private TextField tfImgFromURL = new TextField("http://127.0.0.1:8080/image-service");
  57. /** 文件服务from的systemId */
  58. private TextField tfImgFromSysId = new TextField("dataPlatform");
  59. /** 文件服务from的secret */
  60. private TextField tfImgFromSecret = new TextField("9e0891a7a8c8e885");
  61. /** 接口类型 */
  62. private ChoiceBox cbImgFromApiType = new ChoiceBox(FXCollections.observableArrayList(apiTypes));
  63. /** 文件服务To地址 */
  64. private TextField tfImgToURL = new TextField("http://127.0.0.1:8080/image-service");
  65. /** 文件服务To的systemId */
  66. private TextField tfImgToSysId = new TextField("dataPlatform");
  67. /** 文件服务To的secret */
  68. private TextField tfImgToSecret = new TextField("9e0891a7a8c8e885");
  69. /** 接口类型 */
  70. private ChoiceBox cbImgToApiType = new ChoiceBox(FXCollections.observableArrayList(apiTypes));
  71. /** 执行校验按钮 */
  72. private Button btnValid = new Button("参数校验");
  73. /** 文件传输执行按钮 */
  74. private Button btnExecute = new Button("开始传输");
  75. /** 执行信息 */
  76. private Label lblExecute = new Label();
  77. public static void main(String[] args) {
  78. launch(args);
  79. }
  80. /**
  81. * 初始化基础控件
  82. */
  83. private void initComponents() {
  84. bindDTO();
  85. tfDPF.setPrefWidth(appWidth * .7);
  86. tfPjId.setPrefWidth(appWidth * .25);
  87. tfPjSecret.setPrefWidth(appWidth * .25);
  88. cbObjType.setItems(FXCollections.observableArrayList(objTypes));
  89. cbObjType.setPrefWidth(appWidth * .1);
  90. // 设置默认选择第一项
  91. cbObjType.getSelectionModel().selectFirst();
  92. cbObjInfoCodeArray.setItems(FXCollections.observableArrayList(objToInfoCode.get(cbObjType.getSelectionModel().getSelectedItem().toString())));
  93. cbObjInfoCodeArray.getSelectionModel().selectFirst();
  94. cbObjInfoCodeArray.setPrefWidth(appWidth * .25);
  95. tfImgFromURL.setPrefWidth(appWidth * .5);
  96. tfImgFromSysId.setPrefWidth(appWidth * .25);
  97. tfImgFromSecret.setPrefWidth(appWidth * .25);
  98. cbImgFromApiType.setPrefWidth(appWidth * .15);
  99. cbImgFromApiType.getSelectionModel().selectFirst();
  100. tfImgToURL.setPrefWidth(appWidth * .5);
  101. tfImgToSysId.setPrefWidth(appWidth * .25);
  102. tfImgToSecret.setPrefWidth(appWidth * .25);
  103. cbImgToApiType.setPrefWidth(appWidth * .15);
  104. cbImgToApiType.getSelectionModel().selectFirst();
  105. btnValid.setOnAction(e -> {
  106. validParam();
  107. });
  108. btnExecute.setOnAction(e -> {
  109. disableSet(true, this);
  110. if(validParam()) {
  111. // 操作按钮置为不可操作
  112. }
  113. });
  114. cbObjType.getSelectionModel().selectedIndexProperty().addListener((obv, ov, nv)->{
  115. cbObjInfoCodeArray.setItems(FXCollections.observableArrayList(objToInfoCode.get(cbObjType.getItems().get(nv.intValue()))));
  116. cbObjInfoCodeArray.getSelectionModel().selectFirst();
  117. });
  118. }
  119. private void disableSet(boolean isAble, SagaFileMoveApp father) {
  120. Field[] allFields = SagaFileMoveApp.class.getDeclaredFields();
  121. for(Field field : allFields) {
  122. if(Node.class.isAssignableFrom(field.getDeclaringClass())) {
  123. try {
  124. Node node = (Node) field.get(father);
  125. node.setDisable(isAble);
  126. }catch (Exception e) {}
  127. }
  128. }
  129. }
  130. /**
  131. * 校验参数
  132. * @return
  133. */
  134. private boolean validParam() {
  135. //
  136. if(StringTools.isBlank(dto.dpf.getValue()) || StringTools.isBlank(dto.pjId.getValue()) ||
  137. StringTools.isBlank(dto.imgFromUrl.getValue()) || StringTools.isBlank(dto.imgFromSysId.getValue()) ||
  138. StringTools.isBlank(dto.imgFromSecret.getValue()) || StringTools.isBlank(dto.imgToUrl.getValue()) ||
  139. StringTools.isBlank(dto.imgToSysId.getValue()) || StringTools.isBlank(dto.imgToSecret.getValue())) {
  140. showTipsError("必填参数不能为空!");
  141. return false;
  142. }
  143. if(!service.validParamDpfAndPj()) {
  144. showTipsError("获取不到项目信息!请确保数据平台地址和项目id参数正确。");
  145. return false;
  146. }
  147. if(!service.validParamImgFromUrl()) {
  148. showTipsError("[文件服务-From]访问不通!请确保URL正确。");
  149. return false;
  150. }
  151. if(!service.validParamImgToUrl()) {
  152. showTipsError("[文件服务-To]访问不通!请确保URL正确。");
  153. return false;
  154. }
  155. if(dto.imgFromUrl.getValue().equals(dto.imgToUrl.getValue())) {
  156. showTipsWarn("参数校验通过。警告:两个文件服务的URL相同!");
  157. }else {
  158. showTipsSuccess("校验通过");
  159. }
  160. return true;
  161. }
  162. private void showTipsSuccess(String info) {
  163. lblExecute.setTextFill(Color.DARKGREEN);
  164. lblExecute.setText(info);
  165. }
  166. private void showTipsInfo(String info) {
  167. lblExecute.setTextFill(Color.BLACK);
  168. lblExecute.setText(info);
  169. }
  170. private void showTipsError(String errMsg) {
  171. lblExecute.setTextFill(Color.RED);
  172. lblExecute.setText(errMsg);
  173. }
  174. private void showTipsWarn(String warnMsg) {
  175. lblExecute.setTextFill(Color.DARKORANGE);
  176. lblExecute.setText(warnMsg);
  177. }
  178. /**
  179. * 将控件的值绑定到DTO对象的属性上
  180. */
  181. private void bindDTO() {
  182. dto.dpf.bind(tfDPF.textProperty());
  183. dto.imgFromApiType.bind(cbImgFromApiType.valueProperty());
  184. dto.imgFromSecret.bind(tfImgFromSecret.textProperty());
  185. dto.imgFromSysId.bind(tfImgFromSysId.textProperty());
  186. dto.imgFromUrl.bind(tfImgFromURL.textProperty());
  187. dto.imgToApiType.bind(cbImgToApiType.valueProperty());
  188. dto.imgToSecret.bind(tfImgToSecret.textProperty());
  189. dto.imgToSysId.bind(tfImgToSysId.textProperty());
  190. dto.imgToUrl.bind(tfImgToURL.textProperty());
  191. dto.objInfoCode.bind(cbObjInfoCodeArray.valueProperty());
  192. dto.objType.bind(cbObjType.valueProperty());
  193. dto.pjId.bind(tfPjId.textProperty());
  194. dto.pjSecret.bind(tfPjSecret.textProperty());
  195. }
  196. @Override
  197. public void start(Stage primaryStage) throws Exception {
  198. initComponents();
  199. // 底层border布局
  200. BorderPane baseBorderPane = new BorderPane();
  201. // 菜单栏
  202. MenuBar menuBar = new MenuBar();
  203. menuBar.prefWidthProperty().bind(primaryStage.widthProperty());
  204. menuBar.getMenus().addAll(getHelpMenu());
  205. // 主视图内容布局
  206. Pane centerPane = getCenterPane();
  207. baseBorderPane.setTop(menuBar);
  208. baseBorderPane.setCenter(centerPane);
  209. primaryStage.setResizable(false);
  210. Scene scene = new Scene(baseBorderPane, appWidth, appHeight);
  211. primaryStage.setScene(scene);
  212. primaryStage.show();
  213. }
  214. /**
  215. * 获取主要内容的布局面板实例
  216. * @return
  217. */
  218. private Pane getCenterPane() {
  219. Pane centerPane = new VBox();
  220. centerPane.setPadding(new Insets(0, 5, 0, 5));
  221. TitledPane paneObjParam = getObjTitlePane();
  222. TitledPane paneImgFrom = getImgTitlePane(true);
  223. TitledPane paneImgTo = getImgTitlePane(false);
  224. Pane paneExe = getExePane();
  225. centerPane.getChildren().addAll(paneObjParam, paneImgFrom, paneImgTo, paneExe);
  226. Insets nodeInsets = new Insets(0, 0, 15, 0);
  227. VBox.setMargin(paneObjParam, nodeInsets);
  228. VBox.setMargin(paneImgFrom, nodeInsets);
  229. return centerPane;
  230. }
  231. /**
  232. * 获取执行控制面板
  233. * @return
  234. */
  235. private Pane getExePane() {
  236. HBox contentBox = new HBox(btnValid, btnExecute, lblExecute);
  237. HBox.setMargin(btnExecute, new Insets(0, 20, 0, 15));
  238. contentBox.setPadding(new Insets(15, 0, 0, 0));
  239. return contentBox;
  240. }
  241. /**
  242. * 生成包含数据平台、项目、对象配置参数的带标题的布局实例
  243. * @return
  244. */
  245. private TitledPane getObjTitlePane() {
  246. String title = "物理对象 - 配置传输哪个项目,哪类对象,哪个信息点对应的文件数据";
  247. String titlePaneBack = "-fx-background-color: wheat";
  248. LinkedHashMap<String, Node> projectMap = new LinkedHashMap<>();
  249. projectMap.put("*项目id ", tfPjId);
  250. projectMap.put("项目密码 ", tfPjSecret);
  251. LinkedHashMap<String, Node> objTypeMap = new LinkedHashMap<>();
  252. objTypeMap.put("*对象类型 ", cbObjType);
  253. objTypeMap.put("*对象信息点 ", cbObjInfoCodeArray);
  254. VBox contentPane = new VBox(getHBoxPane("*数据平台 ", tfDPF),
  255. getHBoxPane(projectMap), getHBoxPane(objTypeMap));
  256. contentPane.setPadding(new Insets(5, 0, 5,10));
  257. contentPane.setStyle("-fx-background-color: antiquewhite");
  258. TitledPane titledPane = new TitledPane(title, contentPane);
  259. titledPane.setCollapsible(false);
  260. return titledPane;
  261. }
  262. /**
  263. * 生成包含文件服务参数控件的带标题的布局实例
  264. * @param isFrom true-数据来源方的文件服务;false-数据接收方的文件服务
  265. * @return
  266. */
  267. private TitledPane getImgTitlePane(boolean isFrom) {
  268. String titleFrom = "From:即获取文件资源数据所访问的image-service服务";
  269. String titleTo = "To:即获上传文件资源所访问的image-service服务";
  270. String title = "文件服务 - " + (isFrom ? titleFrom : titleTo);
  271. String titlePaneBack = "-fx-background-color: wheat";
  272. Node systemId = null, secret = null, serviceURL = null, apiType;
  273. if(isFrom) {
  274. systemId = tfImgFromSysId;
  275. secret = tfImgFromSecret;
  276. serviceURL = tfImgFromURL;
  277. apiType = cbImgFromApiType;
  278. titlePaneBack = "-fx-background-color: bisque";
  279. }else {
  280. systemId = tfImgToSysId;
  281. secret = tfImgToSecret;
  282. serviceURL = tfImgToURL;
  283. apiType = cbImgToApiType;
  284. }
  285. LinkedHashMap<String, Node> urlAndApiTypeMap = new LinkedHashMap<>();
  286. urlAndApiTypeMap.put("*服务URL ", serviceURL);
  287. urlAndApiTypeMap.put("*接口类型 ", apiType);
  288. LinkedHashMap<String, Node> paramMap = new LinkedHashMap<>();
  289. paramMap.put("*systemId ", systemId);
  290. paramMap.put("*secret ", secret);
  291. VBox contentPane = new VBox(getHBoxPane(urlAndApiTypeMap),
  292. getHBoxPane(paramMap));
  293. contentPane.setPadding(new Insets(5, 0, 5,10));
  294. contentPane.setStyle(titlePaneBack);
  295. TitledPane titledPane = new TitledPane(title, contentPane);
  296. titledPane.setCollapsible(false);
  297. return titledPane;
  298. }
  299. /**
  300. * 获取水平排布的含有Label和Node节点两个控件面板实例
  301. * @param label 标签内容
  302. * @param node 控件节点
  303. * @return
  304. */
  305. private Pane getHBoxPane(String label, Node node) {
  306. LinkedHashMap<String, Node> map = new LinkedHashMap<>();
  307. map.put(label, node);
  308. return getHBoxPane(map);
  309. }
  310. /**
  311. * 获取水平排布的含多对(Label:Node)节点组的面板实例
  312. * @param label_textField {标签名:控件节点}
  313. * @return
  314. */
  315. private Pane getHBoxPane(LinkedHashMap<String, Node> label_textField) {
  316. HBox pane = new HBox();
  317. Insets nodeInsets = new Insets(0, 15, 0, 0);
  318. for(String name : label_textField.keySet()) {
  319. Label label = new Label(name);
  320. Node node = label_textField.get(name);
  321. pane.getChildren().addAll(label, node);
  322. HBox.setMargin(node, nodeInsets);
  323. }
  324. pane.setPadding(new Insets(5, 5, 5, 0));
  325. pane.setAlignment(Pos.CENTER_LEFT);
  326. return pane;
  327. }
  328. /**
  329. * 获取帮助菜单按钮
  330. * @return
  331. */
  332. private Menu getHelpMenu() {
  333. // 菜单项
  334. MenuItem mi_help = new MenuItem("Help");
  335. MenuItem mi_about = new MenuItem("About");
  336. SeparatorMenuItem seline = new SeparatorMenuItem();
  337. Menu helpMenu = new Menu("Help");
  338. helpMenu.getItems().addAll(mi_help, seline, mi_about);
  339. return helpMenu;
  340. }
  341. }