作者 Administrator

合并分支 'test' 到 'master'

Test



查看合并请求 !1
正在显示 100 个修改的文件 包含 3256 行增加135 行删除

要显示太多修改。

为保证性能只显示 100 of 100+ 个文件。

@@ -23,7 +23,11 @@ _testmain.go @@ -23,7 +23,11 @@ _testmain.go
23 *.test 23 *.test
24 .log 24 .log
25 .idea 25 .idea
  26 +.vscode
26 27
27 app.log 28 app.log
28 go.sum 29 go.sum
29 -lastupdate.tmp  
  30 +lastupdate.tmp
  31 +*.log
  32 +
  33 +public/*
@@ -3,13 +3,12 @@ ENV APP_DIR $GOPATH/src/character-library-metadata-bastion @@ -3,13 +3,12 @@ ENV APP_DIR $GOPATH/src/character-library-metadata-bastion
3 RUN mkdir -p $APP_DIR 3 RUN mkdir -p $APP_DIR
4 WORKDIR $APP_DIR/ 4 WORKDIR $APP_DIR/
5 COPY ./pkg pkg 5 COPY ./pkg pkg
6 -COPY ./conf conf 6 +COPY ./config config
7 COPY ./go.mod go.mod 7 COPY ./go.mod go.mod
8 -COPY ./go.sum go.sum  
9 COPY ./main.go main.go 8 COPY ./main.go main.go
10 RUN ["ln","-sf","/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime"] 9 RUN ["ln","-sf","/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime"]
11 ENV GO111MODULE on 10 ENV GO111MODULE on
12 -ENV GOPROXY https://goproxy.io 11 +ENV GOPROXY https://goproxy.cn
13 RUN ["go","mod","tidy"] 12 RUN ["go","mod","tidy"]
14 RUN ["ls"] 13 RUN ["ls"]
15 RUN ["go","build"] 14 RUN ["go","build"]
@@ -3,9 +3,450 @@ @@ -3,9 +3,450 @@
3 ## 源文件管理 3 ## 源文件管理
4 4
5 - 文件列表 - list 5 - 文件列表 - list
6 -- 上传 - 上传oss / 创建file 6 +- 上传 - 上传 oss / 创建 file
7 - 加载 - loadDataTable 7 - 加载 - loadDataTable
8 - 编辑 - editDataTable 8 - 编辑 - editDataTable
9 - 持久化 - flushDataTable 9 - 持久化 - flushDataTable
10 - 导出 - url 10 - 导出 - url
11 - 删除 - delete 11 - 删除 - delete
  12 +- 操作日志 - log
  13 +
  14 +- editDataTable params 列表
  15 +
  16 +### 加载表格数据 loadDataTable - 查询
  17 +
  18 +```json
  19 +{
  20 + "fileId": 1,
  21 + "where": [
  22 + {
  23 + "field": {
  24 + "index": 1,
  25 + "name": "产品名称"
  26 + },
  27 + "in": ["a", "b"],
  28 + "ex": ["c", "d"],
  29 + "sort": ["a", "asc"]
  30 + }
  31 + ]
  32 +}
  33 +```
  34 +
  35 +### 编辑表格 editDataTable
  36 +
  37 +```json
  38 +{
  39 + "field": {
  40 + "index": 1,
  41 + "name": "产品名称"
  42 + },
  43 + "operation": {
  44 + "desc": ["拆分", "按字符数"],
  45 + "code": "split_by_char_number"
  46 + },
  47 + "params": []
  48 +}
  49 +```
  50 +
  51 +精简
  52 +
  53 +```json
  54 +{
  55 + "field": "产品名称",
  56 + "desc": ["拆分", "按字符数"],
  57 + "operationCode": "split_by_char_number",
  58 + "params": []
  59 +}
  60 +```
  61 +
  62 +`params 列表`
  63 +
  64 +### 数据展示
  65 +
  66 +```json
  67 +{
  68 + "code": 0,
  69 + "data": {
  70 + "dataFields": [
  71 + {
  72 + "index": 1,
  73 + "name": "产品名称",
  74 + "type": "string"
  75 + },
  76 + {
  77 + "index": 2,
  78 + "name": "产品数量",
  79 + "type": "int"
  80 + }
  81 + ],
  82 + "dataRows": [
  83 + ["素面", 200],
  84 + ["冻豆腐", 400],
  85 + ["冻豆腐1", 300],
  86 + ["冻豆2", "A"]
  87 + ],
  88 + "total": 100,
  89 + "pageNumber": 1,
  90 + "inValidCells": [
  91 + {
  92 + "x": 1,
  93 + "y": 3,
  94 + "error": "不是一个有效的数值"
  95 + }
  96 + ]
  97 + },
  98 + "msg": "ok"
  99 +}
  100 +```
  101 +
  102 +## 表关联关系
  103 +
  104 +- [x] 可追加数据的表列表 /tables/search-appended-list
  105 +- [x] 校验文件列表 /files/search-verified-file
  106 +- [x] 匹配方案列表 /mapping-rule-config/search
  107 +- [x] 匹配方案主表 /mapping-rule-config/prepare //主表 校验表 主表字段 校验文件表字段
  108 +- [x] 匹配方案添加 /mapping-rule-config/
  109 +- [x] 匹配方案删除 /mapping-rule-config/:id
  110 +- [x] 追加数据到表格 /append-data-to-table // 验证是否追加过
  111 +- [ ] 取消校验中的文件 /cancel-verifying-file //
  112 +
  113 +- [x] 表结构更新 /tables/update-table-struct
  114 +- [x] 表结构添加 /tables/add-table-struct
  115 +- [x] 分表列表 /tables/search
  116 +- [x] 表复制 /tables/copy-data-table
  117 +- [x] 表删除 /tables/:id // 若是删除主表,需级联删除关联的分表,删除内容包括表数据及表结构;? 分表的副表是否要删除
  118 +- [x] 表详情 /tables/:id // 表结构
  119 +- [x] 表更新 /tables/:id // 表结构、分表才可以编辑
  120 +
  121 +- [x] 日志搜索 /log/search
  122 +- [x] 校验步骤日志 /log/verified-step-Log
  123 +
  124 +## 数据预览
  125 +
  126 +- [x] 表数据预览(格式) /table/preview
  127 +- [x] 表数据自定义查询 /table/preview where conditions 升序、降序 包含、不包含
  128 +- [x] 表数据字段可选值搜索 /table/field-optional 文本匹配
  129 +- [x] 表数据更新、添加、删除 /table/row-data-mutation
  130 +- [x] 表数据导出 /table/export-table
  131 +
  132 +## 数据验证
  133 +
  134 +- [x] 文件验证 /data/edit-data-table
  135 +
  136 +## 底层字库接口
  137 +
  138 +- [x] 数据预览 1
  139 +- [x] 表格编辑 1
  140 +- [x] 保存校验文件 (文件地址) 1
  141 +- [x] 生成主表 1
  142 +- [x] 表复制 (副表)1
  143 +- [x] 追加数据 (主表、副表)
  144 +- [ ] 表删除 (主表、副表)~~、分表~~
  145 +- [x] 表拆分 1
  146 +- [x] 更新表结构(分表)1
  147 +- [x] 编辑、添加、删除表数据(副表) 1
  148 +- [ ] 取消校验
  149 +
  150 +## 定时作业
  151 +
  152 +- [x] 隔天清理校验中的文件
  153 +- [x] 隔天清理 public 临时文件
  154 +
  155 +## 表数据导出
  156 +
  157 +- [ ] 加锁,只允许当前用户同时只能发起一次导出命令 ,3min 过期
  158 +- [ ] 单次拉取数量 MR
  159 + - [ ] 100W ..
  160 + - [ ] 50W 120s 读取数据库:30s 保存文件:10s 下载:30M/500K=60S;RAR 压缩 24M/500k=50S
  161 + - [ ] 20W ..
  162 + - [ ] 10W ..
  163 +- [ ] 保存单个文件、压缩 | 保存多个文件、压缩
  164 +
  165 +## 讨论事项
  166 +
  167 +- [ ] 校验动作,参数模型讨论
  168 +- [ ] 校验日志错误(标红)
  169 +- [ ] 校验完毕应答实体,类型修改即使错误,也要返回修改完毕的表
  170 +
  171 +## 参数说明
  172 +
  173 +### 通用格式
  174 +
  175 +```json
  176 +{
  177 + "objectId": 1,
  178 + "processFields": [],
  179 + "action": "xx",
  180 + "params": {}
  181 +}
  182 +```
  183 +
  184 +processFields:操作字段
  185 +
  186 +### 常规
  187 +
  188 +1. 删除列
  189 +
  190 +```json
  191 +{
  192 + "action": "remove-column",
  193 + "params": {}
  194 +}
  195 +```
  196 +
  197 +2. 复制列
  198 +
  199 +```json
  200 +{
  201 + "action": "copy-column",
  202 + "params": {}
  203 +}
  204 +```
  205 +
  206 +3. 重命名
  207 +
  208 +```json
  209 +{
  210 + "action": "rename-column",
  211 + "params": {
  212 + "newColumnName": "新的列名称"
  213 + }
  214 +}
  215 +```
  216 +
  217 +4. 替换值
  218 +
  219 +```json
  220 +{
  221 + "action": "replace-column",
  222 + "params": {
  223 + "replaceMethod": "replace",
  224 + "searchValue": "搜索值",
  225 + "replaceValue": "替换值"
  226 + }
  227 +}
  228 +```
  229 +
  230 +参数说明
  231 +
  232 +```
  233 +replaceMethod: 替换方法(1.replace:替换值 2.add-prefix:添加前缀 3.add-postfix:添加后缀 4.remove-prefix:去除前缀 5.remove-postfix:去除后缀 6.remove-chars:去除固定字符 7.clean:清除)
  234 +searchValue: 搜索值-replace,remove-prefix,remove-postfix,remove-chars参数
  235 +replaceValue: 替换值-replace,add-prefix,add-postfix参数
  236 +```
  237 +
  238 +### 格式 formatMethod
  239 +
  240 +1. 大写
  241 +
  242 +```json
  243 +{
  244 + "action": "format-column",
  245 + "params": {
  246 + "formatMethod": "upper"
  247 + }
  248 +}
  249 +```
  250 +
  251 +参数说明
  252 +
  253 +```
  254 +formatMethod: 格式化方法(1.upper:大写2.lower:小写3.capitalize:首字母大写4.strip:修整)
  255 +```
  256 +
  257 +2. 小写
  258 +
  259 +```json
  260 +{
  261 + "action": "format-column",
  262 + "params": {
  263 + "formatMethod": "lower"
  264 + }
  265 +}
  266 +```
  267 +
  268 +3. 首字母大写
  269 +
  270 +```json
  271 +{
  272 + "action": "format-column",
  273 + "params": {
  274 + "formatMethod": "capitalize"
  275 + }
  276 +}
  277 +```
  278 +
  279 +4. 清除
  280 +
  281 +```json
  282 +{
  283 + "action": "replace-column",
  284 + "params": {
  285 + "replaceMethod": "clean"
  286 + }
  287 +}
  288 +```
  289 +
  290 +5. 修整
  291 +
  292 +```json
  293 +{
  294 + "action": "format-column",
  295 + "params": {
  296 + "formatMethod": "strip"
  297 + }
  298 +}
  299 +```
  300 +
  301 +6. 添加前缀
  302 +
  303 +```json
  304 +{
  305 + "action": "replace-column",
  306 + "params": {
  307 + "replaceMethod": "add-prefix",
  308 + "replaceValue": "前缀值"
  309 + }
  310 +}
  311 +```
  312 +
  313 +7. 添加后缀
  314 +
  315 +```json
  316 +{
  317 + "action": "replace-column",
  318 + "params": {
  319 + "replaceMethod": "add-postfix",
  320 + "replaceValue": "后缀值"
  321 + }
  322 +}
  323 +```
  324 +
  325 +8. 去除前缀
  326 +
  327 +```json
  328 +{
  329 + "action": "replace-column",
  330 + "params": {
  331 + "replaceMethod": "remove-prefix",
  332 + "searchValue": "前缀值"
  333 + }
  334 +}
  335 +```
  336 +
  337 +9. 去除后最
  338 +
  339 +```json
  340 +{
  341 + "action": "replace-column",
  342 + "params": {
  343 + "replaceMethod": "remove-postfix",
  344 + "searchValue": "后缀值"
  345 + }
  346 +}
  347 +```
  348 +
  349 +10. 去除固定字符
  350 +
  351 +```json
  352 +{
  353 + "action": "replace-column",
  354 + "params": {
  355 + "replaceMethod": "remove-chars",
  356 + "searchValue": "字符"
  357 + }
  358 +}
  359 +```
  360 +
  361 +### 拆分 split-column
  362 +
  363 +1. 按分隔符
  364 +
  365 +```json
  366 +{
  367 + "action": "split-column",
  368 + "params": {
  369 + "splitMethod": "separator",
  370 + "separator": "|",
  371 + "splitDirection": "left",
  372 + "splitCount": "1"
  373 + }
  374 +}
  375 +```
  376 +
  377 +参数说明
  378 +
  379 +```
  380 +separator: 分割符号 ‘|’
  381 +splitDirection: 拆分方向(1.left:从左边 2.right:从右边)
  382 +splitCount: 拆分次数
  383 +```
  384 +
  385 +2. 按字符数
  386 +
  387 +```json
  388 +{
  389 + "action": "split-column",
  390 + "params": {
  391 + "splitMethod": "char-length",
  392 + "splitDirection": "left",
  393 + "charLength": "10",
  394 + "splitCount": "1"
  395 + }
  396 +}
  397 +```
  398 +
  399 +参数说明
  400 +
  401 +```
  402 +charLength: 字符长度-char-length专属参数
  403 +splitDirection: 拆分方向(1.left:从左边 2.right:从右边)
  404 +splitCount: 拆分次数 (拆分策略是重复时:值0或者非1整数)
  405 +```
  406 +
  407 +### 提取 extract-column
  408 +
  409 +1. 按日期
  410 +
  411 +```json
  412 +{
  413 + "action": "extract-column",
  414 + "params": {
  415 + "extractMethod": "by-date"
  416 + }
  417 +}
  418 +```
  419 +
  420 +参数说明
  421 +
  422 +```
  423 +extractMethod: 提取方法(1.by-date:按日期 2.by-number:按数值)
  424 +```
  425 +
  426 +2. 按数值 action
  427 +
  428 +```json
  429 +{
  430 + "action": "extract-column",
  431 + "params": {
  432 + "extractMethod": "by-number"
  433 + }
  434 +}
  435 +```
  436 +
  437 +### 修改字段类型
  438 +
  439 +```json
  440 +{
  441 + "action": "convert-column-type",
  442 + "params": {
  443 + "convertType": "STRING"
  444 + }
  445 +}
  446 +```
  447 +
  448 +参数说明
  449 +
  450 +```
  451 +convertType:转换类型 STRING 数值: INT 小数: FLOAT 日期: DATE 时间: DATETIME
  452 +```
1 -POSTGRESQL_DB_NAME = allied_creation_dev 1 +POSTGRESQL_DB_NAME = allied_creation_test
2 POSTGRESQL_HOST = 114.55.200.59 2 POSTGRESQL_HOST = 114.55.200.59
3 POSTGRESQL_PORT = 31543 3 POSTGRESQL_PORT = 31543
4 POSTGRESQL_USER = postgres 4 POSTGRESQL_USER = postgres
@@ -9,3 +9,12 @@ HTTP_PORT = 8081 @@ -9,3 +9,12 @@ HTTP_PORT = 8081
9 ENABLE_KAFKA_LOG11 = true 9 ENABLE_KAFKA_LOG11 = true
10 HTTPS_PORT = 8143 10 HTTPS_PORT = 8143
11 ALLIED_CREATION_USER_HOST = http://allied-creation-user-dev.fjmaimaimai.com 11 ALLIED_CREATION_USER_HOST = http://allied-creation-user-dev.fjmaimaimai.com
  12 +# AUTH_SERVER_HOST = http://127.0.0.1:8081
  13 +BYTE_CORE_HOST = http://47.97.5.102:8303
  14 +METADATA_BASTION_HOST = http://106.75.231.90:9999
  15 +
  16 +STARROCKS_DB_NAME = character_library
  17 +STARROCKS_USER = root
  18 +STARROCKS_PASSWORD = eagle1010
  19 +STARROCKS_HOST = 220.250.41.79
  20 +STARROCKS_PORT = 9030
  1 +/*1.初始化索引*/
  2 +
  3 +/*files*/
  4 +CREATE INDEX IF NOT EXISTS idx_files_company_id_file_type ON metadata.files USING btree((context->>'companyId'),file_type);
  5 +CREATE INDEX IF NOT EXISTS idx_files_source_file_id ON metadata.files USING btree(source_file_id);
  6 +
  7 +/*tables*/
  8 +CREATE INDEX IF NOT EXISTS idx_tables_company_id_table_type ON metadata.tables USING btree((context->>'companyId'),table_type);
  9 +CREATE INDEX IF NOT EXISTS idx_tables_parent_id ON metadata.tables USING btree(parent_id);
  10 +
  11 +/*logs*/
  12 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_log_type_source_id ON metadata.logs USING btree((context->>'companyId'),log_type,source_id);
  13 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_object_name ON metadata.logs USING btree((context->>'companyId'),object_name);
  14 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_object_type ON metadata.logs USING btree((context->>'companyId'),object_type);
  15 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_operation_type ON metadata.logs USING btree((context->>'companyId'),operation_type);
  16 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_content ON metadata.logs USING btree((context->>'companyId'),content);
  17 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_operator_name ON metadata.logs USING btree((context->>'companyId'),operator_name);
  18 +CREATE INDEX IF NOT EXISTS idx_logs_company_id_created_at ON metadata.logs USING btree((context->>'companyId'),created_at);
  19 +
  20 +/*mapping_rules*/
  21 +CREATE INDEX IF NOT EXISTS idx_mapping_rules_company_id_table_id_file_id ON metadata.mapping_rules USING btree((context->>'companyId'),table_id,file_id);
@@ -2,7 +2,7 @@ apiVersion: v1 @@ -2,7 +2,7 @@ apiVersion: v1
2 kind: Service 2 kind: Service
3 metadata: 3 metadata:
4 name: character-library-metadata-bastion 4 name: character-library-metadata-bastion
5 - namespace: <replace-your-k8s-namespace> 5 + namespace: mmm-suplus-dev
6 labels: 6 labels:
7 k8s-app: character-library-metadata-bastion 7 k8s-app: character-library-metadata-bastion
8 spec: 8 spec:
@@ -17,7 +17,7 @@ apiVersion: extensions/v1beta1 @@ -17,7 +17,7 @@ apiVersion: extensions/v1beta1
17 kind: Deployment 17 kind: Deployment
18 metadata: 18 metadata:
19 name: character-library-metadata-bastion 19 name: character-library-metadata-bastion
20 - namespace: <replace-your-k8s-namespace> 20 + namespace: mmm-suplus-dev
21 labels: 21 labels:
22 k8s-app: character-library-metadata-bastion 22 k8s-app: character-library-metadata-bastion
23 spec: 23 spec:
@@ -52,12 +52,69 @@ spec: @@ -52,12 +52,69 @@ spec:
52 - mountPath: /opt/logs 52 - mountPath: /opt/logs
53 name: accesslogs 53 name: accesslogs
54 env: 54 env:
  55 + - name: POSTGRESQL_DB_NAME
  56 + valueFrom:
  57 + configMapKeyRef:
  58 + name: suplus-config
  59 + key: postgresqlalliedcreation.dbname
  60 + - name: POSTGRESQL_USER
  61 + valueFrom:
  62 + configMapKeyRef:
  63 + name: suplus-config
  64 + key: postgresql.user
  65 + - name: POSTGRESQL_PASSWORD
  66 + valueFrom:
  67 + configMapKeyRef:
  68 + name: suplus-config
  69 + key: postgresql.password
  70 + - name: POSTGRESQL_HOST
  71 + valueFrom:
  72 + configMapKeyRef:
  73 + name: suplus-config
  74 + key: postgresql.host
  75 + - name: POSTGRESQL_PORT
  76 + valueFrom:
  77 + configMapKeyRef:
  78 + name: suplus-config
  79 + key: postgresql.port
  80 + - name: REDIS_HOST
  81 + valueFrom:
  82 + configMapKeyRef:
  83 + name: suplus-config
  84 + key: redis.ip
  85 + - name: REDIS_PORT
  86 + valueFrom:
  87 + configMapKeyRef:
  88 + name: suplus-config
  89 + key: redis.port
  90 + - name: REDIS_AUTH
  91 + value: ""
55 - name: LOG_LEVEL 92 - name: LOG_LEVEL
56 value: "debug" 93 value: "debug"
57 - name: ERROR_BASE_CODE 94 - name: ERROR_BASE_CODE
58 value: "1" 95 value: "1"
59 - name: ERROR_BASE_CODE_MULTIPLE 96 - name: ERROR_BASE_CODE_MULTIPLE
60 - value: "1000" 97 + value: "2000"
  98 + - name: ENABLE_KAFKA_LOG
  99 + value: "true"
  100 + - name: HTTP_PORT
  101 + value: "8082"
  102 + - name: SERVICE_ENV
  103 + value: "dev"
  104 + - name: METADATA_BASTION_HOST
  105 + value: "http://character-library-metadata-bastion-dev.fjmaimaimai.com"
  106 + - name: BYTE_CORE_HOST
  107 + value: "http://47.97.5.102:8303"
  108 + - name: STARROCKS_HOST
  109 + value: "220.250.41.79"
  110 + - name: STARROCKS_PORT
  111 + value: "9030"
  112 + - name: STARROCKS_DB_NAME
  113 + value: "character_library_standard"
  114 + - name: STARROCKS_USER
  115 + value: "root"
  116 + - name: STARROCKS_PASSWORD
  117 + value: "eagle1010"
61 volumes: 118 volumes:
62 - name: accesslogs 119 - name: accesslogs
63 emptyDir: {} 120 emptyDir: {}
1 #!/bin/bash 1 #!/bin/bash
2 export PATH=/root/local/bin:$PATH 2 export PATH=/root/local/bin:$PATH
3 -kubectl -n <replace-your-k8s-namespace> get pods | grep -q character-library-metadata-bastion 3 +kubectl -n mmm-suplus-dev get pods | grep -q character-library-metadata-bastion
4 if [ "$?" == "1" ];then 4 if [ "$?" == "1" ];then
5 kubectl create -f /tmp/dev/character-library-metadata-bastion/character-library-metadata-bastion.yaml --record 5 kubectl create -f /tmp/dev/character-library-metadata-bastion/character-library-metadata-bastion.yaml --record
6 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q character-library-metadata-bastion 6 + kubectl -n mmm-suplus-dev get svc | grep -q character-library-metadata-bastion
7 if [ "$?" == "0" ];then 7 if [ "$?" == "0" ];then
8 echo "character-library-metadata-bastion service install success!" 8 echo "character-library-metadata-bastion service install success!"
9 else 9 else
10 echo "character-library-metadata-bastion service install fail!" 10 echo "character-library-metadata-bastion service install fail!"
11 fi 11 fi
12 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q character-library-metadata-bastion 12 + kubectl -n mmm-suplus-dev get pods | grep -q character-library-metadata-bastion
13 if [ "$?" == "0" ];then 13 if [ "$?" == "0" ];then
14 echo "character-library-metadata-bastion deployment install success!" 14 echo "character-library-metadata-bastion deployment install success!"
15 else 15 else
@@ -17,24 +17,24 @@ if [ "$?" == "1" ];then @@ -17,24 +17,24 @@ if [ "$?" == "1" ];then
17 fi 17 fi
18 else 18 else
19 kubectl delete -f /tmp/dev/character-library-metadata-bastion/character-library-metadata-bastion.yaml 19 kubectl delete -f /tmp/dev/character-library-metadata-bastion/character-library-metadata-bastion.yaml
20 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q character-library-metadata-bastion 20 + kubectl -n mmm-suplus-dev get svc | grep -q character-library-metadata-bastion
21 while [ "$?" == "0" ] 21 while [ "$?" == "0" ]
22 do 22 do
23 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q character-library-metadata-bastion 23 + kubectl -n mmm-suplus-dev get svc | grep -q character-library-metadata-bastion
24 done 24 done
25 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q character-library-metadata-bastion 25 + kubectl -n mmm-suplus-dev get pods | grep -q character-library-metadata-bastion
26 while [ "$?" == "0" ] 26 while [ "$?" == "0" ]
27 do 27 do
28 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q character-library-metadata-bastion 28 + kubectl -n mmm-suplus-dev get pods | grep -q character-library-metadata-bastion
29 done 29 done
30 kubectl create -f /tmp/dev/character-library-metadata-bastion/character-library-metadata-bastion.yaml --record 30 kubectl create -f /tmp/dev/character-library-metadata-bastion/character-library-metadata-bastion.yaml --record
31 - kubectl -n <replace-your-k8s-namespace> get svc | grep -q character-library-metadata-bastion 31 + kubectl -n mmm-suplus-dev get svc | grep -q character-library-metadata-bastion
32 if [ "$?" == "0" ];then 32 if [ "$?" == "0" ];then
33 echo "character-library-metadata-bastion service update success!" 33 echo "character-library-metadata-bastion service update success!"
34 else 34 else
35 echo "character-library-metadata-bastion service update fail!" 35 echo "character-library-metadata-bastion service update fail!"
36 fi 36 fi
37 - kubectl -n <replace-your-k8s-namespace> get pods | grep -q character-library-metadata-bastion 37 + kubectl -n mmm-suplus-dev get pods | grep -q character-library-metadata-bastion
38 if [ "$?" == "0" ];then 38 if [ "$?" == "0" ];then
39 echo "character-library-metadata-bastion deployment update success!" 39 echo "character-library-metadata-bastion deployment update success!"
40 else 40 else
  1 +apiVersion: v1
  2 +kind: Service
  3 +metadata:
  4 + name: character-library-metadata-bastion
  5 + namespace: mmm-suplus-test
  6 + labels:
  7 + k8s-app: character-library-metadata-bastion
  8 +spec:
  9 + ports:
  10 + - name: "http"
  11 + port: 80
  12 + targetPort: 8082
  13 + selector:
  14 + k8s-app: character-library-metadata-bastion
  15 +---
  16 +apiVersion: extensions/v1beta1
  17 +kind: Deployment
  18 +metadata:
  19 + name: character-library-metadata-bastion
  20 + namespace: mmm-suplus-test
  21 + labels:
  22 + k8s-app: character-library-metadata-bastion
  23 +spec:
  24 + replicas: 1
  25 + template:
  26 + metadata:
  27 + labels:
  28 + k8s-app: character-library-metadata-bastion
  29 + spec:
  30 + affinity:
  31 + nodeAffinity:
  32 + preferredDuringSchedulingIgnoredDuringExecution:
  33 + - preference: {}
  34 + weight: 100
  35 + requiredDuringSchedulingIgnoredDuringExecution:
  36 + nodeSelectorTerms:
  37 + - matchExpressions:
  38 + - key: kubernetes.io/hostname
  39 + operator: In
  40 + values:
  41 + - cn-hangzhou.i-bp1djh1xn7taumbue1ze
  42 + - cn-hangzhou.i-bp1djh1xn7taumbue1zd
  43 + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb
  44 + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy
  45 + containers:
  46 + - name: character-library-metadata-bastion
  47 + image: 192.168.0.243:5000/mmm/character-library-metadata-bastion:dev
  48 + imagePullPolicy: Always
  49 + ports:
  50 + - containerPort: 8082
  51 + volumeMounts:
  52 + - mountPath: /opt/logs
  53 + name: accesslogs
  54 + env:
  55 + - name: POSTGRESQL_DB_NAME
  56 + valueFrom:
  57 + configMapKeyRef:
  58 + name: suplus-config
  59 + key: postgresqlalliedcreation.dbname
  60 + - name: POSTGRESQL_USER
  61 + valueFrom:
  62 + configMapKeyRef:
  63 + name: suplus-config
  64 + key: postgresql.user
  65 + - name: POSTGRESQL_PASSWORD
  66 + valueFrom:
  67 + configMapKeyRef:
  68 + name: suplus-config
  69 + key: postgresql.password
  70 + - name: POSTGRESQL_HOST
  71 + valueFrom:
  72 + configMapKeyRef:
  73 + name: suplus-config
  74 + key: postgresql.host
  75 + - name: POSTGRESQL_PORT
  76 + valueFrom:
  77 + configMapKeyRef:
  78 + name: suplus-config
  79 + key: postgresql.port
  80 + - name: REDIS_HOST
  81 + valueFrom:
  82 + configMapKeyRef:
  83 + name: suplus-config
  84 + key: redis.ip
  85 + - name: REDIS_PORT
  86 + valueFrom:
  87 + configMapKeyRef:
  88 + name: suplus-config
  89 + key: redis.port
  90 + - name: REDIS_AUTH
  91 + value: ""
  92 + - name: LOG_LEVEL
  93 + value: "debug"
  94 + - name: ERROR_BASE_CODE
  95 + value: "1"
  96 + - name: ERROR_BASE_CODE_MULTIPLE
  97 + value: "2000"
  98 + - name: ENABLE_KAFKA_LOG
  99 + value: "false"
  100 + - name: HTTP_PORT
  101 + value: "8082"
  102 + - name: SERVICE_ENV
  103 + value: "test"
  104 + - name: METADATA_BASTION_HOST
  105 + value: "http://character-library-metadata-bastion-test.fjmaimaimai.com"
  106 + - name: BYTE_CORE_HOST
  107 + value: "http://47.97.5.102:8303"
  108 + - name: STARROCKS_HOST
  109 + value: "220.250.41.79"
  110 + - name: STARROCKS_PORT
  111 + value: "9030"
  112 + - name: STARROCKS_DB_NAME
  113 + value: "character_library"
  114 + - name: STARROCKS_USER
  115 + value: "root"
  116 + - name: STARROCKS_PASSWORD
  117 + value: "eagle1010"
  118 + volumes:
  119 + - name: accesslogs
  120 + emptyDir: {}
  1 +#!/bin/bash
  2 +export PATH=/root/local/bin:$PATH
  3 +kubectl -n mmm-suplus-test get pods | grep -q character-library-metadata-bastion
  4 +if [ "$?" == "1" ];then
  5 + kubectl create -f /tmp/test/character-library-metadata-bastion/character-library-metadata-bastion.yaml --record
  6 + kubectl -n mmm-suplus-test get svc | grep -q character-library-metadata-bastion
  7 + if [ "$?" == "0" ];then
  8 + echo "character-library-metadata-bastion service install success!"
  9 + else
  10 + echo "character-library-metadata-bastion service install fail!"
  11 + fi
  12 + kubectl -n mmm-suplus-test get pods | grep -q character-library-metadata-bastion
  13 + if [ "$?" == "0" ];then
  14 + echo "character-library-metadata-bastion deployment install success!"
  15 + else
  16 + echo "character-library-metadata-bastion deployment install fail!"
  17 + fi
  18 +else
  19 + kubectl delete -f /tmp/test/character-library-metadata-bastion/character-library-metadata-bastion.yaml
  20 + kubectl -n mmm-suplus-test get svc | grep -q character-library-metadata-bastion
  21 + while [ "$?" == "0" ]
  22 + do
  23 + kubectl -n mmm-suplus-test get svc | grep -q character-library-metadata-bastion
  24 + done
  25 + kubectl -n mmm-suplus-test get pods | grep -q character-library-metadata-bastion
  26 + while [ "$?" == "0" ]
  27 + do
  28 + kubectl -n mmm-suplus-test get pods | grep -q character-library-metadata-bastion
  29 + done
  30 + kubectl create -f /tmp/test/character-library-metadata-bastion/character-library-metadata-bastion.yaml --record
  31 + kubectl -n mmm-suplus-test get svc | grep -q character-library-metadata-bastion
  32 + if [ "$?" == "0" ];then
  33 + echo "character-library-metadata-bastion service update success!"
  34 + else
  35 + echo "character-library-metadata-bastion service update fail!"
  36 + fi
  37 + kubectl -n mmm-suplus-test get pods | grep -q character-library-metadata-bastion
  38 + if [ "$?" == "0" ];then
  39 + echo "character-library-metadata-bastion deployment update success!"
  40 + else
  41 + echo "character-library-metadata-bastion deployment update fail!"
  42 + fi
  43 +fi
  1 +version: v1
  2 +kind: HttpApi
  3 +metadata:
  4 + service: log
  5 + path: /logs
  6 + endpoints:
  7 + - method: createLog
  8 + route:
  9 + post: /
  10 + - method: updateLog
  11 + route:
  12 + put: /{logId}
  13 + - method: getLog
  14 + route:
  15 + get: /{logId}
  16 + - method: removeLog
  17 + route:
  18 + delete: /{logId}
  19 + - method: listLog
  20 + route:
  21 + get: /
  22 + params:
  23 + - name: offset
  24 + - name: limit
  25 + - method: searchLog
  26 + route:
  27 + post: /search
  1 +version: v1
  2 +kind: HttpApi
  3 +metadata:
  4 + service: mappingRule
  5 + path: /mapping-rules
  6 + endpoints:
  7 + - method: createMappingRule
  8 + route:
  9 + post: /
  10 + - method: updateMappingRule
  11 + route:
  12 + put: /{mappingRuleId}
  13 + - method: getMappingRule
  14 + route:
  15 + get: /{mappingRuleId}
  16 + - method: removeMappingRule
  17 + route:
  18 + delete: /{mappingRuleId}
  19 + - method: listMappingRule
  20 + route:
  21 + get: /
  22 + params:
  23 + - name: offset
  24 + - name: limit
  25 + - method: search
  26 + route:
  27 + post: /search
  28 + - method: prepare
  29 + route:
  30 + post: /prepare
  1 +version: v1
  2 +kind: HttpApi
  3 +metadata:
  4 + service: querySet
  5 + path: /query-sets
  6 + endpoints:
  7 + - method: createQuerySet
  8 + route:
  9 + post: /
  10 + - method: updateQuerySet
  11 + route:
  12 + put: /{Id}
  13 + - method: getQuerySet
  14 + route:
  15 + get: /{Id}
  16 + - method: removeQuerySet
  17 + route:
  18 + delete: /{Id}
  19 + - method: listQuerySet
  20 + route:
  21 + get: /
  22 + params:
  23 + - name: offset
  24 + - name: limit
  25 + - method: changeStatus
  26 + route:
  27 + post: /change-status
  28 + - method: copy
  29 + route:
  30 + post: /copy
  31 + - method: dependencyGraph
  32 + route:
  33 + post: /dependency-ggraph
  34 + - method: move
  35 + route:
  36 + post: /move
  37 + - method: rename
  38 + route:
  39 + post: /rename
  40 + - method: searchQuerySet
  41 + route:
  42 + post: /search
  1 +version: v1
  2 +kind: HttpApi
  3 +metadata:
  4 + service: table
  5 + path: /tables
  6 + endpoints:
  7 + - method: createTable
  8 + route:
  9 + post: /
  10 + - method: updateTable
  11 + route:
  12 + put: /{tableId}
  13 + - method: getTable
  14 + route:
  15 + get: /{tableId}
  16 + - method: removeTable
  17 + route:
  18 + delete: /{tableId}
  19 + - method: listTable
  20 + route:
  21 + get: /
  22 + params:
  23 + - name: offset
  24 + - name: limit
  25 + - method: splitDataTable
  26 + route:
  27 + post: /split-data-table
  28 + - method: batchEditSubTable
  29 + route:
  30 + post: /batch-edit-sub-table
  31 + - method: copyDataTable
  32 + route:
  33 + post: /copy-data-table
  34 + - method: search
  35 + route:
  36 + post: /search
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: context
  5 + description: 扩展
  6 + type:
  7 + array: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: mainTableFields
  5 + description: 主表列
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: mappingFields
  5 + description: 校验文件列
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: mappingRuleId
  5 + description: 匹配规则ID
  6 + type:
  7 + primitive: int
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: verifiedFileFields
  5 + description: 校验文件列
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: flag
  5 + description: 标识 1.group 2.query-set
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: name
  5 + description: 名称
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: pinName
  5 + description: 拼音(排序使用)
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: queryComponents
  5 + description: 查询组件
  6 + type:
  7 + array: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: querySetId
  5 + description: 查询集合ID
  6 + type:
  7 + primitive: int
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: querySetInfo
  5 + description: 查询集合信息
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: status
  5 + description: 状态 1:启用 2:关闭 (子过程默认启用)
  6 + type:
  7 + primitive: int
  1 +version: v1
  2 +kind: Attribute
  3 +metadata:
  4 + name: type
  5 + description: schema:方案 sub-process:子过程
  6 + type:
  7 + primitive: string
  1 +version: v1
  2 +kind: Schema
  3 +metadata:
  4 + name: mappingRule
  5 + description: 匹配规则配置
  6 + attributes:
  7 + - ref: mappingRuleId
  8 + required: true
  9 + - ref: name
  10 + required: true
  11 + - ref: tableId
  12 + required: true
  13 + - ref: fileId
  14 + required: true
  15 + - ref: mainTableFields
  16 + required: true
  17 + - ref: verifiedFileFields
  18 + required: true
  19 + - ref: mappingFields
  20 + required: true
  21 + - ref: createdAt
  22 + required: true
  23 + - ref: updatedAt
  24 + required: true
  25 + - ref: deletedAt
  26 + required: true
  1 +version: v1
  2 +kind: Schema
  3 +metadata:
  4 + name: querySet
  5 + description: 查询集合
  6 + attributes:
  7 + - ref: querySetId
  8 + required: true
  9 + - ref: type
  10 + required: true
  11 + - ref: flag
  12 + required: true
  13 + - ref: name
  14 + required: true
  15 + - ref: pinName
  16 + required: true
  17 + - ref: parentId
  18 + required: true
  19 + - ref: status
  20 + required: true
  21 + - ref: querySetInfo
  22 + required: true
  23 + - ref: queryComponents
  24 + required: true
  25 + - ref: sort
  26 + required: true
  27 + - ref: createdAt
  28 + required: true
  29 + - ref: updatedAt
  30 + required: true
  31 + - ref: deletedAt
  32 + required: true
  33 + - ref: context
  34 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: createLog
  5 + type: command
  6 + description: 创建日志服务
  7 + payload:
  8 + - ref: objectName
  9 + required: true
  10 + - ref: objectType
  11 + required: true
  12 + - ref: operationType
  13 + required: true
  14 + - ref: content
  15 + required: true
  16 + - ref: operatorName
  17 + required: true
  18 + result:
  19 + - name: log
  20 + type:
  21 + schema: log
  22 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: getLog
  5 + type: query
  6 + description: 返回日志服务
  7 + payload:
  8 + - ref: logId
  9 + required: true
  10 + result:
  11 + - name: log
  12 + type:
  13 + schema: log
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: listLog
  5 + type: query
  6 + description: 返回日志服务列表
  7 + payload:
  8 + - ref: offset
  9 + required: true
  10 + - ref: limit
  11 + required: true
  12 + result:
  13 + - ref: count
  14 + required: true
  15 + - name: logs
  16 + type:
  17 + array: log
  18 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: removeLog
  5 + type: command
  6 + description: 移除日志服务
  7 + payload:
  8 + - ref: logId
  9 + required: true
  10 + result:
  11 + - name: log
  12 + type:
  13 + schema: log
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: searchLog
  5 + type: command
  6 + description: 搜索日志
  7 + payload:
  8 + - ref: content
  9 + required: false
  10 + result:
  11 + - name: log
  12 + type:
  13 + schema: log
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: updateLog
  5 + type: command
  6 + description: 更新日志服务
  7 + payload:
  8 + - ref: logId
  9 + required: true
  10 + result:
  11 + - name: log
  12 + type:
  13 + schema: log
  14 + required: true
  1 +version: v1
  2 +kind: Service
  3 +metadata:
  4 + name: log
  5 + description: 日志服务
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: createMappingRule
  5 + type: command
  6 + description: 创建匹配规则服务
  7 + payload:
  8 + - ref: name
  9 + required: true
  10 + result:
  11 + - name: mappingRule
  12 + type:
  13 + schema: mappingRule
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: getMappingRule
  5 + type: query
  6 + description: 返回匹配规则服务
  7 + payload:
  8 + - ref: mappingRuleId
  9 + required: true
  10 + result:
  11 + - name: mappingRule
  12 + type:
  13 + schema: mappingRule
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: listMappingRule
  5 + type: query
  6 + description: 返回匹配规则服务列表
  7 + payload:
  8 + - ref: offset
  9 + required: true
  10 + - ref: limit
  11 + required: true
  12 + result:
  13 + - ref: count
  14 + required: true
  15 + - name: mappingRules
  16 + type:
  17 + array: mappingRule
  18 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: prepare
  5 + type: command
  6 + description: 匹配规则预准备(新建规则)
  7 + payload:
  8 + - ref: tableId
  9 + required: true
  10 + - ref: fileId
  11 + required: true
  12 + result:
  13 + - name: mappingRule
  14 + type:
  15 + schema: mappingRule
  16 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: removeMappingRule
  5 + type: command
  6 + description: 移除匹配规则服务
  7 + payload:
  8 + - ref: mappingRuleId
  9 + required: true
  10 + result:
  11 + - name: mappingRule
  12 + type:
  13 + schema: mappingRule
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: search
  5 + type: command
  6 + description: 搜索规则
  7 + payload:
  8 + - ref: name
  9 + required: false
  10 + result:
  11 + - name: mappingRule
  12 + type:
  13 + schema: mappingRule
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: updateMappingRule
  5 + type: command
  6 + description: 更新匹配规则服务
  7 + payload:
  8 + - ref: mappingRuleId
  9 + required: true
  10 + result:
  11 + - name: mappingRule
  12 + type:
  13 + schema: mappingRule
  14 + required: true
  1 +version: v1
  2 +kind: Service
  3 +metadata:
  4 + name: mappingRule
  5 + description: 匹配规则服务
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: changeStatus
  5 + type: command
  6 + description: 修改状态
  7 + payload:
  8 + - ref: querySetId
  9 + required: true
  10 + - ref: status
  11 + required: true
  12 + result:
  13 + - name: querySet
  14 + type:
  15 + schema: querySet
  16 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: copy
  5 + type: command
  6 + description: 移动
  7 + payload:
  8 + - ref: flag
  9 + required: true
  10 + - ref: parentId
  11 + required: true
  12 + - ref: name
  13 + required: true
  14 + - ref: querySetId
  15 + required: true
  16 + result:
  17 + - name: querySet
  18 + type:
  19 + schema: querySet
  20 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: createQuerySet
  5 + type: command
  6 + description: 创建查询集合服务
  7 + payload:
  8 + - ref: type
  9 + required: true
  10 + - ref: flag
  11 + required: true
  12 + - ref: name
  13 + required: true
  14 + - ref: parentId
  15 + required: false
  16 + result:
  17 + - name: querySet
  18 + type:
  19 + schema: querySet
  20 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: dependencyGraph
  5 + type: query
  6 + description: 依赖关系图
  7 + payload:
  8 + - ref: querySetId
  9 + required: true
  10 + result:
  11 + - name: querySet
  12 + type:
  13 + schema: querySet
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: getQuerySet
  5 + type: query
  6 + description: 返回查询集合服务
  7 + payload:
  8 + - ref: querySetId
  9 + required: true
  10 + result:
  11 + - name: querySet
  12 + type:
  13 + schema: querySet
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: listQuerySet
  5 + type: query
  6 + description: 返回查询集合服务列表
  7 + payload:
  8 + - ref: offset
  9 + required: true
  10 + - ref: limit
  11 + required: true
  12 + result:
  13 + - ref: count
  14 + required: true
  15 + - name: querySets
  16 + type:
  17 + array: querySet
  18 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: move
  5 + type: command
  6 + description: 移动
  7 + payload:
  8 + - ref: querySetId
  9 + required: true
  10 + - ref: parentId
  11 + required: true
  12 + result:
  13 + - name: querySet
  14 + type:
  15 + schema: querySet
  16 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: removeQuerySet
  5 + type: command
  6 + description: 移除查询集合服务
  7 + payload:
  8 + - ref: querySetId
  9 + required: true
  10 + result:
  11 + - name: querySet
  12 + type:
  13 + schema: querySet
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: rename
  5 + type: command
  6 + description: 重命名
  7 + payload:
  8 + - ref: querySetId
  9 + required: true
  10 + - ref: name
  11 + required: true
  12 + result:
  13 + - name: querySet
  14 + type:
  15 + schema: querySet
  16 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: searchQuerySet
  5 + type: query
  6 + description: 返回查询集合服务列表
  7 + payload:
  8 + - ref: offset
  9 + required: true
  10 + - ref: limit
  11 + required: true
  12 + result:
  13 + - ref: count
  14 + required: true
  15 + - name: querySets
  16 + type:
  17 + array: querySet
  18 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: updateQuerySet
  5 + type: command
  6 + description: 更新查询集合服务
  7 + payload:
  8 + - ref: querySetId
  9 + required: true
  10 + result:
  11 + - name: querySet
  12 + type:
  13 + schema: querySet
  14 + required: true
  1 +version: v1
  2 +kind: Service
  3 +metadata:
  4 + name: querySet
  5 + description: 查询集合服务
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: batchEditSubTable
  5 + type: command
  6 + description: 批量编辑分表
  7 + payload:
  8 + - ref: tableId
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: copyDataTable
  5 + type: command
  6 + description: 表复制
  7 + payload:
  8 + - ref: tableId
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: createTable
  5 + type: command
  6 + description: 创建表服务
  7 + payload:
  8 + - ref: name
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: getTable
  5 + type: query
  6 + description: 返回表服务
  7 + payload:
  8 + - ref: tableId
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: listTable
  5 + type: query
  6 + description: 返回表服务列表
  7 + payload:
  8 + - ref: offset
  9 + required: true
  10 + - ref: limit
  11 + required: true
  12 + result:
  13 + - ref: count
  14 + required: true
  15 + - name: tables
  16 + type:
  17 + array: table
  18 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: removeTable
  5 + type: command
  6 + description: 移除表服务
  7 + payload:
  8 + - ref: tableId
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: search
  5 + type: query
  6 + description: 表搜索
  7 + payload:
  8 + - ref: tableType
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: splitDataTable
  5 + type: command
  6 + description: 表拆分
  7 + payload:
  8 + - ref: tableId
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Method
  3 +metadata:
  4 + name: updateTable
  5 + type: command
  6 + description: 更新表服务
  7 + payload:
  8 + - ref: tableId
  9 + required: true
  10 + result:
  11 + - name: table
  12 + type:
  13 + schema: table
  14 + required: true
  1 +version: v1
  2 +kind: Service
  3 +metadata:
  4 + name: table
  5 + description: 表服务
@@ -3,32 +3,45 @@ module gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion @@ -3,32 +3,45 @@ module gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion
3 go 1.16 3 go 1.16
4 4
5 require ( 5 require (
6 - github.com/Shopify/sarama v1.25.0  
7 github.com/ajg/form v1.5.1 // indirect 6 github.com/ajg/form v1.5.1 // indirect
8 github.com/beego/beego/v2 v2.0.1 7 github.com/beego/beego/v2 v2.0.1
  8 + github.com/bwmarrin/snowflake v0.3.0
  9 + github.com/dgrijalva/jwt-go v3.2.0+incompatible
  10 + github.com/extrame/xls v0.0.1
9 github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect 11 github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect
10 github.com/fatih/structs v1.1.0 // indirect 12 github.com/fatih/structs v1.1.0 // indirect
11 github.com/gavv/httpexpect v2.0.0+incompatible 13 github.com/gavv/httpexpect v2.0.0+incompatible
12 - github.com/go-pg/pg/v10 v10.9.0  
13 - github.com/go-redis/redis v6.15.9+incompatible // indirect  
14 - github.com/go-redis/redis/v7 v7.4.1 // indirect  
15 - github.com/golang/snappy v0.0.3 // indirect  
16 - github.com/google/go-cmp v0.5.6 // indirect 14 + github.com/go-pg/pg/v10 v10.10.6
  15 + github.com/go-redis/redis v6.15.9+incompatible
17 github.com/google/go-querystring v1.1.0 // indirect 16 github.com/google/go-querystring v1.1.0 // indirect
18 - github.com/google/uuid v1.3.0 // indirect 17 + github.com/google/gofuzz v1.2.0
  18 + github.com/google/uuid v1.3.0
  19 + github.com/gookit/event v1.0.6
19 github.com/imkira/go-interpol v1.1.0 // indirect 20 github.com/imkira/go-interpol v1.1.0 // indirect
20 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 21 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
21 github.com/moul/http2curl v1.0.0 // indirect 22 github.com/moul/http2curl v1.0.0 // indirect
22 - github.com/onsi/ginkgo v1.15.2  
23 - github.com/onsi/gomega v1.11.0 23 + github.com/onsi/ginkgo v1.16.5
  24 + github.com/onsi/gomega v1.18.1
  25 + github.com/patrickmn/go-cache v2.1.0+incompatible
24 github.com/sergi/go-diff v1.2.0 // indirect 26 github.com/sergi/go-diff v1.2.0 // indirect
  27 + github.com/shopspring/decimal v1.3.1
25 github.com/smartystreets/goconvey v1.7.2 // indirect 28 github.com/smartystreets/goconvey v1.7.2 // indirect
  29 + github.com/stretchr/testify v1.7.1
26 github.com/valyala/fasthttp v1.38.0 // indirect 30 github.com/valyala/fasthttp v1.38.0 // indirect
27 github.com/xeipuuv/gojsonschema v1.2.0 // indirect 31 github.com/xeipuuv/gojsonschema v1.2.0 // indirect
  32 + github.com/xuri/excelize/v2 v2.6.0
28 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect 33 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
29 github.com/yudai/gojsondiff v1.0.0 // indirect 34 github.com/yudai/gojsondiff v1.0.0 // indirect
30 github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect 35 github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
31 github.com/yudai/pp v2.0.1+incompatible // indirect 36 github.com/yudai/pp v2.0.1+incompatible // indirect
  37 + github.com/zeromicro/go-zero v1.3.4
  38 + golang.org/x/text v0.3.7
  39 + gorm.io/driver/mysql v1.3.6
  40 + gorm.io/driver/postgres v1.3.9
  41 + gorm.io/gorm v1.23.8
32 ) 42 )
33 43
34 -replace github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 => github.com/tiptok/egglib-go v0.0.0-20220421085958-9682d0ac42c1 44 +replace (
  45 + github.com/extrame/xls v0.0.1 => github.com/tiptok/xls v1.0.1
  46 + github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 => github.com/tiptok/egglib-go v0.0.0-20220421085958-9682d0ac42c1
  47 +)
@@ -3,18 +3,21 @@ package main @@ -3,18 +3,21 @@ package main
3 import ( 3 import (
4 "fmt" 4 "fmt"
5 "github.com/beego/beego/v2/server/web" 5 "github.com/beego/beego/v2/server/web"
  6 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/crontab"
6 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant" 7 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant"
7 - "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/redis"  
8 - "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log"  
9 - "time"  
10 -  
11 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant" 8 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant"
12 - _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/pg" 9 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/pg"
  10 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/redis"
13 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/redis" 11 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/redis"
  12 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/starrocks"
  13 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log"
14 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log" 14 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log"
15 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/port/beego" 15 _ "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/port/beego"
  16 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/port/event"
16 ) 17 )
17 18
  19 +const Version = "v1.2.0"
  20 +
18 func main() { 21 func main() {
19 defer func() { 22 defer func() {
20 if r := recover(); r != nil { 23 if r := recover(); r != nil {
@@ -24,8 +27,17 @@ func main() { @@ -24,8 +27,17 @@ func main() {
24 27
25 log.InitLogHook(constant.ENABLE_KAFKA_LOG, true) 28 log.InitLogHook(constant.ENABLE_KAFKA_LOG, true)
26 redis.InitRedis() 29 redis.InitRedis()
27 -  
28 - time.Sleep(time.Second) 30 + redis.InitZeroCoreRedis()
  31 + pg.Init()
  32 + if err := starrocks.Init(); err != nil {
  33 + log.Logger.Error(err.Error())
  34 + }
  35 + cron := crontab.NewCrontabService(nil)
  36 + cron.StartCrontabTask()
  37 + defer cron.StopCrontabTask()
  38 + event.Start()
  39 + log.Logger.Info("Service:" + constant.SERVICE_NAME)
  40 + log.Logger.Info("Version:" + Version)
29 log.Logger.Info("server start!") 41 log.Logger.Info("server start!")
30 web.Run() 42 web.Run()
31 log.Logger.Info("server stop!") 43 log.Logger.Info("server stop!")
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/beego/beego/v2/task"
  7 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  8 + "github.com/linmadan/egglib-go/utils/xtime"
  9 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/factory"
  10 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  11 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/dao"
  12 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/starrocks"
  13 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log"
  14 + "io/fs"
  15 + "os"
  16 + "path/filepath"
  17 + "time"
  18 +)
  19 +
  20 +type CrontabService struct {
  21 +}
  22 +
  23 +func NewCrontabService(options map[string]interface{}) *CrontabService {
  24 + newCrontabService := &CrontabService{}
  25 + return newCrontabService
  26 +}
  27 +
  28 +func (crontabService *CrontabService) initTask() {
  29 + autoRemoveExpiredTemporaryFile := task.NewTask("定时清理过期临时文件记录", "0 10 */1 * * *", AutoRemoveExpiredTemporaryFile)
  30 + task.AddTask("autoRemoveExpiredTemporaryFile", autoRemoveExpiredTemporaryFile)
  31 +
  32 + autoRemovePublicDownloadFile := task.NewTask("定时清理缓存文件", "0 20 */1 * * *", AutoRemovePublicDownloadFile)
  33 + task.AddTask("autoRemovePublicDownloadFile", autoRemovePublicDownloadFile)
  34 +
  35 + autoRemoveTemporaryTable := task.NewTask("定时清理临时表", "0 57 */1 * * *", AutoRemoveTemporaryTable)
  36 + task.AddTask("autoRemoveTemporaryTable", autoRemoveTemporaryTable)
  37 +}
  38 +
  39 +func (crontabService *CrontabService) StartCrontabTask() {
  40 + crontabService.initTask()
  41 + task.StartTask()
  42 + log.Logger.Info("crontab start!")
  43 +}
  44 +
  45 +func (crontabService *CrontabService) StopCrontabTask() {
  46 + task.StopTask()
  47 + log.Logger.Info("crontab stop!")
  48 +}
  49 +
  50 +func AutoRemoveExpiredTemporaryFile(ctx context.Context) error {
  51 +
  52 + defer func() {
  53 + if r := recover(); r != nil {
  54 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时清理过期临时文件记录"})
  55 + }
  56 + }()
  57 + transactionContext, err := factory.CreateTransactionContext(nil)
  58 + if err != nil {
  59 + return err
  60 + }
  61 + if err := transactionContext.StartTransaction(); err != nil {
  62 + return err
  63 + }
  64 + defer func() {
  65 + if err != nil {
  66 + log.Logger.Error("【定时清理过期临时文件记录】 失败:" + err.Error())
  67 + }
  68 + transactionContext.RollbackTransaction()
  69 + }()
  70 +
  71 + log.Logger.Debug("【定时清理过期临时文件记录】 启动")
  72 + end := xtime.New(time.Now()).BeginningOfDay().Add(-time.Hour * 6)
  73 + begin := end.AddDate(0, 0, -7)
  74 + fileRepository, _, _ := factory.FastPgFile(transactionContext, 0)
  75 + _, files, err := fileRepository.Find(map[string]interface{}{"limit": 100, "fileType": domain.TemporaryFile.ToString(), "updatedAtBegin": begin, "updatedAtEnd": end})
  76 + if err != nil {
  77 + return err
  78 + }
  79 + deleteFileService, _ := factory.CreateDeleteFileService(transactionContext)
  80 + if err = deleteFileService.DeleteFiles(&domain.Context{
  81 + OperatorName: "系统",
  82 + }, files...); err != nil {
  83 + return err
  84 + }
  85 +
  86 + if err = transactionContext.CommitTransaction(); err != nil {
  87 + return err
  88 + }
  89 + return nil
  90 +}
  91 +
  92 +func AutoRemovePublicDownloadFile(ctx context.Context) error {
  93 + var err error
  94 + defer func() {
  95 + if r := recover(); r != nil {
  96 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时清理缓存文件"})
  97 + }
  98 + }()
  99 + defer func() {
  100 + if err != nil {
  101 + log.Logger.Error("【定时清理缓存文件】 失败:" + err.Error())
  102 + }
  103 + }()
  104 + log.Logger.Debug("【定时清理缓存文件】 启动")
  105 + root := "public"
  106 + end := xtime.New(time.Now()).BeginningOfDay().AddDate(0, 0, -1)
  107 + err = filepath.Walk(root, func(path string, info fs.FileInfo, err error) error {
  108 + t := info.ModTime()
  109 + if !info.IsDir() && xtime.Before(t, end) {
  110 + err = os.Remove(path)
  111 + if err != nil {
  112 + return err
  113 + }
  114 + log.Logger.Info(fmt.Sprintf("[%v] 删除文件:%v 大小:%v 路径:%v 文件创建时间:%v", "系统", info.Name(), info.Size(), path, info.ModTime()))
  115 + return nil
  116 + }
  117 + return nil
  118 + })
  119 + if err != nil {
  120 + return err
  121 + }
  122 + return nil
  123 +}
  124 +
  125 +func AutoRemoveTemporaryTable(ctx context.Context) error {
  126 + defer func() {
  127 + if r := recover(); r != nil {
  128 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时清理过期临时文件记录"})
  129 + }
  130 + }()
  131 + transactionContext, err := factory.CreateTransactionContext(nil)
  132 + if err != nil {
  133 + return err
  134 + }
  135 + if err := transactionContext.StartTransaction(); err != nil {
  136 + return err
  137 + }
  138 + defer func() {
  139 + if err != nil {
  140 + log.Logger.Error("【定时清理临时表】 失败:" + err.Error())
  141 + }
  142 + transactionContext.RollbackTransaction()
  143 + }()
  144 +
  145 + log.Logger.Debug("【定时清理临时表】 启动")
  146 + end := xtime.New(time.Now()).BeginningOfDay().Add(-time.Hour * 12)
  147 + begin := end.AddDate(0, 0, -7)
  148 +
  149 + tableRepository, _, _ := factory.FastPgTable(transactionContext, 0)
  150 + _, tables, err := tableRepository.Find(map[string]interface{}{"beginTime": begin, "endTime": end, "tableTypes": []string{domain.TemporaryTable.ToString()}})
  151 + if err != nil {
  152 + return nil
  153 + }
  154 + for i, t := range tables {
  155 + if err = dao.TableDelete(transactionContext.(*pgTransaction.TransactionContext), t.TableId, domain.TemporaryTable); err != nil {
  156 + log.Logger.Error(err.Error())
  157 + return nil
  158 + }
  159 + log.Logger.Info(fmt.Sprintf("序号:%d 清理临时表 %v", i, t.SQLName))
  160 + if err = starrocks.DropView(starrocks.DB, t.SQLName); err != nil {
  161 + log.Logger.Error(err.Error())
  162 + return nil
  163 + }
  164 + }
  165 + //if err = dao.TableDeleteByTime(transactionContext.(*pgTransaction.TransactionContext), domain.TemporaryTable, begin, end); err != nil {
  166 + // return err
  167 + //}
  168 + if err = transactionContext.CommitTransaction(); err != nil {
  169 + return err
  170 + }
  171 + return nil
  172 +}
  1 +package command
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  4 +
  5 +type TableEventCommand struct {
  6 + EventTable *domain.EventTable
  7 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  6 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/event/command"
  7 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/factory"
  8 + tablecommand "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/table/command"
  9 + tableservice "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/table/service"
  10 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  11 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/cache"
  12 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/domainService"
  13 +)
  14 +
  15 +type TableEventService struct {
  16 +}
  17 +
  18 +func (tableEventService *TableEventService) Handler(ctx *domain.Context, cmd *command.TableEventCommand) (interface{}, error) {
  19 + transactionContext, err := factory.CreateTransactionContext(nil)
  20 + if err != nil {
  21 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  22 + }
  23 + if err := transactionContext.StartTransaction(); err != nil {
  24 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  25 + }
  26 + defer func() {
  27 + transactionContext.RollbackTransaction()
  28 + }()
  29 +
  30 + data := cmd.EventTable
  31 + tableId := 0
  32 + switch data.Type {
  33 + case domain.TableDataImportEvent, domain.TableDataEditEvent, domain.TableDeleteEvent:
  34 + tableId = data.Table.TableId
  35 + case domain.QuerySetUpdateEvent:
  36 + tableId = data.QuerySet.QuerySetInfo.BindTableId
  37 + }
  38 + if tableId == 0 {
  39 + return nil, nil
  40 + }
  41 + // tableId 相关联的
  42 + tableRepository, _, _ := factory.FastPgTable(transactionContext, 0)
  43 + _, tables, err := tableRepository.Find(map[string]interface{}{"context": data.Context, "tableTypesNotIn": []string{domain.TemporaryTable.ToString(), domain.ExcelTable.ToString()}})
  44 + if err != nil {
  45 + return nil, err
  46 + }
  47 +
  48 + tableDependencyService, _ := domainService.NewTableDependencyService(transactionContext.(*pgTransaction.TransactionContext))
  49 + tableDependTree := tableDependencyService.TableDependTree(tables, tableId)
  50 + tree := tableDependTree.Tree
  51 +
  52 + tableService := tableservice.NewTableService(nil)
  53 + for i := range tree {
  54 + cache.DefaultDataTableCacheService.DeleteDataTable(tree[i])
  55 + // fresh cache
  56 + tableService.TablePreview(data.Context, &tablecommand.TablePreviewCommand{
  57 + TableId: tree[i],
  58 + ObjectType: domain.ObjectMetaTable,
  59 + PageSize: 10000,
  60 + PageNumber: 0,
  61 + UseCache: true,
  62 + })
  63 + }
  64 +
  65 + if err := transactionContext.CommitTransaction(); err != nil {
  66 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  67 + }
  68 + return nil, nil
  69 +}
  70 +
  71 +func NewTableEventService(options map[string]interface{}) *TableEventService {
  72 + svr := &TableEventService{}
  73 + return svr
  74 +}
1 package factory 1 package factory
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "github.com/linmadan/egglib-go/transaction/pg"
  6 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/domainService"
  8 +)
  9 +
  10 +func FastLog(transactionContext application.TransactionContext, logType domain.LogType, sourceId int, logEntry domainService.Log) error {
  11 + logService, _ := domainService.NewPGLogService(transactionContext.(*pg.TransactionContext))
  12 + return logService.Log(logType, sourceId, logEntry)
  13 +}
  14 +
  15 +func CreateLoadDataTableService(transactionContext application.TransactionContext) (domain.PreviewDataTableService, error) {
  16 + return domainService.NewLoadDataTableService(transactionContext.(*pg.TransactionContext))
  17 +}
  18 +
  19 +func CreateEditDataTableService(transactionContext application.TransactionContext) (domain.EditDataTableService, error) {
  20 + return domainService.NewEditDataTableService(transactionContext.(*pg.TransactionContext))
  21 +}
  22 +
  23 +func CreateFlushDataTableService(transactionContext application.TransactionContext) (domain.FlushDataTableService, error) {
  24 + return domainService.NewFlushDataTableService(transactionContext.(*pg.TransactionContext))
  25 +}
  26 +
  27 +func CreateDeleteFileService(transactionContext application.TransactionContext) (domain.DeleteFileService, error) {
  28 + return domainService.NewDeleteFileService(transactionContext.(*pg.TransactionContext))
  29 +}
  30 +
  31 +func CreateGenerateMainTableService(transactionContext application.TransactionContext) (domain.GenerateMainTableService, error) {
  32 + return domainService.NewGenerateMainTableService(transactionContext.(*pg.TransactionContext))
  33 +}
  34 +
  35 +func CreateCopyDataTableService(transactionContext application.TransactionContext) (domain.CopyDataTableService, error) {
  36 + return domainService.NewCopyDataTableService(transactionContext.(*pg.TransactionContext))
  37 +}
  38 +
  39 +func CreateDeleteDataTableService(transactionContext application.TransactionContext) (domain.DeleteDataTableService, error) {
  40 + return domainService.NewDeleteDataTableService(transactionContext.(*pg.TransactionContext))
  41 +}
  42 +
  43 +func CreateUpdateTableStructService(transactionContext application.TransactionContext) (domain.UpdateTableStructService, error) {
  44 + return domainService.NewUpdateTableStructService(transactionContext.(*pg.TransactionContext))
  45 +}
  46 +
  47 +func CreateAddTableStructService(transactionContext application.TransactionContext) (domain.AddTableStructService, error) {
  48 + return domainService.NewAddTableStructService(transactionContext.(*pg.TransactionContext))
  49 +}
  50 +
  51 +func CreateAppendDataToTableService(transactionContext application.TransactionContext) (domain.AppendDataToTableService, error) {
  52 + return domainService.NewAppendDataToTableService(transactionContext.(*pg.TransactionContext))
  53 +}
  54 +
  55 +func CreateTableEditDataService(transactionContext application.TransactionContext) (domain.TableEditDataService, error) {
  56 + return domainService.NewTableEditDataService(transactionContext.(*pg.TransactionContext))
  57 +}
  58 +
  59 +// 字库核心
  60 +func CreateByteCoreService(transactionContext application.TransactionContext) (domain.ByteLibService, error) {
  61 + return domainService.ByteCore, nil
  62 +}
  1 +package factory
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  6 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/domainService"
  8 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/starrocks"
  9 +)
  10 +
  11 +func FastError(err error) error {
  12 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  13 +}
  14 +
  15 +func FastDataTable(options starrocks.QueryOptions) (*domain.DataTable, error) {
  16 + var err error
  17 + // 待优化分批下载,压缩
  18 + var dataTable *domain.DataTable
  19 + dataTable, err = starrocks.Query(options, starrocks.WrapQueryFuncWithDB(starrocks.DB))
  20 + if err != nil {
  21 + return nil, err
  22 + }
  23 +
  24 + dataTable.Total, err = starrocks.WrapQueryCountWithDB(options, starrocks.DB)()
  25 + if err != nil {
  26 + return nil, err
  27 + }
  28 + return dataTable, nil
  29 +}
  30 +
  31 +func FastQuerySetServices(transactionContext application.TransactionContext) (*domainService.QuerySetService, error) {
  32 + return domainService.NewQuerySetService(transactionContext.(*pgTransaction.TransactionContext))
  33 +}
  1 +package factory
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  6 +)
  7 +
  8 +// FastPgFile 快速返回文件对象
  9 +//
  10 +// transactionContext 事务
  11 +// id 对象唯一标识
  12 +func FastPgFile(transactionContext application.TransactionContext, id int) (domain.FileRepository, *domain.File, error) {
  13 + var rep domain.FileRepository
  14 + var mod *domain.File
  15 + var err error
  16 + if value, err := CreateFileRepository(map[string]interface{}{
  17 + "transactionContext": transactionContext,
  18 + }); err != nil {
  19 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  20 + } else {
  21 + rep = value
  22 + }
  23 + if id > 0 {
  24 + if mod, err = rep.FindOne(map[string]interface{}{"fileId": id}); err != nil {
  25 + if err == domain.ErrorNotFound {
  26 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该文件不存在")
  27 + }
  28 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  29 + }
  30 + }
  31 + //if err = fastPgDataAuth(transactionContext, mod, options...); err != nil {
  32 + // return nil, nil, err
  33 + //}
  34 + return rep, mod, err
  35 +}
  36 +
  37 +// FastPgTable 快速返回表格对象
  38 +//
  39 +// transactionContext 事务
  40 +// id 对象唯一标识
  41 +func FastPgTable(transactionContext application.TransactionContext, id int) (domain.TableRepository, *domain.Table, error) {
  42 + var rep domain.TableRepository
  43 + var mod *domain.Table
  44 + var err error
  45 + if value, err := CreateTableRepository(map[string]interface{}{
  46 + "transactionContext": transactionContext,
  47 + }); err != nil {
  48 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  49 + } else {
  50 + rep = value
  51 + }
  52 + if id > 0 {
  53 + if mod, err = rep.FindOne(map[string]interface{}{"tableId": id}); err != nil {
  54 + if err == domain.ErrorNotFound {
  55 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该表格不存在")
  56 + }
  57 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  58 + }
  59 + }
  60 + return rep, mod, err
  61 +}
  62 +
  63 +// FastPgLog 快速返回日志对象
  64 +//
  65 +// transactionContext 事务
  66 +// id 对象唯一标识
  67 +func FastPgLog(transactionContext application.TransactionContext, id int) (domain.LogRepository, *domain.Log, error) {
  68 + var rep domain.LogRepository
  69 + var mod *domain.Log
  70 + var err error
  71 + if value, err := CreateLogRepository(map[string]interface{}{
  72 + "transactionContext": transactionContext,
  73 + }); err != nil {
  74 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  75 + } else {
  76 + rep = value
  77 + }
  78 + if id > 0 {
  79 + if mod, err = rep.FindOne(map[string]interface{}{"logId": id}); err != nil {
  80 + if err == domain.ErrorNotFound {
  81 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该日志不存在")
  82 + }
  83 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  84 + }
  85 + }
  86 + return rep, mod, err
  87 +}
  88 +
  89 +// FastPgMappingRule 快速返回匹配规则对象
  90 +//
  91 +// transactionContext 事务
  92 +// id 对象唯一标识
  93 +func FastPgMappingRule(transactionContext application.TransactionContext, id int) (domain.MappingRuleRepository, *domain.MappingRule, error) {
  94 + var rep domain.MappingRuleRepository
  95 + var mod *domain.MappingRule
  96 + var err error
  97 + if value, err := CreateMappingRuleRepository(map[string]interface{}{
  98 + "transactionContext": transactionContext,
  99 + }); err != nil {
  100 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  101 + } else {
  102 + rep = value
  103 + }
  104 + if id > 0 {
  105 + if mod, err = rep.FindOne(map[string]interface{}{"mappingRuleId": id}); err != nil {
  106 + if err == domain.ErrorNotFound {
  107 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该匹配规则不存在")
  108 + }
  109 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  110 + }
  111 + }
  112 + return rep, mod, err
  113 +}
  114 +
  115 +// FastPgQuerySet 快速返回查询集合
  116 +//
  117 +// transactionContext 事务
  118 +// id 对象唯一标识
  119 +func FastPgQuerySet(transactionContext application.TransactionContext, id int) (domain.QuerySetRepository, *domain.QuerySet, error) {
  120 + var rep domain.QuerySetRepository
  121 + var mod *domain.QuerySet
  122 + var err error
  123 + if value, err := CreateQuerySetRepository(map[string]interface{}{
  124 + "transactionContext": transactionContext,
  125 + }); err != nil {
  126 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  127 + } else {
  128 + rep = value
  129 + }
  130 + if id > 0 {
  131 + if mod, err = rep.FindOne(map[string]interface{}{"querySetId": id}); err != nil {
  132 + if err == domain.ErrorNotFound {
  133 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该查询集合不存在")
  134 + }
  135 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  136 + }
  137 + }
  138 + return rep, mod, err
  139 +}
@@ -29,3 +29,19 @@ func CreateFileRepository(options map[string]interface{}) (domain.FileRepository @@ -29,3 +29,19 @@ func CreateFileRepository(options map[string]interface{}) (domain.FileRepository
29 } 29 }
30 return repository.NewFileRepository(transactionContext) 30 return repository.NewFileRepository(transactionContext)
31 } 31 }
  32 +
  33 +func CreateMappingRuleRepository(options map[string]interface{}) (domain.MappingRuleRepository, error) {
  34 + var transactionContext *pg.TransactionContext
  35 + if value, ok := options["transactionContext"]; ok {
  36 + transactionContext = value.(*pg.TransactionContext)
  37 + }
  38 + return repository.NewMappingRuleRepository(transactionContext)
  39 +}
  40 +
  41 +func CreateQuerySetRepository(options map[string]interface{}) (domain.QuerySetRepository, error) {
  42 + var transactionContext *pg.TransactionContext
  43 + if value, ok := options["transactionContext"]; ok {
  44 + transactionContext = value.(*pg.TransactionContext)
  45 + }
  46 + return repository.NewQuerySetRepository(transactionContext)
  47 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  6 + "reflect"
  7 + "strings"
  8 +
  9 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type AppendDataToTableCommand struct {
  13 + // 文件ID
  14 + FileId int `cname:"文件ID" json:"fileId" valid:"Required"`
  15 + // 文件ID
  16 + TableId int `cname:"表ID" json:"tableId" valid:"Required"`
  17 + // 校验文件列
  18 + MappingFields []*domain.MappingField `json:"mappingFields"`
  19 +}
  20 +
  21 +func (cmd *AppendDataToTableCommand) Valid(validation *validation.Validation) {
  22 +
  23 +}
  24 +
  25 +func (cmd *AppendDataToTableCommand) ValidateCommand() error {
  26 + valid := validation.Validation{}
  27 + b, err := valid.Valid(cmd)
  28 + if err != nil {
  29 + return err
  30 + }
  31 + if !b {
  32 + elem := reflect.TypeOf(cmd).Elem()
  33 + for _, validErr := range valid.Errors {
  34 + field, isExist := elem.FieldByName(validErr.Field)
  35 + if isExist {
  36 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  37 + } else {
  38 + return fmt.Errorf(validErr.Message)
  39 + }
  40 + }
  41 + }
  42 + return nil
  43 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type CancelVerifyingFileCommand struct {
  12 + // 文件ID
  13 + FileId int `cname:"文件ID" json:"fileId" valid:"Required"`
  14 +}
  15 +
  16 +func (cmd *CancelVerifyingFileCommand) Valid(validation *validation.Validation) {
  17 +
  18 +}
  19 +
  20 +func (cmd *CancelVerifyingFileCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(cmd)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(cmd).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type CheckFileVerifyStatusCommand struct {
  12 + // 文件ID
  13 + FileId int `cname:"文件ID" json:"objectId" valid:"Required"`
  14 +}
  15 +
  16 +func (cmd *CheckFileVerifyStatusCommand) Valid(validation *validation.Validation) {
  17 +
  18 +}
  19 +
  20 +func (cmd *CheckFileVerifyStatusCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(cmd)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(cmd).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
@@ -2,6 +2,8 @@ package command @@ -2,6 +2,8 @@ package command
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  6 + "path/filepath"
5 "reflect" 7 "reflect"
6 "strings" 8 "strings"
7 9
@@ -13,12 +15,16 @@ type CreateFileCommand struct { @@ -13,12 +15,16 @@ type CreateFileCommand struct {
13 Name string `cname:"名称" json:"name" valid:"Required"` 15 Name string `cname:"名称" json:"name" valid:"Required"`
14 // 文件地址 16 // 文件地址
15 Url string `cname:"文件地址" json:"url" valid:"Required"` 17 Url string `cname:"文件地址" json:"url" valid:"Required"`
16 - // 文件大小 18 + // 文件大小 单位KB
17 FileSize int `cname:"文件大小" json:"fileSize" valid:"Required"` 19 FileSize int `cname:"文件大小" json:"fileSize" valid:"Required"`
18 } 20 }
19 21
20 func (createFileCommand *CreateFileCommand) Valid(validation *validation.Validation) { 22 func (createFileCommand *CreateFileCommand) Valid(validation *validation.Validation) {
21 - validation.SetError("CustomValid", "未实现的自定义认证") 23 + ext := filepath.Ext(createFileCommand.Name)
  24 + if !(ext == domain.XLS || ext == domain.XLSX) {
  25 + validation.Error(fmt.Sprintf("仅支持文件格式 xls 、 xlsx"))
  26 + return
  27 + }
22 } 28 }
23 29
24 func (createFileCommand *CreateFileCommand) ValidateCommand() error { 30 func (createFileCommand *CreateFileCommand) ValidateCommand() error {
@@ -2,6 +2,7 @@ package command @@ -2,6 +2,7 @@ package command
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
5 "reflect" 6 "reflect"
6 "strings" 7 "strings"
7 8
@@ -9,12 +10,26 @@ import ( @@ -9,12 +10,26 @@ import (
9 ) 10 )
10 11
11 type EditDataTableCommand struct { 12 type EditDataTableCommand struct {
12 - // 文件ID  
13 - FileId int `cname:"文件ID" json:"fileId" valid:"Required"` 13 + //// 文件ID
  14 + //FileId int `cname:"文件ID" json:"fileId" valid:"Required"`
  15 + //
  16 + //Fields []*domain.Field
  17 + domain.EditTableRequest
14 } 18 }
15 19
16 func (editDataTableCommand *EditDataTableCommand) Valid(validation *validation.Validation) { 20 func (editDataTableCommand *EditDataTableCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 21 + if len(editDataTableCommand.ProcessFieldNames) == 0 {
  22 + validation.Error("未选择操作列")
  23 + return
  24 + }
  25 + if len(editDataTableCommand.Action) == 0 {
  26 + validation.Error("未知操作类型:" + editDataTableCommand.Action)
  27 + return
  28 + }
  29 + if editDataTableCommand.FileId == 0 {
  30 + validation.Error("文件ID不能为空")
  31 + return
  32 + }
18 } 33 }
19 34
20 func (editDataTableCommand *EditDataTableCommand) ValidateCommand() error { 35 func (editDataTableCommand *EditDataTableCommand) ValidateCommand() error {
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type ExportFileCommand struct {
  12 + // 文件ID
  13 + FileId int `cname:"文件ID" json:"fileId" valid:"Required"`
  14 +}
  15 +
  16 +func (cmd *ExportFileCommand) Valid(validation *validation.Validation) {
  17 +
  18 +}
  19 +
  20 +func (cmd *ExportFileCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(cmd)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(cmd).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
@@ -10,11 +10,15 @@ import ( @@ -10,11 +10,15 @@ import (
10 10
11 type FlushDataTableCommand struct { 11 type FlushDataTableCommand struct {
12 // 文件ID 12 // 文件ID
13 - FileId int `cname:"文件ID" json:"fileId" valid:"Required"` 13 + ObjectId int `cname:"文件ID" json:"objectId" valid:"Required"`
  14 + // 记录数
  15 + //RowCount int `cname:"记录数" json:"rowCount" valid:"Required"`
  16 + // 数据列
  17 + //DataFields []*domain.Field `cname:"数据列" json:"fields" valid:"Required"`
14 } 18 }
15 19
16 func (flushDataTableCommand *FlushDataTableCommand) Valid(validation *validation.Validation) { 20 func (flushDataTableCommand *FlushDataTableCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 21 +
18 } 22 }
19 23
20 func (flushDataTableCommand *FlushDataTableCommand) ValidateCommand() error { 24 func (flushDataTableCommand *FlushDataTableCommand) ValidateCommand() error {
@@ -11,10 +11,12 @@ import ( @@ -11,10 +11,12 @@ import (
11 type GenerateMainTableCommand struct { 11 type GenerateMainTableCommand struct {
12 // 文件ID 12 // 文件ID
13 FileId int `cname:"文件ID" json:"fileId" valid:"Required"` 13 FileId int `cname:"文件ID" json:"fileId" valid:"Required"`
  14 + // 表名
  15 + TableName string `cname:"表名" json:"tableName" valid:"Required"`
14 } 16 }
15 17
16 func (generateMainTableCommand *GenerateMainTableCommand) Valid(validation *validation.Validation) { 18 func (generateMainTableCommand *GenerateMainTableCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 19 +
18 } 20 }
19 21
20 func (generateMainTableCommand *GenerateMainTableCommand) ValidateCommand() error { 22 func (generateMainTableCommand *GenerateMainTableCommand) ValidateCommand() error {
@@ -2,6 +2,7 @@ package command @@ -2,6 +2,7 @@ package command
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
5 "reflect" 6 "reflect"
6 "strings" 7 "strings"
7 8
@@ -10,11 +11,18 @@ import ( @@ -10,11 +11,18 @@ import (
10 11
11 type LoadDataTableCommand struct { 12 type LoadDataTableCommand struct {
12 // 文件ID 13 // 文件ID
13 - FileId int `cname:"文件ID" json:"fileId" valid:"Required"` 14 + FileId int `cname:"文件ID" json:"objectId" valid:"Required"`
  15 + Fields []*domain.Field `json:"fields"`
  16 + domain.Where
14 } 17 }
15 18
16 func (loadDataTableCommand *LoadDataTableCommand) Valid(validation *validation.Validation) { 19 func (loadDataTableCommand *LoadDataTableCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 20 + if loadDataTableCommand.PageNumber == 0 {
  21 + loadDataTableCommand.PageNumber = 1
  22 + }
  23 + if loadDataTableCommand.PageSize == 0 {
  24 + loadDataTableCommand.PageSize = 20
  25 + }
18 } 26 }
19 27
20 func (loadDataTableCommand *LoadDataTableCommand) ValidateCommand() error { 28 func (loadDataTableCommand *LoadDataTableCommand) ValidateCommand() error {
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type PrepareTemporaryFileCommand struct {
  12 + // 文件ID
  13 + FileId int `cname:"文件ID" json:"fileId" valid:"Required"`
  14 +}
  15 +
  16 +func (cmd *PrepareTemporaryFileCommand) Valid(validation *validation.Validation) {
  17 +
  18 +}
  19 +
  20 +func (cmd *PrepareTemporaryFileCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(cmd)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(cmd).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
@@ -14,7 +14,7 @@ type RemoveFileCommand struct { @@ -14,7 +14,7 @@ type RemoveFileCommand struct {
14 } 14 }
15 15
16 func (removeFileCommand *RemoveFileCommand) Valid(validation *validation.Validation) { 16 func (removeFileCommand *RemoveFileCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 17 +
18 } 18 }
19 19
20 func (removeFileCommand *RemoveFileCommand) ValidateCommand() error { 20 func (removeFileCommand *RemoveFileCommand) ValidateCommand() error {
  1 +package dto
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  4 +
  5 +type DataTableDto struct {
  6 + FileId int `json:"fileId"`
  7 + DataFields []*Field `json:"dataFields"`
  8 + DataRows [][]interface{} `json:"dataRows"`
  9 + Total int `json:"total"`
  10 + PageNumber int `json:"pageNumber"`
  11 + InValidCells []InValidCell `json:"inValidCells"`
  12 +}
  13 +
  14 +type Field struct {
  15 + // 索引序号
  16 + // Index int `json:"index"`
  17 + // 名称
  18 + Name string `json:"name"`
  19 + // 对应数据库类型
  20 + Type string `json:"type"`
  21 +}
  22 +
  23 +type InValidCell struct {
  24 + X int `json:"x"`
  25 + Y int `json:"y"`
  26 + Error string `json:"error"`
  27 +}
  28 +
  29 +func NewDataTableDtoDemo(fileId int) DataTableDto {
  30 + return DataTableDto{
  31 + DataFields: []*Field{
  32 + {
  33 + //Index: 1,
  34 + Name: "产品名称",
  35 + Type: domain.String.ToString(),
  36 + },
  37 + {
  38 + //Index: 2,
  39 + Name: "产品数量",
  40 + Type: domain.Int.ToString(),
  41 + },
  42 + },
  43 + DataRows: [][]interface{}{
  44 + {"素面", 200},
  45 + {"冻豆腐", 400},
  46 + {"冻豆腐1", 300},
  47 + {"冻豆2", "A"},
  48 + },
  49 + InValidCells: []InValidCell{
  50 + {
  51 + X: 1,
  52 + Y: 3,
  53 + Error: "不是一个有效的数值",
  54 + },
  55 + },
  56 + PageNumber: 1,
  57 + Total: 100,
  58 + FileId: fileId,
  59 + }
  60 +}
  1 +package dto
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  4 +
  5 +type EditDataTableDto struct {
  6 + Code int `json:"errNo,omitempty"`
  7 + Error string `json:"errMsg,omitempty"`
  8 + InValidCells []domain.InValidCell `json:"inValidCells,omitempty"`
  9 +}
  10 +
  11 +func (d *EditDataTableDto) Load(m *domain.DataEditDataTable) *EditDataTableDto {
  12 + d.Error = ""
  13 + if len(m.InValidCells) > 0 {
  14 + d.Error = "类型转换错误"
  15 + d.Code = 1001 // 1001:类型转换错误
  16 + }
  17 + //d.InValidCells = m.InValidCells
  18 + return d
  19 +}
  1 +package dto
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/utils/xtime"
  5 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  6 +)
  7 +
  8 +type FileDto struct {
  9 + // 文件ID
  10 + FileId int `json:"fileId"`
  11 + // 名称
  12 + Name string `json:"name"`
  13 + // 文件地址
  14 + Url string `json:"url"`
  15 + // 文件类型
  16 + FileType string `json:"fileType"`
  17 + // 后缀扩展
  18 + Ext string `json:"ext"`
  19 + // 创建时间
  20 + Time string `json:"time"`
  21 +}
  22 +
  23 +func (d *FileDto) Load(f *domain.File) {
  24 + d.FileId = f.FileId
  25 + d.Name = f.FileInfo.Name
  26 + d.Url = f.FileInfo.Url
  27 + d.FileType = f.FileType
  28 + d.Ext = f.FileInfo.Ext
  29 + d.Time = xtime.New(f.UpdatedAt).Local().Format("2006-01-02 15:04:05")
  30 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  6 + "reflect"
  7 + "strings"
  8 +
  9 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type SearchFileQuery struct {
  13 + // 查询偏离量
  14 + // Offset int `cname:"查询偏离量" json:"offset"`
  15 + // 查询限制
  16 + Limit int `cname:"查询限制" json:"limit"`
  17 + // 页码
  18 + // PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  19 + // 页数
  20 + FileName string `cname:"文件名称" json:"fileName,omitempty"`
  21 + PageSize int `cname:"页数" json:"pageSize,omitempty"`
  22 + LastId int `cname:"最后一条记录ID" json:"lastId"`
  23 + FileType domain.FileType `cname:"文件类型" json:"fileType" valid:"Required"`
  24 + Context *domain.Context
  25 +}
  26 +
  27 +func (cmd *SearchFileQuery) Valid(validation *validation.Validation) {
  28 + cmd.Limit = cmd.PageSize
  29 +}
  30 +
  31 +func (cmd *SearchFileQuery) ValidateQuery() error {
  32 + valid := validation.Validation{}
  33 + b, err := valid.Valid(cmd)
  34 + if err != nil {
  35 + return err
  36 + }
  37 + if !b {
  38 + elem := reflect.TypeOf(cmd).Elem()
  39 + for _, validErr := range valid.Errors {
  40 + field, isExist := elem.FieldByName(validErr.Field)
  41 + if isExist {
  42 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  43 + } else {
  44 + return fmt.Errorf(validErr.Message)
  45 + }
  46 + }
  47 + }
  48 + return nil
  49 +}
  1 +package service
  2 +
  3 +import (
  4 + "bytes"
  5 + "fmt"
  6 + "github.com/beego/beego/v2/client/httplib"
  7 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/excel"
  8 + "time"
  9 +
  10 + "github.com/linmadan/egglib-go/core/application"
  11 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/factory"
  12 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/file/command"
  13 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/file/dto"
  14 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  15 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/redis"
  16 +)
  17 +
  18 +// FilePreview 加载表格数据
  19 +func (fileService *FileService) FilePreview(ctx *domain.Context, loadDataTableCommand *command.LoadDataTableCommand) (interface{}, error) {
  20 + if err := loadDataTableCommand.ValidateCommand(); err != nil {
  21 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  22 + }
  23 + transactionContext, err := factory.CreateTransactionContext(nil)
  24 + if err != nil {
  25 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  26 + }
  27 + if err := transactionContext.StartTransaction(); err != nil {
  28 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  29 + }
  30 + defer func() {
  31 + transactionContext.RollbackTransaction()
  32 + }()
  33 +
  34 + loadDataTableService, _ := factory.CreateLoadDataTableService(transactionContext)
  35 + data, err := loadDataTableService.Preview(ctx, loadDataTableCommand.FileId, loadDataTableCommand.Fields, loadDataTableCommand.Where)
  36 + if err != nil {
  37 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  38 + }
  39 +
  40 + if err := transactionContext.CommitTransaction(); err != nil {
  41 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  42 + }
  43 +
  44 + return data, nil
  45 +}
  46 +
  47 +// PrepareTemporaryFile 准备临时文件
  48 +func (fileService *FileService) PrepareTemporaryFile(ctx *domain.Context, cmd *command.PrepareTemporaryFileCommand) (interface{}, error) {
  49 + if err := cmd.ValidateCommand(); err != nil {
  50 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  51 + }
  52 + transactionContext, err := factory.CreateTransactionContext(nil)
  53 + if err != nil {
  54 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  55 + }
  56 + if err := transactionContext.StartTransaction(); err != nil {
  57 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  58 + }
  59 + defer func() {
  60 + transactionContext.RollbackTransaction()
  61 + }()
  62 +
  63 + loadDataTableService, _ := factory.CreateLoadDataTableService(transactionContext)
  64 + data, err := loadDataTableService.CreateTemporaryFile(ctx, cmd.FileId)
  65 + if err != nil {
  66 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  67 + }
  68 +
  69 + if err := transactionContext.CommitTransaction(); err != nil {
  70 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  71 + }
  72 +
  73 + fileDto := &dto.FileDto{}
  74 + fileDto.Load(data)
  75 + return fileDto, nil
  76 +}
  77 +
  78 +// EditDataTable 编辑表格数据
  79 +func (fileService *FileService) EditDataTable(ctx *domain.Context, editDataTableCommand *command.EditDataTableCommand) (interface{}, error) {
  80 + if err := editDataTableCommand.ValidateCommand(); err != nil {
  81 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  82 + }
  83 + transactionContext, err := factory.CreateTransactionContext(nil)
  84 + if err != nil {
  85 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  86 + }
  87 + if err := transactionContext.StartTransaction(); err != nil {
  88 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  89 + }
  90 + defer func() {
  91 + transactionContext.RollbackTransaction()
  92 + }()
  93 +
  94 + cache := redis.NewFileCacheService()
  95 + temporaryFile, err := cache.Get(redis.KeyTemporaryFileInfo(editDataTableCommand.FileId))
  96 + if err != nil {
  97 + return nil, factory.FastError(err)
  98 + }
  99 + editDataTableCommand.Fields = temporaryFile.Fields
  100 + editDataTableCommand.ProcessFields = temporaryFile.MatchFields(editDataTableCommand.ProcessFieldNames)
  101 + if len(editDataTableCommand.ProcessFields) == 0 {
  102 + return nil, factory.FastError(fmt.Errorf("请至少选择一个数据列"))
  103 + }
  104 + // allowAction := func(fields []*domain.Field, action string) error {
  105 + // for _, f := range fields {
  106 + // if f.SQLType != string(domain.String) &&
  107 + // !(action == domain.RemoveColumn || action == domain.CopyColumn || action == domain.RenameColumn || action == domain.ConvertColumnType) {
  108 + // return fmt.Errorf("列【%v】必须先转字符串类型",f.Name)
  109 + // }
  110 + // }
  111 + // return nil
  112 + // }
  113 + // if err = allowAction(editDataTableCommand.ProcessFields, editDataTableCommand.Action); err != nil {
  114 + // return nil, factory.FastError(err)
  115 + // }
  116 + editDataTableService, _ := factory.CreateEditDataTableService(transactionContext)
  117 + response, err := editDataTableService.Edit(ctx, editDataTableCommand.EditTableRequest)
  118 + if err != nil {
  119 + return nil, factory.FastError(err)
  120 + }
  121 + if err := transactionContext.CommitTransaction(); err != nil {
  122 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  123 + }
  124 + return (&dto.EditDataTableDto{}).Load(response), nil
  125 +}
  126 +
  127 +// FlushDataTable 持久化表格数据
  128 +func (fileService *FileService) FlushDataTable(ctx *domain.Context, flushDataTableCommand *command.FlushDataTableCommand) (interface{}, error) {
  129 + if err := flushDataTableCommand.ValidateCommand(); err != nil {
  130 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  131 + }
  132 + transactionContext, err := factory.CreateTransactionContext(nil)
  133 + if err != nil {
  134 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  135 + }
  136 + if err := transactionContext.StartTransaction(); err != nil {
  137 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  138 + }
  139 + defer func() {
  140 + transactionContext.RollbackTransaction()
  141 + }()
  142 + flushDataTableService, _ := factory.CreateFlushDataTableService(transactionContext)
  143 + cache := redis.NewFileCacheService()
  144 + temporaryFile, err := cache.Get(redis.KeyTemporaryFileInfo(flushDataTableCommand.ObjectId))
  145 + if err != nil {
  146 + return nil, factory.FastError(err)
  147 + }
  148 +
  149 + if _, err := flushDataTableService.Flush(ctx, flushDataTableCommand.ObjectId, &domain.Table{
  150 + DataFields: temporaryFile.Fields,
  151 + RowCount: temporaryFile.Total,
  152 + }); err != nil {
  153 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  154 + }
  155 + if err := transactionContext.CommitTransaction(); err != nil {
  156 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  157 + }
  158 + return struct{}{}, nil
  159 +}
  160 +
  161 +// GenerateMainTable 生成主表
  162 +func (fileService *FileService) GenerateMainTable(ctx *domain.Context, generateMainTableCommand *command.GenerateMainTableCommand) (interface{}, error) {
  163 + if err := generateMainTableCommand.ValidateCommand(); err != nil {
  164 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  165 + }
  166 + transactionContext, err := factory.CreateTransactionContext(nil)
  167 + if err != nil {
  168 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  169 + }
  170 + if err := transactionContext.StartTransaction(); err != nil {
  171 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  172 + }
  173 + defer func() {
  174 + transactionContext.RollbackTransaction()
  175 + }()
  176 +
  177 + generateMainTableService, _ := factory.CreateGenerateMainTableService(transactionContext)
  178 + _, err = generateMainTableService.GenerateTable(ctx, generateMainTableCommand.FileId, generateMainTableCommand.TableName)
  179 + if err != nil {
  180 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  181 + }
  182 + if err := transactionContext.CommitTransaction(); err != nil {
  183 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  184 + }
  185 + return struct{}{}, nil
  186 +}
  187 +
  188 +// AppendDataToTable 追加数据
  189 +func (fileService *FileService) AppendDataToTable(ctx *domain.Context, cmd *command.AppendDataToTableCommand) (interface{}, error) {
  190 + if err := cmd.ValidateCommand(); err != nil {
  191 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  192 + }
  193 + transactionContext, err := factory.CreateTransactionContext(nil)
  194 + if err != nil {
  195 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  196 + }
  197 + if err := transactionContext.StartTransaction(); err != nil {
  198 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  199 + }
  200 + defer func() {
  201 + transactionContext.RollbackTransaction()
  202 + }()
  203 +
  204 + generateMainTableService, _ := factory.CreateAppendDataToTableService(transactionContext)
  205 + result, err := generateMainTableService.AppendData(ctx, cmd.FileId, cmd.TableId, cmd.MappingFields)
  206 + if err != nil {
  207 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  208 + }
  209 + if err := transactionContext.CommitTransaction(); err != nil {
  210 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  211 + }
  212 + return result, nil
  213 +}
  214 +
  215 +// ExportFile 文件下载
  216 +func (fileService *FileService) ExportFile(ctx *domain.Context, cmd *command.ExportFileCommand) (interface{}, error) {
  217 + if err := cmd.ValidateCommand(); err != nil {
  218 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  219 + }
  220 + transactionContext, err := factory.CreateTransactionContext(nil)
  221 + if err != nil {
  222 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  223 + }
  224 + if err := transactionContext.StartTransaction(); err != nil {
  225 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  226 + }
  227 + defer func() {
  228 + transactionContext.RollbackTransaction()
  229 + }()
  230 +
  231 + _, file, err := factory.FastPgFile(transactionContext, cmd.FileId)
  232 + if err != nil {
  233 + return nil, factory.FastError(err)
  234 + }
  235 +
  236 + var response = struct {
  237 + Url string `json:"url"`
  238 + Ext string `json:"ext"`
  239 + FileName string `json:"fileName"`
  240 + }{}
  241 + if file.FileType == domain.SourceFile.ToString() {
  242 + response.Url = file.FileInfo.Url
  243 + response.Ext = domain.XLSX
  244 + response.FileName = file.FileInfo.Name
  245 + return response, nil
  246 + }
  247 + _, table, err := factory.FastPgTable(transactionContext, file.FileInfo.TableId)
  248 + if err != nil {
  249 + return nil, factory.FastError(err)
  250 + }
  251 +
  252 + f, err := httplib.Get(file.FileInfo.Url).Bytes()
  253 + if err != nil {
  254 + return nil, factory.FastError(err)
  255 + }
  256 + reader := bytes.NewReader(f)
  257 + var importer *excel.Importer = excel.NewExcelImportByFile(file.FileInfo.Ext)
  258 + data, err := importer.OpenExcelFromIoReader(reader)
  259 + if err != nil {
  260 + return nil, factory.FastError(err)
  261 + }
  262 + filename := fmt.Sprintf("%v_%v.xlsx", file.FileInfo.Name, time.Now().Format("060102150405"))
  263 + path := fmt.Sprintf("public/%v", filename)
  264 + writerTo := excel.NewXLXSWriterTo(importer.Reader().Header().Columns, data)
  265 + writerTo.ToInterfaces = domain.MakeToInterfaces(table.DataFields)
  266 + if err := writerTo.Save(path); err != nil {
  267 + return nil, factory.FastError(err)
  268 + }
  269 +
  270 + response.Url = domain.DownloadUrl(filename)
  271 + response.FileName = file.FileInfo.Name
  272 + response.Ext = domain.XLSX
  273 +
  274 + if err := transactionContext.CommitTransaction(); err != nil {
  275 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  276 + }
  277 + return response, nil
  278 +}
@@ -2,12 +2,18 @@ package service @@ -2,12 +2,18 @@ package service
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "path/filepath"
  6 + "time"
  7 +
5 "github.com/linmadan/egglib-go/core/application" 8 "github.com/linmadan/egglib-go/core/application"
6 "github.com/linmadan/egglib-go/utils/tool_funs" 9 "github.com/linmadan/egglib-go/utils/tool_funs"
7 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/factory" 10 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/factory"
8 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/file/command" 11 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/file/command"
  12 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/file/dto"
9 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/file/query" 13 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/file/query"
10 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" 14 "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  15 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/domainService"
  16 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils"
11 ) 17 )
12 18
13 // 文件服务 19 // 文件服务
@@ -15,7 +21,7 @@ type FileService struct { @@ -15,7 +21,7 @@ type FileService struct {
15 } 21 }
16 22
17 // 创建文件服务 23 // 创建文件服务
18 -func (fileService *FileService) CreateFile(createFileCommand *command.CreateFileCommand) (interface{}, error) { 24 +func (fileService *FileService) CreateFile(ctx *domain.Context, createFileCommand *command.CreateFileCommand) (interface{}, error) {
19 if err := createFileCommand.ValidateCommand(); err != nil { 25 if err := createFileCommand.ValidateCommand(); err != nil {
20 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 26 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
21 } 27 }
@@ -29,90 +35,47 @@ func (fileService *FileService) CreateFile(createFileCommand *command.CreateFile @@ -29,90 +35,47 @@ func (fileService *FileService) CreateFile(createFileCommand *command.CreateFile
29 defer func() { 35 defer func() {
30 transactionContext.RollbackTransaction() 36 transactionContext.RollbackTransaction()
31 }() 37 }()
32 - newFile := &domain.File{  
33 - //Name: createFileCommand.Name,  
34 - //Url: createFileCommand.Url,  
35 - //FileSize: createFileCommand.FileSize,  
36 - }  
37 - var fileRepository domain.FileRepository  
38 - if value, err := factory.CreateFileRepository(map[string]interface{}{  
39 - "transactionContext": transactionContext,  
40 - }); err != nil {  
41 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())  
42 - } else {  
43 - fileRepository = value 38 + fileInfo := &domain.FileInfo{
  39 + Name: domain.FileName(createFileCommand.Name),
  40 + Url: createFileCommand.Url,
  41 + FileSize: createFileCommand.FileSize,
  42 + Ext: filepath.Ext(createFileCommand.Name),
44 } 43 }
45 - if file, err := fileRepository.Save(newFile); err != nil {  
46 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())  
47 - } else {  
48 - if err := transactionContext.CommitTransaction(); err != nil {  
49 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
50 - }  
51 - return file, nil  
52 - }  
53 -}  
54 -  
55 -// 编辑表格数据  
56 -func (fileService *FileService) EditDataTable(editDataTableCommand *command.EditDataTableCommand) (interface{}, error) {  
57 - if err := editDataTableCommand.ValidateCommand(); err != nil {  
58 - return nil, application.ThrowError(application.ARG_ERROR, err.Error())  
59 - }  
60 - transactionContext, err := factory.CreateTransactionContext(nil)  
61 - if err != nil {  
62 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
63 - }  
64 - if err := transactionContext.StartTransaction(); err != nil {  
65 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
66 - }  
67 - defer func() {  
68 - transactionContext.RollbackTransaction()  
69 - }()  
70 - if err := transactionContext.CommitTransaction(); err != nil {  
71 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
72 - }  
73 - return nil, nil  
74 -} 44 + newFile := &domain.File{
  45 + FileType: domain.SourceFile.ToString(),
  46 + FileInfo: fileInfo,
  47 + SourceFileId: 0,
  48 + //Operator: "",
  49 + CreatedAt: time.Now(),
  50 + UpdatedAt: time.Now(),
  51 + Context: ctx,
  52 + }
  53 + fileRepository, _, _ := factory.FastPgFile(transactionContext, 0)
75 54
76 -// 持久化表格数据  
77 -func (fileService *FileService) FlushDataTable(flushDataTableCommand *command.FlushDataTableCommand) (interface{}, error) {  
78 - if err := flushDataTableCommand.ValidateCommand(); err != nil {  
79 - return nil, application.ThrowError(application.ARG_ERROR, err.Error())  
80 - }  
81 - transactionContext, err := factory.CreateTransactionContext(nil)  
82 - if err != nil {  
83 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
84 - }  
85 - if err := transactionContext.StartTransaction(); err != nil {  
86 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 55 + // 文件名相同进行替换
  56 + if oldFile, findOldFileErr := fileRepository.FindOne(map[string]interface{}{
  57 + "context": ctx,
  58 + "fileName": fileInfo.Name,
  59 + "fileType": domain.SourceFile.ToString(),
  60 + }); oldFile != nil && findOldFileErr == nil {
  61 + oldFile.FileInfo = fileInfo
  62 + oldFile.UpdatedAt = time.Now()
  63 + newFile = oldFile
87 } 64 }
88 - defer func() {  
89 - transactionContext.RollbackTransaction()  
90 - }()  
91 - if err := transactionContext.CommitTransaction(); err != nil {  
92 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
93 - }  
94 - return nil, nil  
95 -}  
96 65
97 -// 生成主表  
98 -func (fileService *FileService) GenerateMainTable(generateMainTableCommand *command.GenerateMainTableCommand) (interface{}, error) {  
99 - if err := generateMainTableCommand.ValidateCommand(); err != nil {  
100 - return nil, application.ThrowError(application.ARG_ERROR, err.Error())  
101 - }  
102 - transactionContext, err := factory.CreateTransactionContext(nil) 66 + file, err := fileRepository.Save(newFile)
103 if err != nil { 67 if err != nil {
104 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 68 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
105 } 69 }
106 - if err := transactionContext.StartTransaction(); err != nil {  
107 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 70 + if err = factory.FastLog(transactionContext, domain.CommonLog, file.FileId, &domainService.FileUploadSuccessLog{
  71 + LogEntry: domain.NewLogEntry(file.FileInfo.Name, domain.SourceFile.ToString(), domain.FileUpload, ctx),
  72 + }); err != nil {
  73 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
108 } 74 }
109 - defer func() {  
110 - transactionContext.RollbackTransaction()  
111 - }()  
112 if err := transactionContext.CommitTransaction(); err != nil { 75 if err := transactionContext.CommitTransaction(); err != nil {
113 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 76 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
114 } 77 }
115 - return nil, nil 78 + return struct{}{}, nil
116 } 79 }
117 80
118 // 返回文件服务 81 // 返回文件服务
@@ -143,7 +106,7 @@ func (fileService *FileService) GetFile(getFileQuery *query.GetFileQuery) (inter @@ -143,7 +106,7 @@ func (fileService *FileService) GetFile(getFileQuery *query.GetFileQuery) (inter
143 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 106 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
144 } 107 }
145 if file == nil { 108 if file == nil {
146 - return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getFileQuery.FileId))) 109 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%d", getFileQuery.FileId))
147 } else { 110 } else {
148 if err := transactionContext.CommitTransaction(); err != nil { 111 if err := transactionContext.CommitTransaction(); err != nil {
149 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 112 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
@@ -188,9 +151,9 @@ func (fileService *FileService) ListFile(listFileQuery *query.ListFileQuery) (in @@ -188,9 +151,9 @@ func (fileService *FileService) ListFile(listFileQuery *query.ListFileQuery) (in
188 } 151 }
189 } 152 }
190 153
191 -// 加载表格数据  
192 -func (fileService *FileService) LoadDataTable(loadDataTableCommand *command.LoadDataTableCommand) (interface{}, error) {  
193 - if err := loadDataTableCommand.ValidateCommand(); err != nil { 154 +// 返回文件服务列表
  155 +func (fileService *FileService) SearchFile(listFileQuery *query.SearchFileQuery) (interface{}, error) {
  156 + if err := listFileQuery.ValidateQuery(); err != nil {
194 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 157 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
195 } 158 }
196 transactionContext, err := factory.CreateTransactionContext(nil) 159 transactionContext, err := factory.CreateTransactionContext(nil)
@@ -203,14 +166,35 @@ func (fileService *FileService) LoadDataTable(loadDataTableCommand *command.Load @@ -203,14 +166,35 @@ func (fileService *FileService) LoadDataTable(loadDataTableCommand *command.Load
203 defer func() { 166 defer func() {
204 transactionContext.RollbackTransaction() 167 transactionContext.RollbackTransaction()
205 }() 168 }()
  169 + var fileRepository domain.FileRepository
  170 + if value, err := factory.CreateFileRepository(map[string]interface{}{
  171 + "transactionContext": transactionContext,
  172 + }); err != nil {
  173 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  174 + } else {
  175 + fileRepository = value
  176 + }
  177 + count, files, err := fileRepository.Find(utils.ObjectToMap(listFileQuery))
  178 + if err != nil {
  179 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  180 + }
  181 + var fileDtos = make([]*dto.FileDto, 0)
  182 + for _, file := range files {
  183 + var item = &dto.FileDto{}
  184 + item.Load(file)
  185 + fileDtos = append(fileDtos, item)
  186 + }
206 if err := transactionContext.CommitTransaction(); err != nil { 187 if err := transactionContext.CommitTransaction(); err != nil {
207 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 188 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
208 } 189 }
209 - return nil, nil 190 + return map[string]interface{}{
  191 + "count": count,
  192 + "files": fileDtos,
  193 + }, nil
210 } 194 }
211 195
212 // 移除文件服务 196 // 移除文件服务
213 -func (fileService *FileService) RemoveFile(removeFileCommand *command.RemoveFileCommand) (interface{}, error) { 197 +func (fileService *FileService) RemoveFile(ctx *domain.Context, removeFileCommand *command.RemoveFileCommand) (interface{}, error) {
214 if err := removeFileCommand.ValidateCommand(); err != nil { 198 if err := removeFileCommand.ValidateCommand(); err != nil {
215 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 199 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
216 } 200 }
@@ -237,16 +221,17 @@ func (fileService *FileService) RemoveFile(removeFileCommand *command.RemoveFile @@ -237,16 +221,17 @@ func (fileService *FileService) RemoveFile(removeFileCommand *command.RemoveFile
237 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 221 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
238 } 222 }
239 if file == nil { 223 if file == nil {
240 - return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeFileCommand.FileId))) 224 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%d", removeFileCommand.FileId))
241 } 225 }
242 - if file, err := fileRepository.Remove(file); err != nil { 226 + deleteFileService, _ := factory.CreateDeleteFileService(transactionContext)
  227 + err = deleteFileService.DeleteFiles(ctx, file)
  228 + if err != nil {
243 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 229 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
244 - } else {  
245 - if err := transactionContext.CommitTransaction(); err != nil {  
246 - return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())  
247 - }  
248 - return file, nil  
249 } 230 }
  231 + if err := transactionContext.CommitTransaction(); err != nil {
  232 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  233 + }
  234 + return struct{}{}, nil
250 } 235 }
251 236
252 // 更新文件服务 237 // 更新文件服务
@@ -277,7 +262,7 @@ func (fileService *FileService) UpdateFile(updateFileCommand *command.UpdateFile @@ -277,7 +262,7 @@ func (fileService *FileService) UpdateFile(updateFileCommand *command.UpdateFile
277 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 262 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
278 } 263 }
279 if file == nil { 264 if file == nil {
280 - return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateFileCommand.FileId))) 265 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%d", updateFileCommand.FileId))
281 } 266 }
282 if err := file.Update(tool_funs.SimpleStructToMap(updateFileCommand)); err != nil { 267 if err := file.Update(tool_funs.SimpleStructToMap(updateFileCommand)); err != nil {
283 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) 268 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
@@ -292,6 +277,82 @@ func (fileService *FileService) UpdateFile(updateFileCommand *command.UpdateFile @@ -292,6 +277,82 @@ func (fileService *FileService) UpdateFile(updateFileCommand *command.UpdateFile
292 } 277 }
293 } 278 }
294 279
  280 +// 取消校验中的文件
  281 +func (fileService *FileService) CancelVerifyingFile(ctx *domain.Context, cmd *command.CancelVerifyingFileCommand) (interface{}, error) {
  282 + if err := cmd.ValidateCommand(); err != nil {
  283 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  284 + }
  285 + transactionContext, err := factory.CreateTransactionContext(nil)
  286 + if err != nil {
  287 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  288 + }
  289 + if err := transactionContext.StartTransaction(); err != nil {
  290 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  291 + }
  292 + defer func() {
  293 + transactionContext.RollbackTransaction()
  294 + }()
  295 +
  296 + _, file, err := factory.FastPgFile(transactionContext, cmd.FileId)
  297 + if err != nil {
  298 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  299 + }
  300 + if file.FileType != domain.TemporaryFile.ToString() {
  301 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "校验中的文件才允许取消")
  302 + }
  303 +
  304 + deleteFileService, _ := factory.CreateDeleteFileService(transactionContext)
  305 + err = deleteFileService.DeleteFiles(nil, file)
  306 + if err != nil {
  307 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  308 + }
  309 +
  310 + byteCore, _ := factory.CreateByteCoreService(transactionContext)
  311 + _, err = byteCore.CancelFile(domain.ReqCancelFile{})
  312 + if err != nil {
  313 + return nil, factory.FastError(err)
  314 + }
  315 +
  316 + if err := transactionContext.CommitTransaction(); err != nil {
  317 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  318 + }
  319 + return struct{}{}, nil
  320 +}
  321 +
  322 +// CheckFileVerifyStatus 检查文件校验状态
  323 +func (fileService *FileService) CheckFileVerifyStatus(ctx *domain.Context, cmd *command.CheckFileVerifyStatusCommand) (interface{}, error) {
  324 + if err := cmd.ValidateCommand(); err != nil {
  325 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  326 + }
  327 + transactionContext, err := factory.CreateTransactionContext(nil)
  328 + if err != nil {
  329 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  330 + }
  331 + if err := transactionContext.StartTransaction(); err != nil {
  332 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  333 + }
  334 + defer func() {
  335 + transactionContext.RollbackTransaction()
  336 + }()
  337 +
  338 + fileRepository, file, err := factory.FastPgFile(transactionContext, cmd.FileId)
  339 + if err != nil {
  340 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  341 + }
  342 + var res = struct {
  343 + ExistVerifyFile bool `json:"existVerifyFile"`
  344 + }{}
  345 + _, verifyFiles, findErr := fileRepository.Find(map[string]interface{}{"context": ctx, "fileType": domain.VerifiedFile.ToString(), "sourceFileId": file.SourceFileId})
  346 + if findErr == nil && len(verifyFiles) > 0 {
  347 + res.ExistVerifyFile = true
  348 + }
  349 +
  350 + if err := transactionContext.CommitTransaction(); err != nil {
  351 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  352 + }
  353 + return res, nil
  354 +}
  355 +
295 func NewFileService(options map[string]interface{}) *FileService { 356 func NewFileService(options map[string]interface{}) *FileService {
296 newFileService := &FileService{} 357 newFileService := &FileService{}
297 return newFileService 358 return newFileService
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type CreateLogCommand struct {
  12 + // 对象名称 数据表名 / 文件名
  13 + ObjectName string `cname:"对象名称 数据表名 / 文件名" json:"objectName" valid:"Required"`
  14 + // 对象类型 1.主表 2.分表 3.副表 4.源文件 5.校验文件
  15 + ObjectType string `cname:"对象类型 1.主表 2.分表 3.副表 4.源文件 5.校验文件" json:"objectType" valid:"Required"`
  16 + // 操作类型 1.主表生成 2.主表拆分 3.数据导入 4.分表生成 5.表复制 6.编辑记录 7.文件上传 8.文件校验
  17 + OperationType string `cname:"操作类型 1.主表生成 2.主表拆分 3.数据导入 4.分表生成 5.表复制 6.编辑记录 7.文件上传 8.文件校验" json:"operationType" valid:"Required"`
  18 + // 日志内容
  19 + Content string `cname:"日志内容" json:"content" valid:"Required"`
  20 + // 操作人名称
  21 + OperatorName string `cname:"操作人名称" json:"operatorName" valid:"Required"`
  22 +}
  23 +
  24 +func (createLogCommand *CreateLogCommand) Valid(validation *validation.Validation) {
  25 + validation.SetError("CustomValid", "未实现的自定义认证")
  26 +}
  27 +
  28 +func (createLogCommand *CreateLogCommand) ValidateCommand() error {
  29 + valid := validation.Validation{}
  30 + b, err := valid.Valid(createLogCommand)
  31 + if err != nil {
  32 + return err
  33 + }
  34 + if !b {
  35 + elem := reflect.TypeOf(createLogCommand).Elem()
  36 + for _, validErr := range valid.Errors {
  37 + field, isExist := elem.FieldByName(validErr.Field)
  38 + if isExist {
  39 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  40 + } else {
  41 + return fmt.Errorf(validErr.Message)
  42 + }
  43 + }
  44 + }
  45 + return nil
  46 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type RemoveLogCommand struct {
  12 + // 日志ID
  13 + LogId int `cname:"日志ID" json:"logId" valid:"Required"`
  14 +}
  15 +
  16 +func (removeLogCommand *RemoveLogCommand) Valid(validation *validation.Validation) {
  17 + validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (removeLogCommand *RemoveLogCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(removeLogCommand)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(removeLogCommand).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 + "time"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  10 +
  11 + "github.com/beego/beego/v2/core/validation"
  12 +)
  13 +
  14 +type SearchLogCommand struct {
  15 + // 日志类型 VerifiedStepLog:校验步骤 CommonLog:常规日志
  16 + LogType string `json:"logType"`
  17 + // 日志内容
  18 + MatchContent string `cname:"匹配日志内容" json:"matchContent,omitempty"`
  19 + // 源数据ID
  20 + SourceId int `cname:"源数据ID" json:"sourceId"`
  21 + // 多个源数据ID
  22 + InSourceId []int `cname:"多个源数据ID" json:"inSourceId"`
  23 + // 页码
  24 + PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  25 + // 页数
  26 + PageSize int `cname:"页数" json:"pageSize,omitempty"`
  27 + // 对象名称
  28 + ObjectName string `cname:"页数" json:"objectName,omitempty"`
  29 +
  30 + Year int `cname:"年" json:"year,omitempty"`
  31 + Month int `cname:"月" json:"month,omitempty"`
  32 + Day int `cname:"日" json:"day,omitempty"`
  33 + // 开始时间
  34 + BeginTime time.Time `cname:"开始时间" json:"beginTime"`
  35 + // 结束时间
  36 + EndTime time.Time `cname:"结束时间" json:"endTime"`
  37 + // 按log_id 排序
  38 + SortByLogId string `json:"sortByLogId"`
  39 + Context *domain.Context
  40 +}
  41 +
  42 +func (cmd *SearchLogCommand) Valid(validation *validation.Validation) {
  43 + if cmd.Year > 0 && cmd.Month == 0 && cmd.Day == 0 {
  44 + cmd.BeginTime = time.Date(cmd.Year, 1, 1, 0, 0, 0, 0, time.Local)
  45 + cmd.EndTime = cmd.BeginTime.AddDate(1, 0, 0)
  46 + }
  47 + if cmd.Year > 0 && cmd.Month > 0 && cmd.Day == 0 {
  48 + cmd.BeginTime = time.Date(cmd.Year, time.Month(cmd.Month), 1, 0, 0, 0, 0, time.Local)
  49 + cmd.EndTime = cmd.BeginTime.AddDate(0, 1, 0)
  50 + }
  51 + if cmd.Year > 0 && cmd.Month > 0 && cmd.Day > 0 {
  52 + cmd.BeginTime = time.Date(cmd.Year, time.Month(cmd.Month), cmd.Day, 0, 0, 0, 0, time.Local)
  53 + cmd.EndTime = cmd.BeginTime.AddDate(0, 0, 1)
  54 + }
  55 + if cmd.PageNumber == 0 {
  56 + cmd.PageNumber = 1
  57 + }
  58 +}
  59 +
  60 +func (cmd *SearchLogCommand) ValidateCommand() error {
  61 + valid := validation.Validation{}
  62 + b, err := valid.Valid(cmd)
  63 + if err != nil {
  64 + return err
  65 + }
  66 + if !b {
  67 + elem := reflect.TypeOf(cmd).Elem()
  68 + for _, validErr := range valid.Errors {
  69 + field, isExist := elem.FieldByName(validErr.Field)
  70 + if isExist {
  71 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  72 + } else {
  73 + return fmt.Errorf(validErr.Message)
  74 + }
  75 + }
  76 + }
  77 + return nil
  78 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type UpdateLogCommand struct {
  12 + // 日志ID
  13 + LogId int `cname:"日志ID" json:"logId" valid:"Required"`
  14 +}
  15 +
  16 +func (updateLogCommand *UpdateLogCommand) Valid(validation *validation.Validation) {
  17 + validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (updateLogCommand *UpdateLogCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(updateLogCommand)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(updateLogCommand).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
  1 +package dto
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  4 +
  5 +type LogDto struct {
  6 + // 日志ID
  7 + LogId int `json:"logId"`
  8 + // 日志类型 1.校验步骤 2.常规日志
  9 + //LogType string `json:"logType"`
  10 + // 源数据ID
  11 + SourceId int `json:"sourceId"`
  12 + // 对象名称 数据表名 / 文件名
  13 + ObjectName string `json:"objectName"`
  14 + // 对象类型 1.主表 2.分表 3.副表 4.源文件 5.校验文件
  15 + ObjectType string `json:"objectType"`
  16 + // 操作类型 1.主表生成 2.主表拆分 3.数据导入 4.分表生成 5.表复制 6.编辑记录 7.文件上传 8.文件校验
  17 + OperationType string `json:"operationType"`
  18 + // 日志内容
  19 + Content string `json:"content"`
  20 + // 操作人名称
  21 + OperatorName string `json:"operatorName"`
  22 + // 创建时间
  23 + CreatedAt string `json:"createdAt"`
  24 +}
  25 +
  26 +func (d *LogDto) Load(m *domain.Log) {
  27 + d.LogId = m.LogId
  28 + d.SourceId = m.SourceId
  29 + d.ObjectName = m.ObjectName
  30 + d.ObjectType = m.ObjectType
  31 + d.OperationType = m.OperationType
  32 + d.Content = m.Content
  33 + d.OperatorName = m.OperatorName
  34 + d.CreatedAt = m.CreatedAt.Local().Format("2006-01-02 15:04:05")
  35 +}
  1 +package dto
  2 +
  3 +import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
  4 +
  5 +type VerifiedStepLogDto struct {
  6 + // 日志ID
  7 + LogId int `json:"logId"`
  8 + // 日志类型 1.校验步骤 2.常规日志
  9 + //LogType string `json:"logType"`
  10 + // 源数据ID
  11 + //SourceId int `json:"sourceId"`
  12 + // 对象名称 数据表名 / 文件名
  13 + //ObjectName string `json:"objectName"`
  14 + // 对象类型 1.主表 2.分表 3.副表 4.源文件 5.校验文件
  15 + //ObjectType string `json:"objectType"`
  16 + // 操作类型 1.主表生成 2.主表拆分 3.数据导入 4.分表生成 5.表复制 6.编辑记录 7.文件上传 8.文件校验
  17 + //OperationType string `json:"operationType"`
  18 + // 日志内容
  19 + Content string `json:"content"`
  20 + // 操作人名称
  21 + //OperatorName string `json:"operatorName"`
  22 + // 创建时间
  23 + CreatedAt string `json:"createdAt"`
  24 + // 错误级别
  25 + Level string `json:"level"`
  26 + // 错误信息
  27 + Error string `json:"error"`
  28 +}
  29 +
  30 +func (d *VerifiedStepLogDto) Load(m *domain.Log) {
  31 + d.LogId = m.LogId
  32 + //d.SourceId = m.SourceId
  33 + //d.ObjectName = m.ObjectName
  34 + //d.ObjectType = m.ObjectType
  35 + //d.OperationType = m.OperationType
  36 + d.Content = m.Content
  37 + //d.OperatorName = m.OperatorName
  38 + d.CreatedAt = m.CreatedAt.Local().Format("2006-01-02 15:04:05")
  39 + d.Level = m.Entry.Level
  40 + d.Error = m.Entry.Error
  41 + if len(d.Level) == 0 {
  42 + d.Level = domain.LevelInfo.ToString()
  43 + }
  44 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type GetLogQuery struct {
  12 + // 日志ID
  13 + LogId int `cname:"日志ID" json:"logId" valid:"Required"`
  14 +}
  15 +
  16 +func (getLogQuery *GetLogQuery) Valid(validation *validation.Validation) {
  17 + validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (getLogQuery *GetLogQuery) ValidateQuery() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(getLogQuery)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(getLogQuery).Elem()
  28 + for _, validErr := range valid.Errors {
  29 + field, isExist := elem.FieldByName(validErr.Field)
  30 + if isExist {
  31 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  32 + } else {
  33 + return fmt.Errorf(validErr.Message)
  34 + }
  35 + }
  36 + }
  37 + return nil
  38 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 +
  8 + "github.com/beego/beego/v2/core/validation"
  9 +)
  10 +
  11 +type ListLogQuery struct {
  12 + // 查询偏离量
  13 + Offset int `cname:"查询偏离量" json:"offset" valid:"Required"`
  14 + // 查询限制
  15 + Limit int `cname:"查询限制" json:"limit" valid:"Required"`
  16 +}
  17 +
  18 +func (listLogQuery *ListLogQuery) Valid(validation *validation.Validation) {
  19 + validation.SetError("CustomValid", "未实现的自定义认证")
  20 +}
  21 +
  22 +func (listLogQuery *ListLogQuery) ValidateQuery() error {
  23 + valid := validation.Validation{}
  24 + b, err := valid.Valid(listLogQuery)
  25 + if err != nil {
  26 + return err
  27 + }
  28 + if !b {
  29 + elem := reflect.TypeOf(listLogQuery).Elem()
  30 + for _, validErr := range valid.Errors {
  31 + field, isExist := elem.FieldByName(validErr.Field)
  32 + if isExist {
  33 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  34 + } else {
  35 + return fmt.Errorf(validErr.Message)
  36 + }
  37 + }
  38 + }
  39 + return nil
  40 +}