正在显示
11 个修改的文件
包含
734 行增加
和
3 行删除
@@ -4,6 +4,7 @@ go 1.16 | @@ -4,6 +4,7 @@ go 1.16 | ||
4 | 4 | ||
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/axgle/mahonia v0.0.0-20180208002826-3358181d7394 | ||
7 | github.com/beego/beego/v2 v2.0.1 | 8 | github.com/beego/beego/v2 v2.0.1 |
8 | github.com/emirpasic/gods v1.12.0 | 9 | github.com/emirpasic/gods v1.12.0 |
9 | github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect | 10 | github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 // indirect |
@@ -11,6 +12,7 @@ require ( | @@ -11,6 +12,7 @@ require ( | ||
11 | github.com/gavv/httpexpect v2.0.0+incompatible | 12 | github.com/gavv/httpexpect v2.0.0+incompatible |
12 | github.com/go-pg/pg/v10 v10.9.0 | 13 | github.com/go-pg/pg/v10 v10.9.0 |
13 | github.com/google/go-querystring v1.1.0 // indirect | 14 | github.com/google/go-querystring v1.1.0 // indirect |
15 | + github.com/gookit/event v1.0.6 | ||
14 | github.com/imkira/go-interpol v1.1.0 // indirect | 16 | github.com/imkira/go-interpol v1.1.0 // indirect |
15 | github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 | 17 | github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 |
16 | github.com/mattn/go-colorable v0.1.8 // indirect | 18 | github.com/mattn/go-colorable v0.1.8 // indirect |
@@ -19,7 +21,7 @@ require ( | @@ -19,7 +21,7 @@ require ( | ||
19 | github.com/onsi/gomega v1.11.0 | 21 | github.com/onsi/gomega v1.11.0 |
20 | github.com/sergi/go-diff v1.2.0 // indirect | 22 | github.com/sergi/go-diff v1.2.0 // indirect |
21 | github.com/smartystreets/goconvey v1.6.4 // indirect | 23 | github.com/smartystreets/goconvey v1.6.4 // indirect |
22 | - github.com/stretchr/testify v1.7.0 | 24 | + github.com/stretchr/testify v1.7.1 |
23 | github.com/tal-tech/go-queue v1.0.5 | 25 | github.com/tal-tech/go-queue v1.0.5 |
24 | github.com/tal-tech/go-zero v1.0.27 | 26 | github.com/tal-tech/go-zero v1.0.27 |
25 | github.com/valyala/fasthttp v1.23.0 // indirect | 27 | github.com/valyala/fasthttp v1.23.0 // indirect |
@@ -21,6 +21,8 @@ github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+Dx | @@ -21,6 +21,8 @@ github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+Dx | ||
21 | github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSULpEc= | 21 | github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSULpEc= |
22 | github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= | 22 | github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= |
23 | github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= | 23 | github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= |
24 | +github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ= | ||
25 | +github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg= | ||
24 | github.com/beanstalkd/go-beanstalk v0.1.0/go.mod h1:/G8YTyChOtpOArwLTQPY1CHB+i212+av35bkPXXj56Y= | 26 | github.com/beanstalkd/go-beanstalk v0.1.0/go.mod h1:/G8YTyChOtpOArwLTQPY1CHB+i212+av35bkPXXj56Y= |
25 | github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE= | 27 | github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE= |
26 | github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI= | 28 | github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI= |
@@ -164,6 +166,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 | @@ -164,6 +166,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 | ||
164 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | 166 | github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= |
165 | github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | 167 | github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= |
166 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | 168 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= |
169 | +github.com/gookit/event v1.0.6 h1:/U95T1tBzt9RSSi23pg4VR3B9VWkyM4xv8TXAGi60IQ= | ||
170 | +github.com/gookit/event v1.0.6/go.mod h1:7Udf/q/HQcrK9XE4JZUvbqi46rI1V8r/Pvao2NbPajA= | ||
167 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= | 171 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= |
168 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | 172 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= |
169 | github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | 173 | github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= |
@@ -308,6 +312,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT | @@ -308,6 +312,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT | ||
308 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= | 312 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= |
309 | github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= | 313 | github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= |
310 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= | 314 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= |
315 | +github.com/qiniu/iconv v1.2.0 h1:2LJKwoF+4LJ3lNM+7cE3P1kNQzAI/HMZuWhkmFoY2U8= | ||
316 | +github.com/qiniu/iconv v1.2.0/go.mod h1:5bxb2h9lptZt2eHLgY+Jw4X06TMtKb6tvvok0DwSwGA= | ||
311 | github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= | 317 | github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= |
312 | github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= | 318 | github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= |
313 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= | 319 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= |
@@ -348,8 +354,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV | @@ -348,8 +354,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV | ||
348 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | 354 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= |
349 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= | 355 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= |
350 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | 356 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= |
351 | -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= | ||
352 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | 357 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= |
358 | +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= | ||
359 | +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||
353 | github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= | 360 | github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= |
354 | github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= | 361 | github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= |
355 | github.com/tal-tech/go-queue v1.0.5 h1:cd2o0lPjAFJKIXuEbQvsGypUhzz6FLib4FVVAyxsMtY= | 362 | github.com/tal-tech/go-queue v1.0.5 h1:cd2o0lPjAFJKIXuEbQvsGypUhzz6FLib4FVVAyxsMtY= |
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 TerminalReportCommand struct { | ||
12 | + TerminalType string `json:"terminalType"` | ||
13 | + TerminalId string `json:"terminalId"` | ||
14 | + Command string `json:"command"` | ||
15 | + Content string `json:"content"` | ||
16 | + Table string `json:"table"` | ||
17 | + | ||
18 | + CompanyId int64 `json:"companyId"` | ||
19 | + OrgId int64 `json:"orgId"` | ||
20 | +} | ||
21 | + | ||
22 | +func (terminalReportCommand *TerminalReportCommand) Valid(validation *validation.Validation) { | ||
23 | + | ||
24 | +} | ||
25 | + | ||
26 | +func (terminalReportCommand *TerminalReportCommand) ValidateCommand() error { | ||
27 | + valid := validation.Validation{} | ||
28 | + b, err := valid.Valid(terminalReportCommand) | ||
29 | + if err != nil { | ||
30 | + return err | ||
31 | + } | ||
32 | + if !b { | ||
33 | + elem := reflect.TypeOf(terminalReportCommand).Elem() | ||
34 | + for _, validErr := range valid.Errors { | ||
35 | + field, isExist := elem.FieldByName(validErr.Field) | ||
36 | + if isExist { | ||
37 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
38 | + } else { | ||
39 | + return fmt.Errorf(validErr.Message) | ||
40 | + } | ||
41 | + } | ||
42 | + } | ||
43 | + return nil | ||
44 | +} |
pkg/application/terminal/service/terminal.go
0 → 100644
1 | +package service | ||
2 | + | ||
3 | +import ( | ||
4 | + "bytes" | ||
5 | + "fmt" | ||
6 | + "github.com/axgle/mahonia" | ||
7 | + "github.com/beego/beego/v2/adapter/utils" | ||
8 | + "github.com/gookit/event" | ||
9 | + "github.com/linmadan/egglib-go/core/application" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/application/factory" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/application/terminal/command" | ||
12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/domain" | ||
13 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/log" | ||
14 | + "io" | ||
15 | +) | ||
16 | + | ||
17 | +var GlobalTerminalManager *TerminalManager | ||
18 | + | ||
19 | +func init() { | ||
20 | + GlobalTerminalManager = NewTerminalManager() | ||
21 | + event.On(domain.UserCreateEvent, event.ListenerFunc(func(e event.Event) error { | ||
22 | + | ||
23 | + return nil | ||
24 | + })) | ||
25 | + event.On(domain.UserUpdateEvent, event.ListenerFunc(func(e event.Event) error { | ||
26 | + | ||
27 | + return nil | ||
28 | + })) | ||
29 | + event.On(domain.UserDeleteEvent, event.ListenerFunc(func(e event.Event) error { | ||
30 | + | ||
31 | + return nil | ||
32 | + })) | ||
33 | + event.On(domain.UserEnableEvent, event.ListenerFunc(func(e event.Event) error { | ||
34 | + | ||
35 | + return nil | ||
36 | + })) | ||
37 | + event.On(domain.UserEnableEvent, event.ListenerFunc(func(e event.Event) error { | ||
38 | + | ||
39 | + return nil | ||
40 | + })) | ||
41 | + event.On(DownEntityEvent, event.ListenerFunc(GlobalTerminalManager.DownEntityEvent)) | ||
42 | +} | ||
43 | + | ||
44 | +type TerminalService struct { | ||
45 | +} | ||
46 | + | ||
47 | +func NewTerminalService(options map[string]interface{}) *TerminalService { | ||
48 | + newUserService := &TerminalService{} | ||
49 | + return newUserService | ||
50 | +} | ||
51 | + | ||
52 | +func (svr *TerminalService) TerminalReport(cmd *command.TerminalReportCommand) (interface{}, error) { | ||
53 | + if err := cmd.ValidateCommand(); err != nil { | ||
54 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
55 | + } | ||
56 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
57 | + if err != nil { | ||
58 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
59 | + } | ||
60 | + if err := transactionContext.StartTransaction(); err != nil { | ||
61 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
62 | + } | ||
63 | + defer func() { | ||
64 | + transactionContext.RollbackTransaction() | ||
65 | + }() | ||
66 | + response, err := terminalReport(cmd, transactionContext) | ||
67 | + if err != nil { | ||
68 | + log.Logger.Error(err.Error()) | ||
69 | + return nil, err | ||
70 | + } | ||
71 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
72 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
73 | + } | ||
74 | + return response, nil | ||
75 | +} | ||
76 | + | ||
77 | +func terminalReport(cmd *command.TerminalReportCommand, transactionContext application.TransactionContext) (interface{}, error) { | ||
78 | + var ( | ||
79 | + response string = "OK" | ||
80 | + ) | ||
81 | + | ||
82 | + switch cmd.Command { | ||
83 | + case "getrequest": | ||
84 | + device, ok := GlobalTerminalManager.GetDevice(cmd.TerminalId) | ||
85 | + if !ok || device == nil { | ||
86 | + break | ||
87 | + } | ||
88 | + if downEntity, ok := device.PopDownEntity(); ok && downEntity != nil { | ||
89 | + response = downEntity.DownCommand() | ||
90 | + } | ||
91 | + break | ||
92 | + case "cdata": | ||
93 | + parseEntities := ParseData(cmd) | ||
94 | + var ( | ||
95 | + down DownEntity | ||
96 | + err error | ||
97 | + handler Handler = ZKClockHandler{TransactionContext: transactionContext} | ||
98 | + ) | ||
99 | + for _, entity := range parseEntities { | ||
100 | + switch TableType(cmd.Table) { | ||
101 | + case AttLOG: | ||
102 | + down, err = handler.Attendance(entity.(AttLOGUpEntity)) | ||
103 | + case BIODATA: | ||
104 | + down, err = handler.BioData(entity.(BIODATAEntity)) | ||
105 | + case OPERLOG: | ||
106 | + //if v, ok := entity.(USEREntity); ok { | ||
107 | + // down, err = handler.ReportUser(v) | ||
108 | + //} | ||
109 | + if v, ok := entity.(BIODATAEntity); ok { | ||
110 | + down, err = handler.BioData(v) | ||
111 | + } | ||
112 | + } | ||
113 | + if err != nil { | ||
114 | + log.Logger.Error(err.Error()) | ||
115 | + continue | ||
116 | + } | ||
117 | + if down != nil { | ||
118 | + response = down.DownCommand() | ||
119 | + } | ||
120 | + break | ||
121 | + } | ||
122 | + } | ||
123 | + | ||
124 | + return map[string]interface{}{ | ||
125 | + "response": response, | ||
126 | + }, nil | ||
127 | +} | ||
128 | + | ||
129 | +func ParseData(cmd *command.TerminalReportCommand) []interface{} { | ||
130 | + result := make([]interface{}, 0) | ||
131 | + buf := bytes.NewBufferString(cmd.Content) | ||
132 | + for { | ||
133 | + line, err := buf.ReadBytes('\n') | ||
134 | + if err == io.EOF { | ||
135 | + break | ||
136 | + } | ||
137 | + if err != nil { | ||
138 | + log.Logger.Error(err.Error()) | ||
139 | + break | ||
140 | + } | ||
141 | + | ||
142 | + switch TableType(cmd.Table) { | ||
143 | + case AttLOG: | ||
144 | + columns := bytes.Split(line, ([]byte)("\t")) | ||
145 | + if len(columns) != 11 { //10 + 1 空格 | ||
146 | + continue | ||
147 | + } | ||
148 | + result = append(result, AttLOGUpEntity{ | ||
149 | + Pin: string(columns[0]), | ||
150 | + CompanyId: cmd.CompanyId, | ||
151 | + OrgId: cmd.OrgId, | ||
152 | + }) | ||
153 | + case BIODATA: | ||
154 | + /*BIODATA Pin=3\tNo=0\tIndex=0\tValid=1\tDuress=0\tType=9\tMajorVer=39\tMinorVer=1\tFormat= | ||
155 | + 0\tTmp=apUBEBABQo4JACcBAWiOADA7dP4pU9F31Uxom7NAGjM4eO/8X5Ee4uahkIT11c3188+VguMsd3oCO0O29efRyxofdLiohI4QL7woK3U*/ | ||
156 | + columns := readLineToMap(line, "BIODATA") | ||
157 | + result = append(result, BIODATAEntity{ | ||
158 | + Pin: columns["Pin"], | ||
159 | + No: columns["No"], | ||
160 | + Index: columns["Index"], | ||
161 | + Duress: columns["Duress"], | ||
162 | + Type: columns["Type"], | ||
163 | + MinorVer: columns["MinorVer"], | ||
164 | + MajorVer: columns["MajorVer"], | ||
165 | + Format: columns["Format"], | ||
166 | + Tmp: columns["Tmp"], | ||
167 | + CompanyId: cmd.CompanyId, | ||
168 | + OrgId: cmd.OrgId, | ||
169 | + }) | ||
170 | + case OPERLOG: | ||
171 | + if bytes.HasPrefix(line, []byte("FP")) { | ||
172 | + /* | ||
173 | + FP PIN=3 FID=6 Size=1336 Valid=1 TMP=SqtTUzIxAAAD6O8ECA | ||
174 | + */ | ||
175 | + columns := readLineToMap(line, "FP") | ||
176 | + result = append(result, BIODATAEntity{ | ||
177 | + Pin: columns["PIN"], | ||
178 | + Type: fmt.Sprintf("%v", BioDataType1), | ||
179 | + Tmp: columns["TMP"], | ||
180 | + CompanyId: cmd.CompanyId, | ||
181 | + OrgId: cmd.OrgId, | ||
182 | + }) | ||
183 | + } else if bytes.HasPrefix(line, []byte("USER")) { | ||
184 | + /* | ||
185 | + USER PIN=3 Name=杨xx Pri=14 Passwd= Card=3731588478 Grp=1 TZ=0000000100000000 Verify=-1 ViceCard= StartDatetime=0 EndDatetime=0 | ||
186 | + */ | ||
187 | + columns := readLineToMap(line, "USER") | ||
188 | + name := columns["Name"] //GbkToUtf8(columns["Name"]) | ||
189 | + result = append(result, USEREntity{ | ||
190 | + OPERLOGType: "USER", | ||
191 | + Pin: columns["PIN"], | ||
192 | + Name: name, | ||
193 | + CompanyId: cmd.CompanyId, | ||
194 | + OrgId: cmd.OrgId, | ||
195 | + }) | ||
196 | + } | ||
197 | + } | ||
198 | + } | ||
199 | + return result | ||
200 | +} | ||
201 | + | ||
202 | +func readLineToMap(line []byte, prefix string) map[string]string { | ||
203 | + var result = make(map[string]string) | ||
204 | + line = bytes.TrimLeft(line, prefix) | ||
205 | + line = bytes.TrimSpace(line) | ||
206 | + columns := bytes.Fields(line) | ||
207 | + for i := range columns { | ||
208 | + kv := bytes.SplitN(columns[i], []byte("="), 2) | ||
209 | + if len(kv) < 2 { | ||
210 | + continue | ||
211 | + } | ||
212 | + //if string(kv[0]) == "Name" { | ||
213 | + // log.Logger.Debug(fmt.Sprintf("%x", kv[1])) | ||
214 | + // log.Logger.Debug(fmt.Sprintf("%v", kv[1])) | ||
215 | + // log.Logger.Debug(fmt.Sprintf("%s", string(kv[1]))) | ||
216 | + //} | ||
217 | + result[string(kv[0])] = string(kv[1]) | ||
218 | + } | ||
219 | + return result | ||
220 | +} | ||
221 | + | ||
222 | +type Handler interface { | ||
223 | + Attendance(entity AttLOGUpEntity) (DownEntity, error) | ||
224 | + BioData(entity BIODATAEntity) (DownEntity, error) | ||
225 | + ReportUser(entity USEREntity) (DownEntity, error) | ||
226 | +} | ||
227 | + | ||
228 | +type ZKClockHandler struct { | ||
229 | + TransactionContext application.TransactionContext | ||
230 | +} | ||
231 | + | ||
232 | +func (handler ZKClockHandler) Attendance(entity AttLOGUpEntity) (DownEntity, error) { | ||
233 | + var ( | ||
234 | + userRepository, _, _ = factory.FastPgUser(handler.TransactionContext, 0) | ||
235 | + userBaseRepository, _, _ = factory.FastPgUserBase(handler.TransactionContext, 0) | ||
236 | + user *domain.User | ||
237 | + userBase *domain.UserBase | ||
238 | + err error | ||
239 | + ) | ||
240 | + if user, err = userRepository.FindOne(map[string]interface{}{"companyId": entity.CompanyId, "orgId": entity.OrgId, "icCardNumber": entity.Pin}); err != nil { | ||
241 | + return nil, err | ||
242 | + } | ||
243 | + if userBase, err = userBaseRepository.FindOne(map[string]interface{}{"userBaseId": user.UserBaseId}); err != nil { | ||
244 | + return nil, err | ||
245 | + } | ||
246 | + var sendQuery bool | ||
247 | + // 请求 人脸识别-用户画像 | ||
248 | + if len(userBase.UserInfo.FacePortrait) == 0 { | ||
249 | + sendQuery = true | ||
250 | + //event.Fire(DownEntityEvent, map[string]interface{}{"entity": NewQueryBIODATADownEntity(generateSn(), entity.Pin, BioDataType2)}) | ||
251 | + } | ||
252 | + // 请求 人脸识别-指纹 | ||
253 | + if len(userBase.UserInfo.FingerprintPortrait) == 0 { | ||
254 | + sendQuery = true | ||
255 | + //event.Fire(DownEntityEvent, map[string]interface{}{"entity": NewQueryBIODATADownEntity(generateSn(), entity.Pin, BioDataType1)}) | ||
256 | + } | ||
257 | + if sendQuery { | ||
258 | + event.Fire(DownEntityEvent, map[string]interface{}{"entity": NewQueryUserInfoDownEntity(generateSn(), entity.Pin)}) | ||
259 | + } | ||
260 | + return nil, nil | ||
261 | +} | ||
262 | + | ||
263 | +func (handler ZKClockHandler) BioData(entity BIODATAEntity) (DownEntity, error) { | ||
264 | + var ( | ||
265 | + userRepository, _, _ = factory.FastPgUser(handler.TransactionContext, 0) | ||
266 | + userBaseRepository, _, _ = factory.FastPgUserBase(handler.TransactionContext, 0) | ||
267 | + user *domain.User | ||
268 | + userBase *domain.UserBase | ||
269 | + err error | ||
270 | + updateFlag bool | ||
271 | + ) | ||
272 | + if user, err = userRepository.FindOne(map[string]interface{}{"companyId": entity.CompanyId, "orgId": entity.OrgId, "icCardNumber": entity.Pin}); err != nil { | ||
273 | + return nil, err | ||
274 | + } | ||
275 | + if userBase, err = userBaseRepository.FindOne(map[string]interface{}{"userBaseId": user.UserBaseId}); err != nil { | ||
276 | + return nil, err | ||
277 | + } | ||
278 | + // 请求 人脸识别-用户画像 | ||
279 | + if len(userBase.UserInfo.FacePortrait) == 0 && len(entity.Tmp) > 0 && entity.Type == "9" { | ||
280 | + userBase.UserInfo.FacePortrait = entity.Tmp | ||
281 | + updateFlag = true | ||
282 | + } | ||
283 | + // 请求 人脸识别-指纹 | ||
284 | + if len(userBase.UserInfo.FingerprintPortrait) == 0 && len(entity.Tmp) > 0 && entity.Type == "1" { | ||
285 | + userBase.UserInfo.FingerprintPortrait = entity.Tmp | ||
286 | + updateFlag = true | ||
287 | + } | ||
288 | + if updateFlag { | ||
289 | + _, err = userBaseRepository.Save(userBase) | ||
290 | + if err != nil { | ||
291 | + log.Logger.Error(err.Error()) | ||
292 | + } | ||
293 | + } | ||
294 | + return nil, err | ||
295 | +} | ||
296 | + | ||
297 | +func (handler ZKClockHandler) ReportUser(entity USEREntity) (DownEntity, error) { | ||
298 | + var ( | ||
299 | + userRepository, _, _ = factory.FastPgUser(handler.TransactionContext, 0) | ||
300 | + userBaseRepository, _, _ = factory.FastPgUserBase(handler.TransactionContext, 0) | ||
301 | + user *domain.User | ||
302 | + userBase *domain.UserBase | ||
303 | + err error | ||
304 | + updateFlag bool | ||
305 | + ) | ||
306 | + if user, err = userRepository.FindOne(map[string]interface{}{"companyId": entity.CompanyId, "orgId": entity.OrgId, "icCardNumber": entity.Pin}); err != nil { | ||
307 | + return nil, err | ||
308 | + } | ||
309 | + if userBase, err = userBaseRepository.FindOne(map[string]interface{}{"userBaseId": user.UserBaseId}); err != nil { | ||
310 | + return nil, err | ||
311 | + } | ||
312 | + // 请求 人脸识别-用户画像 | ||
313 | + //if len(entity.Pin) > 0 && userBase.UserInfo.Pin != entity.Pin { | ||
314 | + // updateFlag = true | ||
315 | + // userBase.UserInfo.Pin = entity.Pin | ||
316 | + //} | ||
317 | + if updateFlag { | ||
318 | + _, err = userBaseRepository.Save(userBase) | ||
319 | + } | ||
320 | + return nil, err | ||
321 | +} | ||
322 | + | ||
323 | +func generateSn() string { | ||
324 | + return string(utils.RandomCreateBytes(10)) | ||
325 | +} | ||
326 | + | ||
327 | +// GbkToUtf8 GBK 转 UTF-8 | ||
328 | +func GbkToUtf8(s string) string { | ||
329 | + decoder := mahonia.NewDecoder("gbk") | ||
330 | + _, data, _ := decoder.Translate([]byte(s), true) | ||
331 | + //return decoder.ConvertString(s) | ||
332 | + return string(data) | ||
333 | +} | ||
334 | + | ||
335 | +// Utf8ToGbk UTF-8 转 GBK | ||
336 | +func Utf8ToGbk(s string) string { | ||
337 | + encoder := mahonia.NewEncoder("gbk") | ||
338 | + return encoder.ConvertString(s) | ||
339 | +} | ||
340 | + | ||
341 | +func ConvertToString(src string, srcCode string, tagCode string) string { | ||
342 | + | ||
343 | + srcCoder := mahonia.NewDecoder(srcCode) | ||
344 | + | ||
345 | + srcResult := srcCoder.ConvertString(src) | ||
346 | + | ||
347 | + tagCoder := mahonia.NewDecoder(tagCode) | ||
348 | + | ||
349 | + _, cdata, _ := tagCoder.Translate([]byte(srcResult), true) | ||
350 | + | ||
351 | + result := string(cdata) | ||
352 | + | ||
353 | + return result | ||
354 | + | ||
355 | +} |
1 | +package service | ||
2 | + | ||
3 | +import ( | ||
4 | + "container/list" | ||
5 | + "github.com/gookit/event" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/log" | ||
7 | + "sync" | ||
8 | +) | ||
9 | + | ||
10 | +var ( | ||
11 | + DownEntityEvent = "down_entity" | ||
12 | +) | ||
13 | + | ||
14 | +type TerminalManager struct { | ||
15 | + TerminalDeviceList []*TerminalDevice | ||
16 | + TerminalDevices sync.Map | ||
17 | +} | ||
18 | + | ||
19 | +func NewTerminalManager() *TerminalManager { | ||
20 | + return &TerminalManager{ | ||
21 | + TerminalDeviceList: make([]*TerminalDevice, 0), | ||
22 | + TerminalDevices: sync.Map{}, | ||
23 | + } | ||
24 | +} | ||
25 | + | ||
26 | +func (term *TerminalManager) GetDevice(terminalId string) (*TerminalDevice, bool) { | ||
27 | + device, ok := term.TerminalDevices.Load(terminalId) | ||
28 | + if !ok { | ||
29 | + device := NewTerminalDevice(terminalId) | ||
30 | + term.TerminalDevices.Store(terminalId, device) | ||
31 | + log.Logger.Debug("【TerminalManager】 add new device:"+terminalId, map[string]interface{}{"device": device}) | ||
32 | + term.TerminalDeviceList = append(term.TerminalDeviceList, device) | ||
33 | + return nil, false | ||
34 | + } | ||
35 | + if v, ok := device.(*TerminalDevice); ok { | ||
36 | + return v, ok | ||
37 | + } | ||
38 | + return nil, false | ||
39 | +} | ||
40 | + | ||
41 | +func (term *TerminalManager) PopDownEntityByDevice(sn string) (DownEntity, bool) { | ||
42 | + device, ok := term.GetDevice(sn) | ||
43 | + if !ok { | ||
44 | + return nil, false | ||
45 | + } | ||
46 | + return device.PopDownEntity() | ||
47 | +} | ||
48 | + | ||
49 | +func (term *TerminalManager) AddDownEntityByDevice(sn string, entity interface{}) bool { | ||
50 | + device, ok := term.GetDevice(sn) | ||
51 | + if !ok { | ||
52 | + return false | ||
53 | + } | ||
54 | + device.AddDownEntity(entity) | ||
55 | + return true | ||
56 | +} | ||
57 | + | ||
58 | +func (term *TerminalManager) BroadcastDownEntity(downEntity interface{}) { | ||
59 | + for i := range term.TerminalDeviceList { | ||
60 | + term.TerminalDeviceList[i].AddDownEntity(downEntity) | ||
61 | + } | ||
62 | +} | ||
63 | + | ||
64 | +// Listen Event | ||
65 | + | ||
66 | +func (term *TerminalManager) DownEntityEvent(e event.Event) error { | ||
67 | + //fmt.Printf("handle down entity event: %s\n", e.Name()) | ||
68 | + entity := e.Get("entity") | ||
69 | + if entity != nil { | ||
70 | + term.BroadcastDownEntity(entity) | ||
71 | + } | ||
72 | + return nil | ||
73 | +} | ||
74 | + | ||
75 | +type TerminalDevice struct { | ||
76 | + Id string | ||
77 | + DownEntityList *list.List | ||
78 | +} | ||
79 | + | ||
80 | +func NewTerminalDevice(terminalId string) *TerminalDevice { | ||
81 | + return &TerminalDevice{ | ||
82 | + Id: terminalId, | ||
83 | + DownEntityList: list.New(), | ||
84 | + } | ||
85 | +} | ||
86 | + | ||
87 | +func (device *TerminalDevice) PopDownEntity() (DownEntity, bool) { | ||
88 | + element := device.DownEntityList.Front() | ||
89 | + if element == nil { | ||
90 | + return nil, false | ||
91 | + } | ||
92 | + device.DownEntityList.Remove(element) | ||
93 | + if v, ok := element.Value.(DownEntity); ok { | ||
94 | + log.Logger.Debug("【TerminalManager】 pop down entity to Sender", map[string]interface{}{"entity": v}) | ||
95 | + return v, ok | ||
96 | + } | ||
97 | + return nil, false | ||
98 | +} | ||
99 | + | ||
100 | +func (device *TerminalDevice) AddDownEntity(downEntity interface{}) { | ||
101 | + log.Logger.Debug("【TerminalManager】 add down entity to Profile", map[string]interface{}{"entity": downEntity}) | ||
102 | + device.DownEntityList.PushBack(downEntity) | ||
103 | +} |
1 | +package service | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "github.com/stretchr/testify/assert" | ||
6 | + "testing" | ||
7 | +) | ||
8 | + | ||
9 | +func TestGbkToUtf8(t *testing.T) { | ||
10 | + input := "刘" | ||
11 | + out := Utf8ToGbk(input) | ||
12 | + t.Log("gbk:" + out) | ||
13 | + //"efbfbdeeb8a3" | ||
14 | + t.Log(fmt.Sprintf("%v", []byte(out))) | ||
15 | + out = GbkToUtf8(out) | ||
16 | + t.Log("utf8:" + out) | ||
17 | + t.Log("utf8:" + fmt.Sprintf("%v", []byte(out))) | ||
18 | + assert.Equal(t, input, out) | ||
19 | +} |
pkg/application/terminal/service/types.go
0 → 100644
1 | +package service | ||
2 | + | ||
3 | +import "fmt" | ||
4 | + | ||
5 | +type TableType string | ||
6 | + | ||
7 | +var ( | ||
8 | + AttLOG TableType = "ATTLOG" // AttLOG 打卡记录 | ||
9 | + UserInfo TableType = "USERINFO" // 用户信息 | ||
10 | + FingerTMP TableType = "FINGERTMP" //指纹 | ||
11 | + Face TableType = "FACE" //脸部 | ||
12 | + OPERLOG TableType = "OPERLOG" //操作记录 | ||
13 | + BIODATA TableType = "BIODATA" //一体化数据 (人脸识别等) | ||
14 | +) | ||
15 | + | ||
16 | +// AttLOGUpEntity 打卡记录实体 - 上行命令 | ||
17 | +type AttLOGUpEntity struct { | ||
18 | + Pin string | ||
19 | + Time string | ||
20 | + Status string | ||
21 | + Verify string | ||
22 | + Workcode string | ||
23 | + Reserved1 string | ||
24 | + Reserved2 string | ||
25 | + MaskFlag string | ||
26 | + Temperature string | ||
27 | + ConvTemperature string | ||
28 | + | ||
29 | + CompanyId int64 `json:"companyId"` | ||
30 | + OrgId int64 `json:"orgId"` | ||
31 | +} | ||
32 | + | ||
33 | +// FPEntity 指纹 - 上行命令 OPERLOG | ||
34 | +type FPEntity struct { | ||
35 | + OPERLOGType string //"FP" "USER" "BIODATA" | ||
36 | + Pin string | ||
37 | + TFID string | ||
38 | + TSize string | ||
39 | + TValid string | ||
40 | + TTMP string | ||
41 | + | ||
42 | + CompanyId int64 `json:"companyId"` | ||
43 | + OrgId int64 `json:"orgId"` | ||
44 | +} | ||
45 | + | ||
46 | +// USEREntity 用户 - 上行命令 OPERLOG | ||
47 | +type USEREntity struct { | ||
48 | + OPERLOGType string //"FP" "USER" "BIODATA" | ||
49 | + Pin string `json:"pin"` | ||
50 | + Name string `json:"Name"` | ||
51 | + Pri string `json:"Pri"` | ||
52 | + Passwd string `json:"Passwd"` | ||
53 | + Grp string `json:"Grp"` | ||
54 | + TZ string `json:"TZ"` | ||
55 | + Verify string `json:"Verify"` | ||
56 | + ViceCard string `json:"ViceCard"` | ||
57 | + StartDatetime string `json:"StartDatetime"` | ||
58 | + EndDatetime string `json:"EndDatetime"` | ||
59 | + | ||
60 | + CompanyId int64 `json:"companyId"` | ||
61 | + OrgId int64 `json:"orgId"` | ||
62 | +} | ||
63 | + | ||
64 | +// BIODATAEntity 一体化数据实体 - 上行命令 BIODATA | ||
65 | +type BIODATAEntity struct { | ||
66 | + Pin string `json:"pin"` | ||
67 | + No string `json:"tNo"` | ||
68 | + Index string `json:"tIndex"` | ||
69 | + Valid string `json:"tValid"` | ||
70 | + Duress string `json:"tDuress"` | ||
71 | + Type string `json:"tType"` | ||
72 | + MajorVer string `json:"tMajorVer"` | ||
73 | + MinorVer string `json:"tMinorVer"` | ||
74 | + Format string `json:"tFormat"` | ||
75 | + Tmp string `json:"Tmp"` | ||
76 | + | ||
77 | + CompanyId int64 `json:"companyId"` | ||
78 | + OrgId int64 `json:"orgId"` | ||
79 | +} | ||
80 | + | ||
81 | +type DownEntity interface { | ||
82 | + DownCommand() string | ||
83 | +} | ||
84 | + | ||
85 | +func QueryUserInfoRequest(sn string, entity AttLOGUpEntity) string { | ||
86 | + return fmt.Sprintf("C:%v:DATA QUERY USERINFO PIN=%v", sn, entity.Pin) | ||
87 | +} | ||
88 | + | ||
89 | +// QueryUserInfoDownEntity 查询用户信息-下行命令 | ||
90 | +type QueryUserInfoDownEntity struct { | ||
91 | + Sn string | ||
92 | + Pin string | ||
93 | +} | ||
94 | + | ||
95 | +func (entity QueryUserInfoDownEntity) DownCommand() string { | ||
96 | + return fmt.Sprintf("C:%v:DATA QUERY USERINFO PIN=%v", entity.Sn, entity.Pin) | ||
97 | +} | ||
98 | + | ||
99 | +func NewQueryUserInfoDownEntity(sn string, pin string) QueryUserInfoDownEntity { | ||
100 | + return QueryUserInfoDownEntity{ | ||
101 | + Sn: sn, | ||
102 | + Pin: pin, | ||
103 | + } | ||
104 | +} | ||
105 | + | ||
106 | +type BioDataType int | ||
107 | + | ||
108 | +var ( | ||
109 | + BioDataType0 BioDataType = 0 //通用 | ||
110 | + BioDataType1 BioDataType = 1 //指纹 | ||
111 | + BioDataType2 BioDataType = 0 //面部 | ||
112 | + BioDataType3 BioDataType = 3 //声纹 | ||
113 | + BioDataType4 BioDataType = 4 //虹膜 | ||
114 | + BioDataType5 BioDataType = 5 //视网膜 | ||
115 | + BioDataType6 BioDataType = 6 //掌纹 | ||
116 | + BioDataType7 BioDataType = 7 //指静脉 | ||
117 | + BioDataType8 BioDataType = 8 //手掌 | ||
118 | + BioDataType9 BioDataType = 9 //可见光面部 | ||
119 | +) | ||
120 | + | ||
121 | +// QueryBioDataDownEntity 查询一体化-下行命令 | ||
122 | +type QueryBioDataDownEntity struct { | ||
123 | + Sn string | ||
124 | + Pin string | ||
125 | + Type BioDataType | ||
126 | +} | ||
127 | + | ||
128 | +func (entity QueryBioDataDownEntity) DownCommand() string { | ||
129 | + return fmt.Sprintf("C:%v:DATA QUERY BIODATA Type=%v PIN=%v", entity.Sn, entity.Type, entity.Pin) | ||
130 | +} | ||
131 | + | ||
132 | +func NewQueryBIODATADownEntity(sn string, pin string, t BioDataType) QueryBioDataDownEntity { | ||
133 | + return QueryBioDataDownEntity{ | ||
134 | + Sn: sn, | ||
135 | + Pin: pin, | ||
136 | + Type: t, | ||
137 | + } | ||
138 | +} | ||
139 | + | ||
140 | +// DeleteUserDownEntity 删除用户-下行命令 | ||
141 | +type DeleteUserDownEntity struct { | ||
142 | + Sn string | ||
143 | + Pin string | ||
144 | + Table string | ||
145 | +} | ||
146 | + | ||
147 | +func (entity DeleteUserDownEntity) DownCommand() string { | ||
148 | + return fmt.Sprintf("C:%v:DATA DELETE %v PIN=%v", entity.Sn, entity.Table, entity.Pin) | ||
149 | +} | ||
150 | + | ||
151 | +func NewClearUserDownEntity(sn string, pin string, t string) DeleteUserDownEntity { | ||
152 | + return DeleteUserDownEntity{ | ||
153 | + Sn: sn, | ||
154 | + Pin: pin, | ||
155 | + Table: t, | ||
156 | + } | ||
157 | +} |
@@ -26,6 +26,14 @@ const ( | @@ -26,6 +26,14 @@ const ( | ||
26 | UserStatusDestroy UserStatus = 3 | 26 | UserStatusDestroy UserStatus = 3 |
27 | ) | 27 | ) |
28 | 28 | ||
29 | +const ( | ||
30 | + UserUpdateEvent = "user_update" | ||
31 | + UserDeleteEvent = "user_delete" | ||
32 | + UserCreateEvent = "user_create" | ||
33 | + UserEnableEvent = "user_enable" //禁用启用事件 | ||
34 | + UserSyncEvent = "user_sync" // 用户同步 | ||
35 | +) | ||
36 | + | ||
29 | // 用户 | 37 | // 用户 |
30 | type User struct { | 38 | type User struct { |
31 | // 用户Id 用户唯一标识 | 39 | // 用户Id 用户唯一标识 |
@@ -13,9 +13,16 @@ type UserInfo struct { | @@ -13,9 +13,16 @@ type UserInfo struct { | ||
13 | 13 | ||
14 | // 员工类型 1:固定 2:派遣 3.临时 | 14 | // 员工类型 1:固定 2:派遣 3.临时 |
15 | EmployeeType int `json:"employeeType,omitempty"` | 15 | EmployeeType int `json:"employeeType,omitempty"` |
16 | - // IC卡号 | 16 | + // IC卡号 = Pin |
17 | IcCardNumber string `json:"icCardNumber,omitempty"` | 17 | IcCardNumber string `json:"icCardNumber,omitempty"` |
18 | 18 | ||
19 | + // 面部识别 | ||
20 | + FacePortrait string `json:"facePortrait,omitempty"` | ||
21 | + // 指纹识别 | ||
22 | + FingerprintPortrait string `json:"fingerprintPortrait,omitempty"` | ||
23 | + // 打卡机标识 | ||
24 | + // Pin string `json:"pin"` | ||
25 | + | ||
19 | Referer string `json:"-"` | 26 | Referer string `json:"-"` |
20 | // 部门 | 27 | // 部门 |
21 | DepartmentName string `cname:"部门" json:"-"` | 28 | DepartmentName string `cname:"部门" json:"-"` |
1 | +package controllers | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/linmadan/egglib-go/web/beego" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/application/terminal/command" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/application/terminal/service" | ||
7 | +) | ||
8 | + | ||
9 | +type TerminalController struct { | ||
10 | + beego.BaseController | ||
11 | +} | ||
12 | + | ||
13 | +func (controller *TerminalController) TerminalReport() { | ||
14 | + service := service.NewTerminalService(nil) | ||
15 | + terminalReportCommand := &command.TerminalReportCommand{} | ||
16 | + controller.Unmarshal(terminalReportCommand) | ||
17 | + data, err := service.TerminalReport(terminalReportCommand) | ||
18 | + controller.Response(data, err) | ||
19 | +} |
pkg/port/beego/routers/terminal_router.go
0 → 100644
-
请 注册 或 登录 后发表评论