Merge branch 'dev' of http://gitlab.fjmaimaimai.com/allied-creation/allied-creat…
…ion-manufacture into dev
正在显示
15 个修改的文件
包含
591 行增加
和
42 行删除
@@ -2,6 +2,7 @@ package main | @@ -2,6 +2,7 @@ package main | ||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "fmt" | 4 | "fmt" |
5 | + | ||
5 | "github.com/beego/beego/v2/server/web" | 6 | "github.com/beego/beego/v2/server/web" |
6 | "github.com/linmadan/egglib-go/log/logrus" | 7 | "github.com/linmadan/egglib-go/log/logrus" |
7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" |
@@ -9,6 +10,7 @@ import ( | @@ -9,6 +10,7 @@ import ( | ||
9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | 10 | "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/mqtt" |
11 | 12 | ||
13 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/crontab" | ||
12 | _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | 14 | _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" |
13 | _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" | 15 | _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg" |
14 | _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" | 16 | _ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" |
@@ -32,6 +34,9 @@ func main() { | @@ -32,6 +34,9 @@ func main() { | ||
32 | log.Logger.AddHook(bw) | 34 | log.Logger.AddHook(bw) |
33 | redis.InitRedis() | 35 | redis.InitRedis() |
34 | go mqtt.Start() | 36 | go mqtt.Start() |
37 | + cron := crontab.NewCrontabService(nil) | ||
38 | + cron.StartCrontabTask() | ||
39 | + defer cron.StopCrontabTask() | ||
35 | log.Logger.Info("server start!") | 40 | log.Logger.Info("server start!") |
36 | web.Run() | 41 | web.Run() |
37 | } | 42 | } |
pkg/application/crontab/crontab.go
0 → 100644
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 | + //PullDataK3Cloud 晚上0时10分执行 | ||
22 | + pullMaterialK3cloud := task.NewTask("pullMaterialK3cloud", "0 10 0 * * *", func(ctx context.Context) error { | ||
23 | + srv := syncdata.PullDataK3CloudService{} | ||
24 | + return srv.PullMaterialNewest() | ||
25 | + }) | ||
26 | + task.AddTask("pullMaterialK3cloud", pullMaterialK3cloud) | ||
27 | + //PullDataK3Cloud 晚上0时10分执行 | ||
28 | + pullMaterialGroupK3cloud := task.NewTask("pullMaterialGroupK3cloud", "0 10 0 * * *", func(ctx context.Context) error { | ||
29 | + srv := syncdata.PullDataK3CloudService{} | ||
30 | + return srv.PullMaterialGroup() | ||
31 | + }) | ||
32 | + task.AddTask("pullMaterialGroupK3cloud", pullMaterialGroupK3cloud) | ||
33 | +} | ||
34 | + | ||
35 | +func (crontabService *CrontabService) StartCrontabTask() { | ||
36 | + crontabService.initTask() | ||
37 | + task.StartTask() | ||
38 | + log.Logger.Info("crontab start!") | ||
39 | +} | ||
40 | + | ||
41 | +func (crontabService *CrontabService) StopCrontabTask() { | ||
42 | + task.StopTask() | ||
43 | + log.Logger.Info("crontab stop!") | ||
44 | +} |
pkg/application/syncdata/k3cloud.go
0 → 100644
1 | +package syncdata | ||
2 | + | ||
3 | +import ( | ||
4 | + "strconv" | ||
5 | + "strings" | ||
6 | + "time" | ||
7 | + | ||
8 | + "github.com/linmadan/egglib-go/core/application" | ||
9 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" | ||
12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
13 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils/k3cloud" | ||
14 | +) | ||
15 | + | ||
16 | +//拉取金蝶k3cloud的数据,并更新本地数据库 | ||
17 | + | ||
18 | +type PullDataK3CloudService struct { | ||
19 | +} | ||
20 | + | ||
21 | +func newK3cloudClient() (*k3cloud.Client, error) { | ||
22 | + // TODO 使用配置方式传入 | ||
23 | + var ( | ||
24 | + acctID = "20211118121754866" | ||
25 | + username = "18559023318" | ||
26 | + password = "stx@123456" | ||
27 | + hostUrl = "https://tianlian.test.ik3cloud.com/k3cloud" | ||
28 | + ) | ||
29 | + client, err := k3cloud.NewClient(hostUrl, acctID, username, password) | ||
30 | + return client, err | ||
31 | +} | ||
32 | + | ||
33 | +func (srv *PullDataK3CloudService) PullMaterialNewest() error { | ||
34 | + var ( | ||
35 | + err error | ||
36 | + materialDao *dao.MaterialK3cloudDao | ||
37 | + ) | ||
38 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
39 | + if err != nil { | ||
40 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
41 | + } | ||
42 | + if err := transactionContext.StartTransaction(); err != nil { | ||
43 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
44 | + } | ||
45 | + defer func() { | ||
46 | + transactionContext.RollbackTransaction() | ||
47 | + }() | ||
48 | + materialDao, err = dao.NewMaterialK3cloudDao(transactionContext.(*pgTransaction.TransactionContext)) | ||
49 | + if err != nil { | ||
50 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
51 | + } | ||
52 | + version, err := materialDao.GetLastVersion() | ||
53 | + if err != nil { | ||
54 | + return application.ThrowError(application.BUSINESS_ERROR, err.Error()) | ||
55 | + } | ||
56 | + if err = transactionContext.CommitTransaction(); err != nil { | ||
57 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
58 | + } | ||
59 | + var timeFilter time.Time | ||
60 | + if version > 0 { | ||
61 | + timeFilter = time.Unix(version, 0) | ||
62 | + } | ||
63 | + err = srv.PullMaterial(timeFilter) | ||
64 | + if err != nil { | ||
65 | + return err | ||
66 | + } | ||
67 | + return err | ||
68 | +} | ||
69 | + | ||
70 | +//PullMaterial 拉取物料数据 | ||
71 | +func (srv *PullDataK3CloudService) PullMaterial(timeFilter time.Time) error { | ||
72 | + //拉取数据 | ||
73 | + var filterString []string | ||
74 | + if !timeFilter.IsZero() { | ||
75 | + str := timeFilter.Format("2006-01-02T15:04:05") | ||
76 | + filterString = append(filterString, "FModifyDate>='"+str+"'") | ||
77 | + } | ||
78 | + client, err := newK3cloudClient() | ||
79 | + if err != nil { | ||
80 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
81 | + } | ||
82 | + fieldKeys := []string{ | ||
83 | + "FMATERIALID", "FSpecification", "FName", "FNumber", | ||
84 | + "FDocumentStatus", "FForbidStatus", "FErpClsID", | ||
85 | + "FBaseUnitId", "FBaseUnitId.FName", "FCreateDate", "FModifyDate", | ||
86 | + "FForbidDate", "FApproveDate", "FMaterialGroup", "FMaterialGroup.FName", | ||
87 | + "FRefStatus", "FMaterialGroup.FNumber", "FUseOrgId", "FUseOrgId.FName", | ||
88 | + } | ||
89 | + var ( | ||
90 | + startRow int | ||
91 | + allResult []map[string]string | ||
92 | + queryErr error | ||
93 | + ) | ||
94 | + for { | ||
95 | + result, err := client.ExecuteBillQuery(k3cloud.RequestExecuteBillQuery{ | ||
96 | + FormId: "BD_MATERIAL", | ||
97 | + Data: k3cloud.ExecuteBillQueryData{ | ||
98 | + FormId: "BD_MATERIAL", | ||
99 | + FieldKeys: strings.Join(fieldKeys, ","), //查询的字段 | ||
100 | + StartRow: startRow, | ||
101 | + Limit: 1000, | ||
102 | + FilterString: strings.Join(filterString, " and "), | ||
103 | + }, | ||
104 | + }) | ||
105 | + if err != nil { | ||
106 | + queryErr = err | ||
107 | + break | ||
108 | + } | ||
109 | + mp := result.ToMapString() | ||
110 | + if len(mp) == 0 { | ||
111 | + break | ||
112 | + } | ||
113 | + allResult = append(allResult, mp...) | ||
114 | + startRow += 1000 | ||
115 | + } | ||
116 | + if queryErr != nil { | ||
117 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
118 | + } | ||
119 | + var ( | ||
120 | + materialModels []models.MaterialK3cloud | ||
121 | + materialTemp models.MaterialK3cloud | ||
122 | + ) | ||
123 | + nowTime := time.Now() | ||
124 | + for _, item := range allResult { | ||
125 | + materialId, err := strconv.Atoi(item["FMATERIALID"]) | ||
126 | + if err != nil { | ||
127 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
128 | + } | ||
129 | + fErpClsID, _ := strconv.Atoi(item["FErpClsID"]) | ||
130 | + fBaseUnitId, _ := strconv.Atoi(item["FBaseUnitId"]) | ||
131 | + materialGroup, _ := strconv.Atoi(item["MaterialGroup"]) | ||
132 | + fUseOrgId, _ := strconv.Atoi(item["FUseOrgId"]) | ||
133 | + refStatus, _ := strconv.Atoi(item["RefStatus"]) | ||
134 | + fCreateDate, _ := time.Parse("2006-01-02T15:04:05.999", item["FCreateDate"]) | ||
135 | + fModifyDate, _ := time.Parse("2006-01-02T15:04:05.999", item["FModifyDate"]) | ||
136 | + fForbidDate, _ := time.Parse("2006-01-02T15:04:05.999", item["FForbidDate"]) | ||
137 | + fApproveDate, _ := time.Parse("2006-01-02T15:04:05.999", item["FApproveDate"]) | ||
138 | + materialTemp = models.MaterialK3cloud{ | ||
139 | + MaterialId: materialId, | ||
140 | + Name: item["FName"], | ||
141 | + Number: item["FNumber"], | ||
142 | + Specification: item["FSpecification"], | ||
143 | + ForbidStatus: item["FForbidStatus"], | ||
144 | + ErpClsId: fErpClsID, | ||
145 | + BaseUnitId: fBaseUnitId, | ||
146 | + BaseUnitName: item["FBaseUnitId.FName"], | ||
147 | + CreateDate: fCreateDate, | ||
148 | + ModifyDate: fModifyDate, | ||
149 | + ForbidDate: fForbidDate, | ||
150 | + ApproveDate: fApproveDate, | ||
151 | + MaterialGroup: materialGroup, | ||
152 | + MaterialGroupNumber: item["FMaterialGroup.FNumber"], | ||
153 | + MaterialGroupName: item["FMaterialGroup.FName"], | ||
154 | + RefStatus: refStatus, | ||
155 | + UseOrgId: fUseOrgId, | ||
156 | + UseOrgName: item["FUseOrgId.FName"], | ||
157 | + JoinProductId: 0, | ||
158 | + DataVersion: nowTime.Unix(), | ||
159 | + } | ||
160 | + materialModels = append(materialModels, materialTemp) | ||
161 | + } | ||
162 | + var ( | ||
163 | + materialDao *dao.MaterialK3cloudDao | ||
164 | + ) | ||
165 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
166 | + if err != nil { | ||
167 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
168 | + } | ||
169 | + if err := transactionContext.StartTransaction(); err != nil { | ||
170 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
171 | + } | ||
172 | + defer func() { | ||
173 | + transactionContext.RollbackTransaction() | ||
174 | + }() | ||
175 | + materialDao, err = dao.NewMaterialK3cloudDao(transactionContext.(*pgTransaction.TransactionContext)) | ||
176 | + if err != nil { | ||
177 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
178 | + } | ||
179 | + //同步MaterialK3cloud表数据 | ||
180 | + err = materialDao.SyncDataMaterialK3cloud(materialModels) | ||
181 | + if err != nil { | ||
182 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
183 | + } | ||
184 | + //MaterialK3cloud表数据到Proudct表 | ||
185 | + err = materialDao.SyncDataProudct(nowTime.Unix()) | ||
186 | + if err != nil { | ||
187 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
188 | + } | ||
189 | + if err = transactionContext.CommitTransaction(); err != nil { | ||
190 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
191 | + } | ||
192 | + return nil | ||
193 | +} | ||
194 | + | ||
195 | +//PullMaterialGroup 拉取物料分组 | ||
196 | +func (srv *PullDataK3CloudService) PullMaterialGroup() error { | ||
197 | + client, err := newK3cloudClient() | ||
198 | + if err != nil { | ||
199 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
200 | + } | ||
201 | + fieldKeys := []string{ | ||
202 | + "FID", "FNumber", "FName", "FParentId", | ||
203 | + } | ||
204 | + var ( | ||
205 | + startRow int | ||
206 | + allResult []map[string]string | ||
207 | + queryErr error | ||
208 | + ) | ||
209 | + for { | ||
210 | + result, err := client.ExecuteBillQuery(k3cloud.RequestExecuteBillQuery{ | ||
211 | + FormId: "SAL_MATERIALGROUP", | ||
212 | + Data: k3cloud.ExecuteBillQueryData{ | ||
213 | + FormId: "SAL_MATERIALGROUP", | ||
214 | + FieldKeys: strings.Join(fieldKeys, ","), //查询的字段 | ||
215 | + StartRow: startRow, | ||
216 | + Limit: 1000, | ||
217 | + }, | ||
218 | + }) | ||
219 | + if err != nil { | ||
220 | + queryErr = err | ||
221 | + break | ||
222 | + } | ||
223 | + mp := result.ToMapString() | ||
224 | + if len(mp) == 0 { | ||
225 | + break | ||
226 | + } | ||
227 | + allResult = append(allResult, mp...) | ||
228 | + startRow += 1000 | ||
229 | + } | ||
230 | + if queryErr != nil { | ||
231 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
232 | + } | ||
233 | + | ||
234 | + var ( | ||
235 | + materialGroups []models.MaterialGroupK3cloud | ||
236 | + materialGroupTemp models.MaterialGroupK3cloud | ||
237 | + ) | ||
238 | + nowTime := time.Now() | ||
239 | + for _, item := range allResult { | ||
240 | + id, _ := strconv.Atoi(item["FID"]) | ||
241 | + fParentId, _ := strconv.Atoi(item["FParentId"]) | ||
242 | + materialGroupTemp = models.MaterialGroupK3cloud{ | ||
243 | + Id: id, | ||
244 | + ParentId: fParentId, | ||
245 | + Number: item["FNumber"], | ||
246 | + Name: item["FName"], | ||
247 | + DataVersion: nowTime.Unix(), | ||
248 | + } | ||
249 | + materialGroups = append(materialGroups, materialGroupTemp) | ||
250 | + } | ||
251 | + | ||
252 | + var ( | ||
253 | + materialGroupDao *dao.MaterialGroupK3cloudDao | ||
254 | + ) | ||
255 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
256 | + if err != nil { | ||
257 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
258 | + } | ||
259 | + if err := transactionContext.StartTransaction(); err != nil { | ||
260 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
261 | + } | ||
262 | + defer func() { | ||
263 | + transactionContext.RollbackTransaction() | ||
264 | + }() | ||
265 | + materialGroupDao, err = dao.NewMaterialGroupK3cloudDao(transactionContext.(*pgTransaction.TransactionContext)) | ||
266 | + if err != nil { | ||
267 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
268 | + } | ||
269 | + //记录到MaterialGroupK3cloud表 | ||
270 | + err = materialGroupDao.SyncDataMaterialGroupK3cloud(materialGroups) | ||
271 | + if err != nil { | ||
272 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
273 | + } | ||
274 | + if err = transactionContext.CommitTransaction(); err != nil { | ||
275 | + return application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
276 | + } | ||
277 | + return nil | ||
278 | +} |
pkg/constant/.gitignore
0 → 100644
1 | +/postgresql_local.go |
1 | +package dao |
1 | +package dao | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "strconv" | ||
6 | + "strings" | ||
7 | + | ||
8 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
10 | +) | ||
11 | + | ||
12 | +type MaterialGroupK3cloudDao struct { | ||
13 | + transactionContext *pgTransaction.TransactionContext | ||
14 | +} | ||
15 | + | ||
16 | +func NewMaterialGroupK3cloudDao(transactionContext *pgTransaction.TransactionContext) (*MaterialGroupK3cloudDao, error) { | ||
17 | + if transactionContext == nil { | ||
18 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
19 | + } else { | ||
20 | + return &MaterialGroupK3cloudDao{ | ||
21 | + transactionContext: transactionContext, | ||
22 | + }, nil | ||
23 | + } | ||
24 | +} | ||
25 | + | ||
26 | +//SyncDataMaterialGroupK3cloud 同步MaterialGroupK3cloud表 物料分组数据 | ||
27 | +func (d *MaterialGroupK3cloudDao) SyncDataMaterialGroupK3cloud(data []models.MaterialGroupK3cloud) error { | ||
28 | + sqlValues := []string{} | ||
29 | + var strTemp []string | ||
30 | + for i := range data { | ||
31 | + strTemp = make([]string, 0, 5) | ||
32 | + strTemp = append(strTemp, strconv.Itoa(data[i].Id)) | ||
33 | + strTemp = append(strTemp, strconv.Itoa(data[i].ParentId)) | ||
34 | + strTemp = append(strTemp, `'`+data[i].Number+`'`) | ||
35 | + strTemp = append(strTemp, `'`+data[i].Name+`'`) | ||
36 | + strTemp = append(strTemp, strconv.Itoa(int(data[i].DataVersion))) | ||
37 | + sqlValues = append(sqlValues, "("+strings.Join(strTemp, ",")+")") | ||
38 | + } | ||
39 | + var valueTemp []string | ||
40 | + for i := 0; i < len(sqlValues); i += 100 { | ||
41 | + if i <= len(sqlValues)-100 { | ||
42 | + valueTemp = sqlValues[i : i+100] | ||
43 | + } else { | ||
44 | + valueTemp = sqlValues[i:] | ||
45 | + } | ||
46 | + sql := `INSERT INTO "manufacture"."material_group_k3cloud" ( | ||
47 | + "id","parent_id","number","name","data_version") | ||
48 | + VALUES ` + strings.Join(valueTemp, ",") + ` | ||
49 | + ON conflict ( "id" ) DO | ||
50 | + UPDATE | ||
51 | + SET ( | ||
52 | + "parent_id","number","name","data_version") = ( | ||
53 | + EXCLUDED."parent_id",EXCLUDED."number", | ||
54 | + EXCLUDED."name",EXCLUDED."data_version" )` | ||
55 | + _, err := d.transactionContext.PgTx.Exec(sql) | ||
56 | + if err != nil { | ||
57 | + return err | ||
58 | + } | ||
59 | + } | ||
60 | + | ||
61 | + return nil | ||
62 | +} |
1 | package dao | 1 | package dao |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | + "fmt" | ||
5 | + "strconv" | ||
6 | + "strings" | ||
7 | + | ||
4 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 8 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
5 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | 9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" |
6 | ) | 10 | ) |
@@ -9,6 +13,16 @@ type MaterialK3cloudDao struct { | @@ -9,6 +13,16 @@ type MaterialK3cloudDao struct { | ||
9 | transactionContext *pgTransaction.TransactionContext | 13 | transactionContext *pgTransaction.TransactionContext |
10 | } | 14 | } |
11 | 15 | ||
16 | +func NewMaterialK3cloudDao(transactionContext *pgTransaction.TransactionContext) (*MaterialK3cloudDao, error) { | ||
17 | + if transactionContext == nil { | ||
18 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
19 | + } else { | ||
20 | + return &MaterialK3cloudDao{ | ||
21 | + transactionContext: transactionContext, | ||
22 | + }, nil | ||
23 | + } | ||
24 | +} | ||
25 | + | ||
12 | //SyncDataMaterialK3cloud 同步MaterialK3cloud表数据 | 26 | //SyncDataMaterialK3cloud 同步MaterialK3cloud表数据 |
13 | func (d *MaterialK3cloudDao) SyncDataMaterialK3cloud(data []models.MaterialK3cloud) error { | 27 | func (d *MaterialK3cloudDao) SyncDataMaterialK3cloud(data []models.MaterialK3cloud) error { |
14 | // -- 插入或者更新 | 28 | // -- 插入或者更新 |
@@ -35,25 +49,119 @@ func (d *MaterialK3cloudDao) SyncDataMaterialK3cloud(data []models.MaterialK3clo | @@ -35,25 +49,119 @@ func (d *MaterialK3cloudDao) SyncDataMaterialK3cloud(data []models.MaterialK3clo | ||
35 | // EXCLUDED."forbid_date",EXCLUDED."approve_date",EXCLUDED."material_group", | 49 | // EXCLUDED."forbid_date",EXCLUDED."approve_date",EXCLUDED."material_group", |
36 | // EXCLUDED."material_group_number",EXCLUDED."material_group_name", | 50 | // EXCLUDED."material_group_number",EXCLUDED."material_group_name", |
37 | // EXCLUDED."ref_status ",EXCLUDED."data_version" ) | 51 | // EXCLUDED."ref_status ",EXCLUDED."data_version" ) |
52 | + sqlValues := []string{} | ||
53 | + var strTemp []string | ||
54 | + for i := range data { | ||
55 | + strTemp = make([]string, 0, 18) | ||
56 | + strTemp = append(strTemp, strconv.Itoa(data[i].MaterialId)) | ||
57 | + strTemp = append(strTemp, `'`+data[i].Name+`'`) | ||
58 | + strTemp = append(strTemp, `'`+data[i].Number+`'`) | ||
59 | + strTemp = append(strTemp, `'`+data[i].Specification+`'`) | ||
60 | + strTemp = append(strTemp, `'`+data[i].ForbidStatus+`'`) | ||
61 | + strTemp = append(strTemp, strconv.Itoa(data[i].ErpClsId)) | ||
62 | + strTemp = append(strTemp, strconv.Itoa(data[i].BaseUnitId)) | ||
63 | + strTemp = append(strTemp, `'`+data[i].BaseUnitName+`'`) | ||
64 | + if data[i].CreateDate.IsZero() { | ||
65 | + strTemp = append(strTemp, `NULL`) | ||
66 | + } else { | ||
67 | + strTemp = append(strTemp, `'`+data[i].CreateDate.Format("2006-01-02 15:04:05.999")+`'`) | ||
68 | + } | ||
69 | + if data[i].ModifyDate.IsZero() { | ||
70 | + strTemp = append(strTemp, `NULL`) | ||
71 | + } else { | ||
72 | + strTemp = append(strTemp, `'`+data[i].ModifyDate.Format("2006-01-02 15:04:05.999")+`'`) | ||
73 | + } | ||
74 | + if data[i].ForbidDate.IsZero() { | ||
75 | + strTemp = append(strTemp, `NULL`) | ||
76 | + } else { | ||
77 | + strTemp = append(strTemp, `'`+data[i].ForbidDate.Format("2006-01-02 15:04:05.999")+`'`) | ||
78 | + } | ||
79 | + if data[i].ApproveDate.IsZero() { | ||
80 | + strTemp = append(strTemp, `NULL`) | ||
81 | + } else { | ||
82 | + strTemp = append(strTemp, `'`+data[i].ApproveDate.Format("2006-01-02 15:04:05.999")+`'`) | ||
83 | + } | ||
84 | + strTemp = append(strTemp, strconv.Itoa(data[i].MaterialGroup)) | ||
85 | + strTemp = append(strTemp, `'`+data[i].MaterialGroupNumber+`'`) | ||
86 | + strTemp = append(strTemp, `'`+data[i].MaterialGroupName+`'`) | ||
87 | + strTemp = append(strTemp, strconv.Itoa(data[i].RefStatus)) | ||
88 | + //关联的产品表id ,使用 product 产品表的自增序列表 | ||
89 | + strTemp = append(strTemp, "nextval('manufacture.product_product_id_seq'::regclass)") | ||
90 | + strTemp = append(strTemp, strconv.Itoa(int(data[i].DataVersion))) | ||
91 | + strTemp = append(strTemp, strconv.Itoa(data[i].UseOrgId)) | ||
92 | + strTemp = append(strTemp, `'`+data[i].UseOrgName+`'`) | ||
93 | + sqlValues = append(sqlValues, "("+strings.Join(strTemp, ",")+")") | ||
94 | + | ||
95 | + } | ||
96 | + var valueTemp []string | ||
97 | + for i := 0; i < len(sqlValues); i += 100 { | ||
98 | + if i <= len(sqlValues)-100 { | ||
99 | + valueTemp = sqlValues[i : i+100] | ||
100 | + } else { | ||
101 | + valueTemp = sqlValues[i:] | ||
102 | + } | ||
103 | + sql := `INSERT INTO "manufacture"."material_k3cloud" ( | ||
104 | + "material_id","name","number","specification","forbid_status", | ||
105 | + "erp_cls_id","base_unit_id","base_unit_name","create_date", | ||
106 | + "modify_date","forbid_date","approve_date","material_group", | ||
107 | + "material_group_number","material_group_name","ref_status", | ||
108 | + "join_product_id","data_version","use_org_id","use_org_name" ) | ||
109 | + VALUES ` + strings.Join(valueTemp, ",") + | ||
110 | + ` ON conflict ( material_id ) DO | ||
111 | + UPDATE | ||
112 | + SET ( | ||
113 | + "name","number","specification","forbid_status","erp_cls_id", | ||
114 | + "base_unit_id","base_unit_name","create_date","modify_date", | ||
115 | + "forbid_date","approve_date","material_group","material_group_number", | ||
116 | + "material_group_name","ref_status","data_version","use_org_id","use_org_name" ) = ( | ||
117 | + EXCLUDED."name",EXCLUDED."number",EXCLUDED."specification", | ||
118 | + EXCLUDED."forbid_status",EXCLUDED."erp_cls_id",EXCLUDED."base_unit_id", | ||
119 | + EXCLUDED."base_unit_name",EXCLUDED."create_date",EXCLUDED."modify_date", | ||
120 | + EXCLUDED."forbid_date",EXCLUDED."approve_date",EXCLUDED."material_group", | ||
121 | + EXCLUDED."material_group_number",EXCLUDED."material_group_name", | ||
122 | + EXCLUDED."ref_status",EXCLUDED."data_version",EXCLUDED."use_org_id",EXCLUDED."use_org_name")` | ||
123 | + _, err := d.transactionContext.PgTx.Exec(sql) | ||
124 | + if err != nil { | ||
125 | + return err | ||
126 | + } | ||
127 | + } | ||
128 | + | ||
38 | return nil | 129 | return nil |
39 | } | 130 | } |
40 | 131 | ||
41 | -//SyncDataProudct 同步Proudct表数据 | ||
42 | -func (d *MaterialK3cloudDao) SyncDataProudct(version int) error { | 132 | +//SyncDataProudct 同步MaterialK3cloud表数据到Proudct表 |
133 | +func (d *MaterialK3cloudDao) SyncDataProudct(version int64) error { | ||
43 | // -- 插入或者更新 | 134 | // -- 插入或者更新 |
44 | - // INSERT INTO "manufacture"."product"( | ||
45 | - // "company_id", "org_id", "product_id", "product_code", "product_name", | ||
46 | - // "product_category", "product_spec", "created_at", "updated_at" | ||
47 | - // ) | ||
48 | - // SELECT 0,0,"join_product_id","number","name","material_group_name",'{}',now(),now() | ||
49 | - // FROM "manufacture"."material_k3cloud" WHERE "data_version"=0000 | ||
50 | - // ON conflict ( product_id ) DO | ||
51 | - // UPDATE | ||
52 | - // SET ( | ||
53 | - // "company_id", "org_id", "product_id", "product_code", "product_name", | ||
54 | - // "product_category", "product_spec", "created_at", "updated_at")=( | ||
55 | - // EXCLUDED."company_id", EXCLUDED."org_id",EXCLUDED."product_id", | ||
56 | - // EXCLUDED."product_code",EXCLUDED."product_name",EXCLUDED."product_category", | ||
57 | - // EXCLUDED."product_spec", EXCLUDED."created_at", EXCLUDED."updated_at") | ||
58 | - return nil | 135 | + sql := `INSERT INTO "manufacture"."product"( |
136 | + "company_id", "org_id", "product_id", "product_code", "product_name", | ||
137 | + "product_category", "product_spec", "created_at", "updated_at" | ||
138 | + ) | ||
139 | + SELECT 0,use_org_id,"join_product_id","number","name","material_group_name", | ||
140 | + json_build_object('unit',specification),now(),now() | ||
141 | + FROM "manufacture"."material_k3cloud" WHERE "data_version"=? AND "material_group_number" LIKE '05%' | ||
142 | + ON conflict ( product_id ) DO | ||
143 | + UPDATE | ||
144 | + SET ( | ||
145 | + "company_id", "org_id", "product_id", "product_code", "product_name", | ||
146 | + "product_category", "product_spec", "updated_at")=( | ||
147 | + EXCLUDED."company_id", EXCLUDED."org_id",EXCLUDED."product_id", | ||
148 | + EXCLUDED."product_code",EXCLUDED."product_name",EXCLUDED."product_category", | ||
149 | + EXCLUDED."product_spec", EXCLUDED."updated_at") ` | ||
150 | + _, err := d.transactionContext.PgTx.Exec(sql, version) | ||
151 | + return err | ||
152 | +} | ||
153 | + | ||
154 | +func (d *MaterialK3cloudDao) GetLastVersion() (int64, error) { | ||
155 | + var materialData []models.MaterialK3cloud | ||
156 | + err := d.transactionContext.PgTx.Model(&materialData). | ||
157 | + Order("data_version DESC"). | ||
158 | + Limit(1). | ||
159 | + Select() | ||
160 | + if err != nil { | ||
161 | + return 0, err | ||
162 | + } | ||
163 | + if len(materialData) == 0 { | ||
164 | + return 0, nil | ||
165 | + } | ||
166 | + return materialData[0].DataVersion, nil | ||
59 | } | 167 | } |
@@ -2,11 +2,12 @@ package pg | @@ -2,11 +2,12 @@ package pg | ||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "fmt" | 4 | "fmt" |
5 | + "reflect" | ||
6 | + | ||
5 | "github.com/go-pg/pg/v10" | 7 | "github.com/go-pg/pg/v10" |
6 | "github.com/go-pg/pg/v10/orm" | 8 | "github.com/go-pg/pg/v10/orm" |
7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | 9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" |
8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | 10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" |
9 | - "reflect" | ||
10 | 11 | ||
11 | "github.com/linmadan/egglib-go/persistent/pg/hooks" | 12 | "github.com/linmadan/egglib-go/persistent/pg/hooks" |
12 | ) | 13 | ) |
@@ -35,6 +36,8 @@ func init() { | @@ -35,6 +36,8 @@ func init() { | ||
35 | (*models.ProductRecord)(nil), | 36 | (*models.ProductRecord)(nil), |
36 | (*models.UnitConversion)(nil), | 37 | (*models.UnitConversion)(nil), |
37 | (*models.Workshop)(nil), | 38 | (*models.Workshop)(nil), |
39 | + (*models.MaterialK3cloud)(nil), | ||
40 | + (*models.MaterialGroupK3cloud)(nil), | ||
38 | } { | 41 | } { |
39 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ | 42 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ |
40 | Temp: false, | 43 | Temp: false, |
@@ -8,7 +8,7 @@ type DataLogK3cloud struct { | @@ -8,7 +8,7 @@ type DataLogK3cloud struct { | ||
8 | FormId string `comment:"formId" pg:"form_id"` | 8 | FormId string `comment:"formId" pg:"form_id"` |
9 | RequestParam string `comment:"请求参数" pg:"request_param"` | 9 | RequestParam string `comment:"请求参数" pg:"request_param"` |
10 | BeginAt int64 `comment:"开始时间" pg:"begin_at"` | 10 | BeginAt int64 `comment:"开始时间" pg:"begin_at"` |
11 | - EndAt int64 `comment:"结束时间" pg:"begin_at"` | 11 | + EndAt int64 `comment:"结束时间" pg:"end_at"` |
12 | DataVersion int64 `comment:"数据版本" pg:"data_version"` | 12 | DataVersion int64 `comment:"数据版本" pg:"data_version"` |
13 | IsSuccess int `comment:"是否成功" pg:"is_success"` | 13 | IsSuccess int `comment:"是否成功" pg:"is_success"` |
14 | Error string `comment:"错误信息" pg:"error"` | 14 | Error string `comment:"错误信息" pg:"error"` |
@@ -3,9 +3,9 @@ package models | @@ -3,9 +3,9 @@ package models | ||
3 | //MaterialGroupK3cloud 采集自金蝶k3cloud物料分组数据 | 3 | //MaterialGroupK3cloud 采集自金蝶k3cloud物料分组数据 |
4 | type MaterialGroupK3cloud struct { | 4 | type MaterialGroupK3cloud struct { |
5 | tableName string `comment:"采集自金蝶k3cloud物料数据" pg:"manufacture.material_group_k3cloud,alias:material_group_k3cloud"` | 5 | tableName string `comment:"采集自金蝶k3cloud物料数据" pg:"manufacture.material_group_k3cloud,alias:material_group_k3cloud"` |
6 | - Id int64 `pg:",pk"` | 6 | + Id int `pg:",pk"` |
7 | Number string `comment:"分组编码" pg:"number"` | 7 | Number string `comment:"分组编码" pg:"number"` |
8 | Name string `comment:"分组名称" pg:"name"` | 8 | Name string `comment:"分组名称" pg:"name"` |
9 | - ParentId int64 `comment:"父级id" pg:"parent_id"` | 9 | + ParentId int `comment:"父级id" pg:"parent_id"` |
10 | DataVersion int64 `comment:"数据版本" pg:"data_version"` | 10 | DataVersion int64 `comment:"数据版本" pg:"data_version"` |
11 | } | 11 | } |
1 | package models | 1 | package models |
2 | 2 | ||
3 | +import "time" | ||
4 | + | ||
3 | //MaterialK3cloud 采集自金蝶k3cloud物料数据 | 5 | //MaterialK3cloud 采集自金蝶k3cloud物料数据 |
4 | type MaterialK3cloud struct { | 6 | type MaterialK3cloud struct { |
5 | - tableName string `comment:"采集自金蝶k3cloud物料数据" pg:"manufacture.material_k3cloud,alias:material_k3cloud"` | ||
6 | - MaterialId int64 `pg:",pk"` | ||
7 | - Name string `comment:"物料名称" pg:"name"` | ||
8 | - Number string `comment:"物料编码" pg:"number"` | ||
9 | - Specification string `comment:"规格型号" pg:"specification"` | ||
10 | - ForbidStatus string `comment:"禁用状态,"A":否,"B":是" pg:"forbid_status"` | ||
11 | - ErpClsId int `comment:"物料属性" pg:"erp_cls_id"` | ||
12 | - BaseUnitId int `comment:"基本单位" pg:"base_unit_id"` | ||
13 | - BaseUnitName string `comment:"基本单位名称" pg:"base_unit_name"` | ||
14 | - CreateDate string `comment:"创建时间" pg:"create_date"` | ||
15 | - ModifyDate string `comment:"修改时间" pg:"modify_date"` | ||
16 | - ForbidDate string `comment:"禁用时间" pg:"forbid_date"` | ||
17 | - ApproveDate string `comment:"审核时间" pg:"approve_date"` | ||
18 | - MaterialGroup int `comment:"物料分组" pg:"material_group"` | ||
19 | - MaterialGroupNumber string `comment:"物料分组编码" pg:"material_group_number"` | ||
20 | - MaterialGroupName string `comment:"物料分组名称" pg:"material_group_name"` | ||
21 | - RefStatus int `comment:"是否使用" pg:"ref_status"` | ||
22 | - JoinProductId int64 `comment:"关联的product表id" pg:"join_product_id"` | ||
23 | - DataVersion int64 `comment:"数据版本" pg:"data_version"` | 7 | + tableName string `comment:"采集自金蝶k3cloud物料数据" pg:"manufacture.material_k3cloud,alias:material_k3cloud"` |
8 | + MaterialId int `pg:",pk"` | ||
9 | + Name string `comment:"物料名称" pg:"name"` | ||
10 | + Number string `comment:"物料编码" pg:"number"` | ||
11 | + Specification string `comment:"规格型号" pg:"specification"` | ||
12 | + ForbidStatus string `comment:"禁用状态,"A":否,"B":是" pg:"forbid_status"` | ||
13 | + ErpClsId int `comment:"物料属性" pg:"erp_cls_id"` | ||
14 | + BaseUnitId int `comment:"基本单位" pg:"base_unit_id"` | ||
15 | + BaseUnitName string `comment:"基本单位名称" pg:"base_unit_name"` | ||
16 | + CreateDate time.Time `comment:"创建时间" pg:"create_date,type:timestamp"` | ||
17 | + ModifyDate time.Time `comment:"修改时间" pg:"modify_date,type:timestamp"` | ||
18 | + ForbidDate time.Time `comment:"禁用时间" pg:"forbid_date,type:timestamp"` | ||
19 | + ApproveDate time.Time `comment:"审核时间" pg:"approve_date,type:timestamp"` | ||
20 | + MaterialGroup int `comment:"物料分组" pg:"material_group"` | ||
21 | + MaterialGroupNumber string `comment:"物料分组编码" pg:"material_group_number"` | ||
22 | + MaterialGroupName string `comment:"物料分组名称" pg:"material_group_name"` | ||
23 | + RefStatus int `comment:"是否使用" pg:"ref_status"` | ||
24 | + UseOrgId int `comment:"使用组织" pg:"use_org_id"` | ||
25 | + UseOrgName string `comment:"使用组织" pg:"use_org_name"` | ||
26 | + JoinProductId int64 `comment:"关联的product表id" pg:"join_product_id"` | ||
27 | + DataVersion int64 `comment:"数据版本" pg:"data_version"` | ||
24 | } | 28 | } |
25 | 29 | ||
26 | //批量处理sql脚本样例 | 30 | //批量处理sql脚本样例 |
1 | package k3cloud | 1 | package k3cloud |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | + "strings" | ||
4 | "testing" | 5 | "testing" |
5 | ) | 6 | ) |
6 | 7 | ||
@@ -34,13 +35,20 @@ func TestExecuteBillQuery(t *testing.T) { | @@ -34,13 +35,20 @@ func TestExecuteBillQuery(t *testing.T) { | ||
34 | // {"FApproveDate", "审核日期"}, {"FOldNumber", "旧物料编码"}, {"FMaterialGroup", "物料分组"}, {"FPLMMaterialId", "PLM物料内码"}, {"FMaterialSRC", "物料来源"}, | 35 | // {"FApproveDate", "审核日期"}, {"FOldNumber", "旧物料编码"}, {"FMaterialGroup", "物料分组"}, {"FPLMMaterialId", "PLM物料内码"}, {"FMaterialSRC", "物料来源"}, |
35 | // {"FIsSalseByNet", "是否网销"}, {"FIsAutoAllocate", "自动分配"}, {"FSPUID", "SPU信息"}, {"FPinYin", "拼音"}, {"FDSMatchByLot", "按批号匹配供需"}, | 36 | // {"FIsSalseByNet", "是否网销"}, {"FIsAutoAllocate", "自动分配"}, {"FSPUID", "SPU信息"}, {"FPinYin", "拼音"}, {"FDSMatchByLot", "按批号匹配供需"}, |
36 | // {"FForbidReson", "禁用原因"}, {"FRefStatus", "已使用"}} | 37 | // {"FForbidReson", "禁用原因"}, {"FRefStatus", "已使用"}} |
38 | + fieldKeys := []string{ | ||
39 | + "FMATERIALID", "FSpecification", "FName", "FNumber", | ||
40 | + "FDocumentStatus", "FForbidStatus", "FErpClsID", | ||
41 | + "FBaseUnitId", "FBaseUnitId.FName", "FCreateDate", "FModifyDate", | ||
42 | + "FForbidDate", "FApproveDate", "FMaterialGroup", "FMaterialGroup.FName", | ||
43 | + "FRefStatus", "FMaterialGroup.FNumber", "FUseOrgId", "FUseOrgId.FName", | ||
44 | + } | ||
37 | result, err := client.ExecuteBillQuery(RequestExecuteBillQuery{ | 45 | result, err := client.ExecuteBillQuery(RequestExecuteBillQuery{ |
38 | FormId: "BD_MATERIAL", | 46 | FormId: "BD_MATERIAL", |
39 | Data: ExecuteBillQueryData{ | 47 | Data: ExecuteBillQueryData{ |
40 | FormId: "BD_MATERIAL", | 48 | FormId: "BD_MATERIAL", |
41 | - FieldKeys: "FMATERIALID,FSpecification,FName,FNumber,FModifyDate,FBaseUnitId.FName,FUseOrgId.FName", //查询的字段 | 49 | + FieldKeys: strings.Join(fieldKeys, ","), //查询的字段 |
42 | TopRowCount: 5, | 50 | TopRowCount: 5, |
43 | - FilterString: `FMaterialGroup.FNumber like '05%' and FModifyDate<'2022-01-08T19:36:06'`, | 51 | + FilterString: "", |
44 | }, | 52 | }, |
45 | }) | 53 | }) |
46 | t.Logf("result buf===> %s \n", string(result.Buf)) | 54 | t.Logf("result buf===> %s \n", string(result.Buf)) |
1 | +package controllers | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/linmadan/egglib-go/web/beego" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/syncdata" | ||
6 | +) | ||
7 | + | ||
8 | +type TestController struct { | ||
9 | + beego.BaseController | ||
10 | +} | ||
11 | + | ||
12 | +func (c *TestController) InvokPullMaterialNewest() { | ||
13 | + srv := syncdata.PullDataK3CloudService{} | ||
14 | + err := srv.PullMaterialNewest() | ||
15 | + c.Response(nil, err) | ||
16 | +} | ||
17 | + | ||
18 | +func (c *TestController) InvokPullMaterialGroup() { | ||
19 | + srv := syncdata.PullDataK3CloudService{} | ||
20 | + err := srv.PullMaterialGroup() | ||
21 | + c.Response(nil, err) | ||
22 | +} |
pkg/port/beego/routers/test_router.go
0 → 100644
1 | +package routers | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/beego/beego/v2/server/web" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/port/beego/controllers" | ||
6 | +) | ||
7 | + | ||
8 | +func init() { | ||
9 | + web.Router("/TestController/PullMaterialNewest", &controllers.TestController{}, "Get:InvokPullMaterialNewest") | ||
10 | + web.Router("/TestController/PullMaterialGroup", &controllers.TestController{}, "Get:InvokPullMaterialGroup") | ||
11 | +} |
-
请 注册 或 登录 后发表评论