浏览代码

支持刷新表字段 https://gitee.com/ghi/dbsyncer/issues/I6VB8M

AE86 2 年之前
父节点
当前提交
e2d9a4ac74

+ 7 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/TableGroupService.java

@@ -26,6 +26,13 @@ public interface TableGroupService {
      */
     String edit(Map<String, String> params);
 
+    /**
+     * 刷新表字段
+     *
+     * @param id
+     */
+    String refreshFields(String id);
+
     /**
      * 删除表关系
      *

+ 18 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/tablegroup/TableGroupChecker.java

@@ -29,6 +29,7 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author AE86
@@ -110,6 +111,23 @@ public class TableGroupChecker extends AbstractChecker {
         return tableGroup;
     }
 
+    /**
+     * 刷新表字段
+     *
+     * @param tableGroup
+     */
+    public void refreshTableFields(TableGroup tableGroup){
+        Mapping mapping = manager.getMapping(tableGroup.getMappingId());
+        Assert.notNull(mapping, "mapping can not be null.");
+
+        Table sourceTable = tableGroup.getSourceTable();
+        Table targetTable = tableGroup.getTargetTable();
+        List<String> sourceTablePks = sourceTable.getColumn().stream().filter(c -> c.isPk()).map(c -> c.getName()).collect(Collectors.toList());
+        List<String> targetTablePks = targetTable.getColumn().stream().filter(c -> c.isPk()).map(c -> c.getName()).collect(Collectors.toList());
+        tableGroup.setSourceTable(getTable(mapping.getSourceConnectorId(), sourceTable.getName(), StringUtil.join(sourceTablePks, ",")));
+        tableGroup.setTargetTable(getTable(mapping.getTargetConnectorId(), targetTable.getName(), StringUtil.join(targetTablePks, ",")));
+    }
+
     public void mergeConfig(Mapping mapping, TableGroup tableGroup) {
         // 合并高级配置
         TableGroup group = PickerUtil.mergeTableGroupConfig(mapping, tableGroup);

+ 13 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/TableGroupServiceImpl.java

@@ -2,6 +2,7 @@ package org.dbsyncer.biz.impl;
 
 import org.dbsyncer.biz.TableGroupService;
 import org.dbsyncer.biz.checker.Checker;
+import org.dbsyncer.biz.checker.impl.tablegroup.TableGroupChecker;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.model.Field;
@@ -73,6 +74,18 @@ public class TableGroupServiceImpl extends BaseServiceImpl implements TableGroup
         return manager.editTableGroup(model);
     }
 
+    @Override
+    public String refreshFields(String id) {
+        TableGroup tableGroup = manager.getTableGroup(id);
+        Assert.notNull(tableGroup, "Can not find tableGroup.");
+        assertRunning(manager.getMapping(tableGroup.getMappingId()));
+
+        TableGroupChecker checker = (TableGroupChecker) tableGroupChecker;
+        checker.refreshTableFields(tableGroup);
+
+        return manager.editTableGroup(tableGroup);
+    }
+
     @Override
     public boolean remove(String mappingId, String ids) {
         Assert.hasText(mappingId, "Mapping id can not be null");

+ 13 - 2
dbsyncer-web/src/main/java/org/dbsyncer/web/controller/index/TableGroupController.java

@@ -37,7 +37,7 @@ public class TableGroupController extends BaseController {
         return "mapping/" + page;
     }
 
-    @RequestMapping(value = "/add")
+    @PostMapping(value = "/add")
     @ResponseBody
     public RestResult add(HttpServletRequest request) {
         try {
@@ -49,7 +49,7 @@ public class TableGroupController extends BaseController {
         }
     }
 
-    @RequestMapping(value = "/edit")
+    @PostMapping(value = "/edit")
     @ResponseBody
     public RestResult edit(HttpServletRequest request) {
         try {
@@ -61,6 +61,17 @@ public class TableGroupController extends BaseController {
         }
     }
 
+    @PostMapping(value = "/refreshFields")
+    @ResponseBody
+    public RestResult refreshFields(@RequestParam(value = "id") String id) {
+        try {
+            return RestResult.restSuccess(tableGroupService.refreshFields(id));
+        } catch (Exception e) {
+            logger.error(e.getLocalizedMessage(), e.getClass());
+            return RestResult.restFail(e.getMessage());
+        }
+    }
+
     @PostMapping("/remove")
     @ResponseBody
     public RestResult remove(@RequestParam(value = "mappingId") String mappingId, @RequestParam(value = "ids") String ids) {

+ 6 - 1
dbsyncer-web/src/main/resources/public/mapping/editTableGroup.html

@@ -107,7 +107,12 @@
 
                             <div class="form-group">
                                 <div class="row">
-                                    <div class="col-md-10"></div>
+                                    <div class="col-md-2">&nbsp;
+                                        <button id="refreshTableFieldBtn" type="button" class="btn btn-default" th:title="刷新数据源和目标源表字段" th:tableGroupId="${tableGroup?.id}">
+                                            <span class="fa fa-refresh"></span>刷新字段
+                                        </button>
+                                    </div>
+                                    <div class="col-md-8"></div>
                                     <div class="col-md-2 text-right">
                                         <button id="fieldMappingDelBtn" type="button" class="btn btn-default" disabled="disabled">
                                             <span class="fa fa-remove"></span>删除

+ 48 - 31
dbsyncer-web/src/main/resources/static/js/mapping/editTableGroup.js

@@ -13,17 +13,17 @@ function submit(data) {
 // 初始化映射关系参数
 function initFieldMappingParams(){
     // 生成JSON参数
-    var row = [];
-    var $fieldMappingList = $("#fieldMappingList");
+    const row = [];
+    const $fieldMappingList = $("#fieldMappingList");
     $fieldMappingList.find("tr").each(function(k,v){
-        var $pk = $(this).find("td:eq(2)").html();
+        const $pk = $(this).find("td:eq(2)").html();
         row.push({
             "source":$(this).find("td:eq(0)").text(),
             "target":$(this).find("td:eq(1)").text(),
             "pk":($pk != "" || $.trim($pk).length > 0)
         });
     });
-    var $fieldMappingTable = $("#fieldMappingTable");
+    const $fieldMappingTable = $("#fieldMappingTable");
     if (0 >= row.length) {
         $fieldMappingTable.addClass("hidden");
     } else {
@@ -34,7 +34,7 @@ function initFieldMappingParams(){
 
 // 获取选择的CheckBox[value]
 function getCheckedBoxSize($checkbox){
-    var checked = [];
+    const checked = [];
     $checkbox.each(function(){
         if($(this).prop('checked')){
             checked.push($(this).attr("id"));
@@ -42,11 +42,26 @@ function getCheckedBoxSize($checkbox){
     });
     return checked;
 }
+// 绑定刷新表字段事件
+function bindRefreshTableFieldsClick() {
+    const $refreshBtn = $("#refreshTableFieldBtn");
+    $refreshBtn.bind('click', function(){
+        let id = $(this).attr("tableGroupId");
+        doPoster("/tableGroup/refreshFields", {'id': id}, function (data) {
+            if (data.success == true) {
+                bootGrowl("刷新字段成功!", "success");
+                doLoader('/tableGroup/page/editTableGroup?id=' + id);
+            } else {
+                bootGrowl(data.resultValue, "danger");
+            }
+        });
+    });
+}
 // 绑定删除表字段复选框事件
 function bindFieldMappingCheckBoxClick(){
-    var $checkboxAll = $('.fieldMappingDeleteCheckboxAll');
-    var $checkbox = $('.fieldMappingDeleteCheckbox');
-    var $delBtn = $("#fieldMappingDelBtn");
+    const $checkboxAll = $('.fieldMappingDeleteCheckboxAll');
+    const $checkbox = $('.fieldMappingDeleteCheckbox');
+    const $delBtn = $("#fieldMappingDelBtn");
     $checkboxAll.iCheck({
         checkboxClass: 'icheckbox_square-red',
         labelHover: false,
@@ -73,20 +88,20 @@ function bindFieldMappingCheckBoxClick(){
 // 绑定字段映射表格点击事件
 function bindFieldMappingListClick(){
     // 行双击事件
-    var $tr = $("#fieldMappingList tr");
+    const $tr = $("#fieldMappingList tr");
     $tr.unbind("dblclick");
     $tr.bind('dblclick', function () {
-        var $pk = $(this).find("td:eq(2)");
-        var $text = $pk.html();
-        var isPk = $text == "" || $.trim($text).length == 0;
+        const $pk = $(this).find("td:eq(2)");
+        const $text = $pk.html();
+        const isPk = $text == "" || $.trim($text).length == 0;
         $pk.html(isPk ? '<i title="主键" class="fa fa-key fa-fw fa-rotate-90 text-warning"></i>' : '');
         initFieldMappingParams();
     });
 }
 // 绑定下拉选择事件自动匹配相似字段事件
 function bindTableFieldSelect(){
-    var $sourceSelect = $("#sourceTableField");
-    var $targetSelect = $("#targetTableField");
+    const $sourceSelect = $("#sourceTableField");
+    const $targetSelect = $("#targetTableField");
 
     // 绑定数据源下拉切换事件
     $sourceSelect.on('changed.bs.select',function(e){
@@ -96,10 +111,10 @@ function bindTableFieldSelect(){
 }
 // 绑定添加字段映射点击事件
 function bindFieldMappingAddClick($sourceSelect, $targetSelect){
-    var $btn = $("#fieldMappingAddBtn");
+    const $btn = $("#fieldMappingAddBtn");
     $btn.bind('click', function(){
-        var sField = $sourceSelect.selectpicker("val");
-        var tField = $targetSelect.selectpicker("val");
+        const sField = $sourceSelect.selectpicker("val");
+        const tField = $targetSelect.selectpicker("val");
         sField = sField == null ? "" : sField;
         tField = tField == null ? "" : tField;
         // 非空检查
@@ -109,21 +124,21 @@ function bindFieldMappingAddClick($sourceSelect, $targetSelect){
         }
 
         // 检查重复字段
-        var repeated = false;
-        var $fieldMappingList = $("#fieldMappingList");
-        var $tr = $fieldMappingList.find("tr");
+        const repeated = false;
+        const $fieldMappingList = $("#fieldMappingList");
+        const $tr = $fieldMappingList.find("tr");
         $tr.each(function(k,v){
-             var sf = $(this).find("td:eq(0)").text();
-             var tf = $(this).find("td:eq(1)").text();
-             if(repeated = (sField==sf && tField==tf)){
+            const sf = $(this).find("td:eq(0)").text();
+            const tf = $(this).find("td:eq(1)").text();
+            if (repeated = (sField == sf && tField == tf)) {
                 bootGrowl("映射关系已存在.", "danger");
                 return false;
-             }
+            }
         });
         if(repeated){ return; }
 
-        var index = $tr.size();
-        var trHtml = "<tr title='双击设置/取消主键'><td>" + sField + "</td><td>" + tField + "</td><td></td><td><input id='fieldIndex_"+ (index + 1) +"' type='checkbox' class='fieldMappingDeleteCheckbox' /></td></tr>";
+        const index = $tr.size();
+        const trHtml = "<tr title='双击设置/取消主键'><td>" + sField + "</td><td>" + tField + "</td><td></td><td><input id='fieldIndex_"+ (index + 1) +"' type='checkbox' class='fieldMappingDeleteCheckbox' /></td></tr>";
         $fieldMappingList.append(trHtml);
 
         initFieldMappingParams();
@@ -134,12 +149,12 @@ function bindFieldMappingAddClick($sourceSelect, $targetSelect){
 }
 // 绑定删除字段映射点击事件
 function bindFieldMappingDelClick(){
-    var $fieldMappingDelBtn = $("#fieldMappingDelBtn");
+    const $fieldMappingDelBtn = $("#fieldMappingDelBtn");
     $fieldMappingDelBtn.unbind("click");
     $fieldMappingDelBtn.click(function () {
-        var ids = getCheckedBoxSize($('.fieldMappingDeleteCheckbox'));
+        const ids = getCheckedBoxSize($('.fieldMappingDeleteCheckbox'));
         if (ids.length > 0) {
-            var len = ids.length;
+            const len = ids.length;
             for(i = 0; i < len; i++){
                 $("#" + ids[i]).parent().parent().parent().remove();
             }
@@ -158,6 +173,8 @@ $(function() {
     initFieldMappingParams();
     // 绑定下拉选择事件自动匹配相似字段事件
     bindTableFieldSelect();
+    // 绑定刷新表字段事件
+    bindRefreshTableFieldsClick();
     // 绑定删除表字段映射事件
     bindFieldMappingCheckBoxClick();
     bindFieldMappingListClick();
@@ -165,9 +182,9 @@ $(function() {
 
     //保存
     $("#tableGroupSubmitBtn").click(function () {
-        var $form = $("#tableGroupModifyForm");
+        const $form = $("#tableGroupModifyForm");
         if ($form.formValidate() == true) {
-            var data = $form.serializeJson();
+            const data = $form.serializeJson();
             submit(data);
         }
     });