作者 Administrator

合并分支 'test' 到 'master'

Test



查看合并请求 !4
正在显示 61 个修改的文件 包含 4419 行增加56 行删除

要显示太多修改。

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

1 -FROM 192.168.0.243:5000/mmm/allied-creation-manufacture:20210809 1 +FROM 192.168.0.243:5000/mmm/allied-creation-user:20210809
2 ENV APP_DIR $GOPATH/src/project-20211220 2 ENV APP_DIR $GOPATH/src/project-20211220
3 RUN mkdir -p $APP_DIR 3 RUN mkdir -p $APP_DIR
4 WORKDIR $APP_DIR/ 4 WORKDIR $APP_DIR/
  1 +FROM golang:alpine
  2 +ENV APP_DIR $GOPATH/src/project-20211220
  3 +ENV POSTGRESQL_DB_NAME="" \
  4 + POSTGRESQL_USER="" \
  5 + POSTGRESQL_PASSWORD="" \
  6 + POSTGRESQL_HOST="" \
  7 + POSTGRESQL_PORT="" \
  8 + REDIS_HOST="" \
  9 + REDIS_PORT="" \
  10 + REDIS_AUTH="" \
  11 + LOG_LEVEL="debug" \
  12 + ERROR_BASE_CODE="1" \
  13 + ERROR_BASE_CODE_MULTIPLE="2000" \
  14 + ENABLE_KAFKA_LOG="false" \
  15 + HTTP_PORT="8082" \
  16 + SERVICE_ENV="prd" \
  17 + ALLIED_CREATION_USER_HOST="https://allied-creation-user-prd.fjmaimaimai.com" \
  18 + MANUFACTURE_DEFAULT_COMPANYID="1" \
  19 + MANUFACTURE_DEFAULT_ORGID="1" \
  20 + MANUFACTURE_DEFAULT_WORKSHOPID="2" \
  21 + MANUFACTURE_PRODUCT_TYPE="0502010004ST,0502010004ST" \
  22 + MQTT_HOST="47.97.5.102" \
  23 + MQTT_PORT="6000"
  24 +RUN mkdir -p $APP_DIR
  25 +WORKDIR $APP_DIR/
  26 +COPY ./pkg pkg
  27 +COPY ./config config
  28 +COPY ./go.mod go.mod
  29 +COPY ./go.sum go.sum
  30 +COPY ./main.go main.go
  31 +RUN ["ln","-sf","/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime"]
  32 +ENV GO111MODULE on
  33 +ENV GOPROXY https://goproxy.cn
  34 +RUN ["go","mod","tidy"]
  35 +RUN ["go","build"]
  36 +RUN ["ls"]
  37 +ENTRYPOINT ["./allied-creation-manufacture"]
1 -#project  
  1 +# 生产制造项目说明
  2 +
  3 +## 1.数据导入导出模块
  4 +
  5 +### 1.1.Excel导入流程
  6 +
  7 +- 原型说明
  8 +
  9 +选择模板下载、文件上传
  10 +![](https://doc-press.fjmaimaimai.com/team/frontend/plugins/data-transfer-upload.png)
  11 +
  12 +导入数据检验有错,显示具体错误
  13 +![](https://timeless-world.oss-cn-shenzhen.aliyuncs.com/opportunity/dev_online/20220225/object/1645791913_Rz2JJkkx6xEXtAFdXDH5eH6NTjfhtjxf.jpg)
  14 +
  15 +- [导入接口文档地址](https://doc-press.fjmaimaimai.com/team/frontend/plugins/business/import.html)
  16 +
  17 +
  18 +```
  19 +POST/v1/web/file-import
  20 +
  21 +Content-Type multipart/form-data
  22 +
  23 +params:
  24 +
  25 +file 文件
  26 +code 对应导入模块的编码
  27 +```
  28 +
  29 +- ``对接步骤``以导入公司用户模块为例
  30 +
  31 +1.定义接口导入的``code``为``ADMIN_SYSTEM-MANAGE_BASE_USER``
  32 +2.根据接口解析导入文件的数据
  33 +3.调用基础库解析数据并传到后台
  34 +```go
  35 +
  36 +// 1.解析列
  37 +excelImport := excel.NewExcelImport()
  38 +excelImport.RowBegin = 3 //第二行开始读取
  39 +excelImport.DataFields = []excel.DataField{
  40 + {EnName: "userCode", CnName: "*用户编码"},
  41 + {EnName: "userName", CnName: "*用户姓名"},
  42 + {EnName: "org", CnName: "*组织机构"},
  43 + {EnName: "department", CnName: "*所属部门"},
  44 + {EnName: "enableStatus", CnName: "*用户状态"},
  45 + {EnName: "phone", CnName: "*手机号"},
  46 + {EnName: "employeeType", CnName: "*员工类型"},
  47 + {EnName: "icCardNumber", CnName: "IC卡号"},
  48 + {EnName: "email", CnName: "邮箱"},
  49 +}
  50 +excelData, err := excelImport.OpenExcelFromIoReader(importDataCommand.Reader)
  51 +if err != nil {
  52 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  53 +}
  54 +users := make([]allied_creation_user.BatchAddUserItem, 0)
  55 +for _, v := range excelData {
  56 + if srv.fieldValueAllEmpty(v) {
  57 + continue
  58 + }
  59 + item := allied_creation_user.BatchAddUserItem{
  60 + CompanyId: importDataCommand.Operator.CompanyId,
  61 + UserType: domain.UserTypeEmployee,
  62 + UserCode: strings.TrimSpace(v["userCode"]),
  63 + Org: strings.TrimSpace(v["org"]),
  64 + Department: strings.TrimSpace(v["department"]),
  65 + UserName: strings.TrimSpace(v["userName"]),
  66 + Phone: strings.TrimSpace(v["phone"]),
  67 + Email: strings.TrimSpace(v["email"]),
  68 + EnableStatus: strings.TrimSpace(v["enableStatus"]),
  69 + EmployeeType: strings.TrimSpace(v["employeeType"]),
  70 + IcCardNumber: strings.TrimSpace(v["icCardNumber"]),
  71 + }
  72 + users = append(users, item)
  73 +}
  74 +// 2.向后台服务发起批量添加请求
  75 +userGateway := allied_creation_user.NewHttplibAlliedCreationUser(importDataCommand.Operator)
  76 +result, err := userGateway.UserBatchAdd(allied_creation_user.ReqBatchAddUser{
  77 + Users: users,
  78 + Password: initPassword,
  79 +})
  80 +```
  81 +
  82 +```go
  83 +```
  84 +
  85 +### 2.2 Excel导出流程
  86 +
  87 +- 功能原型说明
  88 +
  89 +实现可以自定义选择列进行导出,以及选择导出格式,导出格式有 ``xlsx``\\``csv``,功能如下图所示:
  90 +
  91 +![](https://timeless-world.oss-cn-shenzhen.aliyuncs.com/opportunity/dev_online/20220225/object/1645789890_JbTa22EtANsD3fm2nJ4aH6FJkHzXaHJB.png)
  92 +
  93 +- 前后端交互说明
  94 +
  95 +``接口定义``
  96 +
  97 +导出接口
  98 +```shell
  99 +POST /v1/web/file-export
  100 +
  101 +// request 请求参数
  102 +{
  103 + // 业务编码
  104 + "code":"string"
  105 + // 选择的导出的列
  106 + "fields":[]
  107 + // 导出文件格式
  108 + "format":"xlsx"
  109 + // 业务查询条件
  110 + "where":{}
  111 +}
  112 +```
  113 +
  114 +导出列查询接口
  115 +
  116 +```shell
  117 +GET/v1/web/file-export/fields/:code
  118 +
  119 +// response 应答数据
  120 +{
  121 + "fields":[
  122 + {
  123 + "enName":"字段键名",
  124 + "cnName":"字段展示名称",
  125 + "selected":true // 默认勾选
  126 + }
  127 + ]
  128 +}
  129 +```
  130 +
  131 +- 交互流程
  132 +
  133 +1.前台根据 ``导出列查询接口`` 获取可以导出的列;
  134 +2.勾选需要导出的列、文件格式,调用 ``导出接口`` 向后台发起导出数据请求;
  135 +
  136 +
  137 +#### 2.2.1 后端导出实现
  138 +
  139 +1. 导出数据实现接口
  140 +
  141 +```
  142 +type ExcelMaker interface {
  143 + DataFieldList() []DataField //字段元数据列表
  144 + CellValue(index int, enName string) (value interface{}) //获取单元格字段值
  145 + DataListLen() int //数据列表大小
  146 + TableTitle() []string //列表顶部自定义内容
  147 +}
  148 +```
  149 +
  150 +如下所示
  151 +```go
  152 +//ExportCooperationUserData 导出共创用户数据
  153 +type ExportCooperationUserData struct {
  154 + SourceData []allied_creation_user.UserDetail //具体数据
  155 + SelectedField []string
  156 +}
  157 +
  158 +var _ excel.ExcelMaker = (*ExportCooperationUserData)(nil)
  159 +
  160 +func (data ExportCooperationUserData) AllFields() []DataFieldOptions {
  161 + return []DataFieldOptions{
  162 + {EnName: "UserCode", CnName: "用户编码"},
  163 + {EnName: "UserName", CnName: "用户姓名"},
  164 + {EnName: "Phone", CnName: "手机号"},
  165 + {EnName: "CooperationCompany", CnName: "共创公司"},
  166 + {EnName: "CooperationDeadline", CnName: "共创到期"},
  167 + {EnName: "EnableStatus", CnName: "状态"},
  168 + }
  169 +}
  170 +
  171 +func (data ExportCooperationUserData) DataFieldList() []excel.DataField {
  172 + fields := []excel.DataField{}
  173 + allFields := data.AllFields()
  174 + for _, value2 := range allFields {
  175 + if len(data.SelectedField) == 0 || value2.IsDefault {
  176 + fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  177 + continue
  178 + }
  179 + for _, value3 := range data.SelectedField {
  180 + if value2.EnName == value3 {
  181 + fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  182 + }
  183 + }
  184 + }
  185 + return fields
  186 +}
  187 +
  188 +func (data ExportCooperationUserData) CellValue(index int, enName string) (value interface{}) {
  189 + if index > data.DataListLen() {
  190 + return ""
  191 + }
  192 + switch enName {
  193 + case "UserCode":
  194 + return data.SourceData[index].UserCode
  195 + case "UserName":
  196 + return data.SourceData[index].UserInfo.UserName
  197 + case "CooperationCompany":
  198 + return data.SourceData[index].CooperationInfo.CooperationCompany
  199 + case "CooperationDeadline":
  200 + if data.SourceData[index].CooperationInfo.CooperationDeadline.IsZero() || data.SourceData[index].CooperationInfo.CooperationDeadline.Unix() == 0 {
  201 + return ""
  202 + }
  203 + return data.SourceData[index].CooperationInfo.CooperationDeadline.Format("2006-01-02")
  204 + case "Phone":
  205 + return data.SourceData[index].UserInfo.Phone
  206 + case "Email":
  207 + return data.SourceData[index].UserInfo.Email
  208 + case "EnableStatus":
  209 + status := data.SourceData[index].EnableStatus
  210 + statusName := ""
  211 + // 状态(1:启用 2:禁用 3:注销)
  212 + switch status {
  213 + case 1:
  214 + statusName = "启用"
  215 + case 2:
  216 + statusName = "禁用"
  217 + case 3:
  218 + statusName = "注销"
  219 + }
  220 + return statusName
  221 + }
  222 + return nil
  223 +}
  224 +
  225 +func (data ExportCooperationUserData) DataListLen() int {
  226 + return len(data.SourceData)
  227 +}
  228 +
  229 +func (data ExportCooperationUserData) TableTitle() []string {
  230 + return nil
  231 +}
  232 +```
  233 +
  234 +2. 返回文件
  235 +
  236 +```go
  237 +//返回文件
  238 +excelTool := excel.NewExcelExport()
  239 +err = excelTool.ExportData(data, "")
  240 +controller.responseExcelByFile(controller.Ctx, excelTool, filename)
  241 +
  242 +
  243 +func (controller *ExcelDataController) responseExcelByFile(ctx *context.Context, excelExport *excel.ExcelExport, fileName string) error {
  244 + ctx.Output.Header("Content-Disposition", "attachment; filename="+fileName)
  245 + ctx.Output.Header("Content-Description", "File Transfer")
  246 + ctx.Output.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  247 + ctx.Output.Header("Content-Transfer-Encoding", "binary")
  248 + ctx.Output.Header("Expires", "0")
  249 + ctx.Output.Header("Cache-Control", "must-revalidate")
  250 + ctx.Output.Header("Pragma", "public")
  251 + //跳过保存文件,直接写入ctx.ResponseWriter
  252 + excelExport.ExcelFile.Write(ctx.ResponseWriter)
  253 + return nil
  254 +}
  255 +```
@@ -52,12 +52,54 @@ spec: @@ -52,12 +52,54 @@ 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"  
61 - volumes: 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"
62 - name: accesslogs 104 - name: accesslogs
63 emptyDir: {} 105 emptyDir: {}
  1 +apiVersion: v1
  2 +kind: Service
  3 +metadata:
  4 + name: allied-creation-manufacture
  5 + namespace: mmm-suplus-prd
  6 + labels:
  7 + k8s-app: allied-creation-manufacture
  8 +spec:
  9 + ports:
  10 + - name: "http"
  11 + port: 80
  12 + targetPort: 8082
  13 + selector:
  14 + k8s-app: allied-creation-manufacture
  15 +---
  16 +apiVersion: extensions/v1beta1
  17 +kind: Deployment
  18 +metadata:
  19 + name: allied-creation-manufacture
  20 + namespace: mmm-suplus-prd
  21 + labels:
  22 + k8s-app: allied-creation-manufacture
  23 +spec:
  24 + replicas: 1
  25 + template:
  26 + metadata:
  27 + labels:
  28 + k8s-app: allied-creation-manufacture
  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: allied-creation-manufacture
  47 + image: 192.168.0.243:5000/mmm/allied-creation-manufacture:master
  48 + imagePullPolicy: Always
  49 + ports:
  50 + - containerPort: 8082
  51 + env:
  52 + - name: POSTGRESQL_DB_NAME
  53 + valueFrom:
  54 + configMapKeyRef:
  55 + name: suplus-config
  56 + key: postgresqlalliedcreation.dbname
  57 + - name: POSTGRESQL_USER
  58 + valueFrom:
  59 + configMapKeyRef:
  60 + name: suplus-config
  61 + key: postgresql.user
  62 + - name: POSTGRESQL_PASSWORD
  63 + valueFrom:
  64 + configMapKeyRef:
  65 + name: suplus-config
  66 + key: postgresql.password
  67 + - name: POSTGRESQL_HOST
  68 + valueFrom:
  69 + configMapKeyRef:
  70 + name: suplus-config
  71 + key: postgresql.host
  72 + - name: POSTGRESQL_PORT
  73 + valueFrom:
  74 + configMapKeyRef:
  75 + name: suplus-config
  76 + key: postgresql.port
  77 + - name: REDIS_HOST
  78 + valueFrom:
  79 + configMapKeyRef:
  80 + name: suplus-config
  81 + key: redis.ip
  82 + - name: REDIS_PORT
  83 + valueFrom:
  84 + configMapKeyRef:
  85 + name: suplus-config
  86 + key: redis.port
  87 + - name: REDIS_AUTH
  88 + value: ""
  89 + - name: LOG_LEVEL
  90 + value: "debug"
  91 + - name: ERROR_BASE_CODE
  92 + value: "1"
  93 + - name: ERROR_BASE_CODE_MULTIPLE
  94 + value: "2000"
  95 + - name: ENABLE_KAFKA_LOG
  96 + value: "true"
  97 + - name: HTTP_PORT
  98 + value: "8082"
  99 + - name: SERVICE_ENV
  100 + value: "prd"
  101 + - name: ALLIED_CREATION_GATEWAY_HOST
  102 + value: "https://allied-creation-gateway-prd.fjmaimaimai.com"
  103 + - name: ALLIED_CREATION_USER_HOST
  104 + value: "https://allied-creation-user-prd.fjmaimaimai.com"
  105 + - name: ALLIED_CREATION_BASIC_HOST
  106 + value: "https://allied-creation-basic-prd.fjmaimaimai.com"
  107 + - name: ALLIED_CREATION_MANUFACTURE_HOST
  108 + value: "http://allied-creation-manufacture-prd.fjmaimaimai.com"
  109 + - name: SMS_SERVE_HOST
  110 + value: "https://sms.fjmaimaimai.com:9897"
  111 + - name: MANUFACTURE_DEFAULT_COMPANYID
  112 + value: "4"
  113 + - name: MANUFACTURE_DEFAULT_ORGID
  114 + value: "44"
  115 + - name: MANUFACTURE_DEFAULT_WORKSHOPID
  116 + value: "1"
  117 + - name: MANUFACTURE_PRODUCT_TYPE
  118 + value: "0502010001ST,0502010007ST,0502010008ST,0502010009ST,0502010010ST,0502010011ST,0502010014ST,0502010016ST,0502010018ST,0502010020ST,0502010021ST,0502010022ST,0502010023ST"
  119 + - name: MQTT_HOST
  120 + value: "47.97.5.102"
  121 + - name: MQTT_PORT
  122 + value: "6000"
  1 +#!/bin/bash
  2 +export PATH=/root/local/bin:$PATH
  3 +kubectl -n mmm-suplus-prd get pods | grep -q allied-creation-manufacture
  4 +if [ "$?" == "1" ];then
  5 + kubectl create -f /tmp/prd/allied-creation-manufacture/allied-creation-manufacture.yaml --record
  6 + kubectl -n mmm-suplus-prd get svc | grep -q allied-creation-manufacture
  7 + if [ "$?" == "0" ];then
  8 + echo "allied-creation-manufacture service install success!"
  9 + else
  10 + echo "allied-creation-manufacture service install fail!"
  11 + fi
  12 + kubectl -n mmm-suplus-prd get pods | grep -q allied-creation-manufacture
  13 + if [ "$?" == "0" ];then
  14 + echo "allied-creation-manufacture deployment install success!"
  15 + else
  16 + echo "allied-creation-manufacture deployment install fail!"
  17 + fi
  18 +else
  19 + kubectl delete -f /tmp/prd/allied-creation-manufacture/allied-creation-manufacture.yaml
  20 + kubectl -n mmm-suplus-prd get svc | grep -q allied-creation-manufacture
  21 + while [ "$?" == "0" ]
  22 + do
  23 + kubectl -n mmm-suplus-prd get svc | grep -q allied-creation-manufacture
  24 + done
  25 + kubectl -n mmm-suplus-prd get pods | grep -q allied-creation-manufacture
  26 + while [ "$?" == "0" ]
  27 + do
  28 + kubectl -n mmm-suplus-prd get pods | grep -q allied-creation-manufacture
  29 + done
  30 + kubectl create -f /tmp/prd/allied-creation-manufacture/allied-creation-manufacture.yaml --record
  31 + kubectl -n mmm-suplus-prd get svc | grep -q allied-creation-manufacture
  32 + if [ "$?" == "0" ];then
  33 + echo "allied-creation-manufacture service update success!"
  34 + else
  35 + echo "allied-creation-manufacture service update fail!"
  36 + fi
  37 + kubectl -n mmm-suplus-prd get pods | grep -q allied-creation-manufacture
  38 + if [ "$?" == "0" ];then
  39 + echo "allied-creation-manufacture deployment update success!"
  40 + else
  41 + echo "allied-creation-manufacture deployment update fail!"
  42 + fi
  43 +fi
  1 +apiVersion: v1
  2 +kind: Service
  3 +metadata:
  4 + name: allied-creation-manufacture
  5 + namespace: mmm-suplus-test
  6 + labels:
  7 + k8s-app: allied-creation-manufacture
  8 +spec:
  9 + ports:
  10 + - name: "http"
  11 + port: 80
  12 + targetPort: 8082
  13 + selector:
  14 + k8s-app: allied-creation-manufacture
  15 +---
  16 +apiVersion: extensions/v1beta1
  17 +kind: Deployment
  18 +metadata:
  19 + name: allied-creation-manufacture
  20 + namespace: mmm-suplus-test
  21 + labels:
  22 + k8s-app: allied-creation-manufacture
  23 +spec:
  24 + replicas: 1
  25 + template:
  26 + metadata:
  27 + labels:
  28 + k8s-app: allied-creation-manufacture
  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: allied-creation-manufacture
  47 + image: 192.168.0.243:5000/mmm/allied-creation-manufacture:dev
  48 + imagePullPolicy: Always
  49 + ports:
  50 + - containerPort: 8082
  51 + env:
  52 + - name: POSTGRESQL_DB_NAME
  53 + valueFrom:
  54 + configMapKeyRef:
  55 + name: suplus-config
  56 + key: postgresqlalliedcreation.dbname
  57 + - name: POSTGRESQL_USER
  58 + valueFrom:
  59 + configMapKeyRef:
  60 + name: suplus-config
  61 + key: postgresql.user
  62 + - name: POSTGRESQL_PASSWORD
  63 + valueFrom:
  64 + configMapKeyRef:
  65 + name: suplus-config
  66 + key: postgresql.password
  67 + - name: POSTGRESQL_HOST
  68 + valueFrom:
  69 + configMapKeyRef:
  70 + name: suplus-config
  71 + key: postgresql.host
  72 + - name: POSTGRESQL_PORT
  73 + valueFrom:
  74 + configMapKeyRef:
  75 + name: suplus-config
  76 + key: postgresql.port
  77 + - name: REDIS_HOST
  78 + valueFrom:
  79 + configMapKeyRef:
  80 + name: suplus-config
  81 + key: redis.ip
  82 + - name: REDIS_PORT
  83 + valueFrom:
  84 + configMapKeyRef:
  85 + name: suplus-config
  86 + key: redis.port
  87 + - name: REDIS_AUTH
  88 + value: ""
  89 + - name: LOG_LEVEL
  90 + value: "debug"
  91 + - name: ERROR_BASE_CODE
  92 + value: "1"
  93 + - name: ERROR_BASE_CODE_MULTIPLE
  94 + value: "2000"
  95 + - name: ENABLE_KAFKA_LOG
  96 + value: "true"
  97 + - name: HTTP_PORT
  98 + value: "8082"
  99 + - name: SERVICE_ENV
  100 + value: "test"
  101 + - name: SUPLUS_ADMIN_BASE_HOST
  102 + value: "http://suplus-admin-base-dev.fjmaimaimai.com"
  103 + - name: ALLIED_CREATION_GATEWAY_HOST
  104 + value: "https://allied-creation-gateway-test.fjmaimaimai.com"
  105 + - name: ALLIED_CREATION_USER_HOST
  106 + value: "https://allied-creation-user-test.fjmaimaimai.com"
  107 + - name: ALLIED_CREATION_COOPERATION_HOST
  108 + value: "https://allied-creation-cooperation-test.fjmaimaimai.com"
  109 + - name: ALLIED_CREATION_BASIC_HOST
  110 + value: "https://allied-creation-basic-test.fjmaimaimai.com"
  111 + - name: ALLIED_CREATION_MANUFACTURE_HOST
  112 + value: "http://allied-creation-manufacture-test.fjmaimaimai.com"
  113 + - name: SMS_SERVE_HOST
  114 + value: "https://sms.fjmaimaimai.com:9897"
  115 + - name: SUPLUS_SALE_APP
  116 + value: "http://suplus-sale-app-gateway-test.fjmaimaimai.com"
  117 + - name: MANUFACTURE_DEFAULT_COMPANYID
  118 + value: "23"
  119 + - name: MANUFACTURE_DEFAULT_ORGID
  120 + value: "487"
  121 + - name: MANUFACTURE_DEFAULT_WORKSHOPID
  122 + value: "28"
  123 + - name: MANUFACTURE_PRODUCT_TYPE
  124 + value: "SG,SG"
  125 + - name: MQTT_HOST
  126 + value: "47.97.5.102"
  127 + - name: MQTT_PORT
  128 + value: "6000"
  1 +#!/bin/bash
  2 +export PATH=/root/local/bin:$PATH
  3 +kubectl -n mmm-suplus-test get pods | grep -q allied-creation-manufacture
  4 +if [ "$?" == "1" ];then
  5 + kubectl create -f /tmp/test/allied-creation-manufacture/allied-creation-manufacture.yaml --record
  6 + kubectl -n mmm-suplus-test get svc | grep -q allied-creation-manufacture
  7 + if [ "$?" == "0" ];then
  8 + echo "allied-creation-manufacture service install success!"
  9 + else
  10 + echo "allied-creation-manufacture service install fail!"
  11 + fi
  12 + kubectl -n mmm-suplus-test get pods | grep -q allied-creation-manufacture
  13 + if [ "$?" == "0" ];then
  14 + echo "allied-creation-manufacture deployment install success!"
  15 + else
  16 + echo "allied-creation-manufacture deployment install fail!"
  17 + fi
  18 +else
  19 + kubectl delete -f /tmp/test/allied-creation-manufacture/allied-creation-manufacture.yaml
  20 + kubectl -n mmm-suplus-test get svc | grep -q allied-creation-manufacture
  21 + while [ "$?" == "0" ]
  22 + do
  23 + kubectl -n mmm-suplus-test get svc | grep -q allied-creation-manufacture
  24 + done
  25 + kubectl -n mmm-suplus-test get pods | grep -q allied-creation-manufacture
  26 + while [ "$?" == "0" ]
  27 + do
  28 + kubectl -n mmm-suplus-test get pods | grep -q allied-creation-manufacture
  29 + done
  30 + kubectl create -f /tmp/test/allied-creation-manufacture/allied-creation-manufacture.yaml --record
  31 + kubectl -n mmm-suplus-test get svc | grep -q allied-creation-manufacture
  32 + if [ "$?" == "0" ];then
  33 + echo "allied-creation-manufacture service update success!"
  34 + else
  35 + echo "allied-creation-manufacture service update fail!"
  36 + fi
  37 + kubectl -n mmm-suplus-test get pods | grep -q allied-creation-manufacture
  38 + if [ "$?" == "0" ];then
  39 + echo "allied-creation-manufacture deployment update success!"
  40 + else
  41 + echo "allied-creation-manufacture deployment update fail!"
  42 + fi
  43 +fi
@@ -5,24 +5,36 @@ go 1.16 @@ -5,24 +5,36 @@ go 1.16
5 require ( 5 require (
6 github.com/ajg/form v1.5.1 // indirect 6 github.com/ajg/form v1.5.1 // indirect
7 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/eclipse/paho.mqtt.golang v1.3.5
8 github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect 10 github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect
9 github.com/fatih/structs v1.1.0 // indirect 11 github.com/fatih/structs v1.1.0 // indirect
10 github.com/gavv/httpexpect v2.0.0+incompatible 12 github.com/gavv/httpexpect v2.0.0+incompatible
11 github.com/go-pg/pg/v10 v10.9.0 13 github.com/go-pg/pg/v10 v10.9.0
  14 + github.com/go-redis/redis v6.15.7+incompatible
12 github.com/google/go-querystring v1.1.0 // indirect 15 github.com/google/go-querystring v1.1.0 // indirect
  16 + github.com/google/uuid v1.3.0
  17 + github.com/hibiken/asynq v0.21.0
13 github.com/imkira/go-interpol v1.1.0 // indirect 18 github.com/imkira/go-interpol v1.1.0 // indirect
14 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 19 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
  20 + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
15 github.com/moul/http2curl v1.0.0 // indirect 21 github.com/moul/http2curl v1.0.0 // indirect
  22 + github.com/mozillazg/go-pinyin v0.19.0
16 github.com/onsi/ginkgo v1.15.2 23 github.com/onsi/ginkgo v1.15.2
17 github.com/onsi/gomega v1.11.0 24 github.com/onsi/gomega v1.11.0
18 github.com/sergi/go-diff v1.2.0 // indirect 25 github.com/sergi/go-diff v1.2.0 // indirect
  26 + github.com/shopspring/decimal v1.2.0
  27 + github.com/sirupsen/logrus v1.8.0
19 github.com/smartystreets/goconvey v1.7.2 // indirect 28 github.com/smartystreets/goconvey v1.7.2 // indirect
  29 + github.com/stretchr/testify v1.7.0
  30 + github.com/tidwall/gjson v1.13.0
20 github.com/valyala/fasthttp v1.32.0 // indirect 31 github.com/valyala/fasthttp v1.32.0 // indirect
21 github.com/xeipuuv/gojsonschema v1.2.0 // indirect 32 github.com/xeipuuv/gojsonschema v1.2.0 // indirect
22 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect 33 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
23 github.com/yudai/gojsondiff v1.0.0 // indirect 34 github.com/yudai/gojsondiff v1.0.0 // indirect
24 github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect 35 github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
25 github.com/yudai/pp v2.0.1+incompatible // indirect 36 github.com/yudai/pp v2.0.1+incompatible // indirect
  37 + golang.org/x/text v0.3.6
26 ) 38 )
27 39
28 -replace github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 => github.com/tiptok/egglib-go v0.0.0-20210608073225-c852ce95ae34 40 +replace github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 => github.com/tiptok/egglib-go v0.0.0-20220120032512-24dfab2b4987
@@ -32,6 +32,8 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r @@ -32,6 +32,8 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
32 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 32 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
33 github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= 33 github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
34 github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= 34 github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
  35 +github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
  36 +github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
35 github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= 37 github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
36 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 38 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
37 github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 39 github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
@@ -61,6 +63,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c @@ -61,6 +63,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
61 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 63 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
62 github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= 64 github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4=
63 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 65 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
  66 +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
  67 +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
64 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 68 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
65 github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= 69 github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU=
66 github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= 70 github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
@@ -68,6 +72,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8 @@ -68,6 +72,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8
68 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= 72 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
69 github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= 73 github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
70 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= 74 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
  75 +github.com/eclipse/paho.mqtt.golang v1.3.5 h1:sWtmgNxYM9P2sP+xEItMozsR3w0cqZFlqnNN1bdl41Y=
  76 +github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc=
71 github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= 77 github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
72 github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= 78 github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI=
73 github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= 79 github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
@@ -110,6 +116,8 @@ github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w @@ -110,6 +116,8 @@ github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8w
110 github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U= 116 github.com/go-redis/redis v6.15.7+incompatible h1:3skhDh95XQMpnqeqNftPkQD9jL9e5e36z/1SUm6dy1U=
111 github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= 117 github.com/go-redis/redis v6.15.7+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
112 github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= 118 github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
  119 +github.com/go-redis/redis/v8 v8.11.2 h1:WqlSpAwz8mxDSMCvbyz1Mkiqe0LE5OY4j3lgkvu1Ts0=
  120 +github.com/go-redis/redis/v8 v8.11.2/go.mod h1:DLomh7y2e3ggQXQLd1YgmvIfecPJoFl7WU5SOQ/r06M=
113 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 121 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
114 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 122 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
115 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 123 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -152,16 +160,19 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ @@ -152,16 +160,19 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
152 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 160 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
153 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 161 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
154 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 162 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
155 -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=  
156 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 163 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
  164 +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
  165 +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
157 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= 166 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
158 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= 167 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
159 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 168 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
160 github.com/google/gops v0.3.7/go.mod h1:bj0cwMmX1X4XIJFTjR99R5sCxNssNJ8HebFNvoQlmgY= 169 github.com/google/gops v0.3.7/go.mod h1:bj0cwMmX1X4XIJFTjR99R5sCxNssNJ8HebFNvoQlmgY=
161 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 170 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
162 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 171 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
163 -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=  
164 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 172 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
  173 +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
  174 +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
  175 +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
165 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 176 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
166 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 177 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
167 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 178 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
@@ -177,6 +188,8 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 @@ -177,6 +188,8 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1
177 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 188 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
178 github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= 189 github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
179 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 190 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
  191 +github.com/hibiken/asynq v0.21.0 h1:uH9XogJhjq/S39E0/DEPWLZQ6hHJ73UiblZTe4RzHwA=
  192 +github.com/hibiken/asynq v0.21.0/go.mod h1:tyc63ojaW8SJ5SBm8mvI4DDONsguP5HE85EEl4Qr5Ig=
180 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 193 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
181 github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= 194 github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
182 github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= 195 github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=
@@ -246,6 +259,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 @@ -246,6 +259,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9
246 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= 259 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
247 github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= 260 github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs=
248 github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= 261 github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
  262 +github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c=
  263 +github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
249 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 264 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
250 github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= 265 github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
251 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 266 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
@@ -261,6 +276,7 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ @@ -261,6 +276,7 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
261 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= 276 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
262 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= 277 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
263 github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= 278 github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
  279 +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
264 github.com/onsi/ginkgo v1.15.2 h1:l77YT15o814C2qVL47NOyjV/6RbaP7kKdrvZnxQ3Org= 280 github.com/onsi/ginkgo v1.15.2 h1:l77YT15o814C2qVL47NOyjV/6RbaP7kKdrvZnxQ3Org=
265 github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o= 281 github.com/onsi/ginkgo v1.15.2/go.mod h1:Dd6YFfwBW84ETqqtL0CPyPXillHgY6XhQH3uuCCTr/o=
266 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 282 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
@@ -268,6 +284,7 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa @@ -268,6 +284,7 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
268 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 284 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
269 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= 285 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
270 github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= 286 github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
  287 +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
271 github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug= 288 github.com/onsi/gomega v1.11.0 h1:+CqWgvj0OZycCaqclBD1pxKHAU+tOkHmQIWvDHq2aug=
272 github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= 289 github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
273 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= 290 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
@@ -305,6 +322,12 @@ github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFB @@ -305,6 +322,12 @@ github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFB
305 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 322 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
306 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= 323 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ=
307 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= 324 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
  325 +github.com/richardlehane/mscfb v1.0.3 h1:rD8TBkYWkObWO0oLDFCbwMeZ4KoalxQy+QgniCj3nKI=
  326 +github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
  327 +github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o=
  328 +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
  329 +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
  330 +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
308 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 331 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
309 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 332 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
310 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 333 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -316,6 +339,8 @@ github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI @@ -316,6 +339,8 @@ github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI
316 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= 339 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
317 github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= 340 github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
318 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= 341 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
  342 +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
  343 +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
319 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 344 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
320 github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= 345 github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
321 github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s= 346 github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s=
@@ -331,6 +356,8 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 @@ -331,6 +356,8 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3
331 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 356 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
332 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= 357 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
333 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 358 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
  359 +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
  360 +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
334 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 361 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
335 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 362 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
336 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= 363 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
@@ -347,8 +374,14 @@ github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2K @@ -347,8 +374,14 @@ github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2K
347 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= 374 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
348 github.com/tal-tech/go-zero v1.0.27 h1:QMIbaTxibMc/OsO5RTAuKZ8ndbl2dGN6pITQEtp2x/A= 375 github.com/tal-tech/go-zero v1.0.27 h1:QMIbaTxibMc/OsO5RTAuKZ8ndbl2dGN6pITQEtp2x/A=
349 github.com/tal-tech/go-zero v1.0.27/go.mod h1:JtNXlsh/CgeIHyQnt5C5M2IcSevW7V0NAnqO93TQgm8= 376 github.com/tal-tech/go-zero v1.0.27/go.mod h1:JtNXlsh/CgeIHyQnt5C5M2IcSevW7V0NAnqO93TQgm8=
350 -github.com/tiptok/egglib-go v0.0.0-20210608073225-c852ce95ae34 h1:9iDNyYbfpv5KLWDLpDywD/aIODg+PNnwn+v9on7KGlE=  
351 -github.com/tiptok/egglib-go v0.0.0-20210608073225-c852ce95ae34/go.mod h1:KT8WFA2LPo5zVKbomCR6HocO4prnIY9DUVGekA3Ifo4= 377 +github.com/tidwall/gjson v1.13.0 h1:3TFY9yxOQShrvmjdM76K+jc66zJeT6D3/VFFYCGQf7M=
  378 +github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
  379 +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
  380 +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
  381 +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
  382 +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
  383 +github.com/tiptok/egglib-go v0.0.0-20220120032512-24dfab2b4987 h1:0e2hOSL+//5AL7e1r3xCGEugsOPsw2POAm82VZvWLe4=
  384 +github.com/tiptok/egglib-go v0.0.0-20220120032512-24dfab2b4987/go.mod h1:xl9i83IKNUkwlobRF6XLKn1RRbZsT+7yhCicpTGWTKc=
352 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 385 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
353 github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 386 github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
354 github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= 387 github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo=
@@ -381,6 +414,10 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 @@ -381,6 +414,10 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
381 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= 414 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
382 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 415 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
383 github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= 416 github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
  417 +github.com/xuri/efp v0.0.0-20210322160811-ab561f5b45e3 h1:EpI0bqf/eX9SdZDwlMmahKM+CDBgNbsXMhsN28XrM8o=
  418 +github.com/xuri/efp v0.0.0-20210322160811-ab561f5b45e3/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
  419 +github.com/xuri/excelize/v2 v2.4.1 h1:veeeFLAJwsNEBPBlDepzPIYS1eLyBVcXNZUW79exZ1E=
  420 +github.com/xuri/excelize/v2 v2.4.1/go.mod h1:rSu0C3papjzxQA3sdK8cU544TebhrPUoTOaGPIh0Q1A=
384 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY= 421 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
385 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= 422 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY=
386 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= 423 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
@@ -413,6 +450,8 @@ go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bj @@ -413,6 +450,8 @@ go.opentelemetry.io/otel/trace v0.19.0/go.mod h1:4IXiNextNOpPnRlI4ryK69mn5iC84bj
413 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= 450 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
414 go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0= 451 go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0=
415 go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA= 452 go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA=
  453 +go.uber.org/goleak v0.10.0 h1:G3eWbSNIskeRqtsN/1uI5B+eP73y3JUuBsv9AZjehb4=
  454 +go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
416 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= 455 go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
417 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= 456 go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
418 go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= 457 go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
@@ -427,9 +466,12 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U @@ -427,9 +466,12 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
427 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 466 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
428 golang.org/x/crypto v0.0.0-20210218145215-b8e89b74b9df/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 467 golang.org/x/crypto v0.0.0-20210218145215-b8e89b74b9df/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
429 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 468 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
430 -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=  
431 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 469 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
  470 +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
  471 +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
432 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 472 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
  473 +golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb h1:fqpd0EBDzlHRCjiphRR5Zo/RSWWQlWv34418dnEixWk=
  474 +golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
433 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 475 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
434 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 476 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
435 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 477 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -456,6 +498,7 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL @@ -456,6 +498,7 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL
456 golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 498 golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
457 golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 499 golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
458 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 500 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
  501 +golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
459 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 502 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
460 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 503 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
461 golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 504 golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -463,8 +506,9 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY @@ -463,8 +506,9 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
463 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 506 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
464 golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 507 golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
465 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 508 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
466 -golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I=  
467 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 509 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
  510 +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8=
  511 +golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
468 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 512 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
469 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 513 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
470 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 514 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -504,8 +548,9 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w @@ -504,8 +548,9 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
504 golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 548 golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
505 golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 549 golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
506 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 550 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
507 -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 h1:hZR0X1kPW+nwyJ9xRxqZk1vx5RUObAPBdKVvXPDUH/E=  
508 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 551 golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
  552 +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
  553 +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
509 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 554 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
510 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 555 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
511 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 556 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -515,6 +560,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -515,6 +560,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
515 golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= 560 golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
516 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 561 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
517 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 562 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
  563 +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
  564 +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
518 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 565 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
519 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 566 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
520 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 567 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -5,8 +5,13 @@ import ( @@ -5,8 +5,13 @@ import (
5 "github.com/beego/beego/v2/server/web" 5 "github.com/beego/beego/v2/server/web"
6 "github.com/linmadan/egglib-go/log/logrus" 6 "github.com/linmadan/egglib-go/log/logrus"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" 7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" 9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/mqtt"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/task"
  12 + "time"
9 13
  14 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/crontab"
10 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" 15 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
11 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" 16 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg"
12 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" 17 _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
@@ -15,9 +20,11 @@ import ( @@ -15,9 +20,11 @@ import (
15 ) 20 )
16 21
17 func main() { 22 func main() {
18 - log.Logger.Info("server start ....")  
19 - log.Logger.Info(fmt.Sprintf("ENABLE_KAFKA_LOG:%v", constant.ENABLE_KAFKA_LOG))  
20 - 23 + defer func() {
  24 + if r := recover(); r != nil {
  25 + log.Logger.Error(fmt.Sprintf("%v", r))
  26 + }
  27 + }()
21 if constant.ENABLE_KAFKA_LOG { 28 if constant.ENABLE_KAFKA_LOG {
22 w, _ := logrus.NewKafkaWriter(constant.KAFKA_HOST, constant.TOPIC_LOG_STASH, false) 29 w, _ := logrus.NewKafkaWriter(constant.KAFKA_HOST, constant.TOPIC_LOG_STASH, false)
23 log.Logger.AddHook(w) 30 log.Logger.AddHook(w)
@@ -28,7 +35,17 @@ func main() { @@ -28,7 +35,17 @@ func main() {
28 MaxSize: 1024 * 1024 * 2, 35 MaxSize: 1024 * 1024 * 2,
29 }) 36 })
30 log.Logger.AddHook(bw) 37 log.Logger.AddHook(bw)
  38 + redis.InitRedis()
  39 + log.Logger.Info("server start ....")
  40 + log.Logger.Debug(fmt.Sprintf("ENABLE_KAFKA_LOG:%v", constant.ENABLE_KAFKA_LOG))
31 41
  42 + go mqtt.Start(log.Logger)
  43 + go task.Run()
  44 + cron := crontab.NewCrontabService(nil)
  45 + cron.StartCrontabTask()
  46 + defer cron.StopCrontabTask()
  47 + time.Sleep(time.Second)
32 log.Logger.Info("server start!") 48 log.Logger.Info("server start!")
33 web.Run() 49 web.Run()
  50 + log.Logger.Info("server stop!")
34 } 51 }
  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 ApproveAttendanceCommand struct {
  12 + // 考勤记录ID
  13 + ProductAttendanceId int `cname:"考勤记录ID" json:"productAttendanceId" valid:"Required"`
  14 + // 工时
  15 + WorkTimeAfter float64 `cname:"工时" json:"workTimeAfter,omitempty"`
  16 + // 审核人Id
  17 + ApproveUserId int `json:"approveUserId,omitempty"`
  18 +}
  19 +
  20 +func (approveAttendanceCommand *ApproveAttendanceCommand) Valid(validation *validation.Validation) {
  21 + //validation.SetError("CustomValid", "未实现的自定义认证")
  22 +}
  23 +
  24 +func (approveAttendanceCommand *ApproveAttendanceCommand) ValidateCommand() error {
  25 + valid := validation.Validation{}
  26 + b, err := valid.Valid(approveAttendanceCommand)
  27 + if err != nil {
  28 + return err
  29 + }
  30 + if !b {
  31 + elem := reflect.TypeOf(approveAttendanceCommand).Elem()
  32 + for _, validErr := range valid.Errors {
  33 + field, isExist := elem.FieldByName(validErr.Field)
  34 + if isExist {
  35 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  36 + } else {
  37 + return fmt.Errorf(validErr.Message)
  38 + }
  39 + }
  40 + }
  41 + return nil
  42 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 + "time"
  8 +
  9 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type CreateAttendanceCommand struct {
  13 + // 考勤记录ID
  14 + //ProductAttendanceId int `cname:"考勤记录ID" json:"productAttendanceId" valid:"Required"`
  15 + // 考勤类型 1.正常 2.支援
  16 + AttendanceType int `json:"attendanceType,omitempty"`
  17 + // 生产班组Id
  18 + ProductGroupId int `json:"productGroupId,omitempty" valid:"Required"`
  19 + // 生产工人
  20 + ProductWorkerId int `json:"productWorkerId,omitempty" valid:"Required"`
  21 + // 车间ID
  22 + WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"`
  23 + // 生产线ID
  24 + LineId int `cname:"生产线ID" json:"lineId" valid:"Required"`
  25 + // 工段ID
  26 + SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"`
  27 + // 签到
  28 + SignIn time.Time `json:"signIn,omitempty"`
  29 + // 签退
  30 + SignOut time.Time `json:"signOut,omitempty"`
  31 + // 考勤状态 1.未审核 2:已审核 3.自动审核
  32 + //AttendanceStatus int `json:"attendanceStatus,omitempty"`
  33 +}
  34 +
  35 +func (createAttendanceCommand *CreateAttendanceCommand) Valid(validation *validation.Validation) {
  36 + //validation.SetError("CustomValid", "未实现的自定义认证")
  37 +}
  38 +
  39 +func (createAttendanceCommand *CreateAttendanceCommand) ValidateCommand() error {
  40 + valid := validation.Validation{}
  41 + b, err := valid.Valid(createAttendanceCommand)
  42 + if err != nil {
  43 + return err
  44 + }
  45 + if !b {
  46 + elem := reflect.TypeOf(createAttendanceCommand).Elem()
  47 + for _, validErr := range valid.Errors {
  48 + field, isExist := elem.FieldByName(validErr.Field)
  49 + if isExist {
  50 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  51 + } else {
  52 + return fmt.Errorf(validErr.Message)
  53 + }
  54 + }
  55 + }
  56 + return nil
  57 +}
  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 RemoveAttendanceCommand struct {
  12 + // 考勤记录ID
  13 + ProductAttendanceId int `cname:"考勤记录ID" json:"productAttendanceId" valid:"Required"`
  14 +}
  15 +
  16 +func (removeAttendanceCommand *RemoveAttendanceCommand) Valid(validation *validation.Validation) {
  17 + //validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (removeAttendanceCommand *RemoveAttendanceCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(removeAttendanceCommand)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(removeAttendanceCommand).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 UpdateAttendanceCommand struct {
  12 + // 考勤记录ID
  13 + ProductAttendanceId int `cname:"考勤记录ID" json:"productAttendanceId" valid:"Required"`
  14 +}
  15 +
  16 +func (updateAttendanceCommand *UpdateAttendanceCommand) Valid(validation *validation.Validation) {
  17 + validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (updateAttendanceCommand *UpdateAttendanceCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(updateAttendanceCommand)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(updateAttendanceCommand).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 + "github.com/beego/beego/v2/core/validation"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  7 + "reflect"
  8 + "strings"
  9 +)
  10 +
  11 +type WorkerAttendanceReportCommand struct {
  12 + *domain.DeviceZkTeco
  13 +}
  14 +
  15 +func (removeProductRecordCommand *WorkerAttendanceReportCommand) Valid(validation *validation.Validation) {
  16 + //validation.SetError("CustomValid", "未实现的自定义认证")
  17 +}
  18 +
  19 +func (removeProductRecordCommand *WorkerAttendanceReportCommand) ValidateCommand() error {
  20 + valid := validation.Validation{}
  21 + b, err := valid.Valid(removeProductRecordCommand)
  22 + if err != nil {
  23 + return err
  24 + }
  25 + if !b {
  26 + elem := reflect.TypeOf(removeProductRecordCommand).Elem()
  27 + for _, validErr := range valid.Errors {
  28 + field, isExist := elem.FieldByName(validErr.Field)
  29 + if isExist {
  30 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  31 + } else {
  32 + return fmt.Errorf(validErr.Message)
  33 + }
  34 + }
  35 + }
  36 + return nil
  37 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/beego/beego/v2/core/validation"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  7 + "reflect"
  8 + "strings"
  9 +)
  10 +
  11 +type WorkshopWorkTimeRecordStaticsCommand struct {
  12 + *domain.ProductAttendanceRecord
  13 +}
  14 +
  15 +// Type is a string value that indicates the type of the task.
  16 +//func (t *ProductRecordStaticsCommand) Type() string
  17 +
  18 +// Payload is the data needed for task execution.
  19 +//func (t *ProductRecordStaticsCommand) Payload() []byte
  20 +
  21 +func (removeProductRecordCommand *WorkshopWorkTimeRecordStaticsCommand) Valid(validation *validation.Validation) {
  22 + //validation.SetError("CustomValid", "未实现的自定义认证")
  23 +}
  24 +
  25 +func (removeProductRecordCommand *WorkshopWorkTimeRecordStaticsCommand) ValidateCommand() error {
  26 + valid := validation.Validation{}
  27 + b, err := valid.Valid(removeProductRecordCommand)
  28 + if err != nil {
  29 + return err
  30 + }
  31 + if !b {
  32 + elem := reflect.TypeOf(removeProductRecordCommand).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 dto
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  6 + "time"
  7 +)
  8 +
  9 +type AttendanceRecordDto struct {
  10 + // 考勤记录ID
  11 + ProductAttendanceId int `json:"productAttendanceId"`
  12 + // 企业id
  13 + //CompanyId int `json:"companyId,omitempty"`
  14 + // 组织ID
  15 + //OrgId int `json:"orgId,omitempty"`
  16 + // 考勤类型 1.正常 2.支援
  17 + AttendanceType int `json:"attendanceType,omitempty"`
  18 + // 班组名称
  19 + GroupName string `json:"groupName"`
  20 + // 生产工人
  21 + ProductWorker *domain.User `json:"productWorker,omitempty"`
  22 + // 审核人
  23 + ApproveUser *domain.User `json:"approveUser"`
  24 + //*domain.ProductAttendanceRecordExt
  25 + ApproveAt string `json:"approveAt"`
  26 + // 工作位置
  27 + *domain.WorkStation
  28 + // 签到
  29 + SignIn string `json:"signIn"`
  30 + // 签退
  31 + SignOut string `json:"signOut"`
  32 + // 考勤状态 1.未审核 2:已审核 3.自动审核
  33 + AttendanceStatus int `json:"attendanceStatus"`
  34 + // 工时(审核前)
  35 + WorkTimeBefore float64 `json:"workTimeBefore"`
  36 + // 工时(审核后)
  37 + WorkTimeAfter float64 `json:"workTimeAfter"`
  38 + // 签到日期
  39 + SignDate string `json:"signDate"`
  40 + // 组织名称
  41 + OrgName string `json:"orgName"`
  42 + // 权限标识 (当前登录组织匹配为true,否则false)
  43 + AuthFlag bool `json:"authFlag"`
  44 +}
  45 +
  46 +func (d *AttendanceRecordDto) LoadDto(m *domain.ProductAttendanceRecord, orgId int) *AttendanceRecordDto {
  47 + d.ProductAttendanceId = m.ProductAttendanceId
  48 + d.AttendanceType = m.AttendanceType
  49 + d.ProductWorker = m.ProductWorker
  50 + d.WorkStation = m.WorkStation
  51 + if !m.SignIn.IsZero() {
  52 + d.SignIn = m.SignIn.Local().Format("15:04:05")
  53 + d.SignDate = m.SignIn.Local().Format("2006-01-02")
  54 + }
  55 + if !m.SignOut.IsZero() {
  56 + d.SignOut = m.SignOut.Local().Format("15:04:05")
  57 + }
  58 + d.WorkTimeBefore = utils.Round(m.WorkTimeBefore, 1)
  59 + d.WorkTimeAfter = m.WorkTimeAfter
  60 + d.AttendanceStatus = m.AttendanceStatus
  61 + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId)
  62 + if m.Ext != nil {
  63 + d.OrgName = m.Ext.OrgName
  64 + //d.ProductAttendanceRecordExt = m.Ext.AttendanceExt
  65 + //if
  66 + if m.Ext.AttendanceExt != nil {
  67 + if m.Ext.AttendanceExt.ApproveUserId > 0 {
  68 + d.ApproveUser = &domain.User{
  69 + UserId: m.Ext.AttendanceExt.ApproveUserId,
  70 + UserName: m.Ext.AttendanceExt.ApproveUserName,
  71 + }
  72 + }
  73 + if m.Ext.AttendanceExt.ApproveAt > 0 {
  74 + t := time.Unix(m.Ext.AttendanceExt.ApproveAt, 0)
  75 + d.ApproveAt = t.Local().Format("2006-01-02 15:04:05")
  76 + }
  77 + d.GroupName = m.Ext.AttendanceExt.GroupName
  78 + }
  79 + }
  80 + return d
  81 +}
  1 +package dto
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  6 +)
  7 +
  8 +type EmployeeAttendanceRecordDto struct {
  9 + // 考勤记录ID
  10 + ProductAttendanceId int `json:"productAttendanceId"`
  11 + // 签到日期
  12 + SignDate string `json:"signDate"`
  13 + // 工作位置
  14 + *domain.WorkStation
  15 + // 班组名称
  16 + GroupName string `json:"groupName"`
  17 + // 生产工人
  18 + ProductWorker *domain.User `json:"productWorker,omitempty"`
  19 + // 考勤类型 1.正常 2.支援
  20 + AttendanceType int `json:"attendanceType,omitempty"`
  21 + //*domain.ProductAttendanceRecordExt
  22 + // 考勤状态 1.未审核 2:已审核 4.自动审核
  23 + AttendanceStatus int `json:"attendanceStatus"`
  24 + // 考勤类型 1.正常 2.支援
  25 + AttendanceTypeDescription string `json:"attendanceTypeDescription,omitempty"`
  26 + // 员工类型描述 1:固定 2:派遣 3.临时
  27 + EmployeeTypeDescription string `json:"employeeTypeDescription,omitempty"`
  28 + // 考勤状态 1.未审核 2:已审核 4.自动审核
  29 + AttendanceStatusDescription string `json:"attendanceStatusDescription"`
  30 + // 工时
  31 + WorkTime float64 `json:"workTime"`
  32 + // 组织名称
  33 + OrgName string `json:"orgName"`
  34 + // 权限标识 (当前登录组织匹配为true,否则false)
  35 + AuthFlag bool `json:"authFlag"`
  36 +}
  37 +
  38 +func (d *EmployeeAttendanceRecordDto) LoadDto(m *domain.ProductAttendanceRecord, orgId int) *EmployeeAttendanceRecordDto {
  39 + d.ProductAttendanceId = m.ProductAttendanceId
  40 + d.AttendanceType = m.AttendanceType
  41 + d.ProductWorker = m.ProductWorker
  42 + d.WorkStation = m.WorkStation
  43 + if !m.SignIn.IsZero() {
  44 + //d.SignIn = m.SignIn.Format("15:04:05")
  45 + d.SignDate = m.SignIn.Local().Format("2006-01-02")
  46 + }
  47 + d.WorkTime = utils.Round(m.WorkTimeAfter, 1)
  48 + //d.WorkTimeAfter = m.WorkTimeAfter
  49 + d.AttendanceStatus = m.AttendanceStatus
  50 + d.AttendanceTypeDescription = domain.ParticipateTypeDescription(m.AttendanceType)
  51 + d.EmployeeTypeDescription = domain.EmployeeTypeDescription(m.ProductWorker.EmployeeType)
  52 + d.AttendanceStatusDescription = domain.AttendanceStatusDescription(m.AttendanceStatus)
  53 + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId)
  54 + if m.Ext != nil {
  55 + d.OrgName = m.Ext.OrgName
  56 + //d.ProductAttendanceRecordExt = m.Ext.AttendanceExt
  57 + if m.Ext.AttendanceExt != nil {
  58 + d.GroupName = m.Ext.AttendanceExt.GroupName
  59 + }
  60 + }
  61 + return d
  62 +}
  1 +package dto
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  6 +)
  7 +
  8 +type WorkshopWorkTimeRecordDto struct {
  9 + // 车间工时记录ID
  10 + WorkshopWorkTimeRecordId int `json:"workshopWorkTimeRecordId"`
  11 + // 工作位置
  12 + *domain.WorkStation
  13 + // 签到日期
  14 + //SignDate string `json:"signDate"`
  15 + // 记录信息
  16 + *domain.WorkshopWorkTimeRecordInfo
  17 + // 记录日期
  18 + RecordDate string `json:"recordDate"`
  19 + // 组织名称
  20 + OrgName string `json:"orgName"`
  21 + // 权限标识 (当前登录组织匹配为true,否则false)
  22 + AuthFlag bool `json:"authFlag"`
  23 +}
  24 +
  25 +func (d *WorkshopWorkTimeRecordDto) LoadDto(m *domain.WorkshopWorkTimeRecord, orgId int) *WorkshopWorkTimeRecordDto {
  26 + d.WorkshopWorkTimeRecordId = m.WorkshopWorkTimeRecordId
  27 + d.WorkStation = m.WorkStation
  28 + if m.WorkshopWorkTimeRecordInfo != nil {
  29 + d.WorkshopWorkTimeRecordInfo = &domain.WorkshopWorkTimeRecordInfo{}
  30 + d.WorkshopWorkTimeRecordInfo.EPTWorkTime = utils.Round(m.WorkshopWorkTimeRecordInfo.EPTWorkTime, 1)
  31 + d.WorkshopWorkTimeRecordInfo.EDWorkTime = utils.Round(m.WorkshopWorkTimeRecordInfo.EDWorkTime, 1)
  32 + d.WorkshopWorkTimeRecordInfo.EFTWorkTime = utils.Round(m.WorkshopWorkTimeRecordInfo.EFTWorkTime, 1)
  33 + }
  34 + d.WorkStation = m.WorkStation
  35 + d.RecordDate = m.RecordDate.Local().Format("2006-01-02")
  36 + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId)
  37 + if m.Ext != nil {
  38 + d.OrgName = m.Ext.OrgName
  39 + //d.ProductAttendanceRecordExt = m.Ext.AttendanceExt
  40 + }
  41 + return d
  42 +}
  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 GetAttendanceQuery struct {
  12 + // 考勤记录ID
  13 + ProductAttendanceId int `cname:"考勤记录ID" json:"productAttendanceId" valid:"Required"`
  14 +}
  15 +
  16 +func (getAttendanceQuery *GetAttendanceQuery) Valid(validation *validation.Validation) {
  17 + //validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (getAttendanceQuery *GetAttendanceQuery) ValidateQuery() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(getAttendanceQuery)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(getAttendanceQuery).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 ListAttendanceQuery struct {
  12 + // 查询偏离量
  13 + Offset int `cname:"查询偏离量" json:"offset" valid:"Required"`
  14 + // 查询限制
  15 + Limit int `cname:"查询限制" json:"limit" valid:"Required"`
  16 +}
  17 +
  18 +func (listAttendanceQuery *ListAttendanceQuery) Valid(validation *validation.Validation) {
  19 + validation.SetError("CustomValid", "未实现的自定义认证")
  20 +}
  21 +
  22 +func (listAttendanceQuery *ListAttendanceQuery) ValidateQuery() error {
  23 + valid := validation.Validation{}
  24 + b, err := valid.Valid(listAttendanceQuery)
  25 + if err != nil {
  26 + return err
  27 + }
  28 + if !b {
  29 + elem := reflect.TypeOf(listAttendanceQuery).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 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  6 + "reflect"
  7 + "strings"
  8 +
  9 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type SearchAttendanceQuery struct {
  13 + // 查询偏离量
  14 + Offset int `cname:"查询偏离量" json:"offset"`
  15 + // 查询限制
  16 + Limit int `cname:"查询限制" json:"limit"`
  17 + // 当前公司
  18 + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
  19 + // 当前登录的组织
  20 + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty" `
  21 + // 匹配多个组织
  22 + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty" `
  23 + // 页码
  24 + PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  25 + // 页数
  26 + PageSize int `cname:"页数" json:"pageSize,omitempty"`
  27 + // 车间名称
  28 + WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"`
  29 + // 姓名
  30 + UserName string `cname:"姓名" json:"userName,omitempty"`
  31 + // 考勤状态 1.未审核 2:已审核 3.自动审核
  32 + AttendanceStatus int `cname:"考勤状态 1.未审核 2:已审核 3.自动审核" json:"attendanceStatus,omitempty"`
  33 +}
  34 +
  35 +func (cmd *SearchAttendanceQuery) Valid(validation *validation.Validation) {
  36 + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize)
  37 +}
  38 +
  39 +func (cmd *SearchAttendanceQuery) ValidateQuery() error {
  40 + valid := validation.Validation{}
  41 + b, err := valid.Valid(cmd)
  42 + if err != nil {
  43 + return err
  44 + }
  45 + if !b {
  46 + elem := reflect.TypeOf(cmd).Elem()
  47 + for _, validErr := range valid.Errors {
  48 + field, isExist := elem.FieldByName(validErr.Field)
  49 + if isExist {
  50 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  51 + } else {
  52 + return fmt.Errorf(validErr.Message)
  53 + }
  54 + }
  55 + }
  56 + return nil
  57 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  7 + "reflect"
  8 + "strings"
  9 + "time"
  10 +
  11 + "github.com/beego/beego/v2/core/validation"
  12 +)
  13 +
  14 +type SearchEmployeeAttendanceQuery struct {
  15 + // 查询偏离量
  16 + Offset int `cname:"查询偏离量" json:"offset"`
  17 + // 查询限制
  18 + Limit int `cname:"查询限制" json:"limit"`
  19 + // 当前公司
  20 + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
  21 + // 当前登录的组织
  22 + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty" `
  23 + // 匹配多个组织
  24 + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty" `
  25 + // 页码
  26 + PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  27 + // 页数
  28 + PageSize int `cname:"页数" json:"pageSize,omitempty"`
  29 + // 车间名称
  30 + WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"`
  31 + // 生产线名称
  32 + LineName string `cname:"生产线名称" json:"lineName,omitempty"`
  33 + // 工段名称
  34 + SectionName string `cname:"工段名称" json:"sectionName,omitempty"`
  35 + // 姓名
  36 + UserName string `cname:"姓名" json:"userName,omitempty"`
  37 + // 考勤状态 1.未审核 2:已审核 3.自动审核
  38 + AttendanceStatus int `cname:"考勤状态 1.未审核 2:已审核 3.自动审核" json:"attendanceStatus,omitempty"`
  39 + // 员工类型 1:固定 2:派遣 3.临时
  40 + EmployeeType int `cname:"1:固定 2:派遣 3.临时" json:"employeeType,omitempty"`
  41 + // 开始时间
  42 + BeginTime string `cname:"开始时间" json:"beginTime"`
  43 + // 结束时间
  44 + EndTime string `cname:"结束时间" json:"endTime"`
  45 + // 考勤状态 1.未审核 2:已审核 3.自动审核
  46 + InAttendanceStatus []int `cname:"考勤状态 1.未审核 2:已审核 3.自动审核" json:"inAttendanceStatus,omitempty"`
  47 +
  48 + // 开始时间
  49 + SignBeginTime time.Time `cname:"开始时间" json:"signBeginTime"`
  50 + // 结束时间
  51 + SignEndTime time.Time `cname:"结束时间" json:"signEndTime"`
  52 +}
  53 +
  54 +func (cmd *SearchEmployeeAttendanceQuery) Valid(validation *validation.Validation) {
  55 + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize)
  56 + var err error
  57 + if len(cmd.BeginTime) > 0 {
  58 + if cmd.SignBeginTime, err = time.ParseInLocation("2006-01-02 15:04:05", cmd.BeginTime, time.Local); err != nil {
  59 + log.Logger.Error(err.Error())
  60 + validation.Error("开始时间有误")
  61 + return
  62 + }
  63 + }
  64 + if len(cmd.EndTime) > 0 {
  65 + if cmd.SignEndTime, err = time.ParseInLocation("2006-01-02 15:04:05", cmd.EndTime, time.Local); err != nil {
  66 + log.Logger.Error(err.Error())
  67 + validation.Error("结束时间有误")
  68 + return
  69 + }
  70 + if cmd.SignBeginTime.Equal(cmd.SignEndTime) {
  71 + cmd.SignEndTime = cmd.SignEndTime.Add(time.Hour * 24)
  72 + }
  73 + }
  74 + //cmd.AttendanceStatus = 6 // 审核 + 自动审核
  75 + cmd.InAttendanceStatus = []int{2, 3}
  76 +}
  77 +
  78 +func (cmd *SearchEmployeeAttendanceQuery) ValidateQuery() error {
  79 + valid := validation.Validation{}
  80 + b, err := valid.Valid(cmd)
  81 + if err != nil {
  82 + return err
  83 + }
  84 + if !b {
  85 + elem := reflect.TypeOf(cmd).Elem()
  86 + for _, validErr := range valid.Errors {
  87 + field, isExist := elem.FieldByName(validErr.Field)
  88 + if isExist {
  89 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  90 + } else {
  91 + return fmt.Errorf(validErr.Message)
  92 + }
  93 + }
  94 + }
  95 + return nil
  96 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/attendance/command"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/attendance/dto"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/attendance/query"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  12 + "time"
  13 +)
  14 +
  15 +type AttendanceService struct {
  16 +}
  17 +
  18 +// 审核工时
  19 +func (attendanceService *AttendanceService) ApproveAttendance(cmd *command.ApproveAttendanceCommand) (interface{}, error) {
  20 + if err := cmd.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 + var productAttendanceRecordRepository domain.ProductAttendanceRecordRepository
  34 + var attendance *domain.ProductAttendanceRecord
  35 + productAttendanceRecordRepository, attendance, err = factory.FastPgAttendance(transactionContext, cmd.ProductAttendanceId)
  36 + if err != nil {
  37 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  38 + }
  39 +
  40 + var user *domain.User
  41 + userService := domainService.NewUserService()
  42 + user, err = userService.User(cmd.ApproveUserId)
  43 + if err != nil {
  44 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  45 + }
  46 +
  47 + if err = attendance.Approve(user, cmd.WorkTimeAfter, domain.AttendanceApproved); err != nil {
  48 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  49 + }
  50 +
  51 + if _, err := productAttendanceRecordRepository.Save(attendance); err != nil {
  52 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  53 + }
  54 + if err := domainService.SendWorkshopWorkTimeStaticJob(attendance); err != nil {
  55 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  56 + }
  57 + if err := transactionContext.CommitTransaction(); err != nil {
  58 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  59 + }
  60 + return struct{}{}, nil
  61 +}
  62 +
  63 +// 创建
  64 +func (attendanceService *AttendanceService) CreateAttendance(operateInfo *domain.OperateInfo, cmd *command.CreateAttendanceCommand) (interface{}, error) {
  65 + if err := cmd.ValidateCommand(); err != nil {
  66 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  67 + }
  68 + transactionContext, err := factory.CreateTransactionContext(nil)
  69 + if err != nil {
  70 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  71 + }
  72 + if err := transactionContext.StartTransaction(); err != nil {
  73 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  74 + }
  75 + defer func() {
  76 + transactionContext.RollbackTransaction()
  77 + }()
  78 +
  79 + var user *domain.User
  80 + userService := domainService.NewUserService()
  81 + user, err = userService.User(cmd.ProductWorkerId)
  82 + if err != nil {
  83 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  84 + }
  85 +
  86 + var workStation *domain.WorkStation
  87 + _, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId)
  88 + if err != nil {
  89 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  90 + }
  91 +
  92 + var org *domain.Org
  93 + org, err = userService.Organization(operateInfo.OrgId)
  94 + if err != nil {
  95 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  96 + }
  97 +
  98 + var productGroup *domain.ProductGroup
  99 + _, productGroup, err = factory.FastPgProductGroup(transactionContext, cmd.ProductGroupId)
  100 + if err != nil {
  101 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  102 + }
  103 + newAttendance := &domain.ProductAttendanceRecord{
  104 + //ProductAttendanceId: cmd.ProductAttendanceId,
  105 + CompanyId: operateInfo.CompanyId,
  106 + OrgId: operateInfo.OrgId,
  107 + AttendanceType: cmd.AttendanceType,
  108 + ProductWorker: user,
  109 + WorkStation: workStation,
  110 + SignIn: cmd.SignIn,
  111 + SignOut: cmd.SignOut,
  112 + AttendanceStatus: domain.AttendanceNotApprove,
  113 + WorkTimeBefore: 0,
  114 + WorkTimeAfter: 0,
  115 + CreatedAt: time.Now(),
  116 + UpdatedAt: time.Now(),
  117 + Ext: domain.NewExt(org.OrgName).WithAttendanceExt(&domain.ProductAttendanceRecordExt{
  118 + GroupName: productGroup.GroupName,
  119 + ProductGroupId: productGroup.ProductGroupId,
  120 + }),
  121 + }
  122 + newAttendance.WorkTimeBefore = newAttendance.ComputeWorkTimeBefore()
  123 + var attendanceRepository domain.ProductAttendanceRecordRepository
  124 +
  125 + attendanceRepository, _, _ = factory.FastPgAttendance(transactionContext, 0)
  126 +
  127 + if attendance, err := attendanceRepository.Save(newAttendance); err != nil {
  128 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  129 + } else {
  130 + if err := transactionContext.CommitTransaction(); err != nil {
  131 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  132 + }
  133 + return attendance, nil
  134 + }
  135 +}
  136 +
  137 +// 返回
  138 +func (attendanceService *AttendanceService) GetAttendance(getAttendanceQuery *query.GetAttendanceQuery) (interface{}, error) {
  139 + if err := getAttendanceQuery.ValidateQuery(); err != nil {
  140 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  141 + }
  142 + transactionContext, err := factory.CreateTransactionContext(nil)
  143 + if err != nil {
  144 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  145 + }
  146 + if err := transactionContext.StartTransaction(); err != nil {
  147 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  148 + }
  149 + defer func() {
  150 + transactionContext.RollbackTransaction()
  151 + }()
  152 + //var attendanceRepository domain.ProductAttendanceRecordRepository
  153 + var attendance *domain.ProductAttendanceRecord
  154 + _, attendance, err = factory.FastPgAttendance(transactionContext, getAttendanceQuery.ProductAttendanceId)
  155 + if err != nil {
  156 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  157 + }
  158 +
  159 + if err := transactionContext.CommitTransaction(); err != nil {
  160 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  161 + }
  162 + result := &dto.AttendanceRecordDto{}
  163 + result.LoadDto(attendance, 0)
  164 + return result, nil
  165 +}
  166 +
  167 +// 返回列表
  168 +func (attendanceService *AttendanceService) ListAttendance(listAttendanceQuery *query.ListAttendanceQuery) (interface{}, error) {
  169 + if err := listAttendanceQuery.ValidateQuery(); err != nil {
  170 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  171 + }
  172 + transactionContext, err := factory.CreateTransactionContext(nil)
  173 + if err != nil {
  174 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  175 + }
  176 + if err := transactionContext.StartTransaction(); err != nil {
  177 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  178 + }
  179 + defer func() {
  180 + transactionContext.RollbackTransaction()
  181 + }()
  182 + //var attendanceRepository attendance.AttendanceRepository
  183 + //if value, err := factory.CreateAttendanceRepository(map[string]interface{}{
  184 + // "transactionContext": transactionContext,
  185 + //}); err != nil {
  186 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  187 + //} else {
  188 + // attendanceRepository = value
  189 + //}
  190 + //if count, attendances, err := attendanceRepository.Find(tool_funs.SimpleStructToMap(listAttendanceQuery)); err != nil {
  191 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  192 + //} else {
  193 + // if err := transactionContext.CommitTransaction(); err != nil {
  194 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  195 + // }
  196 + // return map[string]interface{}{
  197 + // "count": count,
  198 + // "attendances": attendances,
  199 + // }, nil
  200 + //}
  201 + return nil, nil
  202 +}
  203 +
  204 +// 移除
  205 +func (attendanceService *AttendanceService) RemoveAttendance(removeAttendanceCommand *command.RemoveAttendanceCommand) (interface{}, error) {
  206 + if err := removeAttendanceCommand.ValidateCommand(); err != nil {
  207 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  208 + }
  209 + transactionContext, err := factory.CreateTransactionContext(nil)
  210 + if err != nil {
  211 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  212 + }
  213 + if err := transactionContext.StartTransaction(); err != nil {
  214 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  215 + }
  216 + defer func() {
  217 + transactionContext.RollbackTransaction()
  218 + }()
  219 + var attendanceRepository domain.ProductAttendanceRecordRepository
  220 + var attendance *domain.ProductAttendanceRecord
  221 +
  222 + attendanceRepository, attendance, err = factory.FastPgAttendance(transactionContext, removeAttendanceCommand.ProductAttendanceId)
  223 + if err != nil {
  224 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  225 + }
  226 +
  227 + if attendance, err := attendanceRepository.Remove(attendance); err != nil {
  228 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  229 + } else {
  230 + if err := transactionContext.CommitTransaction(); err != nil {
  231 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  232 + }
  233 + return attendance, nil
  234 + }
  235 +}
  236 +
  237 +// 更新
  238 +func (attendanceService *AttendanceService) UpdateAttendance(updateAttendanceCommand *command.UpdateAttendanceCommand) (interface{}, error) {
  239 + if err := updateAttendanceCommand.ValidateCommand(); err != nil {
  240 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  241 + }
  242 + transactionContext, err := factory.CreateTransactionContext(nil)
  243 + if err != nil {
  244 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  245 + }
  246 + if err := transactionContext.StartTransaction(); err != nil {
  247 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  248 + }
  249 + defer func() {
  250 + transactionContext.RollbackTransaction()
  251 + }()
  252 + //var attendanceRepository attendance.AttendanceRepository
  253 + //if value, err := factory.CreateAttendanceRepository(map[string]interface{}{
  254 + // "transactionContext": transactionContext,
  255 + //}); err != nil {
  256 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  257 + //} else {
  258 + // attendanceRepository = value
  259 + //}
  260 + //attendance, err := attendanceRepository.FindOne(map[string]interface{}{"attendanceId": updateAttendanceCommand.AttendanceId})
  261 + //if err != nil {
  262 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  263 + //}
  264 + //if attendance == nil {
  265 + // return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateAttendanceCommand.AttendanceId)))
  266 + //}
  267 + //if err := attendance.Update(tool_funs.SimpleStructToMap(updateAttendanceCommand)); err != nil {
  268 + // return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  269 + //}
  270 + //if attendance, err := attendanceRepository.Save(attendance); err != nil {
  271 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  272 + //} else {
  273 + // if err := transactionContext.CommitTransaction(); err != nil {
  274 + // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  275 + // }
  276 + // return attendance, nil
  277 + //}
  278 + return nil, nil
  279 +}
  280 +
  281 +// 返回列表
  282 +func (attendanceService *AttendanceService) SearchAttendance(operateInfo *domain.OperateInfo, cmd *query.SearchAttendanceQuery) (int64, interface{}, error) {
  283 + if err := cmd.ValidateQuery(); err != nil {
  284 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  285 + }
  286 + transactionContext, err := factory.CreateTransactionContext(nil)
  287 + if err != nil {
  288 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  289 + }
  290 + if err := transactionContext.StartTransaction(); err != nil {
  291 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  292 + }
  293 + defer func() {
  294 + transactionContext.RollbackTransaction()
  295 + }()
  296 + var attendanceRepository domain.ProductAttendanceRecordRepository
  297 + attendanceRepository, _, _ = factory.FastPgAttendance(transactionContext, 0)
  298 +
  299 + queryOptions := utils.ObjectToMap(cmd)
  300 +
  301 + count, attendances, err := attendanceRepository.Find(queryOptions)
  302 + if err != nil {
  303 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  304 + }
  305 + if err := transactionContext.CommitTransaction(); err != nil {
  306 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  307 + }
  308 + var result = make([]*dto.AttendanceRecordDto, 0)
  309 + for i := range attendances {
  310 + newItem := &dto.AttendanceRecordDto{}
  311 + result = append(result, newItem.LoadDto(attendances[i], operateInfo.OrgId))
  312 + }
  313 + return count, result, nil
  314 +}
  315 +
  316 +// 员工工时统计
  317 +func (attendanceService *AttendanceService) SearchEmployeeAttendanceStatics(operateInfo *domain.OperateInfo, cmd *query.SearchEmployeeAttendanceQuery) (int64, interface{}, error) {
  318 + if err := cmd.ValidateQuery(); err != nil {
  319 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  320 + }
  321 + transactionContext, err := factory.CreateTransactionContext(nil)
  322 + if err != nil {
  323 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  324 + }
  325 + if err := transactionContext.StartTransaction(); err != nil {
  326 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  327 + }
  328 + defer func() {
  329 + transactionContext.RollbackTransaction()
  330 + }()
  331 + var attendanceRepository domain.ProductAttendanceRecordRepository
  332 + attendanceRepository, _, _ = factory.FastPgAttendance(transactionContext, 0)
  333 +
  334 + queryOptions := utils.ObjectToMap(cmd)
  335 + count, attendances, err := attendanceRepository.Find(queryOptions)
  336 + if err != nil {
  337 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  338 + }
  339 + if err := transactionContext.CommitTransaction(); err != nil {
  340 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  341 + }
  342 + var result = make([]*dto.EmployeeAttendanceRecordDto, 0)
  343 + for i := range attendances {
  344 + newItem := &dto.EmployeeAttendanceRecordDto{}
  345 + result = append(result, newItem.LoadDto(attendances[i], operateInfo.OrgId))
  346 + }
  347 + return count, result, nil
  348 +}
  349 +
  350 +// 车间工时统计
  351 +func (attendanceService *AttendanceService) SearchWorkshopWorkTimeStatics(operateInfo *domain.OperateInfo, cmd *query.SearchEmployeeAttendanceQuery) (int64, interface{}, error) {
  352 + if err := cmd.ValidateQuery(); err != nil {
  353 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  354 + }
  355 + transactionContext, err := factory.CreateTransactionContext(nil)
  356 + if err != nil {
  357 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  358 + }
  359 + if err := transactionContext.StartTransaction(); err != nil {
  360 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  361 + }
  362 + defer func() {
  363 + transactionContext.RollbackTransaction()
  364 + }()
  365 + var attendanceRepository domain.WorkshopWorkTimeRecordRepository
  366 + attendanceRepository, _, _ = factory.FastPgWorkshopWorkTimeRecord(transactionContext, 0)
  367 +
  368 + queryOptions := utils.ObjectToMap(cmd)
  369 + count, attendances, err := attendanceRepository.Find(queryOptions)
  370 + if err != nil {
  371 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  372 + }
  373 + if err := transactionContext.CommitTransaction(); err != nil {
  374 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  375 + }
  376 + var result = make([]*dto.WorkshopWorkTimeRecordDto, 0)
  377 + for i := range attendances {
  378 + newItem := &dto.WorkshopWorkTimeRecordDto{}
  379 + result = append(result, newItem.LoadDto(attendances[i], operateInfo.OrgId))
  380 + }
  381 + return count, result, nil
  382 +}
  383 +
  384 +func NewAttendanceService(options map[string]interface{}) *AttendanceService {
  385 + newAttendanceService := &AttendanceService{}
  386 + return newAttendanceService
  387 +}
  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/allied-creation-manufacture/pkg/application/attendance/command"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  10 +)
  11 +
  12 +func (attendanceService *AttendanceService) WorkerAttendanceReport(cmd *command.WorkerAttendanceReportCommand) (interface{}, error) {
  13 + if err := cmd.ValidateCommand(); err != nil {
  14 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  15 + }
  16 + transactionContext, err := factory.CreateTransactionContext(nil)
  17 + if err != nil {
  18 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  19 + }
  20 + if err := transactionContext.StartTransaction(); err != nil {
  21 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  22 + }
  23 + defer func() {
  24 + transactionContext.RollbackTransaction()
  25 + }()
  26 +
  27 + //svr, _ := domainService.NewPGWorkshopWorkTimeStaticService(transactionContext.(*pgTransaction.TransactionContext))
  28 + //if _, err := svr.WorkshopWorkTimeStatic(cmd.ProductAttendanceRecord); err != nil {
  29 + // log.Logger.Error(err.Error())
  30 + // return nil, err
  31 + //}
  32 + attendanceReportService, _ := domainService.NewPGWorkerAttendanceReportService(transactionContext.(*pgTransaction.TransactionContext))
  33 + if _, err := attendanceReportService.Report(constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID, cmd.DeviceZkTeco); err != nil {
  34 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  35 + }
  36 + if err := transactionContext.CommitTransaction(); err != nil {
  37 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  38 + }
  39 + return struct{}{}, nil
  40 +}
  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/allied-creation-manufacture/pkg/application/attendance/command"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  10 +)
  11 +
  12 +// 审核工时
  13 +func (attendanceService *AttendanceService) WorkshopWorkTimeRecordStatics(cmd *command.WorkshopWorkTimeRecordStaticsCommand) (interface{}, error) {
  14 + if err := cmd.ValidateCommand(); err != nil {
  15 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  16 + }
  17 + transactionContext, err := factory.CreateTransactionContext(nil)
  18 + if err != nil {
  19 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  20 + }
  21 + if err := transactionContext.StartTransaction(); err != nil {
  22 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  23 + }
  24 + defer func() {
  25 + transactionContext.RollbackTransaction()
  26 + }()
  27 +
  28 + svr, _ := domainService.NewPGWorkshopWorkTimeStaticService(transactionContext.(*pgTransaction.TransactionContext))
  29 + if _, err := svr.WorkshopWorkTimeStatic(cmd.ProductAttendanceRecord); err != nil {
  30 + log.Logger.Error(err.Error())
  31 + return nil, err
  32 + }
  33 +
  34 + if err := transactionContext.CommitTransaction(); err != nil {
  35 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  36 + }
  37 + return struct{}{}, nil
  38 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 +
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  7 +
  8 + "github.com/beego/beego/v2/task"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/syncdata"
  10 +)
  11 +
  12 +type CrontabService struct {
  13 +}
  14 +
  15 +func NewCrontabService(options map[string]interface{}) *CrontabService {
  16 + newCrontabService := &CrontabService{}
  17 + return newCrontabService
  18 +}
  19 +
  20 +func (crontabService *CrontabService) initTask() {
  21 + //拉取物料数据 每5分执行
  22 + pullMaterialK3cloud := task.NewTask("pullMaterialK3cloud", "0 */5 0 * * *", func(ctx context.Context) error {
  23 + srv := syncdata.PullDataK3CloudService{}
  24 + return srv.PullMaterialNewest()
  25 + })
  26 + task.AddTask("pullMaterialK3cloud", pullMaterialK3cloud)
  27 + //拉取物料分组数据 每5分执行
  28 + pullMaterialGroupK3cloud := task.NewTask("pullMaterialGroupK3cloud", "0 */5 0 * * *", func(ctx context.Context) error {
  29 + srv := syncdata.PullDataK3CloudService{}
  30 + return srv.PullMaterialGroup()
  31 + })
  32 + task.AddTask("pullMaterialGroupK3cloud", pullMaterialGroupK3cloud)
  33 + //拉取订生产订单数据 每5分执行
  34 + PullPrdMoK3cloud := task.NewTask("PullPrdMoK3cloud", "0 */5 0 * * *", func(ctx context.Context) error {
  35 + srv := syncdata.PullDataK3CloudService{}
  36 + return srv.PullPrdMoNewest()
  37 + })
  38 + task.AddTask("PullPrdMoK3cloud", PullPrdMoK3cloud)
  39 +
  40 + autoApproveAttendanceRecord := task.NewTask("autoApproveAttendanceRecord", "0 */2 * * * *", AutoApproveProductAttendanceRecord)
  41 + task.AddTask("autoApproveAttendanceRecord", autoApproveAttendanceRecord)
  42 +
  43 + autoApproveRecord := task.NewTask("autoApproveRecord", "0 */2 * * * *", AutoApproveProductRecord)
  44 + task.AddTask("autoApproveRecord", autoApproveRecord)
  45 +
  46 + autoFlushDeviceDailyRunningRecord := task.NewTask("定时刷新设备每日运行记录", "0 */1 * * * *", AutoFlushDeviceDailyRunningRecord)
  47 + task.AddTask("autoFlushDeviceDailyRunningRecord", autoFlushDeviceDailyRunningRecord)
  48 +
  49 + autoFlushDeviceDailyRunningRecordOEE := task.NewTask("定时刷新设备每日运行记录-OEE", "0 */10 * * * *", AutoFlushDeviceDailyRunningRecordOEE)
  50 + task.AddTask("autoFlushDeviceDailyRunningRecordOEE", autoFlushDeviceDailyRunningRecordOEE)
  51 +
  52 + autoWorkshopPlanCompletionRecord := task.NewTask("定时刷新昨日车间计划完成纪录", "0 5 1-17/1 * * *", AutoWorkshopPlanCompletionRecord)
  53 + task.AddTask("autoWorkshopPlanCompletionRecord", autoWorkshopPlanCompletionRecord)
  54 +
  55 + autoTodayWorkshopPlanCompletionRecord := task.NewTask("定时刷新当天车间计划完成纪录", "0 0 1-23/1 * * *", AutoTodayWorkshopPlanCompletionRecord) // 1:00, 4:00, 每三个小时运行一次
  56 + task.AddTask("autoTodayWorkshopPlanCompletionRecord", autoTodayWorkshopPlanCompletionRecord)
  57 +
  58 + syncProductPlan := task.NewTask("定时同步车间计划", "0 */5 * * * *", SyncProductPlan)
  59 + task.AddTask("SyncProductPlan", syncProductPlan)
  60 +
  61 + syncProduct := task.NewTask("定时同步产品信息", "0 */30 * * * *", SyncProduct)
  62 + task.AddTask("syncProduct", syncProduct)
  63 +}
  64 +
  65 +func (crontabService *CrontabService) StartCrontabTask() {
  66 + crontabService.initTask()
  67 + task.StartTask()
  68 + log.Logger.Info("crontab start!")
  69 +}
  70 +
  71 +func (crontabService *CrontabService) StopCrontabTask() {
  72 + task.StopTask()
  73 + log.Logger.Info("crontab stop!")
  74 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  12 +)
  13 +
  14 +// 定时审核生产考勤记录
  15 +func AutoApproveProductAttendanceRecord(ctx context.Context) error {
  16 + defer func() {
  17 + if r := recover(); r != nil {
  18 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时审核生产考勤记录"})
  19 + }
  20 + }()
  21 + transactionContext, err := factory.CreateTransactionContext(nil)
  22 + if err != nil {
  23 + return err
  24 + }
  25 + if err := transactionContext.StartTransaction(); err != nil {
  26 + return err
  27 + }
  28 + defer func() {
  29 + if err != nil {
  30 + log.Logger.Error("【定时审核生产考勤记录】 失败:" + err.Error())
  31 + }
  32 + transactionContext.RollbackTransaction()
  33 + }()
  34 +
  35 + attendanceRecordDao, _ := dao.NewAttendanceRecordDao(transactionContext.(*pgTransaction.TransactionContext))
  36 + var records []*domain.ProductAttendanceRecord
  37 + _, records, err = attendanceRecordDao.RecentUnApprovedAttendanceRecord(24, 2)
  38 + if err != nil {
  39 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时审核生产考勤记录"})
  40 + return err
  41 + }
  42 +
  43 + approveAttendanceRecordsService, _ := domainService.NewPGApproveAttendanceRecordsService(transactionContext.(*pgTransaction.TransactionContext))
  44 +
  45 + if _, err = approveAttendanceRecordsService.BatchApproveAttendanceRecords(nil, records, 0, 0, domain.AttendanceAutoApproved); err != nil {
  46 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时审核生产考勤记录"})
  47 + return err
  48 + }
  49 + if err = transactionContext.CommitTransaction(); err != nil {
  50 + return err
  51 + }
  52 + return nil
  53 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  12 +)
  13 +
  14 +// 定时审核生产记录
  15 +func AutoApproveProductRecord(ctx context.Context) error {
  16 + defer func() {
  17 + if r := recover(); r != nil {
  18 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时审核生产记录"})
  19 + }
  20 + }()
  21 + transactionContext, err := factory.CreateTransactionContext(nil)
  22 + if err != nil {
  23 + return err
  24 + }
  25 + if err := transactionContext.StartTransaction(); err != nil {
  26 + return err
  27 + }
  28 + defer func() {
  29 + if err != nil {
  30 + log.Logger.Error("【定时审核生产考勤记录】 失败:" + err.Error())
  31 + }
  32 + transactionContext.RollbackTransaction()
  33 + }()
  34 +
  35 + attendanceRecordDao, _ := dao.NewProductRecordDao(transactionContext.(*pgTransaction.TransactionContext))
  36 + var records []*domain.ProductRecord
  37 + _, records, err = attendanceRecordDao.RecentUnApprovedProductRecord(24, 2, domain.RecordTypeSecondLevelWeigh)
  38 + if err != nil {
  39 + return err
  40 + }
  41 +
  42 + approveAttendanceRecordsService, _ := domainService.NewPGProductRecordService(transactionContext.(*pgTransaction.TransactionContext))
  43 +
  44 + if _, err = approveAttendanceRecordsService.BatchApprove(records, 0, 0, domain.AttendanceAutoApproved); err != nil {
  45 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时审核生产记录"})
  46 + return err
  47 + }
  48 + if err = transactionContext.CommitTransaction(); err != nil {
  49 + return err
  50 + }
  51 + return nil
  52 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  9 + "time"
  10 +)
  11 +
  12 +// 定时刷新设备每日运行记录
  13 +func AutoFlushDeviceDailyRunningRecord(ctx context.Context) error {
  14 + defer func() {
  15 + if r := recover(); r != nil {
  16 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时刷新设备每日运行记录"})
  17 + }
  18 + }()
  19 + transactionContext, err := factory.CreateTransactionContext(nil)
  20 + if err != nil {
  21 + return err
  22 + }
  23 + if err := transactionContext.StartTransaction(); err != nil {
  24 + return err
  25 + }
  26 + defer func() {
  27 + if err != nil {
  28 + log.Logger.Error("【定时刷新设备每日运行记录】 失败:" + err.Error())
  29 + }
  30 + transactionContext.RollbackTransaction()
  31 + }()
  32 +
  33 + log.Logger.Debug("【定时刷新设备每日运行记录】 启动")
  34 + deviceDailyRunningRecordRepository, _, _ := factory.FastPgDeviceDailyRunningRecord(transactionContext, 0)
  35 + // 获取redis里当天的记录
  36 + span := time.Duration(20)
  37 + t := time.Now().Add(-time.Minute * span)
  38 + records, err := redis.GetDeviceDailyAllRecord(t)
  39 + if err != nil {
  40 + log.Logger.Debug(err.Error())
  41 + return err
  42 + }
  43 +
  44 + for _, v := range records {
  45 + if v.UpdatedAt.Add(time.Minute * 20).Before(time.Now()) {
  46 + log.Logger.Debug(fmt.Sprintf("【定时刷新设备每日运行记录】 跳过记录 %v 最后更新时间:%v", v, v.UpdatedAt))
  47 + continue
  48 + }
  49 +
  50 + // 更新设备效率 OEE = tu * pu * qu
  51 +
  52 + if _, err := deviceDailyRunningRecordRepository.Save(v); err != nil {
  53 + log.Logger.Error(err.Error(), map[string]interface{}{"record": v})
  54 + continue
  55 + } else {
  56 + log.Logger.Debug(fmt.Sprintf("【定时刷新设备每日运行记录】 刷新记录 %v", v))
  57 + }
  58 + }
  59 +
  60 + if err = transactionContext.CommitTransaction(); err != nil {
  61 + return err
  62 + }
  63 + return nil
  64 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
  12 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  14 + "time"
  15 +)
  16 +
  17 +// 定时刷新设备每日运行记录
  18 +func AutoFlushDeviceDailyRunningRecordOEE(ctx context.Context) error {
  19 + defer func() {
  20 + if r := recover(); r != nil {
  21 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时刷新设备每日运行记录"})
  22 + }
  23 + }()
  24 + transactionContext, err := factory.CreateTransactionContext(nil)
  25 + if err != nil {
  26 + return err
  27 + }
  28 + if err := transactionContext.StartTransaction(); err != nil {
  29 + return err
  30 + }
  31 + defer func() {
  32 + if err != nil {
  33 + log.Logger.Error("【定时刷新设备每日运行记录-OEE】 失败:" + err.Error())
  34 + }
  35 + transactionContext.RollbackTransaction()
  36 + }()
  37 +
  38 + log.Logger.Debug("【定时刷新设备每日运行记录-OEE】 启动")
  39 + deviceDailyRunningRecordRepository, _, _ := factory.FastPgDeviceDailyRunningRecord(transactionContext, 0)
  40 + // 获取redis里当天的记录
  41 + span := time.Duration(20)
  42 + t := time.Now().Add(-time.Minute * span)
  43 + records, err := redis.GetDeviceDailyAllRecord(t)
  44 + if err != nil {
  45 + log.Logger.Error(err.Error())
  46 + return err
  47 + }
  48 + total := 24 * 60 * 60
  49 + deviceRepository, _, _ := factory.FastPgDevice(transactionContext, 0)
  50 + workshopProductRecordDao, _ := dao.NewWorkshopProductRecordDao(transactionContext.(*pg.TransactionContext))
  51 +
  52 + for _, v := range records {
  53 + //if v.UpdatedAt.Add(time.Minute * 5).Before(time.Now()) {
  54 + // log.Logger.Debug(fmt.Sprintf("【定时刷新设备每日运行记录-OEE】 跳过记录 %v 最后更新时间:%v", v, v.UpdatedAt))
  55 + // continue
  56 + //}
  57 +
  58 + var (
  59 + pu float64 = 100
  60 + qu float64 = 100
  61 + )
  62 +
  63 + // 更新设备效率 OEE = tu * pu * qu
  64 + /*
  65 + pu 性能利用
  66 + 设备标准工时,
  67 + 没有配置设备标准工时的为100
  68 + */
  69 +
  70 + // 只计算串串机
  71 + if v.DeviceRunningRecordInfo.DeviceType == domain.DeviceTypeChuanChuanJi {
  72 + // 设备数据(标准工时)
  73 + device, err := deviceRepository.FindOne(map[string]interface{}{"deviceId": v.DeviceId})
  74 + if device != nil && err == nil {
  75 + if device.Ext.DeviceExt != nil {
  76 + pu = utils.Round((float64(v.DeviceRunningRecordInfo.Count)*100.0)/(float64(total)/device.Ext.DeviceExt.UnitProductionSecTime), 1)
  77 + }
  78 + }
  79 + // 工段对应二级品数据
  80 +
  81 + record, err := workshopProductRecordDao.WorkStationProductRecord(v.CompanyId, v.OrgId, v.WorkStation.WorkStationId, t)
  82 + if record != nil && err == nil {
  83 + qu = float64(v.DeviceRunningRecordInfo.Count) * domainService.DefaultCCJUnitQuantity
  84 + qu = utils.Round((qu-record.SecondLevelWeigh)*100/qu, 1)
  85 + }
  86 + }
  87 +
  88 + v.DeviceRunningRecordInfo.ResetOEE(pu, qu)
  89 +
  90 + if _, err := deviceDailyRunningRecordRepository.Save(v); err != nil {
  91 + log.Logger.Error(err.Error())
  92 + continue
  93 + }
  94 + if err := redis.SaveDeviceDailyRunningRecord(v); err != nil {
  95 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时刷新设备每日运行记录"})
  96 + continue
  97 + }
  98 + log.Logger.Debug(fmt.Sprintf("【定时刷新设备每日运行记录-OEE】 刷新记录 %v", v))
  99 + }
  100 +
  101 + if err = transactionContext.CommitTransaction(); err != nil {
  102 + return err
  103 + }
  104 + return nil
  105 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  11 + "time"
  12 +)
  13 +
  14 +// 定时刷新车间计划完成纪录
  15 +func AutoWorkshopPlanCompletionRecord(ctx context.Context) error {
  16 + defer func() {
  17 + if r := recover(); r != nil {
  18 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时刷新车间计划完成纪录"})
  19 + }
  20 + }()
  21 + transactionContext, err := factory.CreateTransactionContext(nil)
  22 + if err != nil {
  23 + return err
  24 + }
  25 + if err := transactionContext.StartTransaction(); err != nil {
  26 + return err
  27 + }
  28 + defer func() {
  29 + if err != nil {
  30 + log.Logger.Error("【定时刷新车间计划备每日运行记录】 失败:" + err.Error())
  31 + }
  32 + transactionContext.RollbackTransaction()
  33 + }()
  34 +
  35 + log.Logger.Debug("【定时刷新车间计划每日运行记录】 启动")
  36 + end := utils.GetZeroTime(time.Now())
  37 + begin := utils.GetZeroTime(end.Add(-time.Second))
  38 + approveAttendanceRecordsService, _ := domainService.NewPGWorkshopPlanCompletionRecordService(transactionContext.(*pgTransaction.TransactionContext))
  39 +
  40 + if err = approveAttendanceRecordsService.WorkshopPlanCompletion(begin, end, "yesterday"); err != nil {
  41 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时刷新车间计划完成纪录"})
  42 + return err
  43 + }
  44 +
  45 + if err = transactionContext.CommitTransaction(); err != nil {
  46 + return err
  47 + }
  48 + return nil
  49 +}
  50 +
  51 +// 定时刷新当天车间计划完成纪录
  52 +func AutoTodayWorkshopPlanCompletionRecord(ctx context.Context) error {
  53 + defer func() {
  54 + if r := recover(); r != nil {
  55 + log.Logger.Error(fmt.Sprintf("%v", r))
  56 + }
  57 + }()
  58 + transactionContext, err := factory.CreateTransactionContext(nil)
  59 + if err != nil {
  60 + return err
  61 + }
  62 + if err := transactionContext.StartTransaction(); err != nil {
  63 + return err
  64 + }
  65 + defer func() {
  66 + if err != nil {
  67 + log.Logger.Error("【定时刷新车间计划今日运行记录】 失败:" + err.Error())
  68 + }
  69 + transactionContext.RollbackTransaction()
  70 + }()
  71 +
  72 + log.Logger.Debug("【定时刷新车间计划今日运行记录】 启动")
  73 + begin := utils.GetZeroTime(time.Now())
  74 + end := time.Now()
  75 + approveAttendanceRecordsService, _ := domainService.NewPGWorkshopPlanCompletionRecordService(transactionContext.(*pgTransaction.TransactionContext))
  76 +
  77 + if err = approveAttendanceRecordsService.WorkshopPlanCompletion(begin, end, "today"); err != nil {
  78 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时刷新当天车间计划完成纪录"})
  79 + return err
  80 + }
  81 +
  82 + if err = transactionContext.CommitTransaction(); err != nil {
  83 + return err
  84 + }
  85 + return nil
  86 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/syncdata"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  11 + "runtime/debug"
  12 + "time"
  13 +)
  14 +
  15 +// SyncProduct 定时同步产品
  16 +func SyncProduct(ctx context.Context) error {
  17 + defer func() {
  18 + if r := recover(); r != nil {
  19 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时同步产品", "stack": string(debug.Stack())})
  20 + }
  21 + }()
  22 + transactionContext, err := factory.CreateTransactionContext(nil)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if err := transactionContext.StartTransaction(); err != nil {
  27 + return err
  28 + }
  29 + defer func() {
  30 + if err != nil {
  31 + log.Logger.Error("【定时同步产品信息】 失败:" + err.Error())
  32 + }
  33 + transactionContext.RollbackTransaction()
  34 + }()
  35 +
  36 + log.Logger.Debug("【定时同步同步产品信息】 启动")
  37 + pullK3CloudService := syncdata.PullDataK3CloudService{}
  38 + t := ctx.Value("fromTime")
  39 + var fromTime time.Time
  40 + if ctx != nil {
  41 + if t != nil {
  42 + if v, ok := t.(time.Time); ok {
  43 + fromTime = v
  44 + }
  45 + }
  46 + }
  47 + if fromTime.IsZero() {
  48 + fromTime, err = redis.GetLastFetchTime(redis.MaterialK3cloudFetchTimeKey())
  49 + if err != nil {
  50 + log.Logger.Error(err.Error())
  51 + return nil
  52 + }
  53 + }
  54 + if err := pullK3CloudService.SyncDataProduct(transactionContext.(*pg.TransactionContext), fromTime); err != nil {
  55 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时同步产品"})
  56 + return nil
  57 + }
  58 + if err = transactionContext.CommitTransaction(); err != nil {
  59 + return err
  60 + }
  61 + return nil
  62 +}
  1 +package crontab
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/linmadan/egglib-go/transaction/pg"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/syncdata"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  10 + "runtime/debug"
  11 + "time"
  12 +)
  13 +
  14 +// 定时同步生产计划
  15 +func SyncProductPlan(ctx context.Context) error {
  16 + defer func() {
  17 + if r := recover(); r != nil {
  18 + log.Logger.Error(fmt.Sprintf("%v", r), map[string]interface{}{"task": "定时同步车间计划", "stack": debug.Stack()})
  19 + }
  20 + }()
  21 + transactionContext, err := factory.CreateTransactionContext(nil)
  22 + if err != nil {
  23 + return err
  24 + }
  25 + if err := transactionContext.StartTransaction(); err != nil {
  26 + return err
  27 + }
  28 + defer func() {
  29 + if err != nil {
  30 + log.Logger.Error("【定时同步车间计划】 失败:" + err.Error())
  31 + }
  32 + transactionContext.RollbackTransaction()
  33 + }()
  34 +
  35 + log.Logger.Debug("【定时同步车间计划】 启动")
  36 + pullK3CloudService := syncdata.PullDataK3CloudService{}
  37 + var fromTime time.Time
  38 + if ctx != nil {
  39 + t := ctx.Value("fromTime")
  40 + if t != nil {
  41 + if v, ok := t.(time.Time); ok {
  42 + fromTime = v
  43 + }
  44 + }
  45 + }
  46 +
  47 + if err := pullK3CloudService.SyncDataProductPlan(transactionContext.(*pg.TransactionContext), fromTime); err != nil {
  48 + log.Logger.Error(err.Error(), map[string]interface{}{"task": "定时同步车间计划"})
  49 + return nil
  50 + }
  51 + if err = transactionContext.CommitTransaction(); err != nil {
  52 + return err
  53 + }
  54 + return nil
  55 +}
  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 BatchRemoveDeviceCommand struct {
  12 + // ID列表
  13 + IdList []int `cname:"ID列表" json:"idList" valid:"Required"`
  14 +}
  15 +
  16 +func (removeDeviceCommand *BatchRemoveDeviceCommand) Valid(validation *validation.Validation) {
  17 + //validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (removeDeviceCommand *BatchRemoveDeviceCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(removeDeviceCommand)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(removeDeviceCommand).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 +}
@@ -22,21 +22,24 @@ type CreateDeviceCommand struct { @@ -22,21 +22,24 @@ type CreateDeviceCommand struct {
22 // 设备类型 22 // 设备类型
23 DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"` 23 DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"`
24 // 车间ID 24 // 车间ID
25 - WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` 25 + WorkshopId int `cname:"车间ID" json:"workshopId"`
26 // 生产线ID 26 // 生产线ID
27 - LineId int `cname:"生产线ID" json:"lineId" valid:"Required"` 27 + LineId int `cname:"生产线ID" json:"lineId"`
28 // 工段ID 28 // 工段ID
29 - SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"` 29 + SectionId int `cname:"工段ID" json:"sectionId"`
30 // 品牌 30 // 品牌
31 - Brand string `cname:"品牌" json:"brand" valid:"Required"` 31 + Brand string `cname:"品牌" json:"brand"`
32 // 设备状态 1:正常 2:封存 3:报废 32 // 设备状态 1:正常 2:封存 3:报废
33 DeviceStatus int `cname:"设备状态 1:正常 2:封存 3:报废" json:"deviceStatus" valid:"Required"` 33 DeviceStatus int `cname:"设备状态 1:正常 2:封存 3:报废" json:"deviceStatus" valid:"Required"`
34 // 风险等级 1:高 2:中 3:低 34 // 风险等级 1:高 2:中 3:低
35 RiskLevel int `cname:"风险等级 1:高 2:中 3:低" json:"riskLevel" valid:"Required"` 35 RiskLevel int `cname:"风险等级 1:高 2:中 3:低" json:"riskLevel" valid:"Required"`
  36 +
  37 + // 标准工时 生产单个产品的时间(单位:秒)
  38 + UnitProductionSecTime float64 `cname:"标准工时" json:"unitProductionSecTime"`
36 } 39 }
37 40
38 func (createDeviceCommand *CreateDeviceCommand) Valid(validation *validation.Validation) { 41 func (createDeviceCommand *CreateDeviceCommand) Valid(validation *validation.Validation) {
39 - validation.SetError("CustomValid", "未实现的自定义认证") 42 + //validation.SetError("CustomValid", "未实现的自定义认证")
40 } 43 }
41 44
42 func (createDeviceCommand *CreateDeviceCommand) ValidateCommand() error { 45 func (createDeviceCommand *CreateDeviceCommand) ValidateCommand() error {
@@ -14,7 +14,7 @@ type RemoveDeviceCommand struct { @@ -14,7 +14,7 @@ type RemoveDeviceCommand struct {
14 } 14 }
15 15
16 func (removeDeviceCommand *RemoveDeviceCommand) Valid(validation *validation.Validation) { 16 func (removeDeviceCommand *RemoveDeviceCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 17 + //validation.SetError("CustomValid", "未实现的自定义认证")
18 } 18 }
19 19
20 func (removeDeviceCommand *RemoveDeviceCommand) ValidateCommand() error { 20 func (removeDeviceCommand *RemoveDeviceCommand) ValidateCommand() error {
@@ -20,21 +20,23 @@ type UpdateDeviceCommand struct { @@ -20,21 +20,23 @@ type UpdateDeviceCommand struct {
20 // 设备类型 20 // 设备类型
21 DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"` 21 DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"`
22 // 车间ID 22 // 车间ID
23 - WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` 23 + WorkshopId int `cname:"车间ID" json:"workshopId"`
24 // 生产线ID 24 // 生产线ID
25 - LineId int `cname:"生产线ID" json:"lineId" valid:"Required"` 25 + LineId int `cname:"生产线ID" json:"lineId" `
26 // 工段ID 26 // 工段ID
27 - SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"` 27 + SectionId int `cname:"工段ID" json:"sectionId"`
28 // 品牌 28 // 品牌
29 - Brand string `cname:"品牌" json:"brand" valid:"Required"` 29 + Brand string `cname:"品牌" json:"brand"`
30 // 设备状态 1:正常 2:封存 3:报废 30 // 设备状态 1:正常 2:封存 3:报废
31 DeviceStatus int `cname:"设备状态 1:正常 2:封存 3:报废" json:"deviceStatus" valid:"Required"` 31 DeviceStatus int `cname:"设备状态 1:正常 2:封存 3:报废" json:"deviceStatus" valid:"Required"`
32 // 风险等级 1:高 2:中 3:低 32 // 风险等级 1:高 2:中 3:低
33 RiskLevel int `cname:"风险等级 1:高 2:中 3:低" json:"riskLevel" valid:"Required"` 33 RiskLevel int `cname:"风险等级 1:高 2:中 3:低" json:"riskLevel" valid:"Required"`
  34 + // 标准工时
  35 + UnitProductionSecTime int `cname:"标准工时" json:"unitProductionSecTime"`
34 } 36 }
35 37
36 func (updateDeviceCommand *UpdateDeviceCommand) Valid(validation *validation.Validation) { 38 func (updateDeviceCommand *UpdateDeviceCommand) Valid(validation *validation.Validation) {
37 - validation.SetError("CustomValid", "未实现的自定义认证") 39 + //validation.SetError("CustomValid", "未实现的自定义认证")
38 } 40 }
39 41
40 func (updateDeviceCommand *UpdateDeviceCommand) ValidateCommand() error { 42 func (updateDeviceCommand *UpdateDeviceCommand) ValidateCommand() error {
  1 +package dto
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  6 +)
  7 +
  8 +type DeviceDto struct {
  9 + // 设备Id
  10 + DeviceId int `json:"deviceId,omitempty"`
  11 + // 设备编号
  12 + DeviceCode string `json:"deviceCode,omitempty"`
  13 + // 设备名称
  14 + DeviceName string `json:"deviceName,omitempty"`
  15 + // 设备型号
  16 + DeviceModel string `json:"deviceModel,omitempty"`
  17 + // 设备类型
  18 + DeviceType string `json:"deviceType,omitempty"`
  19 + // 品牌
  20 + Brand string `json:"brand,omitempty"`
  21 + // 设备状态 1:正常 2:封存 3:报废
  22 + DeviceStatus int `json:"deviceStatus,omitempty"`
  23 + // 风险等级 1:高 2:中 3:低
  24 + RiskLevel int `json:"riskLevel,omitempty"`
  25 + // 所属位置
  26 + *domain.WorkStation
  27 + // 生产单个产品的时间(单位:秒)
  28 + UnitProductionSecTime string `json:"unitProductionSecTime"`
  29 +
  30 + // 组织名称
  31 + OrgName string `json:"orgName"`
  32 + // 权限标识 (当前登录组织匹配为true,否则false)
  33 + AuthFlag bool `json:"authFlag"`
  34 +}
  35 +
  36 +func (d *DeviceDto) LoadDto(m *domain.Device, orgId int) *DeviceDto {
  37 + d.DeviceId = m.DeviceId
  38 + d.DeviceCode = m.DeviceCode
  39 + d.DeviceName = m.DeviceName
  40 + d.DeviceModel = m.DeviceModel
  41 + d.DeviceType = m.DeviceType
  42 + d.Brand = m.Brand
  43 + d.DeviceStatus = m.DeviceStatus
  44 + d.RiskLevel = m.RiskLevel
  45 + d.WorkStation = m.WorkStation
  46 + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId)
  47 + if m.Ext != nil {
  48 + d.OrgName = m.Ext.OrgName
  49 + }
  50 + if m.Ext != nil && m.Ext.DeviceExt != nil {
  51 + if m.Ext.DeviceExt.UnitProductionSecTime > 0 {
  52 + d.UnitProductionSecTime = fmt.Sprintf("%v", m.Ext.DeviceExt.UnitProductionSecTime)
  53 + }
  54 + }
  55 + return d
  56 +}
@@ -14,7 +14,7 @@ type GetDeviceQuery struct { @@ -14,7 +14,7 @@ type GetDeviceQuery struct {
14 } 14 }
15 15
16 func (getDeviceQuery *GetDeviceQuery) Valid(validation *validation.Validation) { 16 func (getDeviceQuery *GetDeviceQuery) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 17 + //validation.SetError("CustomValid", "未实现的自定义认证")
18 } 18 }
19 19
20 func (getDeviceQuery *GetDeviceQuery) ValidateQuery() error { 20 func (getDeviceQuery *GetDeviceQuery) ValidateQuery() error {
@@ -10,13 +10,13 @@ import ( @@ -10,13 +10,13 @@ import (
10 10
11 type ListDeviceQuery struct { 11 type ListDeviceQuery struct {
12 // 查询偏离量 12 // 查询偏离量
13 - Offset int `cname:"查询偏离量" json:"offset" valid:"Required"` 13 + Offset int `cname:"查询偏离量" json:"offset"`
14 // 查询限制 14 // 查询限制
15 Limit int `cname:"查询限制" json:"limit" valid:"Required"` 15 Limit int `cname:"查询限制" json:"limit" valid:"Required"`
16 } 16 }
17 17
18 func (listDeviceQuery *ListDeviceQuery) Valid(validation *validation.Validation) { 18 func (listDeviceQuery *ListDeviceQuery) Valid(validation *validation.Validation) {
19 - validation.SetError("CustomValid", "未实现的自定义认证") 19 + //validation.SetError("CustomValid", "未实现的自定义认证")
20 } 20 }
21 21
22 func (listDeviceQuery *ListDeviceQuery) ValidateQuery() error { 22 func (listDeviceQuery *ListDeviceQuery) ValidateQuery() error {
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  6 + "reflect"
  7 + "strings"
  8 +
  9 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type SearchDeviceQuery struct {
  13 + // 查询偏离量
  14 + Offset int `cname:"查询偏离量" json:"offset"`
  15 + // 查询限制
  16 + Limit int `cname:"查询限制" json:"limit"`
  17 + // 当前公司
  18 + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
  19 + // 当前登录的组织
  20 + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty"`
  21 + // 匹配多个组织
  22 + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty" valid:"Required"`
  23 + // 页码
  24 + PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  25 + // 页数
  26 + PageSize int `cname:"页数" json:"pageSize,omitempty"`
  27 + // 设备名称
  28 + DeviceName string `json:"deviceName,omitempty"`
  29 + // 设备状态 1:正常 2:封存 3:报废
  30 + DeviceStatus int `json:"deviceStatus,omitempty"`
  31 + // 排除的设备列表
  32 + IncludeDevices []int `cname:"排除的设备列表" json:"includeDevices"`
  33 +}
  34 +
  35 +func (cmd *SearchDeviceQuery) Valid(validation *validation.Validation) {
  36 + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize)
  37 +}
  38 +
  39 +func (cmd *SearchDeviceQuery) ValidateQuery() error {
  40 + valid := validation.Validation{}
  41 + b, err := valid.Valid(cmd)
  42 + if err != nil {
  43 + return err
  44 + }
  45 + if !b {
  46 + elem := reflect.TypeOf(cmd).Elem()
  47 + for _, validErr := range valid.Errors {
  48 + field, isExist := elem.FieldByName(validErr.Field)
  49 + if isExist {
  50 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  51 + } else {
  52 + return fmt.Errorf(validErr.Message)
  53 + }
  54 + }
  55 + }
  56 + return nil
  57 +}
@@ -3,11 +3,16 @@ package service @@ -3,11 +3,16 @@ package service
3 import ( 3 import (
4 "fmt" 4 "fmt"
5 "github.com/linmadan/egglib-go/core/application" 5 "github.com/linmadan/egglib-go/core/application"
  6 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
6 "github.com/linmadan/egglib-go/utils/tool_funs" 7 "github.com/linmadan/egglib-go/utils/tool_funs"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/command" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/command"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/dto"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/query" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/device/query"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" 11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" 12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  14 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  15 + "time"
11 ) 16 )
12 17
13 // 设备服务 18 // 设备服务
@@ -15,8 +20,10 @@ type DeviceService struct { @@ -15,8 +20,10 @@ type DeviceService struct {
15 } 20 }
16 21
17 // 创建设备服务 22 // 创建设备服务
18 -func (deviceService *DeviceService) CreateDevice(createDeviceCommand *command.CreateDeviceCommand) (interface{}, error) {  
19 - if err := createDeviceCommand.ValidateCommand(); err != nil { 23 +func (deviceService *DeviceService) CreateDevice(operateInfo *domain.OperateInfo, cmd *command.CreateDeviceCommand) (interface{}, error) {
  24 + cmd.OrgId = operateInfo.OrgId
  25 + cmd.CompanyId = operateInfo.CompanyId
  26 + if err := cmd.ValidateCommand(); err != nil {
20 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 27 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
21 } 28 }
22 transactionContext, err := factory.CreateTransactionContext(nil) 29 transactionContext, err := factory.CreateTransactionContext(nil)
@@ -29,27 +36,51 @@ func (deviceService *DeviceService) CreateDevice(createDeviceCommand *command.Cr @@ -29,27 +36,51 @@ func (deviceService *DeviceService) CreateDevice(createDeviceCommand *command.Cr
29 defer func() { 36 defer func() {
30 transactionContext.RollbackTransaction() 37 transactionContext.RollbackTransaction()
31 }() 38 }()
  39 +
  40 + var workStation *domain.WorkStation
  41 + if cmd.WorkshopId != 0 {
  42 + _, workshop, err := factory.FastPgWorkshop(transactionContext, cmd.WorkshopId) //, cmd.LineId, cmd.SectionId
  43 + if err != nil {
  44 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  45 + }
  46 + workStation, _ = workshop.FindWorkStationOrNil(cmd.WorkshopId, cmd.LineId, cmd.SectionId)
  47 + }
  48 +
  49 + var userService = domainService.NewUserService()
  50 + var org *domain.Org
  51 + org, err = userService.Organization(operateInfo.OrgId)
  52 + if err != nil {
  53 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  54 + }
  55 +
32 newDevice := &domain.Device{ 56 newDevice := &domain.Device{
33 - CompanyId: createDeviceCommand.CompanyId,  
34 - OrgId: createDeviceCommand.OrgId,  
35 - DeviceCode: createDeviceCommand.DeviceCode,  
36 - DeviceName: createDeviceCommand.DeviceName,  
37 - DeviceModel: createDeviceCommand.DeviceModel,  
38 - DeviceType: createDeviceCommand.DeviceType,  
39 - //WorkshopId: createDeviceCommand.WorkshopId,  
40 - //LineId: createDeviceCommand.LineId,  
41 - //SectionId: createDeviceCommand.SectionId,  
42 - Brand: createDeviceCommand.Brand,  
43 - DeviceStatus: createDeviceCommand.DeviceStatus,  
44 - RiskLevel: createDeviceCommand.RiskLevel, 57 + CompanyId: cmd.CompanyId,
  58 + OrgId: cmd.OrgId,
  59 + DeviceCode: cmd.DeviceCode,
  60 + DeviceName: cmd.DeviceName,
  61 + DeviceModel: cmd.DeviceModel,
  62 + DeviceType: cmd.DeviceType,
  63 + WorkStation: workStation,
  64 + Brand: cmd.Brand,
  65 + DeviceStatus: cmd.DeviceStatus,
  66 + RiskLevel: cmd.RiskLevel,
  67 + CreatedAt: time.Now(),
  68 + UpdatedAt: time.Now(),
  69 + Ext: domain.NewExt(org.OrgName).WithDeviceExt(&domain.DeviceExt{UnitProductionSecTime: cmd.UnitProductionSecTime}),
  70 + }
  71 + deviceRepository, _, _ := factory.FastPgDevice(transactionContext, 0)
  72 +
  73 + if total, _, err := deviceRepository.Find(map[string]interface{}{
  74 + "deviceCode": cmd.DeviceCode,
  75 + "companyId": cmd.CompanyId,
  76 + "orgId": cmd.OrgId,
  77 + "limit": 1,
  78 + }); err == nil && total > 0 {
  79 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "设备编号重复")
45 } 80 }
46 - var deviceRepository domain.DeviceRepository  
47 - if value, err := factory.CreateDeviceRepository(map[string]interface{}{  
48 - "transactionContext": transactionContext,  
49 - }); err != nil { 81 +
  82 + if err := newDevice.Valid(); err != nil {
50 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 83 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
51 - } else {  
52 - deviceRepository = value  
53 } 84 }
54 if device, err := deviceRepository.Save(newDevice); err != nil { 85 if device, err := deviceRepository.Save(newDevice); err != nil {
55 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 86 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
@@ -94,7 +125,10 @@ func (deviceService *DeviceService) GetDevice(getDeviceQuery *query.GetDeviceQue @@ -94,7 +125,10 @@ func (deviceService *DeviceService) GetDevice(getDeviceQuery *query.GetDeviceQue
94 if err := transactionContext.CommitTransaction(); err != nil { 125 if err := transactionContext.CommitTransaction(); err != nil {
95 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 126 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
96 } 127 }
97 - return device, nil 128 +
  129 + result := &dto.DeviceDto{}
  130 + result.LoadDto(device, 0)
  131 + return result, nil
98 } 132 }
99 } 133 }
100 134
@@ -174,9 +208,9 @@ func (deviceService *DeviceService) RemoveDevice(removeDeviceCommand *command.Re @@ -174,9 +208,9 @@ func (deviceService *DeviceService) RemoveDevice(removeDeviceCommand *command.Re
174 } 208 }
175 } 209 }
176 210
177 -// 更新设备服务  
178 -func (deviceService *DeviceService) UpdateDevice(updateDeviceCommand *command.UpdateDeviceCommand) (interface{}, error) {  
179 - if err := updateDeviceCommand.ValidateCommand(); err != nil { 211 +// 移除设备服务
  212 +func (deviceService *DeviceService) BatchRemoveDevice(cmd *command.BatchRemoveDeviceCommand) (interface{}, error) {
  213 + if err := cmd.ValidateCommand(); err != nil {
180 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 214 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
181 } 215 }
182 transactionContext, err := factory.CreateTransactionContext(nil) 216 transactionContext, err := factory.CreateTransactionContext(nil)
@@ -197,16 +231,89 @@ func (deviceService *DeviceService) UpdateDevice(updateDeviceCommand *command.Up @@ -197,16 +231,89 @@ func (deviceService *DeviceService) UpdateDevice(updateDeviceCommand *command.Up
197 } else { 231 } else {
198 deviceRepository = value 232 deviceRepository = value
199 } 233 }
200 - device, err := deviceRepository.FindOne(map[string]interface{}{"deviceId": updateDeviceCommand.DeviceId}) 234 + for i := range cmd.IdList {
  235 + id := cmd.IdList[i]
  236 + device, err := deviceRepository.FindOne(map[string]interface{}{"deviceId": id})
201 if err != nil { 237 if err != nil {
202 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 238 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
203 } 239 }
204 if device == nil { 240 if device == nil {
205 - return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateDeviceCommand.DeviceId))) 241 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%d", id))
  242 + }
  243 + if _, err := deviceRepository.Remove(device); err != nil {
  244 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  245 + }
206 } 246 }
207 - if err := device.Update(tool_funs.SimpleStructToMap(updateDeviceCommand)); err != nil { 247 + if err := transactionContext.CommitTransaction(); err != nil {
  248 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  249 + }
  250 + return struct {
  251 + }{}, nil
  252 +
  253 +}
  254 +
  255 +// 更新设备服务
  256 +func (deviceService *DeviceService) UpdateDevice(cmd *command.UpdateDeviceCommand) (interface{}, error) {
  257 + if err := cmd.ValidateCommand(); err != nil {
  258 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  259 + }
  260 + transactionContext, err := factory.CreateTransactionContext(nil)
  261 + if err != nil {
  262 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  263 + }
  264 + if err := transactionContext.StartTransaction(); err != nil {
  265 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  266 + }
  267 + defer func() {
  268 + transactionContext.RollbackTransaction()
  269 + }()
  270 + var deviceRepository domain.DeviceRepository
  271 + var device *domain.Device
  272 + deviceRepository, device, err = factory.FastPgDevice(transactionContext, cmd.DeviceId)
  273 + if err != nil {
  274 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  275 + }
  276 +
  277 + var workStation *domain.WorkStation
  278 + //_, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId, factory.WithSetPrincipal())
  279 + //if err != nil {
  280 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  281 + //}
  282 + if cmd.WorkshopId != 0 {
  283 + _, workshop, err := factory.FastPgWorkshop(transactionContext, cmd.WorkshopId) //, cmd.LineId, cmd.SectionId
  284 + if err != nil {
  285 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  286 + }
  287 + workStation, _ = workshop.FindWorkStationOrNil(cmd.WorkshopId, cmd.LineId, cmd.SectionId)
  288 + }
  289 + device.WorkStation = workStation
  290 +
  291 + if cmd.DeviceCode != device.DeviceCode {
  292 + if total, _, err := deviceRepository.Find(map[string]interface{}{
  293 + "deviceCode": cmd.DeviceCode,
  294 + "companyId": device.CompanyId,
  295 + "orgId": device.OrgId,
  296 + "limit": 1,
  297 + }); err == nil && total > 0 {
  298 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "设备编号重复")
  299 + }
  300 + }
  301 +
  302 + var userService = domainService.NewUserService()
  303 + var org *domain.Org
  304 + org, err = userService.Organization(device.OrgId)
  305 + if err != nil {
  306 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  307 + }
  308 +
  309 + data := tool_funs.SimpleStructToMap(cmd)
  310 + data["orgName"] = org.OrgName
  311 + if err := device.Update(data); err != nil {
208 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) 312 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
209 } 313 }
  314 + if err := device.Valid(); err != nil {
  315 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  316 + }
210 if device, err := deviceRepository.Save(device); err != nil { 317 if device, err := deviceRepository.Save(device); err != nil {
211 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 318 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
212 } else { 319 } else {
@@ -217,6 +324,133 @@ func (deviceService *DeviceService) UpdateDevice(updateDeviceCommand *command.Up @@ -217,6 +324,133 @@ func (deviceService *DeviceService) UpdateDevice(updateDeviceCommand *command.Up
217 } 324 }
218 } 325 }
219 326
  327 +// 返回设备服务列表
  328 +func (deviceService *DeviceService) SearchDevice(operateInfo *domain.OperateInfo, listDeviceQuery *query.SearchDeviceQuery) (int64, interface{}, error) {
  329 + if err := listDeviceQuery.ValidateQuery(); err != nil {
  330 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  331 + }
  332 + transactionContext, err := factory.CreateTransactionContext(nil)
  333 + if err != nil {
  334 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  335 + }
  336 + if err := transactionContext.StartTransaction(); err != nil {
  337 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  338 + }
  339 + defer func() {
  340 + transactionContext.RollbackTransaction()
  341 + }()
  342 + deviceRepository, _, _ := factory.FastPgDevice(transactionContext, 0)
  343 + count, devices, err := deviceRepository.Find(utils.ObjectToMap(listDeviceQuery))
  344 + if err != nil {
  345 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  346 + }
  347 + workshops, _ := factory.FastPgWorkshops(transactionContext, operateInfo.CompanyId)
  348 +
  349 + var result = make([]*dto.DeviceDto, 0)
  350 + for i := range devices {
  351 + item := devices[i]
  352 + newJobDto := &dto.DeviceDto{}
  353 + if item.WorkStation != nil && item.WorkStation.WorkshopId > 0 {
  354 + newJobDto.WorkStation = workshops.FindWorkStationOrNil(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId)
  355 + }
  356 + newJobDto.LoadDto(item, operateInfo.OrgId)
  357 + result = append(result, newJobDto)
  358 + }
  359 +
  360 + if err := transactionContext.CommitTransaction(); err != nil {
  361 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  362 + }
  363 + return count, result, nil
  364 +}
  365 +
  366 +// 返回设备服务列表
  367 +func (deviceService *DeviceService) SelectorDeviceUnbounded(operateInfo *domain.OperateInfo, listDeviceQuery *query.SearchDeviceQuery) (int64, interface{}, error) {
  368 + if err := listDeviceQuery.ValidateQuery(); err != nil {
  369 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  370 + }
  371 + transactionContext, err := factory.CreateTransactionContext(nil)
  372 + if err != nil {
  373 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  374 + }
  375 + if err := transactionContext.StartTransaction(); err != nil {
  376 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  377 + }
  378 + defer func() {
  379 + transactionContext.RollbackTransaction()
  380 + }()
  381 + deviceRepository, _, _ := factory.FastPgDevice(transactionContext, 0)
  382 + count, devices, err := deviceRepository.Find(utils.ObjectToMap(listDeviceQuery))
  383 + if err != nil {
  384 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  385 + }
  386 + workshops, _ := factory.FastPgWorkshops(transactionContext, operateInfo.CompanyId)
  387 +
  388 + productJobRepository, _, _ := factory.FastPgProductJob(transactionContext, 0)
  389 + _, productJobs, _ := productJobRepository.Find(map[string]interface{}{"companyId": listDeviceQuery.CompanyId})
  390 + var excludeMap = make(map[int]int)
  391 + var allBoundedDevice = make([]int, 0)
  392 + for i := range productJobs {
  393 + allBoundedDevice = append(allBoundedDevice, productJobs[i].RelatedDevices...)
  394 + }
  395 + for _, v := range allBoundedDevice {
  396 + exclude := false
  397 + for _, j := range listDeviceQuery.IncludeDevices {
  398 + if j == v {
  399 + exclude = true
  400 + }
  401 + }
  402 + if exclude {
  403 + continue
  404 + }
  405 + excludeMap[v] = v
  406 + }
  407 + var result = make([]*dto.DeviceDto, 0)
  408 + for i := range devices {
  409 + item := devices[i]
  410 + newJobDto := &dto.DeviceDto{}
  411 + if _, ok := excludeMap[item.DeviceId]; ok {
  412 + continue
  413 + }
  414 + if item.WorkStation != nil && item.WorkStation.WorkshopId > 0 {
  415 + newJobDto.WorkStation = workshops.FindWorkStationOrNil(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId)
  416 + }
  417 + newJobDto.LoadDto(item, operateInfo.OrgId)
  418 + result = append(result, newJobDto)
  419 + }
  420 +
  421 + if err := transactionContext.CommitTransaction(); err != nil {
  422 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  423 + }
  424 + return count, result, nil
  425 +}
  426 +
  427 +// 批量添加产品服务
  428 +func (deviceService *DeviceService) BatchAddProduct(opt *domain.OperateInfo, list []*domain.ImportDeviceItem) ([]interface{}, error) {
  429 + transactionContext, err := factory.CreateTransactionContext(nil)
  430 + if err != nil {
  431 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  432 + }
  433 + if err := transactionContext.StartTransaction(); err != nil {
  434 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  435 + }
  436 + defer func() {
  437 + transactionContext.RollbackTransaction()
  438 + }()
  439 +
  440 + batchAddProductService, _ := domainService.NewPGBatchAddDeviceService(transactionContext.(*pgTransaction.TransactionContext))
  441 + var failRows []interface{}
  442 + if failRows, err = batchAddProductService.BatchAddDevice(opt, list); err != nil {
  443 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  444 + }
  445 + if len(failRows) != 0 {
  446 + return failRows, nil //有错误行,回滚
  447 + }
  448 + if err := transactionContext.CommitTransaction(); err != nil {
  449 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  450 + }
  451 + return failRows, nil
  452 +}
  453 +
220 func NewDeviceService(options map[string]interface{}) *DeviceService { 454 func NewDeviceService(options map[string]interface{}) *DeviceService {
221 newDeviceService := &DeviceService{} 455 newDeviceService := &DeviceService{}
222 return newDeviceService 456 return newDeviceService
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "reflect"
  6 + "strings"
  7 + "time"
  8 +
  9 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type CreateDeviceCollectionCommand struct {
  13 + // 数据采集ID
  14 + //DeviceCollectionId int64 `cname:"数据采集ID" json:"deviceCollectionId,string" valid:"Required"`
  15 + // 车间名
  16 + WorkShopName string `cname:"车间名" json:"workShopName" valid:"Required"`
  17 + // 启动状态 1-启动 0-停止
  18 + StartupStatus int64 `cname:"启动状态 1-启动 0-停止" json:"startupStatus"`
  19 + // 采集时间
  20 + CollectionTime time.Time `cname:"采集时间" json:"collectionTime" valid:"Required"`
  21 + // 设备名
  22 + DeviceSn string `cname:"设备名" json:"deviceSn" valid:"Required"`
  23 + // 设备类型
  24 + DeviceType string `comment:"设备类型" json:"deviceType" valid:"Required"`
  25 + // 通讯状态 1-通讯正常 0-设备未上电或与采集端通讯故障
  26 + ComStatus int64 `cname:"通讯状态 1-通讯正常 0-设备未上电或与采集端通讯故障" json:"comStatus"`
  27 + // 设备数据值
  28 + Values map[string]interface{} `cname:"设备数据值" json:"values" valid:"Required"`
  29 + // 预查
  30 + PreCheck bool `json:"check"`
  31 +}
  32 +
  33 +func (createDeviceCollectionCommand *CreateDeviceCollectionCommand) Valid(validation *validation.Validation) {
  34 + //validation.SetError("CustomValid", "未实现的自定义认证")
  35 +}
  36 +
  37 +func (createDeviceCollectionCommand *CreateDeviceCollectionCommand) ValidateCommand() error {
  38 + valid := validation.Validation{}
  39 + b, err := valid.Valid(createDeviceCollectionCommand)
  40 + if err != nil {
  41 + return err
  42 + }
  43 + if !b {
  44 + elem := reflect.TypeOf(createDeviceCollectionCommand).Elem()
  45 + for _, validErr := range valid.Errors {
  46 + field, isExist := elem.FieldByName(validErr.Field)
  47 + if isExist {
  48 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  49 + } else {
  50 + return fmt.Errorf(validErr.Message)
  51 + }
  52 + }
  53 + }
  54 + return nil
  55 +}
  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 RemoveDeviceCollectionCommand struct {
  12 + // 数据采集ID
  13 + DeviceCollectionId int64 `cname:"数据采集ID" json:"deviceCollectionId,string" valid:"Required"`
  14 +}
  15 +
  16 +func (removeDeviceCollectionCommand *RemoveDeviceCollectionCommand) Valid(validation *validation.Validation) {
  17 + //validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (removeDeviceCollectionCommand *RemoveDeviceCollectionCommand) ValidateCommand() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(removeDeviceCollectionCommand)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(removeDeviceCollectionCommand).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 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type UpdateDeviceCollectionCommand struct {
  13 + // 数据采集ID
  14 + DeviceCollectionId int64 `cname:"数据采集ID" json:"deviceCollectionId,string" valid:"Required"`
  15 + // 车间名
  16 + WorkShopName string `cname:"车间名" json:"workShopName" valid:"Required"`
  17 + // 启动状态 1-启动 0-停止
  18 + StartupStatus int64 `cname:"启动状态 1-启动 0-停止" json:"startupStatus"`
  19 + // 采集时间
  20 + CollectionTime time.Time `cname:"采集时间" json:"collectionTime" valid:"Required"`
  21 + // 设备名
  22 + DeviceSn string `cname:"设备名" json:"deviceSn" valid:"Required"`
  23 + // 设备类型
  24 + DeviceType string `comment:"设备类型" json:"deviceType" valid:"Required"`
  25 + // 通讯状态 1-通讯正常 0-设备未上电或与采集端通讯故障
  26 + ComStatus int64 `cname:"通讯状态 1-通讯正常 0-设备未上电或与采集端通讯故障" json:"comStatus"`
  27 + // 设备数据值
  28 + Values map[string]interface{} `cname:"设备数据值" json:"values" valid:"Required"`
  29 +}
  30 +
  31 +func (updateDeviceCollectionCommand *UpdateDeviceCollectionCommand) Valid(validation *validation.Validation) {
  32 + //validation.SetError("CustomValid", "未实现的自定义认证")
  33 +}
  34 +
  35 +func (updateDeviceCollectionCommand *UpdateDeviceCollectionCommand) ValidateCommand() error {
  36 + valid := validation.Validation{}
  37 + b, err := valid.Valid(updateDeviceCollectionCommand)
  38 + if err != nil {
  39 + return err
  40 + }
  41 + if !b {
  42 + elem := reflect.TypeOf(updateDeviceCollectionCommand).Elem()
  43 + for _, validErr := range valid.Errors {
  44 + field, isExist := elem.FieldByName(validErr.Field)
  45 + if isExist {
  46 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  47 + } else {
  48 + return fmt.Errorf(validErr.Message)
  49 + }
  50 + }
  51 + }
  52 + return nil
  53 +}
  1 +package dto
  2 +
  3 +import "time"
  4 +
  5 +type DeviceCollectionDto struct {
  6 + // 数据采集ID
  7 + DeviceCollectionId int64 `json:"deviceCollectionId,string"`
  8 + // 车间名
  9 + WorkShopName string `json:"workShopName"`
  10 + // 采集时间
  11 + CollectionTime time.Time `json:"collectionTime"`
  12 + // 设备名
  13 + DeviceSn string `json:"deviceSn"`
  14 + // 设备类型
  15 + DeviceType string `json:"deviceType"`
  16 + // 启动状态 1-启动 0-停止
  17 + StartupStatus int64 `json:"startupStatus"`
  18 + // 通讯状态 1-通讯正常 0-设备未上电或与采集端通讯故障
  19 + ComStatus int64 `json:"comStatus"`
  20 + // 设备数据值
  21 + Values map[string]interface{} `json:"values"`
  22 +}
  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 GetDeviceCollectionQuery struct {
  12 + // 数据采集ID
  13 + DeviceCollectionId int64 `cname:"数据采集ID" json:"deviceCollectionId,string" valid:"Required"`
  14 +}
  15 +
  16 +func (getDeviceCollectionQuery *GetDeviceCollectionQuery) Valid(validation *validation.Validation) {
  17 + validation.SetError("CustomValid", "未实现的自定义认证")
  18 +}
  19 +
  20 +func (getDeviceCollectionQuery *GetDeviceCollectionQuery) ValidateQuery() error {
  21 + valid := validation.Validation{}
  22 + b, err := valid.Valid(getDeviceCollectionQuery)
  23 + if err != nil {
  24 + return err
  25 + }
  26 + if !b {
  27 + elem := reflect.TypeOf(getDeviceCollectionQuery).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 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  6 + "reflect"
  7 + "strings"
  8 + "time"
  9 +
  10 + "github.com/beego/beego/v2/core/validation"
  11 +)
  12 +
  13 +type ListDeviceCollectionQuery struct {
  14 + // 查询偏离量
  15 + PageNumber int64 `cname:"查询偏离量" json:"pageNumber" `
  16 + // 查询限制
  17 + PageSize int64 `cname:"查询限制" json:"pageSize" valid:"Required"`
  18 + // 设备类型
  19 + DeviceType string `json:"deviceType" cname:"设备类型"`
  20 + // 车间名
  21 + WorkShopName string `json:"workShopName"`
  22 +
  23 + // 开始时间
  24 + BeginTime string `cname:"开始时间" json:"beginTime"`
  25 + // 结束时间
  26 + EndTime string `cname:"结束时间" json:"endTime"`
  27 +
  28 + // 开始时间
  29 + ProductBeginTime time.Time `cname:"开始时间" json:"productBeginTime"`
  30 + // 结束时间
  31 + ProductEndTime time.Time `cname:"结束时间" json:"productEndTime"`
  32 +}
  33 +
  34 +func (cmd *ListDeviceCollectionQuery) Valid(validation *validation.Validation) {
  35 + var err error
  36 + if len(cmd.BeginTime) > 0 {
  37 + if cmd.ProductBeginTime, err = time.ParseInLocation("2006-01-02 15:04:05", cmd.BeginTime, time.Local); err != nil {
  38 + log.Logger.Error(err.Error())
  39 + validation.Error("开始时间有误")
  40 + return
  41 + }
  42 + }
  43 + if len(cmd.EndTime) > 0 {
  44 + if cmd.ProductEndTime, err = time.ParseInLocation("2006-01-02 15:04:05", cmd.EndTime, time.Local); err != nil {
  45 + log.Logger.Error(err.Error())
  46 + validation.Error("结束时间有误")
  47 + return
  48 + }
  49 + if cmd.ProductBeginTime.Equal(cmd.ProductEndTime) {
  50 + cmd.ProductEndTime = cmd.ProductEndTime.Add(time.Hour * 24)
  51 + }
  52 + }
  53 +}
  54 +
  55 +func (cmd *ListDeviceCollectionQuery) ValidateQuery() error {
  56 + valid := validation.Validation{}
  57 + b, err := valid.Valid(cmd)
  58 + if err != nil {
  59 + return err
  60 + }
  61 + if !b {
  62 + elem := reflect.TypeOf(cmd).Elem()
  63 + for _, validErr := range valid.Errors {
  64 + field, isExist := elem.FieldByName(validErr.Field)
  65 + if isExist {
  66 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  67 + } else {
  68 + return fmt.Errorf(validErr.Message)
  69 + }
  70 + }
  71 + }
  72 + return nil
  73 +}
  1 +package service
  2 +
  3 +import (
  4 + "errors"
  5 + "fmt"
  6 + "github.com/linmadan/egglib-go/core/application"
  7 + "github.com/linmadan/egglib-go/utils/tool_funs"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/deviceCollection/command"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/deviceCollection/query"
  10 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
  11 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  12 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis"
  14 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  15 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log"
  16 + "strconv"
  17 + "sync"
  18 + "time"
  19 +)
  20 +
  21 +type DeviceCollectionService struct {
  22 +}
  23 +
  24 +var (
  25 + DeviceDataCache = NewDeviceDataInstance()
  26 +)
  27 +
  28 +// 创建
  29 +func (deviceCollectionService *DeviceCollectionService) CreateDeviceCollection(createDeviceCollectionCommand *command.CreateDeviceCollectionCommand) (interface{}, error) {
  30 + if err := createDeviceCollectionCommand.ValidateCommand(); err != nil {
  31 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  32 + }
  33 + transactionContext, err := factory.CreateTransactionContext(nil)
  34 + if err != nil {
  35 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  36 + }
  37 + if err := transactionContext.StartTransaction(); err != nil {
  38 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  39 + }
  40 + defer func() {
  41 + transactionContext.RollbackTransaction()
  42 + }()
  43 + newDeviceCollection := &domain.DeviceCollection{
  44 + //DeviceCollectionId: createDeviceCollectionCommand.DeviceCollectionId,
  45 + WorkShopName: createDeviceCollectionCommand.WorkShopName,
  46 + DeviceType: createDeviceCollectionCommand.DeviceType,
  47 + StartupStatus: createDeviceCollectionCommand.StartupStatus,
  48 + DeviceSn: createDeviceCollectionCommand.DeviceSn,
  49 + ComStatus: createDeviceCollectionCommand.ComStatus,
  50 + CollectionTime: createDeviceCollectionCommand.CollectionTime,
  51 + Values: createDeviceCollectionCommand.Values,
  52 + }
  53 + var deviceCollectionRepository domain.DeviceCollectionRepository
  54 + if value, err := factory.CreateDeviceCollectionRepository(map[string]interface{}{
  55 + "transactionContext": transactionContext,
  56 + }); err != nil {
  57 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  58 + } else {
  59 + deviceCollectionRepository = value
  60 + }
  61 + if deviceCollection, err := deviceCollectionRepository.Save(newDeviceCollection); err != nil {
  62 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  63 + } else {
  64 + if err := transactionContext.CommitTransaction(); err != nil {
  65 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  66 + }
  67 + return map[string]interface{}{
  68 + "deviceCollection": deviceCollection,
  69 + }, nil
  70 + }
  71 +}
  72 +
  73 +// 创建
  74 +func (deviceCollectionService *DeviceCollectionService) DeviceCollection(createDeviceCollectionCommand *command.CreateDeviceCollectionCommand) (interface{}, error) {
  75 + if err := createDeviceCollectionCommand.ValidateCommand(); err != nil {
  76 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  77 + }
  78 +
  79 + newDeviceCollection := &domain.DeviceCollection{
  80 + //DeviceCollectionId: createDeviceCollectionCommand.DeviceCollectionId,
  81 + WorkShopName: createDeviceCollectionCommand.WorkShopName,
  82 + DeviceType: createDeviceCollectionCommand.DeviceType,
  83 + StartupStatus: createDeviceCollectionCommand.StartupStatus,
  84 + DeviceSn: createDeviceCollectionCommand.DeviceSn,
  85 + ComStatus: createDeviceCollectionCommand.ComStatus,
  86 + CollectionTime: createDeviceCollectionCommand.CollectionTime,
  87 + Values: createDeviceCollectionCommand.Values,
  88 + LatestUpdateTime: time.Now(),
  89 + }
  90 + var lastDeviceCollectionRecord = &domain.DeviceCollection{}
  91 + var err error
  92 + if createDeviceCollectionCommand.PreCheck {
  93 + //前置验证,限制设备上报速率
  94 + if lastDeviceCollectionRecord, err = DeviceDataCache.Add(newDeviceCollection.DeviceSn, newDeviceCollection.DeviceType, newDeviceCollection); err != nil {
  95 + //log.Logger.Error(err.Error()+newDeviceCollection.DeviceSn)
  96 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  97 + }
  98 + if lastDeviceCollectionRecord == nil {
  99 + //log.Logger.Error("未找到上一条设备数据")
  100 + return nil, nil
  101 + }
  102 + }
  103 +
  104 + transactionContext, err := factory.CreateTransactionContext(nil)
  105 + if err != nil {
  106 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  107 + }
  108 + if err := transactionContext.StartTransaction(); err != nil {
  109 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  110 + }
  111 + defer func() {
  112 + transactionContext.RollbackTransaction()
  113 + }()
  114 +
  115 + var deviceCollectionRepository domain.DeviceCollectionRepository
  116 + if value, err := factory.CreateDeviceCollectionRepository(map[string]interface{}{
  117 + "transactionContext": transactionContext,
  118 + }); err != nil {
  119 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  120 + } else {
  121 + deviceCollectionRepository = value
  122 + }
  123 +
  124 + //计算区间的产能
  125 + if v, ok := newDeviceCollection.Values["Count"]; ok {
  126 + newDeviceCollection.Values["total"] = v // 记录原始值
  127 + newDeviceCollection.Values["Count"] = 0
  128 + curCount, errCurCount := strconv.Atoi(utils.AssertString(v))
  129 + lastCount, errLastCount := strconv.Atoi(utils.AssertString(lastDeviceCollectionRecord.Values["Count"]))
  130 + var count int
  131 + if errLastCount == nil && errCurCount == nil && lastCount <= curCount {
  132 + if lastCount <= curCount {
  133 + count = curCount - lastCount
  134 + } else {
  135 + count = 0
  136 + /*设备统计的数量超过一定范围会重置为0,特殊处理0操作*/
  137 + if lastCount > 10000000 && curCount < 1000 {
  138 + count = curCount
  139 + }
  140 + }
  141 + newDeviceCollection.Values["Count"] = count
  142 + newDeviceCollection.ProductCount = count
  143 + }
  144 + }
  145 + // TODO:测试假数据,后期注释掉
  146 + //if createDeviceCollectionCommand.DeviceType == domain.DeviceTypeChuanChuanJi {
  147 + // newDeviceCollection.Values["Count"] = rand.Intn(300)
  148 + //}
  149 + deviceCollection, err := deviceCollectionRepository.Save(newDeviceCollection)
  150 + if err != nil {
  151 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  152 + }
  153 + err = domainService.SendWorkshopDeviceData(deviceCollection)
  154 + if err != nil {
  155 + log.Logger.Error("车间设备数据加入redis失败:" + err.Error())
  156 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  157 + }
  158 +
  159 + if err := transactionContext.CommitTransaction(); err != nil {
  160 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  161 + }
  162 + return map[string]interface{}{
  163 + "deviceCollection": deviceCollection,
  164 + }, nil
  165 +
  166 +}
  167 +
  168 +// 返回
  169 +func (deviceCollectionService *DeviceCollectionService) GetDeviceCollection(getDeviceCollectionQuery *query.GetDeviceCollectionQuery) (interface{}, error) {
  170 + if err := getDeviceCollectionQuery.ValidateQuery(); err != nil {
  171 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  172 + }
  173 + transactionContext, err := factory.CreateTransactionContext(nil)
  174 + if err != nil {
  175 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  176 + }
  177 + if err := transactionContext.StartTransaction(); err != nil {
  178 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  179 + }
  180 + defer func() {
  181 + transactionContext.RollbackTransaction()
  182 + }()
  183 + var deviceCollectionRepository domain.DeviceCollectionRepository
  184 + if value, err := factory.CreateDeviceCollectionRepository(map[string]interface{}{
  185 + "transactionContext": transactionContext,
  186 + }); err != nil {
  187 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  188 + } else {
  189 + deviceCollectionRepository = value
  190 + }
  191 + deviceCollection, err := deviceCollectionRepository.FindOne(map[string]interface{}{"deviceCollectionId": getDeviceCollectionQuery.DeviceCollectionId})
  192 + if err != nil {
  193 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  194 + }
  195 + if deviceCollection == nil {
  196 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(getDeviceCollectionQuery.DeviceCollectionId)))
  197 + } else {
  198 + if err := transactionContext.CommitTransaction(); err != nil {
  199 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  200 + }
  201 + return deviceCollection, nil
  202 + }
  203 +}
  204 +
  205 +// 返回列表
  206 +func (deviceCollectionService *DeviceCollectionService) ListDeviceCollection(listDeviceCollectionQuery *query.ListDeviceCollectionQuery) (interface{}, error) {
  207 + if err := listDeviceCollectionQuery.ValidateQuery(); err != nil {
  208 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  209 + }
  210 + transactionContext, err := factory.CreateTransactionContext(nil)
  211 + if err != nil {
  212 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  213 + }
  214 + if err := transactionContext.StartTransaction(); err != nil {
  215 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  216 + }
  217 + defer func() {
  218 + transactionContext.RollbackTransaction()
  219 + }()
  220 + var deviceCollectionRepository domain.DeviceCollectionRepository
  221 + if value, err := factory.CreateDeviceCollectionRepository(map[string]interface{}{
  222 + "transactionContext": transactionContext,
  223 + }); err != nil {
  224 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  225 + } else {
  226 + deviceCollectionRepository = value
  227 + }
  228 + if count, deviceCollections, err := deviceCollectionRepository.Find(tool_funs.SimpleStructToMap(listDeviceCollectionQuery)); err != nil {
  229 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  230 + } else {
  231 + if err := transactionContext.CommitTransaction(); err != nil {
  232 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  233 + }
  234 + return tool_funs.SimpleWrapGridMap(count, deviceCollections), nil
  235 + }
  236 +}
  237 +
  238 +// 移除
  239 +func (deviceCollectionService *DeviceCollectionService) RemoveDeviceCollection(removeDeviceCollectionCommand *command.RemoveDeviceCollectionCommand) (interface{}, error) {
  240 + if err := removeDeviceCollectionCommand.ValidateCommand(); err != nil {
  241 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  242 + }
  243 + transactionContext, err := factory.CreateTransactionContext(nil)
  244 + if err != nil {
  245 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  246 + }
  247 + if err := transactionContext.StartTransaction(); err != nil {
  248 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  249 + }
  250 + defer func() {
  251 + transactionContext.RollbackTransaction()
  252 + }()
  253 + var deviceCollectionRepository domain.DeviceCollectionRepository
  254 + if value, err := factory.CreateDeviceCollectionRepository(map[string]interface{}{
  255 + "transactionContext": transactionContext,
  256 + }); err != nil {
  257 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  258 + } else {
  259 + deviceCollectionRepository = value
  260 + }
  261 + deviceCollection, err := deviceCollectionRepository.FindOne(map[string]interface{}{"deviceCollectionId": removeDeviceCollectionCommand.DeviceCollectionId})
  262 + if err != nil {
  263 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  264 + }
  265 + if deviceCollection == nil {
  266 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeDeviceCollectionCommand.DeviceCollectionId)))
  267 + }
  268 + if deviceCollection, err := deviceCollectionRepository.Remove(deviceCollection); err != nil {
  269 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  270 + } else {
  271 + if err := transactionContext.CommitTransaction(); err != nil {
  272 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  273 + }
  274 + return map[string]interface{}{
  275 + "deviceCollection": deviceCollection,
  276 + }, nil
  277 + }
  278 +}
  279 +
  280 +// 更新
  281 +func (deviceCollectionService *DeviceCollectionService) UpdateDeviceCollection(updateDeviceCollectionCommand *command.UpdateDeviceCollectionCommand) (interface{}, error) {
  282 + if err := updateDeviceCollectionCommand.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 + var deviceCollectionRepository domain.DeviceCollectionRepository
  296 + if value, err := factory.CreateDeviceCollectionRepository(map[string]interface{}{
  297 + "transactionContext": transactionContext,
  298 + }); err != nil {
  299 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  300 + } else {
  301 + deviceCollectionRepository = value
  302 + }
  303 + deviceCollection, err := deviceCollectionRepository.FindOne(map[string]interface{}{"deviceCollectionId": updateDeviceCollectionCommand.DeviceCollectionId})
  304 + if err != nil {
  305 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  306 + }
  307 + if deviceCollection == nil {
  308 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateDeviceCollectionCommand.DeviceCollectionId)))
  309 + }
  310 + if err := deviceCollection.Update(tool_funs.SimpleStructToMap(updateDeviceCollectionCommand)); err != nil {
  311 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  312 + }
  313 + if deviceCollection, err := deviceCollectionRepository.Save(deviceCollection); err != nil {
  314 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  315 + } else {
  316 + if err := transactionContext.CommitTransaction(); err != nil {
  317 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  318 + }
  319 + return map[string]interface{}{
  320 + "deviceCollection": deviceCollection,
  321 + }, nil
  322 + }
  323 +}
  324 +
  325 +func NewDeviceCollectionService(options map[string]interface{}) *DeviceCollectionService {
  326 + newDeviceCollectionService := &DeviceCollectionService{}
  327 + return newDeviceCollectionService
  328 +}
  329 +
  330 +const DefaultReceiveSpan = 60 // 60 sec
  331 +
  332 +type DeviceDataInstance struct {
  333 + //deviceDataCache sync.Map
  334 + deviceDataLastTime sync.Map
  335 +}
  336 +
  337 +func NewDeviceDataInstance() *DeviceDataInstance {
  338 + return &DeviceDataInstance{
  339 + deviceDataLastTime: sync.Map{},
  340 + }
  341 +}
  342 +
  343 +func (d *DeviceDataInstance) Add(deviceSn, deviceType string, data interface{}) (*domain.DeviceCollection, error) {
  344 + // 获取数据上一次的
  345 + var v interface{}
  346 + var ok bool
  347 + var now = time.Now().Unix()
  348 + var t = now
  349 + if v, ok = d.deviceDataLastTime.Load(deviceSn); ok {
  350 + t = v.(int64)
  351 + } else {
  352 + d.deviceDataLastTime.Store(deviceSn, t)
  353 + redis.SaveDeviceRealTimeData(deviceSn, data, true)
  354 + return nil, errors.New(fmt.Sprintf("ingnore this record"))
  355 + }
  356 + // 60秒接受一次数据,暂时不用太多数据
  357 + if now < t+DefaultReceiveSpan {
  358 + return nil, errors.New(fmt.Sprintf("receive too fast wait %v sec", t+DefaultReceiveSpan-now))
  359 + }
  360 + // 从redis获取最后的数据进行处理
  361 + var result = &domain.DeviceCollection{}
  362 + if err := redis.GetDeviceRealTimeData(deviceSn, result); err != nil {
  363 + if err == domain.ErrorNotFound {
  364 + redis.SaveDeviceRealTimeData(deviceSn, data, true)
  365 + return nil, nil
  366 + }
  367 + return nil, err
  368 + }
  369 + //log.Logger.Debug("",map[string]interface{}{"t":t,"device":deviceSn})
  370 + d.deviceDataLastTime.Store(deviceSn, now)
  371 + return result, redis.SaveDeviceRealTimeData(deviceSn, data, false)
  372 +}
  1 +package command
  2 +
  3 +import (
  4 + "encoding/json"
  5 + "fmt"
  6 + "github.com/beego/beego/v2/core/validation"
  7 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  8 +)
  9 +
  10 +type ExportDataCommand struct {
  11 + //操作人
  12 + Operator *domain.OperateInfo `json:"-"`
  13 + // 业务编码
  14 + Ids []string `json:"ids"`
  15 + Where json.RawMessage `json:"where"`
  16 + // 业务编码
  17 + Code string `form:"code"`
  18 +}
  19 +
  20 +func (exportDataCommand *ExportDataCommand) Valid(validation *validation.Validation) {
  21 +
  22 +}
  23 +
  24 +func (exportDataCommand *ExportDataCommand) ValidateCommand() error {
  25 + valid := validation.Validation{}
  26 + b, err := valid.Valid(exportDataCommand)
  27 + if err != nil {
  28 + return err
  29 + }
  30 + if !b {
  31 + for _, validErr := range valid.Errors {
  32 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  33 + }
  34 + }
  35 + return nil
  36 +}
  37 +
  38 +func (exportDataCommand *ExportDataCommand) UnmarshalQuery(query interface{}) error {
  39 + return json.Unmarshal(exportDataCommand.Where, query)
  40 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/beego/beego/v2/core/validation"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  7 + "io"
  8 +)
  9 +
  10 +type ImportDataCommand struct {
  11 + //操作人
  12 + Operator *domain.OperateInfo `json:"-"`
  13 + Reader io.Reader `json:"-"`
  14 + FileExt string `json:"-"`
  15 + // 业务编码
  16 + Code string `form:"code"`
  17 +}
  18 +
  19 +func (importDataCommand *ImportDataCommand) Valid(validation *validation.Validation) {
  20 +
  21 +}
  22 +
  23 +func (importDataCommand *ImportDataCommand) ValidateCommand() error {
  24 + valid := validation.Validation{}
  25 + b, err := valid.Valid(importDataCommand)
  26 + if err != nil {
  27 + return err
  28 + }
  29 + if !b {
  30 + for _, validErr := range valid.Errors {
  31 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  32 + }
  33 + }
  34 + return nil
  35 +}
  1 +package query
  2 +
  3 +import ()
  4 +
  5 +type CooperationUserListQuery struct {
  6 + //操作人
  7 + //Operator domain.Operator `json:"-"`
  8 + //用户名称
  9 + UserName string `json:"userName"`
  10 + //共创公司
  11 + CooperationCompany string `json:"cooperationCompany"`
  12 + SelectedField []string `json:"selectedField"`
  13 +}
  1 +package service
  2 +
  3 +// ExportCompanyUser 导出公司用户信息列表
  4 +//func (srv ExcelDataService) ExportCompanyUser(companyUserListQuery *query.CompanyUserListQuery) (ExportCompanyUserData, error) {
  5 +// creationUserGateway := allied_creation_user.NewHttplibAlliedCreationUser(companyUserListQuery.Operator)
  6 +// result, err := creationUserGateway.UserSearch(allied_creation_user.ReqUserSearch{
  7 +// Limit: 10000,
  8 +// CompanyId: companyUserListQuery.Operator.CompanyId,
  9 +// OrganizationId: 0,
  10 +// DepartmentId: 0,
  11 +// UserName: companyUserListQuery.UserName,
  12 +// DepName: companyUserListQuery.DepartmentName,
  13 +// Phone: "",
  14 +// UserType: domain.UserTypeEmployee,
  15 +// InOrgIds: companyUserListQuery.Operator.OrgIds,
  16 +// PullRealTime: true,
  17 +// })
  18 +// if err != nil {
  19 +// return ExportCompanyUserData{}, fmt.Errorf("获取企业用户数据失败:%w", err)
  20 +// }
  21 +// return ExportCompanyUserData{
  22 +// SourceData: result.Users,
  23 +// SelectedField: companyUserListQuery.SelectedField,
  24 +// }, nil
  25 +//}
  26 +
  27 +// ExportCooperationUser 导出共创用户信息列表
  28 +//func (srv ExcelDataService) ExportCooperationUser(companyUserListQuery *query.CooperationUserListQuery) (ExportCooperationUserData, error) {
  29 +// creationUserGateway := allied_creation_user.NewHttplibAlliedCreationUser(companyUserListQuery.Operator)
  30 +// result, err := creationUserGateway.UserSearch(allied_creation_user.ReqUserSearch{
  31 +// Limit: 10000,
  32 +// CompanyId: companyUserListQuery.Operator.CompanyId,
  33 +// OrganizationId: 0,
  34 +// DepartmentId: 0,
  35 +// UserName: companyUserListQuery.UserName,
  36 +// CooperationCompany: companyUserListQuery.CooperationCompany,
  37 +// Phone: "",
  38 +// UserType: domain.UserTypeCooperation,
  39 +// InOrgIds: companyUserListQuery.Operator.OrgIds,
  40 +// })
  41 +// if err != nil {
  42 +// return ExportCooperationUserData{}, fmt.Errorf("获取企业用户数据失败:%w", err)
  43 +// }
  44 +// return ExportCooperationUserData{SourceData: result.Users, SelectedField: companyUserListQuery.SelectedField}, nil
  45 +//}
  1 +package service
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/linmadan/egglib-go/core/application"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
  7 + "strings"
  8 +
  9 + "github.com/linmadan/egglib-go/utils/excel"
  10 +)
  11 +
  12 +type ExcelDataService struct {
  13 +}
  14 +
  15 +func NewExcelDataService(param map[string]interface{}) *ExcelDataService {
  16 + return &ExcelDataService{}
  17 +}
  18 +
  19 +// 导入结果
  20 +func (srv ExcelDataService) importResultWithHeader(headers []excel.DataField, failRows []interface{}, totalRow int) interface{} {
  21 + var result = map[string]interface{}{
  22 + "successCount": 0,
  23 + "fail": struct{}{},
  24 + }
  25 + if len(failRows) == 0 {
  26 + result["successCount"] = totalRow
  27 + }
  28 + if len(failRows) > 0 {
  29 + fail := map[string]interface{}{
  30 + "body": failRows,
  31 + }
  32 + var header = make(map[string]string)
  33 + for i := 0; i < len(headers); i++ {
  34 + item := headers[i]
  35 + header[item.EnName] = item.CnName
  36 + }
  37 + fail["header"] = header
  38 + result["fail"] = fail
  39 + }
  40 + return result
  41 +}
  42 +
  43 +func (srv ExcelDataService) fieldValueAllEmpty(param map[string]string) bool {
  44 + isAllEmpty := true
  45 + for _, v := range param {
  46 + value := strings.TrimSpace(v)
  47 + if len(value) > 0 {
  48 + isAllEmpty = false
  49 + }
  50 + }
  51 + return isAllEmpty
  52 +}
  53 +
  54 +//// FileImportTemplate 导入模板
  55 +func (srv ExcelDataService) FileImportTemplate(importDataCommand *command.ImportDataCommand) (interface{}, error) {
  56 + var mapTemplate = map[string]string{
  57 + //domain.ImportCompanyUser: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210916/object/1631807485_EaxECeRz23WpzrMZmbwdEPRJ3Pdxpx5X.xlsx",
  58 + //domain.ImportOrganization: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210916/object/1631807490_r2XWhGmbWWmpbeePBkZ3EJQFKcZEMpEm.xlsx",
  59 + //domain.ImportDividendsOrders: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210927/object/1632743206_NPYTKw6RGhXn4TpYNEQhGGdCkXKXTnxM.xlsx",
  60 + //domain.ImportCooperationUser: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210926/object/1632635345_SbfzmkXjQHhCwPw4MB7zb5EBBtdp2MSE.xlsx",
  61 + //domain.ImportDividendsReturnOrders: "https://timeless-world.oss-cn-shenzhen.aliyuncs.com/open-api/dev_online/20210927/object/1632743214_rNHm6ZBXZaC5xKTrsE7M4h45MY6n6Ff3.xlsx",
  62 + }
  63 + var url string
  64 + var ok bool
  65 + if url, ok = mapTemplate[importDataCommand.Code]; !ok {
  66 + return nil, application.ThrowError(application.BUSINESS_ERROR, fmt.Sprintf("模板:%v 不存在", importDataCommand.Code))
  67 + }
  68 + return map[string]string{
  69 + "url": url,
  70 + }, nil
  71 +}
  72 +
  73 +func (srv ExcelDataService) GetExcelDataFields(code string) (interface{}, error) {
  74 + dataFields := []DataFieldOptions{}
  75 + //switch code {
  76 + //case domain.ExportCompanyUser:
  77 + // dataFileds = (ExportCompanyUserData{}).AllFields()
  78 + //case domain.ExportCooperationUser:
  79 + // dataFileds = (ExportCooperationUserData{}).AllFields()
  80 + //}
  81 + return dataFields, nil
  82 +}
  1 +package service
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "github.com/linmadan/egglib-go/utils/excel"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/ecelData/command"
  7 + productService "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/product/service"
  8 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils/converter"
  10 + "strings"
  11 +)
  12 +
  13 +// ImportProduct 导入生产信息
  14 +func (srv ExcelDataService) ImportProduct(importDataCommand *command.ImportDataCommand) (interface{}, error) {
  15 + excelImport := excel.NewExcelImport()
  16 + excelImport.RowBegin = 3 //第二行开始读取
  17 + excelImport.DataFields = []excel.DataField{
  18 + {EnName: "productCode", CnName: "产品编号"},
  19 + {EnName: "productName", CnName: "*品名"},
  20 + {EnName: "unit", CnName: "*规格"},
  21 + {EnName: "productCategory", CnName: "*类别"},
  22 + {EnName: "unitWeight", CnName: "投入单份重量"},
  23 + }
  24 + excelData, err := converter.OpenImportFileFromIoReader(excelImport, importDataCommand.Reader, importDataCommand.FileExt) //excelImport.OpenExcelFromIoReader(importDataCommand.Reader)
  25 + if err != nil {
  26 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  27 + }
  28 + items := make([]*domain.ImportProductItem, 0)
  29 + for _, v := range excelData {
  30 + item := &domain.ImportProductItem{
  31 + ProductCode: strings.TrimSpace(v["productCode"]),
  32 + ProductName: strings.TrimSpace(v["productName"]),
  33 + ProductCategory: strings.TrimSpace(v["productCategory"]),
  34 + Unit: strings.TrimSpace(v["unit"]),
  35 + UnitWeight: strings.TrimSpace(v["unitWeight"]),
  36 + }
  37 + items = append(items, item)
  38 + }
  39 +
  40 + svr := productService.NewProductService(nil)
  41 + failRows, err := svr.BatchAddProduct(importDataCommand.Operator, items)
  42 + if err != nil {
  43 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  44 + }
  45 + return srv.importResultWithHeader(excelImport.DataFields, failRows, len(items)), nil
  46 +}
  1 +package service
  2 +
  3 +type DataFieldOptions struct {
  4 + EnName string `json:"enName"`
  5 + CnName string `json:"cnName"`
  6 + IsDefault bool `json:"isDefault"`
  7 +}
  8 +
  9 +//
  10 +//// ExportCompanyUserData 导出公司用户数据
  11 +//type ExportCompanyUserData struct {
  12 +// SourceData []allied_creation_user.UserDetail
  13 +// SelectedField []string
  14 +//}
  15 +//
  16 +//var _ excel.ExcelMaker = (*ExportCompanyUserData)(nil)
  17 +//
  18 +//func (data ExportCompanyUserData) AllFields() []DataFieldOptions {
  19 +// return []DataFieldOptions{
  20 +// {EnName: "UserCode", CnName: "用户编码"},
  21 +// {EnName: "UserName", CnName: "用户姓名"},
  22 +// {EnName: "Phone", CnName: "手机号"},
  23 +// {EnName: "DepartmentName", CnName: "所属部门"},
  24 +// {EnName: "EnableStatus", CnName: "状态"},
  25 +// {EnName: "OrgName", CnName: "组织机构"},
  26 +// }
  27 +//}
  28 +//
  29 +//func (data ExportCompanyUserData) DataFieldList() []excel.DataField {
  30 +// fields := []excel.DataField{}
  31 +// allFields := data.AllFields()
  32 +// for _, value2 := range allFields {
  33 +// if len(data.SelectedField) == 0 || value2.IsDefault {
  34 +// fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  35 +// continue
  36 +// }
  37 +// for _, value3 := range data.SelectedField {
  38 +// if value2.EnName == value3 {
  39 +// fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  40 +// }
  41 +// }
  42 +// }
  43 +// return fields
  44 +//}
  45 +//
  46 +//func (data ExportCompanyUserData) CellValue(index int, enName string) (value interface{}) {
  47 +// if index > data.DataListLen() {
  48 +// return ""
  49 +// }
  50 +// switch enName {
  51 +// case "UserCode":
  52 +// return data.SourceData[index].UserCode
  53 +// case "UserName":
  54 +// return data.SourceData[index].UserInfo.UserName
  55 +// case "Phone":
  56 +// return data.SourceData[index].UserInfo.Phone
  57 +// case "DepartmentName":
  58 +// if data.SourceData[index].Department != nil {
  59 +// return data.SourceData[index].Department.DepartmentName
  60 +// } else {
  61 +// return ""
  62 +// }
  63 +// case "EnableStatus":
  64 +// status := data.SourceData[index].EnableStatus
  65 +// statusName := ""
  66 +// // 状态(1:启用 2:禁用 3:注销)
  67 +// switch status {
  68 +// case 1:
  69 +// statusName = "启用"
  70 +// case 2:
  71 +// statusName = "禁用"
  72 +// case 3:
  73 +// statusName = "注销"
  74 +// }
  75 +// return statusName
  76 +// case "OrgName":
  77 +// if data.SourceData[index].Org != nil {
  78 +// return data.SourceData[index].Org.OrgName
  79 +// } else {
  80 +// return ""
  81 +// }
  82 +// }
  83 +// return nil
  84 +//}
  85 +//
  86 +//func (data ExportCompanyUserData) DataListLen() int {
  87 +// return len(data.SourceData)
  88 +//}
  89 +//
  90 +//func (data ExportCompanyUserData) TableTitle() []string {
  91 +// return nil
  92 +//}
  93 +//
  94 +////ExportCooperationUserData 导出共创用户数据
  95 +//type ExportCooperationUserData struct {
  96 +// SourceData []allied_creation_user.UserDetail
  97 +// SelectedField []string
  98 +//}
  99 +//
  100 +//var _ excel.ExcelMaker = (*ExportCooperationUserData)(nil)
  101 +//
  102 +//func (data ExportCooperationUserData) AllFields() []DataFieldOptions {
  103 +// return []DataFieldOptions{
  104 +// {EnName: "UserCode", CnName: "用户编码"},
  105 +// {EnName: "UserName", CnName: "用户姓名"},
  106 +// {EnName: "Phone", CnName: "手机号"},
  107 +// {EnName: "CooperationCompany", CnName: "共创公司"},
  108 +// {EnName: "CooperationDeadline", CnName: "共创到期"},
  109 +// {EnName: "EnableStatus", CnName: "状态"},
  110 +// }
  111 +//}
  112 +//
  113 +//func (data ExportCooperationUserData) DataFieldList() []excel.DataField {
  114 +// fields := []excel.DataField{}
  115 +// allFields := data.AllFields()
  116 +// for _, value2 := range allFields {
  117 +// if len(data.SelectedField) == 0 || value2.IsDefault {
  118 +// fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  119 +// continue
  120 +// }
  121 +// for _, value3 := range data.SelectedField {
  122 +// if value2.EnName == value3 {
  123 +// fields = append(fields, excel.DataField{EnName: value2.EnName, CnName: value2.CnName})
  124 +// }
  125 +// }
  126 +// }
  127 +// return fields
  128 +//}
  129 +//
  130 +//func (data ExportCooperationUserData) CellValue(index int, enName string) (value interface{}) {
  131 +// if index > data.DataListLen() {
  132 +// return ""
  133 +// }
  134 +// switch enName {
  135 +// case "UserCode":
  136 +// return data.SourceData[index].UserCode
  137 +// case "UserName":
  138 +// return data.SourceData[index].UserInfo.UserName
  139 +// case "CooperationCompany":
  140 +// return data.SourceData[index].CooperationInfo.CooperationCompany
  141 +// case "CooperationDeadline":
  142 +// if data.SourceData[index].CooperationInfo.CooperationDeadline.IsZero() || data.SourceData[index].CooperationInfo.CooperationDeadline.Unix() == 0 {
  143 +// return ""
  144 +// }
  145 +// return data.SourceData[index].CooperationInfo.CooperationDeadline.Format("2006-01-02")
  146 +// case "Phone":
  147 +// return data.SourceData[index].UserInfo.Phone
  148 +// case "Email":
  149 +// return data.SourceData[index].UserInfo.Email
  150 +// case "EnableStatus":
  151 +// status := data.SourceData[index].EnableStatus
  152 +// statusName := ""
  153 +// // 状态(1:启用 2:禁用 3:注销)
  154 +// switch status {
  155 +// case 1:
  156 +// statusName = "启用"
  157 +// case 2:
  158 +// statusName = "禁用"
  159 +// case 3:
  160 +// statusName = "注销"
  161 +// }
  162 +// return statusName
  163 +// }
  164 +// return nil
  165 +//}
  166 +//
  167 +//func (data ExportCooperationUserData) DataListLen() int {
  168 +// return len(data.SourceData)
  169 +//}
  170 +//
  171 +//func (data ExportCooperationUserData) TableTitle() []string {
  172 +// return nil
  173 +//}
  1 +package factory
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  6 +)
  7 +
  8 +// FastPgWorkshop 快速返回车间对象
  9 +//
  10 +// transactionContext 事务
  11 +// id 对象唯一标识
  12 +func FastPgWorkshop(transactionContext application.TransactionContext, id int, options ...option) (domain.WorkshopRepository, *domain.Workshop, error) {
  13 + var rep domain.WorkshopRepository
  14 + var mod *domain.Workshop
  15 + var err error
  16 + if value, err := CreateWorkshopRepository(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{}{"workshopId": 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 +// FastPgWorkshop 快速返回车间对象
  38 +//
  39 +// transactionContext 事务
  40 +// id 对象唯一标识
  41 +func FastPgWorkshops(transactionContext application.TransactionContext, companyId int, options ...option) (domain.Workshops, error) {
  42 + var rep domain.WorkshopRepository
  43 + //var mod *domain.Workshop
  44 + var err error
  45 + if value, err := CreateWorkshopRepository(map[string]interface{}{
  46 + "transactionContext": transactionContext,
  47 + }); err != nil {
  48 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  49 + } else {
  50 + rep = value
  51 + }
  52 + _, workshops, err := rep.Find(map[string]interface{}{"companyId": companyId})
  53 + if err != nil {
  54 + return nil, err
  55 + }
  56 + if len(workshops) == 0 {
  57 + workshops = make([]*domain.Workshop, 0)
  58 + }
  59 + return workshops, err
  60 +}
  61 +
  62 +// FastPgWorkstation 快速返回工作定位对象
  63 +//
  64 +// transactionContext 事务
  65 +// workshopId 车间ID
  66 +// lineId 生产线ID
  67 +// sectionId 对象ID
  68 +func FastPgWorkstation(transactionContext application.TransactionContext, workshopId, lineId, sectionId int, options ...option) (domain.WorkshopRepository, *domain.WorkStation, error) {
  69 + var rep domain.WorkshopRepository
  70 + var mod *domain.Workshop
  71 + var err error
  72 + if value, err := CreateWorkshopRepository(map[string]interface{}{
  73 + "transactionContext": transactionContext,
  74 + }); err != nil {
  75 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  76 + } else {
  77 + rep = value
  78 + }
  79 +
  80 + if mod, err = rep.FindOne(map[string]interface{}{"workshopId": workshopId}); err != nil {
  81 + if err == domain.ErrorNotFound {
  82 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该工作位置不存在")
  83 + }
  84 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  85 + }
  86 +
  87 + workStation, err := mod.FindWorkStation(workshopId, lineId, sectionId)
  88 + if err != nil {
  89 + return rep, nil, err
  90 + }
  91 + o := NewFastOptions(options...)
  92 + if o.SetPrincipal {
  93 + workStation.Principal = mod.Principal
  94 + }
  95 + return rep, workStation, err
  96 +}
  97 +
  98 +// FastPgProductJob 快速返回工位对象
  99 +//
  100 +// transactionContext 事务
  101 +// id 对象唯一标识
  102 +func FastPgProductJob(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductJobRepository, *domain.ProductJob, error) {
  103 + var rep domain.ProductJobRepository
  104 + var mod *domain.ProductJob
  105 + var err error
  106 + if value, err := CreateProductJobRepository(map[string]interface{}{
  107 + "transactionContext": transactionContext,
  108 + }); err != nil {
  109 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  110 + } else {
  111 + rep = value
  112 + }
  113 + if id > 0 {
  114 + if mod, err = rep.FindOne(map[string]interface{}{"productJobId": id}); err != nil {
  115 + if err == domain.ErrorNotFound {
  116 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该工位不存在")
  117 + }
  118 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  119 + }
  120 + }
  121 + //if err = fastPgDataAuth(transactionContext, mod, options...); err != nil {
  122 + // return nil, nil, err
  123 + //}
  124 + return rep, mod, err
  125 +}
  126 +
  127 +// FastPgProductGroup 快速返回生产组对象
  128 +//
  129 +// transactionContext 事务
  130 +// id 对象唯一标识
  131 +func FastPgProductGroup(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductGroupRepository, *domain.ProductGroup, error) {
  132 + var rep domain.ProductGroupRepository
  133 + var mod *domain.ProductGroup
  134 + var err error
  135 + if value, err := CreateProductGroupRepository(map[string]interface{}{
  136 + "transactionContext": transactionContext,
  137 + }); err != nil {
  138 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  139 + } else {
  140 + rep = value
  141 + }
  142 + if id > 0 {
  143 + if mod, err = rep.FindOne(map[string]interface{}{"productGroupId": id}); err != nil {
  144 + if err == domain.ErrorNotFound {
  145 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该生产班组不存在")
  146 + }
  147 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  148 + }
  149 + }
  150 + //if err = fastPgDataAuth(transactionContext, mod, options...); err != nil {
  151 + // return nil, nil, err
  152 + //}
  153 + return rep, mod, err
  154 +}
  155 +
  156 +// FastPgProduct 快速返回产品对象
  157 +//
  158 +// transactionContext 事务
  159 +// id 对象唯一标识
  160 +func FastPgProduct(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductRepository, *domain.Product, error) {
  161 + var rep domain.ProductRepository
  162 + var mod *domain.Product
  163 + var err error
  164 + if value, err := CreateProductRepository(map[string]interface{}{
  165 + "transactionContext": transactionContext,
  166 + }); err != nil {
  167 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  168 + } else {
  169 + rep = value
  170 + }
  171 + if id > 0 {
  172 + if mod, err = rep.FindOne(map[string]interface{}{"productId": id}); err != nil {
  173 + if err == domain.ErrorNotFound {
  174 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该产品不存在")
  175 + }
  176 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  177 + }
  178 + }
  179 + return rep, mod, err
  180 +}
  181 +
  182 +// FastPgDevice 快速返回设备对象
  183 +//
  184 +// transactionContext 事务
  185 +// id 对象唯一标识
  186 +func FastPgDevice(transactionContext application.TransactionContext, id int, options ...option) (domain.DeviceRepository, *domain.Device, error) {
  187 + var rep domain.DeviceRepository
  188 + var mod *domain.Device
  189 + var err error
  190 + if value, err := CreateDeviceRepository(map[string]interface{}{
  191 + "transactionContext": transactionContext,
  192 + }); err != nil {
  193 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  194 + } else {
  195 + rep = value
  196 + }
  197 + if id > 0 {
  198 + if mod, err = rep.FindOne(map[string]interface{}{"deviceId": id}); err != nil {
  199 + if err == domain.ErrorNotFound {
  200 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该设备档案不存在")
  201 + }
  202 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  203 + }
  204 + }
  205 + return rep, mod, err
  206 +}
  207 +
  208 +// FastPgProductCalendar 快速返回设备对象
  209 +//
  210 +// transactionContext 事务
  211 +// id 对象唯一标识
  212 +func FastPgProductCalendar(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductCalendarRepository, *domain.ProductCalendar, error) {
  213 + var rep domain.ProductCalendarRepository
  214 + var mod *domain.ProductCalendar
  215 + var err error
  216 + if value, err := CreateProductCalendarRepository(map[string]interface{}{
  217 + "transactionContext": transactionContext,
  218 + }); err != nil {
  219 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  220 + } else {
  221 + rep = value
  222 + }
  223 + if id > 0 {
  224 + if mod, err = rep.FindOne(map[string]interface{}{"productCalendarId": id}); err != nil {
  225 + if err == domain.ErrorNotFound {
  226 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该车间日历不存在")
  227 + }
  228 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  229 + }
  230 + }
  231 + return rep, mod, err
  232 +}
  233 +
  234 +// FastPgUnitConversion 快速返回单位换算对象
  235 +//
  236 +// transactionContext 事务
  237 +// id 对象唯一标识
  238 +func FastPgUnitConversion(transactionContext application.TransactionContext, id int, options ...option) (domain.UnitConversionRepository, *domain.UnitConversion, error) {
  239 + var rep domain.UnitConversionRepository
  240 + var mod *domain.UnitConversion
  241 + var err error
  242 + if value, err := CreateUnitConversionRepository(map[string]interface{}{
  243 + "transactionContext": transactionContext,
  244 + }); err != nil {
  245 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  246 + } else {
  247 + rep = value
  248 + }
  249 + if id > 0 {
  250 + if mod, err = rep.FindOne(map[string]interface{}{"unitConversionId": id}); err != nil {
  251 + if err == domain.ErrorNotFound {
  252 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该单位换算不存在")
  253 + }
  254 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  255 + }
  256 + }
  257 + return rep, mod, err
  258 +}
  259 +
  260 +// FastPgProductPlan 快速返回生产计划对象
  261 +//
  262 +// transactionContext 事务
  263 +// id 对象唯一标识
  264 +func FastPgProductPlan(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductPlanRepository, *domain.ProductPlan, error) {
  265 + var rep domain.ProductPlanRepository
  266 + var mod *domain.ProductPlan
  267 + var err error
  268 + if value, err := CreateProductPlanRepository(map[string]interface{}{
  269 + "transactionContext": transactionContext,
  270 + }); err != nil {
  271 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  272 + } else {
  273 + rep = value
  274 + }
  275 + if id > 0 {
  276 + if mod, err = rep.FindOne(map[string]interface{}{"productPlanId": id}); err != nil {
  277 + if err == domain.ErrorNotFound {
  278 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该生产计划不存在")
  279 + }
  280 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  281 + }
  282 + }
  283 + return rep, mod, err
  284 +}
  285 +
  286 +// FastPgProductPlan 快速返回生产计划对象
  287 +//
  288 +// transactionContext 事务
  289 +// id 对象唯一标识
  290 +func FastPgProductPlanDispatchRecord(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductPlanDispatchRecordRepository, *domain.ProductPlanDispatchRecord, error) {
  291 + var rep domain.ProductPlanDispatchRecordRepository
  292 + var mod *domain.ProductPlanDispatchRecord
  293 + var err error
  294 + if value, err := CreateProductPlanDispatchRecordRepository(map[string]interface{}{
  295 + "transactionContext": transactionContext,
  296 + }); err != nil {
  297 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  298 + } else {
  299 + rep = value
  300 + }
  301 + if id > 0 {
  302 + if mod, err = rep.FindOne(map[string]interface{}{"productPlanDispatchRecordId": id}); err != nil {
  303 + if err == domain.ErrorNotFound {
  304 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该生产计划调度记录不存在")
  305 + }
  306 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  307 + }
  308 + }
  309 + return rep, mod, err
  310 +}
  311 +
  312 +// FastPgAttendance 快速返回考勤记录
  313 +//
  314 +// transactionContext 事务
  315 +// id 对象唯一标识
  316 +func FastPgAttendance(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductAttendanceRecordRepository, *domain.ProductAttendanceRecord, error) {
  317 + var rep domain.ProductAttendanceRecordRepository
  318 + var mod *domain.ProductAttendanceRecord
  319 + var err error
  320 + if value, err := CreateProductAttendanceRecordRepository(map[string]interface{}{
  321 + "transactionContext": transactionContext,
  322 + }); err != nil {
  323 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  324 + } else {
  325 + rep = value
  326 + }
  327 + if id > 0 {
  328 + if mod, err = rep.FindOne(map[string]interface{}{"productAttendanceRecordId": id}); err != nil {
  329 + if err == domain.ErrorNotFound {
  330 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该考勤记录不存在")
  331 + }
  332 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  333 + }
  334 + }
  335 + return rep, mod, err
  336 +}
  337 +
  338 +// FastPgProductRecord 快速返回生产记录
  339 +//
  340 +// transactionContext 事务
  341 +// id 对象唯一标识
  342 +func FastPgProductRecord(transactionContext application.TransactionContext, id int, options ...option) (domain.ProductRecordRepository, *domain.ProductRecord, error) {
  343 + var rep domain.ProductRecordRepository
  344 + var mod *domain.ProductRecord
  345 + var err error
  346 + if value, err := CreateProductRecordRepository(map[string]interface{}{
  347 + "transactionContext": transactionContext,
  348 + }); err != nil {
  349 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  350 + } else {
  351 + rep = value
  352 + }
  353 + if id > 0 {
  354 + if mod, err = rep.FindOne(map[string]interface{}{"productRecordId": id}); err != nil {
  355 + if err == domain.ErrorNotFound {
  356 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该记录不存在")
  357 + }
  358 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  359 + }
  360 + }
  361 + return rep, mod, err
  362 +}
  363 +
  364 +// FastPgWorkshopWorkTimeRecord 快速返回生产记录
  365 +//
  366 +// transactionContext 事务
  367 +// id 对象唯一标识
  368 +func FastPgWorkshopWorkTimeRecord(transactionContext application.TransactionContext, id int, options ...option) (domain.WorkshopWorkTimeRecordRepository, *domain.WorkshopWorkTimeRecord, error) {
  369 + var rep domain.WorkshopWorkTimeRecordRepository
  370 + var mod *domain.WorkshopWorkTimeRecord
  371 + var err error
  372 + if value, err := CreateWorkshopWorkTimeRecordRepository(map[string]interface{}{
  373 + "transactionContext": transactionContext,
  374 + }); err != nil {
  375 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  376 + } else {
  377 + rep = value
  378 + }
  379 + if id > 0 {
  380 + if mod, err = rep.FindOne(map[string]interface{}{"workshopWorkTimeRecordId": id}); err != nil {
  381 + if err == domain.ErrorNotFound {
  382 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该记录不存在")
  383 + }
  384 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  385 + }
  386 + }
  387 + return rep, mod, err
  388 +}
  389 +
  390 +// FastPgDeviceDailyRunningRecord 快速返回设备每日运行记录
  391 +//
  392 +// transactionContext 事务
  393 +// id 对象唯一标识
  394 +func FastPgDeviceDailyRunningRecord(transactionContext application.TransactionContext, id int, options ...option) (domain.DeviceDailyRunningRecordRepository, *domain.DeviceDailyRunningRecord, error) {
  395 + var rep domain.DeviceDailyRunningRecordRepository
  396 + var mod *domain.DeviceDailyRunningRecord
  397 + var err error
  398 + if value, err := CreateDeviceDailyRunningRecordRepository(map[string]interface{}{
  399 + "transactionContext": transactionContext,
  400 + }); err != nil {
  401 + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  402 + } else {
  403 + rep = value
  404 + }
  405 + if id > 0 {
  406 + if mod, err = rep.FindOne(map[string]interface{}{"deviceDailyRunningRecordId": id}); err != nil {
  407 + if err == domain.ErrorNotFound {
  408 + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该记录不存在")
  409 + }
  410 + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  411 + }
  412 + }
  413 + return rep, mod, err
  414 +}
  415 +
  416 +/***** 2.配置 *****/
  417 +
  418 +type FastOptions struct {
  419 + DataAuthRequired bool
  420 + SetPrincipal bool
  421 + OperateInfo *domain.OperateInfo
  422 +}
  423 +
  424 +func NewFastOptions(options ...option) *FastOptions {
  425 + o := &FastOptions{
  426 + DataAuthRequired: false,
  427 + }
  428 + for i := 0; i < len(options); i++ {
  429 + options[i](o)
  430 + }
  431 + return o
  432 +}
  433 +
  434 +type option func(options *FastOptions)
  435 +
  436 +// 需要数据权限
  437 +func WithDataAuthRequired() option {
  438 + return func(options *FastOptions) {
  439 + options.DataAuthRequired = true
  440 + }
  441 +}
  442 +
  443 +// WithOperator 操作人
  444 +func WithOperator(op *domain.OperateInfo) option {
  445 + return func(options *FastOptions) {
  446 + options.OperateInfo = op
  447 + }
  448 +}
  449 +
  450 +// WithOperator 操作人
  451 +func WithSetPrincipal() option {
  452 + return func(options *FastOptions) {
  453 + options.SetPrincipal = true
  454 + }
  455 +}