名称 最后更新
config 正在载入提交数据...
deploy 正在载入提交数据...
doc/character-library-metadata-bastion 正在载入提交数据...
document/openapi 正在载入提交数据...
pkg 正在载入提交数据...
test/integration/beego 正在载入提交数据...
.gitignore 正在载入提交数据...
Dockerfile 正在载入提交数据...
README.md 正在载入提交数据...
go.mod 正在载入提交数据...
main.go 正在载入提交数据...

character-library-metadata-bastion

源文件管理

  • 文件列表 - list
  • 上传 - 上传 oss / 创建 file
  • 加载 - loadDataTable
  • 编辑 - editDataTable
  • 持久化 - flushDataTable
  • 导出 - url
  • 删除 - delete
  • 操作日志 - log

  • editDataTable params 列表

加载表格数据 loadDataTable - 查询

{
  "fileId": 1,
  "where": [
    {
      "field": {
        "index": 1,
        "name": "产品名称"
      },
      "in": ["a", "b"],
      "ex": ["c", "d"],
      "sort": ["a", "asc"]
    }
  ]
}

编辑表格 editDataTable

{
  "field": {
    "index": 1,
    "name": "产品名称"
  },
  "operation": {
    "desc": ["拆分", "按字符数"],
    "code": "split_by_char_number"
  },
  "params": []
}

精简

{
  "field": "产品名称",
  "desc": ["拆分", "按字符数"],
  "operationCode": "split_by_char_number",
  "params": []
}

params 列表

数据展示

{
  "code": 0,
  "data": {
    "dataFields": [
      {
        "index": 1,
        "name": "产品名称",
        "type": "string"
      },
      {
        "index": 2,
        "name": "产品数量",
        "type": "int"
      }
    ],
    "dataRows": [
      ["素面", 200],
      ["冻豆腐", 400],
      ["冻豆腐1", 300],
      ["冻豆2", "A"]
    ],
    "total": 100,
    "pageNumber": 1,
    "inValidCells": [
      {
        "x": 1,
        "y": 3,
        "error": "不是一个有效的数值"
      }
    ]
  },
  "msg": "ok"
}

表关联关系

  • 可追加数据的表列表 /tables/search-appended-list
  • 校验文件列表 /files/search-verified-file
  • 匹配方案列表 /mapping-rule-config/search
  • 匹配方案主表 /mapping-rule-config/prepare //主表 校验表 主表字段 校验文件表字段
  • 匹配方案添加 /mapping-rule-config/
  • 匹配方案删除 /mapping-rule-config/:id
  • 追加数据到表格 /append-data-to-table // 验证是否追加过
  • 取消校验中的文件 /cancel-verifying-file //

  • 表结构更新 /tables/update-table-struct

  • 表结构添加 /tables/add-table-struct

  • 分表列表 /tables/search

  • 表复制 /tables/copy-data-table

  • 表删除 /tables/:id // 若是删除主表,需级联删除关联的分表,删除内容包括表数据及表结构;? 分表的副表是否要删除

  • 表详情 /tables/:id // 表结构

  • 表更新 /tables/:id // 表结构、分表才可以编辑

  • 日志搜索 /log/search

  • 校验步骤日志 /log/verified-step-Log

数据预览

  • 表数据预览(格式) /table/preview
  • 表数据自定义查询 /table/preview where conditions 升序、降序 包含、不包含
  • 表数据字段可选值搜索 /table/field-optional 文本匹配
  • 表数据更新、添加、删除 /table/row-data-mutation
  • 表数据导出 /table/export-table

数据验证

  • 文件验证 /data/edit-data-table

底层字库接口

  • 数据预览 1
  • 表格编辑 1
  • 保存校验文件 (文件地址) 1
  • 生成主表 1
  • 表复制 (副表)1
  • 追加数据 (主表、副表)
  • 表删除 (主表、副表)、分表
  • 表拆分 1
  • 更新表结构(分表)1
  • 编辑、添加、删除表数据(副表) 1
  • 取消校验

定时作业

  • 隔天清理校验中的文件
  • 隔天清理 public 临时文件

表数据导出

  • 加锁,只允许当前用户同时只能发起一次导出命令 ,3min 过期
  • 单次拉取数量 MR
    • 100W ..
    • 50W 120s 读取数据库:30s 保存文件:10s 下载:30M/500K=60S;RAR 压缩 24M/500k=50S
    • 20W ..
    • 10W ..
  • 保存单个文件、压缩 | 保存多个文件、压缩

表达式解析

表达式类型说明

  • ValueExprAST: 值表达式(数值,字符串) e.g. 1 、 2011-1-1 、字符串 json { "exprType":"ValueExprAST", "val":"", "str":"业绩2" }
  • FieldExprAST: 字段表达式(处理的字段) e.g. 生产明细.业绩 json { "exprType":"FieldExprAST", "str":"业绩1", "field":{ "tableId":1, "tableName":"测试ABC", "tableSqlName":"table_abc_test", "fieldName":"业绩", "fieldSqlName":"ye_ji_1", "fieldSqlType":"Float" } }
  • BinaryExprAST: 二元表达式 e.g. 1 + 2 、 100 * 生产明细.业绩

    {
    "exprType":"BinaryExprAST",
    "op":"/",
    "lhs":{},
    "rhs":{}
    }
  • FunCallerExprAST:函数表达式 e.g. sum(arg1,arg2,arg3)

    {
    "arrayFlag": false,
    "exprType": "FunCallerExprAST",
    "name": "sum",
    "args": []
    }

用例

  • 输入表达式 SUM(1/COUNTIFS(【业绩】,【业绩】)) json { "arrayFlag":false, "exprType":"FunCallerExprAST", "name":"sum", "args":[ { "exprType":"BinaryExprAST", "op":"/", "lhs":{ "exprType":"ValueExprAST", "val":"", "str":"1" }, "rhs":{ "arrayFlag":false, "exprType":"FunCallerExprAST", "name":"countifs", "args":[ { "exprType":"FieldExprAST", "str":"业绩1", "field":{ "tableId":1, "tableName":"测试ABC", "tableSqlName":"table_abc_test", "fieldName":"业绩", "fieldSqlName":"ye_ji_1", "fieldSqlType":"Float" } }, { "exprType":"ValueExprAST", "val":"", "str":"业绩2" } ] } } ] }

讨论事项

  • 校验动作,参数模型讨论
  • 校验日志错误(标红)
  • 校验完毕应答实体,类型修改即使错误,也要返回修改完毕的表

参数说明

通用格式

{
  "objectId": 1,
  "processFields": [],
  "action": "xx",
  "params": {}
}

processFields:操作字段

常规

  1. 删除列
{
  "action": "remove-column",
  "params": {}
}
  1. 复制列
{
  "action": "copy-column",
  "params": {}
}
  1. 重命名
{
  "action": "rename-column",
  "params": {
    "newColumnName": "新的列名称"
  }
}
  1. 替换值
{
  "action": "replace-column",
  "params": {
    "replaceMethod": "replace",
    "searchValue": "搜索值",
    "replaceValue": "替换值"
  }
}

参数说明

replaceMethod: 替换方法(1.replace:替换值 2.add-prefix:添加前缀 3.add-postfix:添加后缀 4.remove-prefix:去除前缀 5.remove-postfix:去除后缀 6.remove-chars:去除固定字符 7.clean:清除)
searchValue: 搜索值-replace,remove-prefix,remove-postfix,remove-chars参数
replaceValue: 替换值-replace,add-prefix,add-postfix参数

格式 formatMethod

  1. 大写
{
  "action": "format-column",
  "params": {
    "formatMethod": "upper"
  }
}

参数说明

formatMethod: 格式化方法(1.upper:大写2.lower:小写3.capitalize:首字母大写4.strip:修整)
  1. 小写
{
  "action": "format-column",
  "params": {
    "formatMethod": "lower"
  }
}
  1. 首字母大写
{
  "action": "format-column",
  "params": {
    "formatMethod": "capitalize"
  }
}
  1. 清除
{
  "action": "replace-column",
  "params": {
    "replaceMethod": "clean"
  }
}
  1. 修整
{
  "action": "format-column",
  "params": {
    "formatMethod": "strip"
  }
}
  1. 添加前缀
{
  "action": "replace-column",
  "params": {
    "replaceMethod": "add-prefix",
    "replaceValue": "前缀值"
  }
}
  1. 添加后缀
{
  "action": "replace-column",
  "params": {
    "replaceMethod": "add-postfix",
    "replaceValue": "后缀值"
  }
}
  1. 去除前缀
{
  "action": "replace-column",
  "params": {
    "replaceMethod": "remove-prefix",
    "searchValue": "前缀值"
  }
}
  1. 去除后最
{
  "action": "replace-column",
  "params": {
    "replaceMethod": "remove-postfix",
    "searchValue": "后缀值"
  }
}
  1. 去除固定字符
{
  "action": "replace-column",
  "params": {
    "replaceMethod": "remove-chars",
    "searchValue": "字符"
  }
}

拆分 split-column

  1. 按分隔符
{
  "action": "split-column",
  "params": {
    "splitMethod": "separator",
    "separator": "|",
    "splitDirection": "left",
    "splitCount": "1"
  }
}

参数说明

separator: 分割符号 ‘|’
splitDirection: 拆分方向(1.left:从左边 2.right:从右边)
splitCount: 拆分次数
  1. 按字符数
{
  "action": "split-column",
  "params": {
    "splitMethod": "char-length",
    "splitDirection": "left",
    "charLength": "10",
    "splitCount": "1"
  }
}

参数说明

charLength: 字符长度-char-length专属参数
splitDirection: 拆分方向(1.left:从左边 2.right:从右边)
splitCount: 拆分次数 (拆分策略是重复时:值0或者非1整数)

提取 extract-column

  1. 按日期
{
  "action": "extract-column",
  "params": {
    "extractMethod": "by-date"
  }
}

参数说明

extractMethod: 提取方法(1.by-date:按日期 2.by-number:按数值)
  1. 按数值 action
{
  "action": "extract-column",
  "params": {
    "extractMethod": "by-number"
  }
}

修改字段类型

{
  "action": "convert-column-type",
  "params": {
    "convertType": "STRING"
  }
}

参数说明

convertType:转换类型 STRING 数值: INT 小数: FLOAT 日期: DATE 时间: DATETIME

优化点

  • [] 0.测试服务、数据库的上限(QPS,TPS)查询瓶颈的接口

  • [] 1.模型详情缓存(tables、query_set)

  • [] 2.列表搜索缓存 (tables、query_set),减轻数据库压力

更新、删除、重命名
get list:queryset:cxxx:*
删除所有匹配的缓存

消息队列更新事件、确保缓存一定移除成功、缓存时间控制