Merge branch 'dev' of http://gitlab.fjmaimaimai.com/allied-creation/allied-creat…
…ion-manufacture into dev
正在显示
47 个修改的文件
包含
771 行增加
和
125 行删除
@@ -98,3 +98,23 @@ spec: | @@ -98,3 +98,23 @@ spec: | ||
98 | value: "8082" | 98 | value: "8082" |
99 | - name: SERVICE_ENV | 99 | - name: SERVICE_ENV |
100 | value: "dev" | 100 | value: "dev" |
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" |
@@ -20,9 +20,6 @@ import ( | @@ -20,9 +20,6 @@ import ( | ||
20 | ) | 20 | ) |
21 | 21 | ||
22 | func main() { | 22 | func main() { |
23 | - log.Logger.Info("server start ....") | ||
24 | - log.Logger.Info(fmt.Sprintf("ENABLE_KAFKA_LOG:%v", constant.ENABLE_KAFKA_LOG)) | ||
25 | - | ||
26 | if constant.ENABLE_KAFKA_LOG { | 23 | if constant.ENABLE_KAFKA_LOG { |
27 | w, _ := logrus.NewKafkaWriter(constant.KAFKA_HOST, constant.TOPIC_LOG_STASH, false) | 24 | w, _ := logrus.NewKafkaWriter(constant.KAFKA_HOST, constant.TOPIC_LOG_STASH, false) |
28 | log.Logger.AddHook(w) | 25 | log.Logger.AddHook(w) |
@@ -34,6 +31,9 @@ func main() { | @@ -34,6 +31,9 @@ func main() { | ||
34 | }) | 31 | }) |
35 | log.Logger.AddHook(bw) | 32 | log.Logger.AddHook(bw) |
36 | redis.InitRedis() | 33 | redis.InitRedis() |
34 | + log.Logger.Debug("server start ....") | ||
35 | + log.Logger.Debug(fmt.Sprintf("ENABLE_KAFKA_LOG:%v", constant.ENABLE_KAFKA_LOG)) | ||
36 | + | ||
37 | go mqtt.Start() | 37 | go mqtt.Start() |
38 | go task.Run() | 38 | go task.Run() |
39 | cron := crontab.NewCrontabService(nil) | 39 | cron := crontab.NewCrontabService(nil) |
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 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_COMPANYID, 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 | +} |
@@ -37,7 +37,7 @@ func (crontabService *CrontabService) initTask() { | @@ -37,7 +37,7 @@ func (crontabService *CrontabService) initTask() { | ||
37 | }) | 37 | }) |
38 | task.AddTask("PullPrdMoK3cloud", PullPrdMoK3cloud) | 38 | task.AddTask("PullPrdMoK3cloud", PullPrdMoK3cloud) |
39 | 39 | ||
40 | - autoApproveAttendanceRecord := task.NewTask("autoApproveAttendanceRecord", "0 */1 * * * *", AutoApproveProductAttendanceRecord) | 40 | + autoApproveAttendanceRecord := task.NewTask("autoApproveAttendanceRecord", "0 */2 * * * *", AutoApproveProductAttendanceRecord) |
41 | task.AddTask("autoApproveAttendanceRecord", autoApproveAttendanceRecord) | 41 | task.AddTask("autoApproveAttendanceRecord", autoApproveAttendanceRecord) |
42 | 42 | ||
43 | autoApproveRecord := task.NewTask("autoApproveRecord", "0 */2 * * * *", AutoApproveProductRecord) | 43 | autoApproveRecord := task.NewTask("autoApproveRecord", "0 */2 * * * *", AutoApproveProductRecord) |
@@ -350,7 +350,7 @@ func (deviceService *DeviceService) SearchDevice(operateInfo *domain.OperateInfo | @@ -350,7 +350,7 @@ func (deviceService *DeviceService) SearchDevice(operateInfo *domain.OperateInfo | ||
350 | for i := range devices { | 350 | for i := range devices { |
351 | item := devices[i] | 351 | item := devices[i] |
352 | newJobDto := &dto.DeviceDto{} | 352 | newJobDto := &dto.DeviceDto{} |
353 | - item.WorkStation = workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId) | 353 | + newJobDto.WorkStation = workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId) |
354 | newJobDto.LoadDto(item, operateInfo.OrgId) | 354 | newJobDto.LoadDto(item, operateInfo.OrgId) |
355 | result = append(result, newJobDto) | 355 | result = append(result, newJobDto) |
356 | } | 356 | } |
@@ -328,8 +328,8 @@ func (productCalendarService *ProductCalendarService) UpdateProductCalendar(cmd | @@ -328,8 +328,8 @@ func (productCalendarService *ProductCalendarService) UpdateProductCalendar(cmd | ||
328 | } | 328 | } |
329 | 329 | ||
330 | // 返回工厂日历服务列表 | 330 | // 返回工厂日历服务列表 |
331 | -func (productCalendarService *ProductCalendarService) SearchProductCalendar(operateInfo *domain.OperateInfo, listProductCalendarQuery *query.SearchProductCalendarQuery) (int64, interface{}, error) { | ||
332 | - if err := listProductCalendarQuery.ValidateQuery(); err != nil { | 331 | +func (productCalendarService *ProductCalendarService) SearchProductCalendar(operateInfo *domain.OperateInfo, cmd *query.SearchProductCalendarQuery) (int64, interface{}, error) { |
332 | + if err := cmd.ValidateQuery(); err != nil { | ||
333 | return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | 333 | return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) |
334 | } | 334 | } |
335 | transactionContext, err := factory.CreateTransactionContext(nil) | 335 | transactionContext, err := factory.CreateTransactionContext(nil) |
@@ -345,7 +345,12 @@ func (productCalendarService *ProductCalendarService) SearchProductCalendar(oper | @@ -345,7 +345,12 @@ func (productCalendarService *ProductCalendarService) SearchProductCalendar(oper | ||
345 | var productCalendarRepository domain.ProductCalendarRepository | 345 | var productCalendarRepository domain.ProductCalendarRepository |
346 | productCalendarRepository, _, _ = factory.FastPgProductCalendar(transactionContext, 0) | 346 | productCalendarRepository, _, _ = factory.FastPgProductCalendar(transactionContext, 0) |
347 | 347 | ||
348 | - count, productCalendars, err := productCalendarRepository.Find(utils.ObjectToMap(listProductCalendarQuery)) | 348 | + workshops, _ := factory.FastPgWorkshops(transactionContext, operateInfo.CompanyId) |
349 | + queryOptions := utils.ObjectToMap(cmd) | ||
350 | + delete(queryOptions, "workshopName") | ||
351 | + queryOptions = workshops.FindByNameWithQuery(queryOptions, cmd.WorkshopName, "", "") | ||
352 | + | ||
353 | + count, productCalendars, err := productCalendarRepository.Find(queryOptions) | ||
349 | if err != nil { | 354 | if err != nil { |
350 | return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 355 | return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
351 | } | 356 | } |
@@ -358,6 +363,7 @@ func (productCalendarService *ProductCalendarService) SearchProductCalendar(oper | @@ -358,6 +363,7 @@ func (productCalendarService *ProductCalendarService) SearchProductCalendar(oper | ||
358 | item := productCalendars[i] | 363 | item := productCalendars[i] |
359 | newJobDto := &dto.ProductCalendarDto{} | 364 | newJobDto := &dto.ProductCalendarDto{} |
360 | newJobDto.LoadDto(item, operateInfo.OrgId) | 365 | newJobDto.LoadDto(item, operateInfo.OrgId) |
366 | + newJobDto.WorkStation = workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId) | ||
361 | result = append(result, newJobDto) | 367 | result = append(result, newJobDto) |
362 | } | 368 | } |
363 | 369 |
@@ -2,6 +2,7 @@ package dto | @@ -2,6 +2,7 @@ package dto | ||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 4 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils/converter" | ||
5 | "strings" | 6 | "strings" |
6 | ) | 7 | ) |
7 | 8 | ||
@@ -19,6 +20,7 @@ type ProductGroupEmployeesDto struct { | @@ -19,6 +20,7 @@ type ProductGroupEmployeesDto struct { | ||
19 | WorkOnDescription string `json:"workOn,omitempty"` | 20 | WorkOnDescription string `json:"workOn,omitempty"` |
20 | // 工作位置键值 (车间ID+'.'+生产线ID+'.'+工段ID) | 21 | // 工作位置键值 (车间ID+'.'+生产线ID+'.'+工段ID) |
21 | //WorkStationId string `json:"workStationId,omitempty"` | 22 | //WorkStationId string `json:"workStationId,omitempty"` |
23 | + UserNamePinyin string `json:"pinyin"` | ||
22 | } | 24 | } |
23 | 25 | ||
24 | func NewProductGroupEmployeesDto(group *domain.ProductGroup) []*ProductGroupEmployeesDto { | 26 | func NewProductGroupEmployeesDto(group *domain.ProductGroup) []*ProductGroupEmployeesDto { |
@@ -41,6 +43,9 @@ func NewGroupEmployee(group *domain.ProductGroup, u *domain.User) *ProductGroupE | @@ -41,6 +43,9 @@ func NewGroupEmployee(group *domain.ProductGroup, u *domain.User) *ProductGroupE | ||
41 | workOns := domain.WorkOnDescription(group.WorkOn) | 43 | workOns := domain.WorkOnDescription(group.WorkOn) |
42 | item.WorkOnDescription = strings.Join(workOns, ",") | 44 | item.WorkOnDescription = strings.Join(workOns, ",") |
43 | //item.WorkStationId = group.WorkStation.WorkStationId | 45 | //item.WorkStationId = group.WorkStation.WorkStationId |
46 | + if len(item.UserName) > 0 { | ||
47 | + item.UserNamePinyin = converter.ToPinYin(item.UserName, "") | ||
48 | + } | ||
44 | return item | 49 | return item |
45 | } | 50 | } |
46 | 51 | ||
@@ -72,3 +77,11 @@ func NewProductGroupEmployeesDtos() *ProductGroupEmployeesDtos { | @@ -72,3 +77,11 @@ func NewProductGroupEmployeesDtos() *ProductGroupEmployeesDtos { | ||
72 | MapResult: make(map[int]*ProductGroupEmployeesDto), | 77 | MapResult: make(map[int]*ProductGroupEmployeesDto), |
73 | } | 78 | } |
74 | } | 79 | } |
80 | + | ||
81 | +func (ms *ProductGroupEmployeesDtos) Len() int { return len(ms.Result) } | ||
82 | +func (ms *ProductGroupEmployeesDtos) Less(i, j int) bool { | ||
83 | + return ms.Result[i].UserNamePinyin < ms.Result[j].UserNamePinyin | ||
84 | +} | ||
85 | +func (ms *ProductGroupEmployeesDtos) Swap(i, j int) { | ||
86 | + ms.Result[i], ms.Result[j] = ms.Result[j], ms.Result[i] | ||
87 | +} |
@@ -11,6 +11,7 @@ import ( | @@ -11,6 +11,7 @@ import ( | ||
11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" | 12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" |
13 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | 13 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" |
14 | + "sort" | ||
14 | "time" | 15 | "time" |
15 | ) | 16 | ) |
16 | 17 | ||
@@ -358,7 +359,7 @@ func (productGroupService *ProductGroupService) SearchProductGroup(operateInfo * | @@ -358,7 +359,7 @@ func (productGroupService *ProductGroupService) SearchProductGroup(operateInfo * | ||
358 | item := productGroups[i] | 359 | item := productGroups[i] |
359 | newItem := &dto.ProductGroupDto{} | 360 | newItem := &dto.ProductGroupDto{} |
360 | newItem.LoadDto(productGroups[i], operateInfo.OrgId) | 361 | newItem.LoadDto(productGroups[i], operateInfo.OrgId) |
361 | - item.WorkStation = workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId) | 362 | + newItem.WorkStation = workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId) |
362 | results = append(results, newItem) | 363 | results = append(results, newItem) |
363 | } | 364 | } |
364 | if err := transactionContext.CommitTransaction(); err != nil { | 365 | if err := transactionContext.CommitTransaction(); err != nil { |
@@ -401,6 +402,7 @@ func (productGroupService *ProductGroupService) SearchProductGroupEmployees(oper | @@ -401,6 +402,7 @@ func (productGroupService *ProductGroupService) SearchProductGroupEmployees(oper | ||
401 | items := dto.NewProductGroupEmployeesDto(item) | 402 | items := dto.NewProductGroupEmployeesDto(item) |
402 | results.Append(items...) | 403 | results.Append(items...) |
403 | } | 404 | } |
405 | + sort.Stable(results) | ||
404 | if err := transactionContext.CommitTransaction(); err != nil { | 406 | if err := transactionContext.CommitTransaction(); err != nil { |
405 | return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 407 | return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
406 | } | 408 | } |
@@ -335,9 +335,11 @@ func (productJobService *ProductJobService) SearchProductJob(operateInfo *domain | @@ -335,9 +335,11 @@ func (productJobService *ProductJobService) SearchProductJob(operateInfo *domain | ||
335 | var result = make([]*dto.ProductJobDto, 0) | 335 | var result = make([]*dto.ProductJobDto, 0) |
336 | for i := range productJobs { | 336 | for i := range productJobs { |
337 | item := productJobs[i] | 337 | item := productJobs[i] |
338 | - item.WorkStation = workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId) | 338 | + |
339 | newJobDto := &dto.ProductJobDto{} | 339 | newJobDto := &dto.ProductJobDto{} |
340 | newJobDto.LoadDto(item, operateInfo.OrgId) | 340 | newJobDto.LoadDto(item, operateInfo.OrgId) |
341 | + newJobDto.WorkStation = workshops.FindWorkStation(item.WorkStation.WorkshopId, item.WorkStation.LineId, item.WorkStation.SectionId) | ||
342 | + newJobDto.WorkStation.Principal = item.WorkStation.Principal | ||
341 | result = append(result, newJobDto) | 343 | result = append(result, newJobDto) |
342 | } | 344 | } |
343 | return count, result, nil | 345 | return count, result, nil |
@@ -17,7 +17,7 @@ type CreateProductPlanCommand struct { | @@ -17,7 +17,7 @@ type CreateProductPlanCommand struct { | ||
17 | // 车间ID | 17 | // 车间ID |
18 | WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` | 18 | WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` |
19 | // 批号 | 19 | // 批号 |
20 | - BatchNumber string `cname:"批号" json:"batchNumber" valid:"Required"` | 20 | + BatchNumber string `cname:"批号" json:"batchNumber"` |
21 | // 生产日期 | 21 | // 生产日期 |
22 | ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"` | 22 | ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"` |
23 | // 上班班次 1:全天 2:白班 4:中班 8:夜班 | 23 | // 上班班次 1:全天 2:白班 4:中班 8:夜班 |
@@ -28,17 +28,14 @@ type CreateProductPlanCommand struct { | @@ -28,17 +28,14 @@ type CreateProductPlanCommand struct { | ||
28 | //PlanProductName string `cname:"计划的产品名称" json:"planProductName"` | 28 | //PlanProductName string `cname:"计划的产品名称" json:"planProductName"` |
29 | // 产品ID | 29 | // 产品ID |
30 | ProductId int `cname:"产品ID" json:"productId" valid:"Required"` | 30 | ProductId int `cname:"产品ID" json:"productId" valid:"Required"` |
31 | + // 投入量规格 默认份 | ||
32 | + DevotedUnit string `cname:"投入量规格" json:"devotedUnit" ` | ||
31 | // 数量(保留两位小数) | 33 | // 数量(保留两位小数) |
32 | Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` | 34 | Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` |
33 | - // 单位 | ||
34 | - //Unit string `cname:"单位" json:"unit" ` | ||
35 | - // 单份重量(原材料) | ||
36 | - //nitWeight float64 `cname:"单份重量(原材料)" json:"unitWeight" valid:"Required"` | ||
37 | // 重量 | 35 | // 重量 |
38 | Weight float64 `cname:"重量" json:"weight" valid:"Required"` | 36 | Weight float64 `cname:"重量" json:"weight" valid:"Required"` |
39 | // 备注 | 37 | // 备注 |
40 | Remark string `cname:"备注" json:"remark"` | 38 | Remark string `cname:"备注" json:"remark"` |
41 | - | ||
42 | // 生产日期 | 39 | // 生产日期 |
43 | ProductDateTime time.Time `cname:"生产日期" json:"-" ` | 40 | ProductDateTime time.Time `cname:"生产日期" json:"-" ` |
44 | } | 41 | } |
@@ -49,8 +46,8 @@ func (createProductPlanCommand *CreateProductPlanCommand) Valid(validation *vali | @@ -49,8 +46,8 @@ func (createProductPlanCommand *CreateProductPlanCommand) Valid(validation *vali | ||
49 | validation.Error(err.Error()) | 46 | validation.Error(err.Error()) |
50 | return | 47 | return |
51 | } | 48 | } |
52 | - if t, err := time.Parse("2006/01/02", createProductPlanCommand.ProductDate); err != nil { | ||
53 | - validation.Error("时间格式有误 2006/01/02") | 49 | + if t, err := time.Parse("2006-01-02", createProductPlanCommand.ProductDate); err != nil { |
50 | + validation.Error("时间格式有误" + createProductPlanCommand.ProductDate) | ||
54 | return | 51 | return |
55 | } else { | 52 | } else { |
56 | createProductPlanCommand.ProductDateTime = t | 53 | createProductPlanCommand.ProductDateTime = t |
@@ -19,7 +19,7 @@ type UpdateProductPlanCommand struct { | @@ -19,7 +19,7 @@ type UpdateProductPlanCommand struct { | ||
19 | // 车间ID | 19 | // 车间ID |
20 | WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` | 20 | WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` |
21 | // 批号 | 21 | // 批号 |
22 | - BatchNumber string `cname:"批号" json:"batchNumber" valid:"Required"` | 22 | + BatchNumber string `cname:"批号" json:"batchNumber"` |
23 | // 生产日期 | 23 | // 生产日期 |
24 | ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"` | 24 | ProductDate string `cname:"生产日期" json:"productDate" valid:"Required"` |
25 | // 上班班次 1:全天 2:白班 4:中班 8:夜班 | 25 | // 上班班次 1:全天 2:白班 4:中班 8:夜班 |
@@ -30,6 +30,8 @@ type UpdateProductPlanCommand struct { | @@ -30,6 +30,8 @@ type UpdateProductPlanCommand struct { | ||
30 | PlanProductName string `cname:"计划的产品名称" json:"planProductName"` | 30 | PlanProductName string `cname:"计划的产品名称" json:"planProductName"` |
31 | // 产品ID | 31 | // 产品ID |
32 | ProductId int `cname:"产品ID" json:"productId" valid:"Required"` | 32 | ProductId int `cname:"产品ID" json:"productId" valid:"Required"` |
33 | + // 投入量规格 默认份 | ||
34 | + DevotedUnit string `cname:"投入量规格" json:"devotedUnit" ` | ||
33 | // 数量(保留两位小数) | 35 | // 数量(保留两位小数) |
34 | Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` | 36 | Quantity float64 `cname:"数量(保留两位小数)" json:"quantity" valid:"Required"` |
35 | // 单位 | 37 | // 单位 |
@@ -39,7 +41,7 @@ type UpdateProductPlanCommand struct { | @@ -39,7 +41,7 @@ type UpdateProductPlanCommand struct { | ||
39 | // 重量 | 41 | // 重量 |
40 | Weight float64 `cname:"重量" json:"weight"` | 42 | Weight float64 `cname:"重量" json:"weight"` |
41 | // 备注 | 43 | // 备注 |
42 | - Remark string `cname:"备注" json:"remark" valid:"Required"` | 44 | + Remark string `cname:"备注" json:"remark"` |
43 | // 生产日期 | 45 | // 生产日期 |
44 | ProductDateTime time.Time `cname:"生产日期" json:"productDateTime" ` | 46 | ProductDateTime time.Time `cname:"生产日期" json:"productDateTime" ` |
45 | } | 47 | } |
@@ -49,8 +51,8 @@ func (updateProductPlanCommand *UpdateProductPlanCommand) Valid(validation *vali | @@ -49,8 +51,8 @@ func (updateProductPlanCommand *UpdateProductPlanCommand) Valid(validation *vali | ||
49 | validation.Error(err.Error()) | 51 | validation.Error(err.Error()) |
50 | return | 52 | return |
51 | } | 53 | } |
52 | - if t, err := time.Parse("2006/01/02", updateProductPlanCommand.ProductDate); err != nil { | ||
53 | - validation.Error("时间格式有误 2006/01/02") | 54 | + if t, err := time.Parse("2006-01-02", updateProductPlanCommand.ProductDate); err != nil { |
55 | + validation.Error("时间格式有误") | ||
54 | return | 56 | return |
55 | } else { | 57 | } else { |
56 | updateProductPlanCommand.ProductDateTime = t | 58 | updateProductPlanCommand.ProductDateTime = t |
@@ -23,9 +23,13 @@ type ProductPlanDto struct { | @@ -23,9 +23,13 @@ type ProductPlanDto struct { | ||
23 | // 上班班次描述 | 23 | // 上班班次描述 |
24 | WorkOnDescription string `json:"workOnDescription"` | 24 | WorkOnDescription string `json:"workOnDescription"` |
25 | // 机台 (A、B、C、D 区分机器大小) | 25 | // 机台 (A、B、C、D 区分机器大小) |
26 | - Machine string `json:"machine,omitempty"` | 26 | + Machine string `json:"machine"` |
27 | + // 产品ID | ||
28 | + ProductId int `json:"productId,omitempty"` | ||
27 | // 计划的产品名称 | 29 | // 计划的产品名称 |
28 | PlanProductName string `json:"planProductName,omitempty"` | 30 | PlanProductName string `json:"planProductName,omitempty"` |
31 | + // 投入量规格 默认份 | ||
32 | + DevotedUnit string `json:"devotedUnit" ` | ||
29 | // 计划投入 | 33 | // 计划投入 |
30 | *domain.UnitQuantity | 34 | *domain.UnitQuantity |
31 | // 计划状态 (1:上线 2:下线 默认下线) | 35 | // 计划状态 (1:上线 2:下线 默认下线) |
@@ -45,12 +49,19 @@ type ProductPlanDto struct { | @@ -45,12 +49,19 @@ type ProductPlanDto struct { | ||
45 | func (d *ProductPlanDto) LoadDto(m *domain.ProductPlan, orgId int) *ProductPlanDto { | 49 | func (d *ProductPlanDto) LoadDto(m *domain.ProductPlan, orgId int) *ProductPlanDto { |
46 | d.ProductPlanId = m.ProductPlanId | 50 | d.ProductPlanId = m.ProductPlanId |
47 | d.BatchNumber = m.BatchNumber | 51 | d.BatchNumber = m.BatchNumber |
48 | - d.ProductDate = m.ProductDate.Format("2006/01/02") | 52 | + d.ProductDate = m.ProductDate.Format("2006-01-02") |
49 | d.WorkshopId = m.Workshop.WorkshopId | 53 | d.WorkshopId = m.Workshop.WorkshopId |
50 | d.WorkshopName = m.Workshop.WorkshopName | 54 | d.WorkshopName = m.Workshop.WorkshopName |
51 | d.WorkOn = m.WorkOn | 55 | d.WorkOn = m.WorkOn |
56 | + | ||
57 | + d.Machine = m.Machine | ||
52 | d.PlanProductName = m.PlanProductName | 58 | d.PlanProductName = m.PlanProductName |
53 | d.UnitQuantity = m.PlanDevoted | 59 | d.UnitQuantity = m.PlanDevoted |
60 | + d.DevotedUnit = "份" | ||
61 | + if m.Ext.ProductPlanExt != nil { | ||
62 | + d.DevotedUnit = m.Ext.ProductPlanExt.DevotedUnit | ||
63 | + d.ProductId = m.Ext.ProductPlanExt.ProductId | ||
64 | + } | ||
54 | d.PlanStatus = m.PlanStatus | 65 | d.PlanStatus = m.PlanStatus |
55 | d.TotalProduct = 0 | 66 | d.TotalProduct = 0 |
56 | d.Remark = m.Remark | 67 | d.Remark = m.Remark |
@@ -11,6 +11,7 @@ import ( | @@ -11,6 +11,7 @@ import ( | ||
11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productPlan/query" | 11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productPlan/query" |
12 | "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" | 13 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" |
14 | + "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/infrastructure/utils" |
15 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | 16 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" |
16 | "time" | 17 | "time" |
@@ -61,6 +62,16 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre | @@ -61,6 +62,16 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre | ||
61 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 62 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
62 | } | 63 | } |
63 | 64 | ||
65 | + if len(cmd.BatchNumber) == 0 { | ||
66 | + generator := redis.NewPlanBatchCodeCache(cmd.CompanyId) | ||
67 | + code, err := redis.GenCode(generator) | ||
68 | + if err != nil { | ||
69 | + log.Logger.Error(err.Error()) | ||
70 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "服务器异常") | ||
71 | + } | ||
72 | + cmd.BatchNumber = code | ||
73 | + } | ||
74 | + | ||
64 | newProductPlan := &domain.ProductPlan{ | 75 | newProductPlan := &domain.ProductPlan{ |
65 | CompanyId: cmd.CompanyId, | 76 | CompanyId: cmd.CompanyId, |
66 | OrgId: cmd.OrgId, | 77 | OrgId: cmd.OrgId, |
@@ -86,8 +97,10 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre | @@ -86,8 +97,10 @@ func (productPlanService *ProductPlanService) CreateProductPlan(cmd *command.Cre | ||
86 | ProductCode: product.ProductCode, | 97 | ProductCode: product.ProductCode, |
87 | ProductName: product.ProductName, | 98 | ProductName: product.ProductName, |
88 | //ProductSpec: product.ProductSpec, | 99 | //ProductSpec: product.ProductSpec, |
100 | + DevotedUnit: cmd.DevotedUnit, | ||
89 | }), | 101 | }), |
90 | } | 102 | } |
103 | + | ||
91 | if cmd.Weight > 0 { | 104 | if cmd.Weight > 0 { |
92 | newProductPlan.PlanDevoted.Weight = cmd.Weight | 105 | newProductPlan.PlanDevoted.Weight = cmd.Weight |
93 | } | 106 | } |
@@ -261,7 +274,7 @@ func (productPlanService *ProductPlanService) UpdateProductPlan(cmd *command.Upd | @@ -261,7 +274,7 @@ func (productPlanService *ProductPlanService) UpdateProductPlan(cmd *command.Upd | ||
261 | ProductId: product.ProductId, | 274 | ProductId: product.ProductId, |
262 | ProductCode: product.ProductCode, | 275 | ProductCode: product.ProductCode, |
263 | ProductName: product.ProductName, | 276 | ProductName: product.ProductName, |
264 | - //ProductSpec: product.ProductSpec, | 277 | + DevotedUnit: cmd.DevotedUnit, |
265 | }) | 278 | }) |
266 | productPlan.PlanDevoted.UnitWeight = product.ProductSpec.UnitWeight | 279 | productPlan.PlanDevoted.UnitWeight = product.ProductSpec.UnitWeight |
267 | cmd.PlanProductName = product.ProductName | 280 | cmd.PlanProductName = product.ProductName |
1 | package syncdata | 1 | package syncdata |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" | ||
4 | "strconv" | 6 | "strconv" |
5 | "strings" | 7 | "strings" |
6 | "time" | 8 | "time" |
@@ -181,8 +183,15 @@ func (srv *PullDataK3CloudService) PullMaterial(timeFilter time.Time) error { | @@ -181,8 +183,15 @@ func (srv *PullDataK3CloudService) PullMaterial(timeFilter time.Time) error { | ||
181 | if err != nil { | 183 | if err != nil { |
182 | return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 184 | return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
183 | } | 185 | } |
186 | + | ||
187 | + var userService = domainService.NewUserService() | ||
188 | + org, err := userService.Organization(constant.MANUFACTURE_DEFAULT_ORGID) | ||
189 | + if err != nil { | ||
190 | + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
191 | + } | ||
192 | + | ||
184 | //MaterialK3cloud表数据到Proudct表 | 193 | //MaterialK3cloud表数据到Proudct表 |
185 | - err = materialDao.SyncDataProudct(nowTime.Unix()) | 194 | + err = materialDao.SyncDataProudct(nowTime.Unix(), org.OrgName) |
186 | if err != nil { | 195 | if err != nil { |
187 | return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 196 | return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
188 | } | 197 | } |
@@ -175,7 +175,7 @@ func (workshopService *WorkshopService) RemoveWorkshop(removeWorkshopCommand *co | @@ -175,7 +175,7 @@ func (workshopService *WorkshopService) RemoveWorkshop(removeWorkshopCommand *co | ||
175 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeWorkshopCommand.WorkshopId))) | 175 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeWorkshopCommand.WorkshopId))) |
176 | } | 176 | } |
177 | if !workshop.CanRemove() { | 177 | if !workshop.CanRemove() { |
178 | - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "当车间下存在线别") | 178 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "当前车间下存在线别,不可删除") |
179 | } | 179 | } |
180 | if workshop, err := workshopRepository.Remove(workshop); err != nil { | 180 | if workshop, err := workshopRepository.Remove(workshop); err != nil { |
181 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 181 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
pkg/constant/manufacture.go
0 → 100644
1 | +package constant | ||
2 | + | ||
3 | +import ( | ||
4 | + "os" | ||
5 | + "strconv" | ||
6 | +) | ||
7 | + | ||
8 | +var ( | ||
9 | + // 生产制造 - 称重系统 - 默认公司 | ||
10 | + MANUFACTURE_DEFAULT_COMPANYID = 1 | ||
11 | + // 生产制造 - 称重系统 - 默认组织 | ||
12 | + MANUFACTURE_DEFAULT_ORGID = 1 | ||
13 | +) | ||
14 | + | ||
15 | +func init() { | ||
16 | + if os.Getenv("MANUFACTURE_DEFAULT_COMPANYID") != "" { | ||
17 | + MANUFACTURE_DEFAULT_COMPANYID, _ = strconv.Atoi(os.Getenv("MANUFACTURE_DEFAULT_COMPANYID")) | ||
18 | + } | ||
19 | + if os.Getenv("MANUFACTURE_DEFAULT_ORGID") != "" { | ||
20 | + MANUFACTURE_DEFAULT_ORGID, _ = strconv.Atoi(os.Getenv("MANUFACTURE_DEFAULT_ORGID")) | ||
21 | + } | ||
22 | +} |
1 | package domain | 1 | package domain |
2 | 2 | ||
3 | -import "time" | 3 | +import ( |
4 | + "fmt" | ||
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
6 | + "time" | ||
7 | +) | ||
4 | 8 | ||
5 | type DeviceZkTeco struct { | 9 | type DeviceZkTeco struct { |
6 | Sn string `json:"sn"` // 设备号 | 10 | Sn string `json:"sn"` // 设备号 |
7 | UserNo string `json:"userNo"` // 用户编码 | 11 | UserNo string `json:"userNo"` // 用户编码 |
8 | ActionTime time.Time `json:"actionTime"` // 操作时间 | 12 | ActionTime time.Time `json:"actionTime"` // 操作时间 |
9 | } | 13 | } |
14 | + | ||
15 | +func (m *DeviceZkTeco) Valid() error { | ||
16 | + if len(m.Sn) == 0 { | ||
17 | + return fmt.Errorf("设备号不能为空") | ||
18 | + } | ||
19 | + if len(m.UserNo) == 0 { | ||
20 | + return fmt.Errorf("用户编码不能为空") | ||
21 | + } | ||
22 | + if m.ActionTime.IsZero() { | ||
23 | + return fmt.Errorf("操作时间不能为空") | ||
24 | + } | ||
25 | + return nil | ||
26 | +} | ||
27 | + | ||
28 | +func (m *DeviceZkTeco) String() string { | ||
29 | + return fmt.Sprintf("设备号:%v 用户编码:%v 操作时间:%v", m.Sn, m.UserNo, m.ActionTime) | ||
30 | +} | ||
31 | + | ||
32 | +func TaskDeviceZkTecoReport() string { | ||
33 | + return fmt.Sprintf("%v:task:device-zk-teco:report", constant.CACHE_PREFIX) | ||
34 | +} |
@@ -10,4 +10,6 @@ type ProductPlanExt struct { | @@ -10,4 +10,6 @@ type ProductPlanExt struct { | ||
10 | ProductName string `json:"productName,omitempty"` | 10 | ProductName string `json:"productName,omitempty"` |
11 | // 产品规格 | 11 | // 产品规格 |
12 | //ProductSpec *UnitQuantity `json:"productSpec,omitempty"` | 12 | //ProductSpec *UnitQuantity `json:"productSpec,omitempty"` |
13 | + // 投入量规格 默认份 | ||
14 | + DevotedUnit string `json:"devotedUnit" ` | ||
13 | } | 15 | } |
@@ -3,8 +3,8 @@ package domain | @@ -3,8 +3,8 @@ package domain | ||
3 | import "time" | 3 | import "time" |
4 | 4 | ||
5 | const ( | 5 | const ( |
6 | - ParticipateNormal = 1 | ||
7 | - ParticipateSupport = 2 | 6 | + ParticipateNormal = 1 // 正常 |
7 | + ParticipateSupport = 2 // 支援 | ||
8 | ) | 8 | ) |
9 | 9 | ||
10 | const ( | 10 | const ( |
@@ -28,7 +28,7 @@ type EmployeeProductRecord struct { | @@ -28,7 +28,7 @@ type EmployeeProductRecord struct { | ||
28 | WorkOn int `json:"workOn"` | 28 | WorkOn int `json:"workOn"` |
29 | // 参与类型 1:正常 2:支援 | 29 | // 参与类型 1:正常 2:支援 |
30 | ParticipateType int `json:"participateType"` | 30 | ParticipateType int `json:"participateType"` |
31 | - // 产能 | 31 | + // 初始产能 |
32 | ProductWeigh float64 `json:"productWeigh"` | 32 | ProductWeigh float64 `json:"productWeigh"` |
33 | // 二级品产能 | 33 | // 二级品产能 |
34 | SecondLevelWeigh float64 `json:"secondLevelWeigh"` | 34 | SecondLevelWeigh float64 `json:"secondLevelWeigh"` |
@@ -67,21 +67,18 @@ func (employeeProductRecord *EmployeeProductRecord) Update(data map[string]inter | @@ -67,21 +67,18 @@ func (employeeProductRecord *EmployeeProductRecord) Update(data map[string]inter | ||
67 | } | 67 | } |
68 | 68 | ||
69 | // 更新生产量 | 69 | // 更新生产量 |
70 | -func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh float64, productRecordType int, sectionName string) { | 70 | +func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh float64, productRecordType int, sectionName string, yesterdayWeight float64, bestWeight float64) { |
71 | if employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh == nil { | 71 | if employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh == nil { |
72 | employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh = make(map[string]float64) | 72 | employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh = make(map[string]float64) |
73 | } | 73 | } |
74 | if productRecordType == RecordTypeSecondLevelWeigh { | 74 | if productRecordType == RecordTypeSecondLevelWeigh { |
75 | + // 当前工段 | ||
75 | if employeeProductRecord.WorkStation.SectionName == sectionName { | 76 | if employeeProductRecord.WorkStation.SectionName == sectionName { |
76 | employeeProductRecord.SecondLevelWeigh += weigh | 77 | employeeProductRecord.SecondLevelWeigh += weigh |
77 | } else { | 78 | } else { |
78 | - if _, ok := employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName]; ok { | ||
79 | - employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName] += weigh //存关联级的二级品 | ||
80 | - } else { | ||
81 | - employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName] = weigh | ||
82 | - } | 79 | + // 其他工段的二级品 |
80 | + employeeProductRecord.ProductRecordInfo.AddSectionWeight(sectionName, weigh) | ||
83 | } | 81 | } |
84 | - employeeProductRecord.ProductRecordInfo.TotalOtherSecondLevelWeigh = employeeProductRecord.ProductRecordInfo.OtherSecondLevelWeigh() // 预先统计其他二级品占比 | ||
85 | } | 82 | } |
86 | if productRecordType == RecordTypeReceiveMaterial { | 83 | if productRecordType == RecordTypeReceiveMaterial { |
87 | employeeProductRecord.ProductWeigh += weigh | 84 | employeeProductRecord.ProductWeigh += weigh |
@@ -89,6 +86,7 @@ func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh flo | @@ -89,6 +86,7 @@ func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh flo | ||
89 | if productRecordType == RecordTypeReturnMaterial { | 86 | if productRecordType == RecordTypeReturnMaterial { |
90 | employeeProductRecord.ProductWeigh -= weigh | 87 | employeeProductRecord.ProductWeigh -= weigh |
91 | } | 88 | } |
89 | + employeeProductRecord.ProductRecordInfo.PreStatistics(employeeProductRecord.ProductWeigh, employeeProductRecord.SecondLevelWeigh, 0, 0) | ||
92 | employeeProductRecord.UpdatedAt = time.Now() | 90 | employeeProductRecord.UpdatedAt = time.Now() |
93 | employeeProductRecord.Version += 1 | 91 | employeeProductRecord.Version += 1 |
94 | } | 92 | } |
@@ -9,13 +9,26 @@ type ProductRecordStaticInfo struct { | @@ -9,13 +9,26 @@ type ProductRecordStaticInfo struct { | ||
9 | PlanProductName string `json:"planProductName,omitempty"` | 9 | PlanProductName string `json:"planProductName,omitempty"` |
10 | // 批号 | 10 | // 批号 |
11 | BatchNumber string `json:"batchNumber,omitempty"` | 11 | BatchNumber string `json:"batchNumber,omitempty"` |
12 | - | ||
13 | // 生产小组ID | 12 | // 生产小组ID |
14 | ProductGroupId int `json:"productGroupId,omitempty"` | 13 | ProductGroupId int `json:"productGroupId,omitempty"` |
15 | 14 | ||
16 | - TotalOtherSecondLevelWeigh float64 `json:"otherSecondLevelWeigh"` | 15 | + // 投入量 |
16 | + InputWeight float64 `json:"inputWeight,omitempty"` | ||
17 | + // 产出量 | ||
18 | + OutputWeight float64 `json:"outputWeight,omitempty"` | ||
19 | + // 二级品重量 | ||
20 | + SecondLevelWeight float64 `json:"secondLevelWeight"` | ||
21 | + // 昨天产出量 | ||
22 | + YesterdayOutputWeight float64 `json:"yesterdayOutputWeight"` | ||
23 | + // 历史最好产出量 | ||
24 | + BestOutputWeight float64 `json:"bestOutputWeight"` | ||
25 | + // 合格率 | ||
26 | + QualificationRate int `json:"qualificationRate"` | ||
27 | + | ||
28 | + // 其他工段二级品的重量合计 | ||
29 | + TotalOtherSecondLevelWeigh float64 `json:"totalOtherSecondLevelWeigh"` | ||
17 | // 保存其他工段二级品的重量 | 30 | // 保存其他工段二级品的重量 |
18 | - OtherSectionSecondLevelWeigh map[string]float64 `json:"sectionSecondLevelWeigh"` | 31 | + OtherSectionSecondLevelWeigh map[string]float64 `json:"otherSectionSecondLevelWeigh"` |
19 | } | 32 | } |
20 | 33 | ||
21 | func (info *ProductRecordStaticInfo) OtherSecondLevelWeigh() float64 { | 34 | func (info *ProductRecordStaticInfo) OtherSecondLevelWeigh() float64 { |
@@ -25,3 +38,31 @@ func (info *ProductRecordStaticInfo) OtherSecondLevelWeigh() float64 { | @@ -25,3 +38,31 @@ func (info *ProductRecordStaticInfo) OtherSecondLevelWeigh() float64 { | ||
25 | } | 38 | } |
26 | return result | 39 | return result |
27 | } | 40 | } |
41 | + | ||
42 | +// AddSectionWeight 添加工段的二级品 | ||
43 | +func (info *ProductRecordStaticInfo) AddSectionWeight(section string, weight float64) { | ||
44 | + if _, ok := info.OtherSectionSecondLevelWeigh[section]; ok { | ||
45 | + info.OtherSectionSecondLevelWeigh[section] += weight //存关联级的二级品 | ||
46 | + } else { | ||
47 | + info.OtherSectionSecondLevelWeigh[section] = weight | ||
48 | + } | ||
49 | +} | ||
50 | + | ||
51 | +// 预统计 | ||
52 | +// productWeight 初始产能 | ||
53 | +// secondWeight 二级品重量 | ||
54 | +// yesterdayWeight 昨天产能 | ||
55 | +// bestWeight 最佳产能 | ||
56 | +func (info *ProductRecordStaticInfo) PreStatistics(productWeight float64, secondWeight float64, yesterdayWeight float64, bestWeight float64) { | ||
57 | + totalOtherSecondLevelWeigh := info.OtherSecondLevelWeigh() | ||
58 | + info.InputWeight = productWeight - totalOtherSecondLevelWeigh | ||
59 | + info.OutputWeight = info.InputWeight - secondWeight | ||
60 | + info.SecondLevelWeight = secondWeight | ||
61 | + info.YesterdayOutputWeight = yesterdayWeight | ||
62 | + info.BestOutputWeight = bestWeight | ||
63 | + if bestWeight <= info.InputWeight { | ||
64 | + info.BestOutputWeight = info.OutputWeight | ||
65 | + } | ||
66 | + info.TotalOtherSecondLevelWeigh = totalOtherSecondLevelWeigh | ||
67 | + info.QualificationRate = int(info.OutputWeight / info.InputWeight * 100) | ||
68 | +} |
@@ -58,12 +58,8 @@ func (employeeProductRecord *WorkshopProductRecord) UpdateProductWeigh(weigh flo | @@ -58,12 +58,8 @@ func (employeeProductRecord *WorkshopProductRecord) UpdateProductWeigh(weigh flo | ||
58 | if employeeProductRecord.WorkStation.SectionName == sectionName { | 58 | if employeeProductRecord.WorkStation.SectionName == sectionName { |
59 | employeeProductRecord.SecondLevelWeigh += weigh | 59 | employeeProductRecord.SecondLevelWeigh += weigh |
60 | } else { | 60 | } else { |
61 | - if _, ok := employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName]; ok { | ||
62 | - employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName] += weigh //存关联级的二级品 | ||
63 | - } else { | ||
64 | - employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName] = weigh | ||
65 | - } | ||
66 | - employeeProductRecord.ProductRecordInfo.TotalOtherSecondLevelWeigh = employeeProductRecord.ProductRecordInfo.OtherSecondLevelWeigh() // 预先统计其他二级品占比 | 61 | + // 其他工段的二级品 |
62 | + employeeProductRecord.ProductRecordInfo.AddSectionWeight(sectionName, weigh) | ||
67 | } | 63 | } |
68 | } | 64 | } |
69 | if productRecordType == RecordTypeReceiveMaterial { | 65 | if productRecordType == RecordTypeReceiveMaterial { |
@@ -72,6 +68,7 @@ func (employeeProductRecord *WorkshopProductRecord) UpdateProductWeigh(weigh flo | @@ -72,6 +68,7 @@ func (employeeProductRecord *WorkshopProductRecord) UpdateProductWeigh(weigh flo | ||
72 | if productRecordType == RecordTypeReturnMaterial { | 68 | if productRecordType == RecordTypeReturnMaterial { |
73 | employeeProductRecord.ProductWeigh -= weigh | 69 | employeeProductRecord.ProductWeigh -= weigh |
74 | } | 70 | } |
71 | + employeeProductRecord.ProductRecordInfo.PreStatistics(employeeProductRecord.ProductWeigh, employeeProductRecord.SecondLevelWeigh, 0, 0) | ||
75 | employeeProductRecord.UpdatedAt = time.Now() | 72 | employeeProductRecord.UpdatedAt = time.Now() |
76 | employeeProductRecord.Version += 1 | 73 | employeeProductRecord.Version += 1 |
77 | } | 74 | } |
@@ -20,4 +20,8 @@ type User struct { | @@ -20,4 +20,8 @@ type User struct { | ||
20 | Avatar string `json:"avatar,omitempty"` | 20 | Avatar string `json:"avatar,omitempty"` |
21 | // 手机号码 | 21 | // 手机号码 |
22 | Phone string `json:"phone,omitempty"` | 22 | Phone string `json:"phone,omitempty"` |
23 | + | ||
24 | + // 额外扩展的参数 | ||
25 | + GroupId int `json:"-"` | ||
26 | + GroupName string `json:"-"` | ||
23 | } | 27 | } |
@@ -104,6 +104,14 @@ func (workshop *Workshop) UpdateLine(lineId int, lineName string) error { | @@ -104,6 +104,14 @@ func (workshop *Workshop) UpdateLine(lineId int, lineName string) error { | ||
104 | if line.Removed == Deleted { | 104 | if line.Removed == Deleted { |
105 | return fmt.Errorf("生产线:%v已删除", line.LineName) | 105 | return fmt.Errorf("生产线:%v已删除", line.LineName) |
106 | } | 106 | } |
107 | + for _, v := range workshop.ProductLines { | ||
108 | + if v.Removed == Deleted { | ||
109 | + continue | ||
110 | + } | ||
111 | + if v.LineName == lineName && v.LineId != lineId { | ||
112 | + return fmt.Errorf("生产线:%v已存在", lineName) | ||
113 | + } | ||
114 | + } | ||
107 | line.LineName = lineName | 115 | line.LineName = lineName |
108 | return nil | 116 | return nil |
109 | } | 117 | } |
@@ -174,6 +182,21 @@ func (workshop *Workshop) UpdateSection(lineId, sectionId int, sectionName strin | @@ -174,6 +182,21 @@ func (workshop *Workshop) UpdateSection(lineId, sectionId int, sectionName strin | ||
174 | if section.Removed == Deleted { | 182 | if section.Removed == Deleted { |
175 | return fmt.Errorf("工段:%v已删除", section.SectionName) | 183 | return fmt.Errorf("工段:%v已删除", section.SectionName) |
176 | } | 184 | } |
185 | + | ||
186 | + // 当前线下面工段不能重复 | ||
187 | + line, err := workshop.FindLine(lineId) | ||
188 | + if err != nil { | ||
189 | + return err | ||
190 | + } | ||
191 | + for _, v := range line.ProductSections { | ||
192 | + if v.Removed == Deleted { | ||
193 | + continue | ||
194 | + } | ||
195 | + if v.SectionName == sectionName && v.SectionId != sectionId { | ||
196 | + return fmt.Errorf("工段:%v已存在", sectionName) | ||
197 | + } | ||
198 | + } | ||
199 | + | ||
177 | section.SectionName = sectionName | 200 | section.SectionName = sectionName |
178 | return nil | 201 | return nil |
179 | } | 202 | } |
@@ -29,6 +29,16 @@ func NewHttpLibAlliedCreationUser(host string) *HttpLibAlliedCreationUser { | @@ -29,6 +29,16 @@ func NewHttpLibAlliedCreationUser(host string) *HttpLibAlliedCreationUser { | ||
29 | func (gateway HttpLibAlliedCreationUser) User(userId int) (*models.User, error) { | 29 | func (gateway HttpLibAlliedCreationUser) User(userId int) (*models.User, error) { |
30 | return gateway.UserGet(ReqGetUser{UserId: userId}) | 30 | return gateway.UserGet(ReqGetUser{UserId: userId}) |
31 | } | 31 | } |
32 | +func (gateway HttpLibAlliedCreationUser) UserByCode(companyId, orgId int, userCode string) (*models.User, error) { | ||
33 | + _, users, err := gateway.UserSearch(ReqUserSearch{CompanyId: int64(companyId), OrganizationId: int64(orgId), UserCode: userCode, Limit: 1, PullRealTime: true}) | ||
34 | + if err != nil { | ||
35 | + return nil, err | ||
36 | + } | ||
37 | + if len(users) == 0 { | ||
38 | + return nil, fmt.Errorf("用户不存在") | ||
39 | + } | ||
40 | + return users[0], nil | ||
41 | +} | ||
32 | func (gateway HttpLibAlliedCreationUser) Users(userIds []int) ([]*models.User, error) { | 42 | func (gateway HttpLibAlliedCreationUser) Users(userIds []int) ([]*models.User, error) { |
33 | var list = make([]*models.User, 0) | 43 | var list = make([]*models.User, 0) |
34 | for i := range userIds { | 44 | for i := range userIds { |
@@ -40,6 +40,8 @@ type ( | @@ -40,6 +40,8 @@ type ( | ||
40 | InEnableStatus []int `cname:"状态(1:启用 2:禁用 3:注销)" json:"inEnableStatus,omitempty"` | 40 | InEnableStatus []int `cname:"状态(1:启用 2:禁用 3:注销)" json:"inEnableStatus,omitempty"` |
41 | // 匹配多个公司 | 41 | // 匹配多个公司 |
42 | InCompanyIds []interface{} `json:"inCompanyIds,omitempty"` | 42 | InCompanyIds []interface{} `json:"inCompanyIds,omitempty"` |
43 | + // 用户编号 企业内标识 | ||
44 | + UserCode string `cname:"用户编号" json:"userCode,omitempty"` | ||
43 | 45 | ||
44 | // 自定义高级查询 | 46 | // 自定义高级查询 |
45 | AdvancedQuery string `json:"advancedQuery"` | 47 | AdvancedQuery string `json:"advancedQuery"` |
@@ -80,3 +80,32 @@ func (dao *AttendanceRecordDao) RecentUnApprovedAttendanceRecord(fromLastHour in | @@ -80,3 +80,32 @@ func (dao *AttendanceRecordDao) RecentUnApprovedAttendanceRecord(fromLastHour in | ||
80 | return int64(count), productAttendanceRecords, nil | 80 | return int64(count), productAttendanceRecords, nil |
81 | } | 81 | } |
82 | } | 82 | } |
83 | + | ||
84 | +func (dao *AttendanceRecordDao) WorkerAttendanceRecords(companyId, orgId, workerId int, workStationId string, beginTime, endTime time.Time) (int64, []*domain.ProductAttendanceRecord, error) { | ||
85 | + tx := dao.transactionContext.PgTx | ||
86 | + //endTime := time.Now() | ||
87 | + //beginTime := endTime.Add(-(time.Hour * time.Duration(recentDay*24))) | ||
88 | + var productAttendanceRecordModels []*models.ProductAttendanceRecord | ||
89 | + productAttendanceRecords := make([]*domain.ProductAttendanceRecord, 0) | ||
90 | + query := sqlbuilder.BuildQuery(tx.Model(&productAttendanceRecordModels), map[string]interface{}{}) | ||
91 | + query.Where("company_id =?", companyId) | ||
92 | + query.Where("org_id =?", orgId) | ||
93 | + query.Where("product_worker ->>'userId' = '?'", workerId) | ||
94 | + query.Where("sign_in >= ?", beginTime) | ||
95 | + query.Where("sign_in <= ?", endTime) | ||
96 | + query.Where("attendance_status = ?", domain.AttendanceNotApprove) | ||
97 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
98 | + query.SetOrderDirect("product_attendance_id", "DESC") | ||
99 | + if count, err := query.SelectAndCount(); err != nil { | ||
100 | + return 0, productAttendanceRecords, err | ||
101 | + } else { | ||
102 | + for _, productAttendanceRecordModel := range productAttendanceRecordModels { | ||
103 | + if productAttendanceRecord, err := transform.TransformToProductAttendanceRecordDomainModelFromPgModels(productAttendanceRecordModel); err != nil { | ||
104 | + return 0, productAttendanceRecords, err | ||
105 | + } else { | ||
106 | + productAttendanceRecords = append(productAttendanceRecords, productAttendanceRecord) | ||
107 | + } | ||
108 | + } | ||
109 | + return int64(count), productAttendanceRecords, nil | ||
110 | + } | ||
111 | +} |
pkg/infrastructure/dao/device_dao.go
0 → 100644
1 | +package dao | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
6 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | ||
10 | +) | ||
11 | + | ||
12 | +type DeviceDao struct { | ||
13 | + transactionContext *pgTransaction.TransactionContext | ||
14 | +} | ||
15 | + | ||
16 | +func NewDeviceDao(transactionContext *pgTransaction.TransactionContext) (*DeviceDao, error) { | ||
17 | + if transactionContext == nil { | ||
18 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
19 | + } else { | ||
20 | + return &DeviceDao{ | ||
21 | + transactionContext: transactionContext, | ||
22 | + }, nil | ||
23 | + } | ||
24 | +} | ||
25 | + | ||
26 | +func (d *DeviceDao) FindDeviceByDeviceCode(companyId, orgId int, deviceCode string) (*domain.Device, error) { | ||
27 | + tx := d.transactionContext.PgTx | ||
28 | + deviceModel := new(models.Device) | ||
29 | + query := sqlbuilder.BuildQuery(tx.Model(deviceModel), map[string]interface{}{}) | ||
30 | + query.Where("company_id = ?", companyId) | ||
31 | + query.Where("org_id = ?", orgId) | ||
32 | + query.Where("device_code = ?", deviceCode) | ||
33 | + //if v, ok := queryOptions["includeDeleted"]; ok && v.(bool) { | ||
34 | + // query.AllWithDeleted() | ||
35 | + //} | ||
36 | + if err := query.First(); err != nil { | ||
37 | + if err.Error() == "pg: no rows in result set" { | ||
38 | + return nil, domain.ErrorNotFound | ||
39 | + } else { | ||
40 | + return nil, err | ||
41 | + } | ||
42 | + } | ||
43 | + if deviceModel.DeviceId == 0 { | ||
44 | + return nil, nil | ||
45 | + } else { | ||
46 | + return transform.TransformToDeviceDomainModelFromPgModels(deviceModel) | ||
47 | + } | ||
48 | + return nil, nil | ||
49 | +} |
@@ -49,6 +49,30 @@ func (dao *EmployeeProductRecordDao) WorkerProductRecord(companyId, orgId, planI | @@ -49,6 +49,30 @@ func (dao *EmployeeProductRecordDao) WorkerProductRecord(companyId, orgId, planI | ||
49 | } | 49 | } |
50 | } | 50 | } |
51 | 51 | ||
52 | +// 员工对应批次 最好生产记录 | ||
53 | +func (dao *EmployeeProductRecordDao) WorkerBestOutputRecord(companyId, orgId, planId, workerId int) (*domain.EmployeeProductRecord, error) { | ||
54 | + tx := dao.transactionContext.PgTx | ||
55 | + employeeProductRecordModel := new(models.EmployeeProductRecord) | ||
56 | + query := sqlbuilder.BuildQuery(tx.Model(employeeProductRecordModel), map[string]interface{}{}) | ||
57 | + query.Where("company_id = ?", companyId) | ||
58 | + query.Where("org_id = ?", orgId) | ||
59 | + query.Where("product_worker ->>'userId' = '?'", workerId) | ||
60 | + query.Where("product_record_info ->>'productPlanId' = '?'", planId) | ||
61 | + query.Order("product_record_info ->>'outputWeight' DESC") | ||
62 | + if err := query.First(); err != nil { | ||
63 | + if err.Error() == "pg: no rows in result set" { | ||
64 | + return nil, domain.ErrorNotFound | ||
65 | + } else { | ||
66 | + return nil, err | ||
67 | + } | ||
68 | + } | ||
69 | + if employeeProductRecordModel.EmployeeProductRecordId == 0 { | ||
70 | + return nil, domain.ErrorNotFound | ||
71 | + } else { | ||
72 | + return transform.TransformToEmployeeProductRecordDomainModelFromPgModels(employeeProductRecordModel) | ||
73 | + } | ||
74 | +} | ||
75 | + | ||
52 | func (dao *EmployeeProductRecordDao) SearchEmployeeProductRecord(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) { | 76 | func (dao *EmployeeProductRecordDao) SearchEmployeeProductRecord(queryOptions map[string]interface{}) (int64, []*domain.EmployeeProductRecord, error) { |
53 | tx := dao.transactionContext.PgTx | 77 | tx := dao.transactionContext.PgTx |
54 | var employeeProductRecordModels []*models.EmployeeProductRecord | 78 | var employeeProductRecordModels []*models.EmployeeProductRecord |
@@ -2,6 +2,7 @@ package dao | @@ -2,6 +2,7 @@ package dao | ||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "fmt" | 4 | "fmt" |
5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
5 | "strconv" | 6 | "strconv" |
6 | "strings" | 7 | "strings" |
7 | 8 | ||
@@ -106,15 +107,15 @@ func (d *MaterialK3cloudDao) SyncDataMaterialK3cloud(data []models.MaterialK3clo | @@ -106,15 +107,15 @@ func (d *MaterialK3cloudDao) SyncDataMaterialK3cloud(data []models.MaterialK3clo | ||
106 | } | 107 | } |
107 | 108 | ||
108 | //SyncDataProudct 同步MaterialK3cloud表数据到Proudct表 | 109 | //SyncDataProudct 同步MaterialK3cloud表数据到Proudct表 |
109 | -func (d *MaterialK3cloudDao) SyncDataProudct(version int64) error { | 110 | +func (d *MaterialK3cloudDao) SyncDataProudct(version int64, orgName string) error { |
110 | // -- 插入或者更新 | 111 | // -- 插入或者更新 |
111 | - sql := `INSERT INTO "manufacture"."product"( | 112 | + sql := fmt.Sprintf(`INSERT INTO "manufacture"."product"( |
112 | "company_id", "org_id", "product_id", "product_code", "product_name", | 113 | "company_id", "org_id", "product_id", "product_code", "product_name", |
113 | - "product_category", "product_spec", "created_at", "updated_at" | 114 | + "product_category", "product_spec", "created_at", "updated_at","ext" |
114 | ) | 115 | ) |
115 | - SELECT 0,use_org_id,"join_product_id","number","name","material_group_name", | ||
116 | - json_build_object('unit',specification),now(),now() | ||
117 | - FROM "manufacture"."material_k3cloud" WHERE "data_version"=? AND "material_group_number" LIKE '05%' | 116 | + SELECT %v,%v,"join_product_id","number","name","material_group_name", |
117 | + json_build_object('unit',specification),now(),now(),json_build_object('orgName','%v') | ||
118 | + FROM "manufacture"."material_k3cloud" WHERE "data_version"=? AND "material_group_number" LIKE '05%%' | ||
118 | ON conflict ( product_id ) DO | 119 | ON conflict ( product_id ) DO |
119 | UPDATE | 120 | UPDATE |
120 | SET ( | 121 | SET ( |
@@ -122,7 +123,7 @@ func (d *MaterialK3cloudDao) SyncDataProudct(version int64) error { | @@ -122,7 +123,7 @@ func (d *MaterialK3cloudDao) SyncDataProudct(version int64) error { | ||
122 | "product_category", "product_spec", "updated_at")=( | 123 | "product_category", "product_spec", "updated_at")=( |
123 | EXCLUDED."company_id", EXCLUDED."org_id",EXCLUDED."product_id", | 124 | EXCLUDED."company_id", EXCLUDED."org_id",EXCLUDED."product_id", |
124 | EXCLUDED."product_code",EXCLUDED."product_name",EXCLUDED."product_category", | 125 | EXCLUDED."product_code",EXCLUDED."product_name",EXCLUDED."product_category", |
125 | - EXCLUDED."product_spec", EXCLUDED."updated_at") ` | 126 | + EXCLUDED."product_spec", EXCLUDED."updated_at") `, constant.MANUFACTURE_DEFAULT_COMPANYID, constant.MANUFACTURE_DEFAULT_ORGID, orgName) |
126 | _, err := d.transactionContext.PgTx.Exec(sql, version) | 127 | _, err := d.transactionContext.PgTx.Exec(sql, version) |
127 | return err | 128 | return err |
128 | } | 129 | } |
@@ -19,6 +19,14 @@ func (svr *UserService) User(id int) (*domain.User, error) { | @@ -19,6 +19,14 @@ func (svr *UserService) User(id int) (*domain.User, error) { | ||
19 | return svr.ToUser(rsp), nil | 19 | return svr.ToUser(rsp), nil |
20 | } | 20 | } |
21 | 21 | ||
22 | +func (svr *UserService) UserByCode(companyId, orgId int, userCode string) (*domain.User, error) { | ||
23 | + rsp, err := svr.internalUserService.UserByCode(companyId, orgId, userCode) | ||
24 | + if err != nil { | ||
25 | + return nil, err | ||
26 | + } | ||
27 | + return svr.ToUser(rsp), nil | ||
28 | +} | ||
29 | + | ||
22 | func (svr *UserService) Users(id []int) ([]*domain.User, error) { | 30 | func (svr *UserService) Users(id []int) ([]*domain.User, error) { |
23 | rsp, err := svr.internalUserService.Users(id) | 31 | rsp, err := svr.internalUserService.Users(id) |
24 | if err != nil { | 32 | if err != nil { |
@@ -12,6 +12,7 @@ type PGApproveAttendanceRecordsService struct { | @@ -12,6 +12,7 @@ type PGApproveAttendanceRecordsService struct { | ||
12 | transactionContext *pgTransaction.TransactionContext | 12 | transactionContext *pgTransaction.TransactionContext |
13 | } | 13 | } |
14 | 14 | ||
15 | +// 批量审核考勤记录 | ||
15 | func (ptr *PGApproveAttendanceRecordsService) BatchApproveAttendanceRecords(opt *domain.OperateInfo, list []*domain.ProductAttendanceRecord, approveUserId int, workTime float64, status int) (interface{}, error) { | 16 | func (ptr *PGApproveAttendanceRecordsService) BatchApproveAttendanceRecords(opt *domain.OperateInfo, list []*domain.ProductAttendanceRecord, approveUserId int, workTime float64, status int) (interface{}, error) { |
16 | var productAttendanceRecordRepository, _ = repository.NewProductAttendanceRecordRepository(ptr.transactionContext) | 17 | var productAttendanceRecordRepository, _ = repository.NewProductAttendanceRecordRepository(ptr.transactionContext) |
17 | var attendance *domain.ProductAttendanceRecord | 18 | var attendance *domain.ProductAttendanceRecord |
@@ -80,6 +80,7 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | @@ -80,6 +80,7 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | ||
80 | if _, ok := groupMembers[groupMembersKeyFunc(r.ProductWorker.UserId)]; !ok { | 80 | if _, ok := groupMembers[groupMembersKeyFunc(r.ProductWorker.UserId)]; !ok { |
81 | participateType = domain.ParticipateSupport | 81 | participateType = domain.ParticipateSupport |
82 | } | 82 | } |
83 | + | ||
83 | var employeeProductRecord *domain.EmployeeProductRecord | 84 | var employeeProductRecord *domain.EmployeeProductRecord |
84 | employeeProductRecord, err = employeeProductRecordDao.WorkerProductRecord(cid, oid, productRecord.ProductRecordInfo.ProductPlanId, r.ProductWorker.UserId, productRecord.CreatedAt) | 85 | employeeProductRecord, err = employeeProductRecordDao.WorkerProductRecord(cid, oid, productRecord.ProductRecordInfo.ProductPlanId, r.ProductWorker.UserId, productRecord.CreatedAt) |
85 | if err == domain.ErrorNotFound { | 86 | if err == domain.ErrorNotFound { |
@@ -90,7 +91,23 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | @@ -90,7 +91,23 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | ||
90 | continue | 91 | continue |
91 | } | 92 | } |
92 | } | 93 | } |
93 | - employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType, productRecord.WorkStation.SectionName) | 94 | + |
95 | + // 查询当前员工 昨日产能 、历史最好产能 | ||
96 | + var ( | ||
97 | + yesterdayOutputWeight float64 = 0 | ||
98 | + bestOutputWeight float64 = 0 | ||
99 | + ) | ||
100 | + if record, e := employeeProductRecordDao.WorkerProductRecord(cid, oid, planId, r.ProductWorker.UserId, productRecord.CreatedAt.AddDate(0, 0, -1)); e == nil && record != nil { | ||
101 | + yesterdayOutputWeight = record.ProductRecordInfo.OutputWeight | ||
102 | + bestOutputWeight = record.ProductRecordInfo.BestOutputWeight | ||
103 | + | ||
104 | + } else { | ||
105 | + if record, e := employeeProductRecordDao.WorkerBestOutputRecord(cid, oid, planId, r.ProductWorker.UserId); e == nil && record != nil { | ||
106 | + yesterdayOutputWeight = record.ProductRecordInfo.OutputWeight | ||
107 | + } | ||
108 | + } | ||
109 | + | ||
110 | + employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType, productRecord.WorkStation.SectionName, yesterdayOutputWeight, bestOutputWeight) | ||
94 | 111 | ||
95 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { | 112 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { |
96 | // TODO:异常处理 | 113 | // TODO:异常处理 |
@@ -172,6 +189,8 @@ func FindGroupMembers(productGroupRepository domain.ProductGroupRepository, comp | @@ -172,6 +189,8 @@ func FindGroupMembers(productGroupRepository domain.ProductGroupRepository, comp | ||
172 | //g:=groups[i] | 189 | //g:=groups[i] |
173 | for j := range groups[i].GroupMembers { | 190 | for j := range groups[i].GroupMembers { |
174 | u := groups[i].GroupMembers[j] | 191 | u := groups[i].GroupMembers[j] |
192 | + u.GroupId = groups[i].ProductGroupId | ||
193 | + u.GroupName = groups[i].GroupName | ||
175 | result[keyFunc(u.UserId)] = u | 194 | result[keyFunc(u.UserId)] = u |
176 | } | 195 | } |
177 | } | 196 | } |
@@ -211,7 +230,23 @@ func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain. | @@ -211,7 +230,23 @@ func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain. | ||
211 | if err == domain.ErrorNotFound { | 230 | if err == domain.ErrorNotFound { |
212 | employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, productRecord.ProductWorker) | 231 | employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, productRecord.ProductWorker) |
213 | } | 232 | } |
214 | - employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType, productRecord.WorkStation.SectionName) | 233 | + |
234 | + // 查询当前员工 昨日产能 、历史最好产能 | ||
235 | + var ( | ||
236 | + yesterdayOutputWeight float64 = 0 | ||
237 | + bestOutputWeight float64 = 0 | ||
238 | + ) | ||
239 | + if record, e := employeeProductRecordDao.WorkerProductRecord(cid, oid, planId, productRecord.ProductWorker.UserId, productRecord.CreatedAt.AddDate(0, 0, -1)); e == nil && record != nil { | ||
240 | + yesterdayOutputWeight = record.ProductRecordInfo.OutputWeight | ||
241 | + bestOutputWeight = record.ProductRecordInfo.BestOutputWeight | ||
242 | + | ||
243 | + } else { | ||
244 | + if record, e := employeeProductRecordDao.WorkerBestOutputRecord(cid, oid, planId, productRecord.ProductWorker.UserId); e == nil && record != nil { | ||
245 | + yesterdayOutputWeight = record.ProductRecordInfo.OutputWeight | ||
246 | + } | ||
247 | + } | ||
248 | + | ||
249 | + employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType, productRecord.WorkStation.SectionName, yesterdayOutputWeight, bestOutputWeight) | ||
215 | 250 | ||
216 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { | 251 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { |
217 | // TODO:异常处理 | 252 | // TODO:异常处理 |
1 | +package domainService | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + "github.com/linmadan/egglib-go/core/application" | ||
6 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/dao" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
12 | + "time" | ||
13 | +) | ||
14 | + | ||
15 | +type PGWorkerAttendanceReportService struct { | ||
16 | + transactionContext *pgTransaction.TransactionContext | ||
17 | +} | ||
18 | + | ||
19 | +// 考勤汇报 | ||
20 | +func (ptr *PGWorkerAttendanceReportService) Report(cid, oid int, report *domain.DeviceZkTeco) (interface{}, error) { | ||
21 | + var ( | ||
22 | + attendanceRecordDao, _ = dao.NewAttendanceRecordDao(ptr.transactionContext) | ||
23 | + attendanceRecordRepository, _ = repository.NewProductAttendanceRecordRepository(ptr.transactionContext) | ||
24 | + isSignIn = true | ||
25 | + record *domain.ProductAttendanceRecord | ||
26 | + workStationId string //具体工位 | ||
27 | + workStation *domain.WorkStation | ||
28 | + attendanceType int = domain.ParticipateNormal | ||
29 | + worker *domain.User | ||
30 | + org *domain.Org | ||
31 | + ) | ||
32 | + | ||
33 | + if err := report.Valid(); err != nil { | ||
34 | + return nil, err | ||
35 | + } | ||
36 | + | ||
37 | + var ( | ||
38 | + device *domain.Device | ||
39 | + err error | ||
40 | + productGroupRepository, _ = repository.NewProductGroupRepository(ptr.transactionContext) | ||
41 | + groupId = 0 | ||
42 | + groupName = "" | ||
43 | + ) | ||
44 | + deviceRepository, _ := dao.NewDeviceDao(ptr.transactionContext) | ||
45 | + if device, err = deviceRepository.FindDeviceByDeviceCode(cid, oid, report.Sn); err != nil { | ||
46 | + return nil, err | ||
47 | + } | ||
48 | + workStation = device.WorkStation | ||
49 | + | ||
50 | + var userService = NewUserService() | ||
51 | + org, err = userService.Organization(oid) | ||
52 | + if err != nil { | ||
53 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
54 | + } | ||
55 | + | ||
56 | + worker, err = userService.UserByCode(cid, oid, report.UserNo) | ||
57 | + if err != nil { | ||
58 | + return nil, err | ||
59 | + } | ||
60 | + | ||
61 | + groupMembers, groupMembersKeyFunc := FindGroupMembers(productGroupRepository, cid, oid, workStation.WorkStationId) | ||
62 | + if v, ok := groupMembers[groupMembersKeyFunc(worker.UserId)]; !ok { | ||
63 | + attendanceType = domain.ParticipateSupport | ||
64 | + } else { | ||
65 | + groupId = v.GroupId | ||
66 | + groupName = v.GroupName | ||
67 | + } | ||
68 | + | ||
69 | + beginTime := utils.GetZeroTime(report.ActionTime) | ||
70 | + endTime := report.ActionTime | ||
71 | + _, records, _ := attendanceRecordDao.WorkerAttendanceRecords(cid, oid, worker.UserId, workStationId, beginTime, endTime) | ||
72 | + for i := 0; i < len(records); i++ { | ||
73 | + r := records[i] | ||
74 | + // 操作时间 < 签到时间 | ||
75 | + if utils.TimeAfterEqual(r.SignIn, report.ActionTime) { | ||
76 | + log.Logger.Info(fmt.Sprintf("【考勤汇报】 考勤记录不合法,操作时间小于签到时间 考勤ID:%v 用户:%v 打卡时间:%v", r.ProductAttendanceId, worker.UserId, report.ActionTime)) | ||
77 | + return struct{}{}, nil | ||
78 | + } | ||
79 | + // 存在完整打卡记录 | ||
80 | + // 1. 如果在区间内,退出 | ||
81 | + if !utils.TimeIsZero(r.SignIn) && !utils.TimeIsZero(r.SignOut) { | ||
82 | + if utils.TimeBeforeEqual(r.SignIn, report.ActionTime) && utils.TimeAfterEqual(r.SignOut, report.ActionTime) { | ||
83 | + log.Logger.Info(fmt.Sprintf("【考勤汇报】 已存在同一时间段的考勤记录 考勤ID:%v 用户:%v 打卡时间:%v", r.ProductAttendanceId, worker.UserId, report.ActionTime)) | ||
84 | + return struct{}{}, nil | ||
85 | + } | ||
86 | + continue | ||
87 | + } | ||
88 | + // 存在未结束的打卡记录 | ||
89 | + // 1.满足条件-签退 | ||
90 | + if !utils.TimeIsZero(r.SignIn) && utils.TimeIsZero(r.SignOut) { | ||
91 | + if utils.TimeBeforeEqual(r.SignIn, report.ActionTime) { | ||
92 | + isSignIn = false | ||
93 | + record = r | ||
94 | + break | ||
95 | + } | ||
96 | + } | ||
97 | + } | ||
98 | + | ||
99 | + if isSignIn || record == nil { | ||
100 | + record = &domain.ProductAttendanceRecord{ | ||
101 | + CompanyId: cid, | ||
102 | + OrgId: oid, | ||
103 | + AttendanceType: attendanceType, | ||
104 | + ProductWorker: worker, | ||
105 | + WorkStation: workStation, | ||
106 | + SignIn: report.ActionTime, | ||
107 | + //SignOut: cmd.SignOut, | ||
108 | + AttendanceStatus: domain.AttendanceNotApprove, | ||
109 | + WorkTimeBefore: 0, | ||
110 | + WorkTimeAfter: 0, | ||
111 | + CreatedAt: time.Now(), | ||
112 | + UpdatedAt: time.Now(), | ||
113 | + Ext: domain.NewExt(org.OrgName).WithAttendanceExt(&domain.ProductAttendanceRecordExt{ | ||
114 | + GroupName: groupName, | ||
115 | + ProductGroupId: groupId, | ||
116 | + }), | ||
117 | + } | ||
118 | + log.Logger.Info(fmt.Sprintf("【考勤汇报】 用户:%v(%v) 签到 %v", worker.UserName, worker.UserId, report)) | ||
119 | + } else { | ||
120 | + record.SignOut = report.ActionTime | ||
121 | + record.WorkTimeBefore = record.ComputeWorkTimeBefore() | ||
122 | + log.Logger.Info(fmt.Sprintf("【考勤汇报】 用户:%v(%v) 签退 %v", worker.UserName, worker.UserId, report)) | ||
123 | + } | ||
124 | + | ||
125 | + if _, err = attendanceRecordRepository.Save(record); err != nil { | ||
126 | + return nil, err | ||
127 | + } | ||
128 | + | ||
129 | + return struct{}{}, nil | ||
130 | +} | ||
131 | + | ||
132 | +func NewPGWorkerAttendanceReportService(transactionContext *pgTransaction.TransactionContext) (*PGWorkerAttendanceReportService, error) { | ||
133 | + if transactionContext == nil { | ||
134 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
135 | + } else { | ||
136 | + return &PGWorkerAttendanceReportService{ | ||
137 | + transactionContext: transactionContext, | ||
138 | + }, nil | ||
139 | + } | ||
140 | +} |
1 | -package domainService | ||
2 | - | ||
3 | -//import ( | ||
4 | -// "fmt" | ||
5 | -// pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
6 | -// "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
7 | -// "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" | ||
8 | -//) | ||
9 | -// | ||
10 | -//type PGWorkshopService struct { | ||
11 | -// transactionContext *pgTransaction.TransactionContext | ||
12 | -//} | ||
13 | -// | ||
14 | -//func(ptr *PGWorkshopService)CompanyWorkshops(companyId int)(domain.Workshops,error){ | ||
15 | -// workshopRepository,_:= repository.NewWorkshopRepository(ptr.transactionContext) | ||
16 | -// _,workshops,err:= workshopRepository.Find(map[string]interface{}{"companyId":companyId}) | ||
17 | -// if err!=nil{ | ||
18 | -// return nil,err | ||
19 | -// } | ||
20 | -// if len(workshops)==0{ | ||
21 | -// workshops = make([]*domain.Workshop,0) | ||
22 | -// } | ||
23 | -// return workshops,nil | ||
24 | -//} | ||
25 | -// | ||
26 | -//func NewPGWorkshopService(transactionContext *pgTransaction.TransactionContext) (*PGWorkshopService, error) { | ||
27 | -// if transactionContext == nil { | ||
28 | -// return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
29 | -// } else { | ||
30 | -// return &PGWorkshopService{ | ||
31 | -// transactionContext: transactionContext, | ||
32 | -// }, nil | ||
33 | -// } | ||
34 | -//} |
@@ -59,7 +59,15 @@ func (ptr *PGWorkshopWorkTimeStaticService) WorkshopWorkTimeStatic(productRecord | @@ -59,7 +59,15 @@ func (ptr *PGWorkshopWorkTimeStaticService) WorkshopWorkTimeStatic(productRecord | ||
59 | } | 59 | } |
60 | 60 | ||
61 | func SendWorkshopWorkTimeStaticJob(productRecord *domain.ProductAttendanceRecord) error { | 61 | func SendWorkshopWorkTimeStaticJob(productRecord *domain.ProductAttendanceRecord) error { |
62 | - task := asynq.NewTask(domain.TaskKeyWorkshopWorkTimeRecordStatics(), []byte(json.MarshalToString(productRecord))) | 62 | + return SendAsyncJob(domain.TaskKeyWorkshopWorkTimeRecordStatics(), productRecord) |
63 | +} | ||
64 | + | ||
65 | +func SenDeviceZkTecoReportJob(productRecord *domain.DeviceZkTeco) error { | ||
66 | + return SendAsyncJob(domain.TaskDeviceZkTecoReport(), productRecord) | ||
67 | +} | ||
68 | + | ||
69 | +func SendAsyncJob(queueName string, job interface{}) error { | ||
70 | + task := asynq.NewTask(queueName, []byte(json.MarshalToString(job))) | ||
63 | 71 | ||
64 | client := asynq.NewClient(asynq.RedisClientOpt{Addr: constant.REDIS_ADDRESS}) | 72 | client := asynq.NewClient(asynq.RedisClientOpt{Addr: constant.REDIS_ADDRESS}) |
65 | _, err := client.Enqueue(task) | 73 | _, err := client.Enqueue(task) |
1 | package pg | 1 | package pg |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | + "context" | ||
4 | "fmt" | 5 | "fmt" |
6 | + "github.com/beego/beego/v2/core/logs" | ||
7 | + "log" | ||
5 | "reflect" | 8 | "reflect" |
6 | 9 | ||
7 | "github.com/go-pg/pg/v10" | 10 | "github.com/go-pg/pg/v10" |
8 | "github.com/go-pg/pg/v10/orm" | 11 | "github.com/go-pg/pg/v10/orm" |
9 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | 12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" |
10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | 13 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" |
11 | - | ||
12 | - "github.com/linmadan/egglib-go/persistent/pg/hooks" | ||
13 | ) | 14 | ) |
14 | 15 | ||
15 | var DB *pg.DB | 16 | var DB *pg.DB |
@@ -22,7 +23,7 @@ func init() { | @@ -22,7 +23,7 @@ func init() { | ||
22 | Addr: fmt.Sprintf("%s:%s", constant.POSTGRESQL_HOST, constant.POSTGRESQL_PORT), | 23 | Addr: fmt.Sprintf("%s:%s", constant.POSTGRESQL_HOST, constant.POSTGRESQL_PORT), |
23 | }) | 24 | }) |
24 | if !constant.DISABLE_SQL_GENERATE_PRINT { | 25 | if !constant.DISABLE_SQL_GENERATE_PRINT { |
25 | - DB.AddQueryHook(hooks.SqlGeneratePrintHook{}) | 26 | + DB.AddQueryHook(SqlGeneratePrintHook{}) |
26 | } | 27 | } |
27 | if !constant.DISABLE_CREATE_TABLE { | 28 | if !constant.DISABLE_CREATE_TABLE { |
28 | for _, model := range []interface{}{ | 29 | for _, model := range []interface{}{ |
@@ -59,6 +60,23 @@ func init() { | @@ -59,6 +60,23 @@ func init() { | ||
59 | } | 60 | } |
60 | } | 61 | } |
61 | 62 | ||
63 | +type SqlGeneratePrintHook struct{} | ||
64 | + | ||
65 | +func (hook SqlGeneratePrintHook) BeforeQuery(c context.Context, q *pg.QueryEvent) (context.Context, error) { | ||
66 | + return c, nil | ||
67 | +} | ||
68 | + | ||
69 | +func (hook SqlGeneratePrintHook) AfterQuery(c context.Context, q *pg.QueryEvent) error { | ||
70 | + sqlStr, err := q.FormattedQuery() | ||
71 | + if err != nil { | ||
72 | + return err | ||
73 | + } | ||
74 | + //log.Logger.Debug(string(sqlStr)) | ||
75 | + log.Println(string(sqlStr)) | ||
76 | + logs.Debug(string(sqlStr)) | ||
77 | + return nil | ||
78 | +} | ||
79 | + | ||
62 | func AddComments(db *pg.DB, model interface{}) { | 80 | func AddComments(db *pg.DB, model interface{}) { |
63 | tableName := db.Model(model).TableModel().Table().SQLName | 81 | tableName := db.Model(model).TableModel().Table().SQLName |
64 | columnsMap := make(map[string]*orm.Field) | 82 | columnsMap := make(map[string]*orm.Field) |
@@ -61,3 +61,28 @@ func NewProductCodeCache(id int) ProductCodeCache { | @@ -61,3 +61,28 @@ func NewProductCodeCache(id int) ProductCodeCache { | ||
61 | Time: time.Now(), | 61 | Time: time.Now(), |
62 | } | 62 | } |
63 | } | 63 | } |
64 | + | ||
65 | +type PlanBatchCodeCache struct { | ||
66 | + CompanyId int | ||
67 | + Time time.Time | ||
68 | +} | ||
69 | + | ||
70 | +func (ca PlanBatchCodeCache) CacheKey() string { | ||
71 | + str := fmt.Sprintf("%v:plan-batch-code:%v:%v", constant.CACHE_PREFIX, ca.CompanyId, ca.Time.Format("20060102")) | ||
72 | + return str | ||
73 | +} | ||
74 | +func (ca PlanBatchCodeCache) Format(index int) string { | ||
75 | + if index <= 999 { | ||
76 | + return fmt.Sprintf("%v%03d", ca.Time.Format("20060102"), index) | ||
77 | + } | ||
78 | + return fmt.Sprintf("%v%d", ca.Time.Format("20060102"), index) | ||
79 | +} | ||
80 | +func (ca PlanBatchCodeCache) Expire() time.Duration { | ||
81 | + return time.Hour * 24 | ||
82 | +} | ||
83 | +func NewPlanBatchCodeCache(id int) PlanBatchCodeCache { | ||
84 | + return PlanBatchCodeCache{ | ||
85 | + CompanyId: id, | ||
86 | + Time: time.Now(), | ||
87 | + } | ||
88 | +} |
@@ -6,6 +6,7 @@ import ( | @@ -6,6 +6,7 @@ import ( | ||
6 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 6 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | 7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" |
8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | 8 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" |
9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
9 | 10 | ||
10 | "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | 11 | "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" |
11 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 12 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
@@ -161,8 +162,8 @@ func (repository *ProductCalendarRepository) Find(queryOptions map[string]interf | @@ -161,8 +162,8 @@ func (repository *ProductCalendarRepository) Find(queryOptions map[string]interf | ||
161 | } | 162 | } |
162 | query.SetWhereByQueryOption("work_station->>'workStationId'=?", "workStationId") | 163 | query.SetWhereByQueryOption("work_station->>'workStationId'=?", "workStationId") |
163 | query.SetWhereByQueryOption("work_on & ? >0", "workOn") | 164 | query.SetWhereByQueryOption("work_on & ? >0", "workOn") |
164 | - if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 { | ||
165 | - query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v)) | 165 | + if v, ok := queryOptions["inWorkshopIds"]; ok && len(v.([]int)) > 0 { |
166 | + query.Where(`work_station->>'workshopId' in (?)`, pg.In(utils.ToArrayString(v.([]int)))) | ||
166 | } | 167 | } |
167 | query.SetOffsetAndLimit(domain.MaxQueryRow) | 168 | query.SetOffsetAndLimit(domain.MaxQueryRow) |
168 | query.SetOrderDirect("product_calendar_id", "DESC") | 169 | query.SetOrderDirect("product_calendar_id", "DESC") |
@@ -174,7 +174,6 @@ func (repository *ProductPlanRepository) Find(queryOptions map[string]interface{ | @@ -174,7 +174,6 @@ func (repository *ProductPlanRepository) Find(queryOptions map[string]interface{ | ||
174 | query := sqlbuilder.BuildQuery(tx.Model(&productPlanModels), queryOptions) | 174 | query := sqlbuilder.BuildQuery(tx.Model(&productPlanModels), queryOptions) |
175 | query.SetWhereByQueryOption("company_id = ?", "companyId") | 175 | query.SetWhereByQueryOption("company_id = ?", "companyId") |
176 | query.SetWhereByQueryOption("org_id = ?", "orgId") | 176 | query.SetWhereByQueryOption("org_id = ?", "orgId") |
177 | - query.SetWhereByQueryOption("batch_number=?", "batchNumber") | ||
178 | 177 | ||
179 | if v, ok := queryOptions["batchNumber"]; ok && len(v.(string)) > 0 { | 178 | if v, ok := queryOptions["batchNumber"]; ok && len(v.(string)) > 0 { |
180 | query.Where(fmt.Sprintf(`batch_number like '%%%v%%'`, v)) | 179 | query.Where(fmt.Sprintf(`batch_number like '%%%v%%'`, v)) |
@@ -12,5 +12,9 @@ func ToPinYin(hans string, sep string) string { | @@ -12,5 +12,9 @@ func ToPinYin(hans string, sep string) string { | ||
12 | for i := range tmp { | 12 | for i := range tmp { |
13 | result = append(result, tmp[i]...) | 13 | result = append(result, tmp[i]...) |
14 | } | 14 | } |
15 | - return strings.Join(result, sep) | 15 | + py := strings.Join(result, sep) |
16 | + if len(py) == 0 { | ||
17 | + return strings.ToLower(hans) | ||
18 | + } | ||
19 | + return py | ||
16 | } | 20 | } |
@@ -50,3 +50,33 @@ func TransformTimestampToTime(timeStamp int64) time.Time { | @@ -50,3 +50,33 @@ func TransformTimestampToTime(timeStamp int64) time.Time { | ||
50 | //(myTime) | 50 | //(myTime) |
51 | return time.Date(myTime.Year(), myTime.Month(), myTime.Day(), myTime.Hour(), myTime.Minute(), myTime.Second(), 0, time.Local) | 51 | return time.Date(myTime.Year(), myTime.Month(), myTime.Day(), myTime.Hour(), myTime.Minute(), myTime.Second(), 0, time.Local) |
52 | } | 52 | } |
53 | + | ||
54 | +func TimeIsZero(d time.Time) bool { | ||
55 | + if d.IsZero() { | ||
56 | + return true | ||
57 | + } | ||
58 | + if d.Equal(time.Date(1, 1, 1, 0, 0, 0, 0, time.Local)) { | ||
59 | + return true | ||
60 | + } | ||
61 | + return false | ||
62 | +} | ||
63 | + | ||
64 | +func TimeAfterEqual(t1, t2 time.Time) bool { | ||
65 | + if t1.After(t2) { | ||
66 | + return true | ||
67 | + } | ||
68 | + if t1.Equal(t2) { | ||
69 | + return true | ||
70 | + } | ||
71 | + return false | ||
72 | +} | ||
73 | + | ||
74 | +func TimeBeforeEqual(t1, t2 time.Time) bool { | ||
75 | + if t1.Before(t2) { | ||
76 | + return true | ||
77 | + } | ||
78 | + if t1.Equal(t2) { | ||
79 | + return true | ||
80 | + } | ||
81 | + return false | ||
82 | +} |
1 | package controllers | 1 | package controllers |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | - "encoding/json" | ||
5 | "github.com/linmadan/egglib-go/web/beego" | 4 | "github.com/linmadan/egglib-go/web/beego" |
6 | - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 5 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
8 | - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/redis" | 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" |
9 | "strings" | 7 | "strings" |
10 | "time" | 8 | "time" |
11 | ) | 9 | ) |
@@ -28,8 +26,9 @@ func (controller *DeviceZKTecoController) PostCdata() { | @@ -28,8 +26,9 @@ func (controller *DeviceZKTecoController) PostCdata() { | ||
28 | mTime, err := time.ParseInLocation("2006-01-02 15:04:05", bodyList[1], time.Local) | 26 | mTime, err := time.ParseInLocation("2006-01-02 15:04:05", bodyList[1], time.Local) |
29 | if err == nil { | 27 | if err == nil { |
30 | data.ActionTime = mTime | 28 | data.ActionTime = mTime |
31 | - mBytes, _ := json.Marshal(data) | ||
32 | - redis.GetRedis().LPush(constant.REDIS_ZKTECO_KEY, mBytes) | 29 | + //mBytes, _ := json.Marshal(data) |
30 | + //redis.GetRedis().LPush(domain.TaskDeviceZkTecoReport(), mBytes) | ||
31 | + domainService.SenDeviceZkTecoReportJob(data) | ||
33 | } | 32 | } |
34 | } | 33 | } |
35 | controller.Response(data, nil) | 34 | controller.Response(data, nil) |
1 | package task | 1 | package task |
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | - "context" | ||
5 | - "encoding/json" | ||
6 | - "fmt" | ||
7 | "github.com/hibiken/asynq" | 4 | "github.com/hibiken/asynq" |
8 | - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command" | ||
9 | - "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service" | ||
10 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | 5 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" |
11 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | 6 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" |
12 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | 7 | "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" |
@@ -25,6 +20,7 @@ func Run() { | @@ -25,6 +20,7 @@ func Run() { | ||
25 | // ... Register handlers | 20 | // ... Register handlers |
26 | h.HandleFunc(domain.TaskKeyPatternProductRecordStatics(), HandlerProductRecordStatics) | 21 | h.HandleFunc(domain.TaskKeyPatternProductRecordStatics(), HandlerProductRecordStatics) |
27 | h.HandleFunc(domain.TaskKeyWorkshopWorkTimeRecordStatics(), WorkshopWorkTimeRecordStatics) | 22 | h.HandleFunc(domain.TaskKeyWorkshopWorkTimeRecordStatics(), WorkshopWorkTimeRecordStatics) |
23 | + h.HandleFunc(domain.TaskDeviceZkTecoReport(), WorkerAttendanceReport) | ||
28 | log.Logger.Info("aysnq task running ...") | 24 | log.Logger.Info("aysnq task running ...") |
29 | // Run blocks and waits for os signal to terminate the program. | 25 | // Run blocks and waits for os signal to terminate the program. |
30 | if err := srv.Run(h); err != nil { | 26 | if err := srv.Run(h); err != nil { |
@@ -36,19 +32,3 @@ func Run() { | @@ -36,19 +32,3 @@ func Run() { | ||
36 | log.Logger.Info("aysnq task stopping ...") | 32 | log.Logger.Info("aysnq task stopping ...") |
37 | srv.Shutdown() | 33 | srv.Shutdown() |
38 | } | 34 | } |
39 | - | ||
40 | -// 生产记录统计 | ||
41 | -func HandlerProductRecordStatics(c context.Context, t *asynq.Task) error { | ||
42 | - productPlanService := service.NewProductRecordService(nil) | ||
43 | - cmd := &command.ProductRecordStaticsCommand{} | ||
44 | - if err := json.Unmarshal(t.Payload(), cmd); err != nil { | ||
45 | - return err | ||
46 | - } | ||
47 | - log.Logger.Debug(fmt.Sprintf("【生产记录统计】 消费 生产记录ID:%v 类型:%v 工段:%v(%v) 重量:%v", cmd.ProductRecordId, cmd.ProductRecordType, | ||
48 | - cmd.WorkStation.SectionName, cmd.WorkStation.WorkStationId, cmd.ProductRecordInfo.Weigh)) | ||
49 | - _, err := productPlanService.ProductRecordStatics(cmd) | ||
50 | - if err != nil { | ||
51 | - log.Logger.Error(err.Error()) | ||
52 | - } | ||
53 | - return err | ||
54 | -} |
pkg/port/task/task_product_record_statics.go
0 → 100644
1 | +package task | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "encoding/json" | ||
6 | + "fmt" | ||
7 | + "github.com/hibiken/asynq" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/command" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productRecord/service" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
11 | +) | ||
12 | + | ||
13 | +// 生产记录统计 | ||
14 | +func HandlerProductRecordStatics(c context.Context, t *asynq.Task) error { | ||
15 | + productPlanService := service.NewProductRecordService(nil) | ||
16 | + cmd := &command.ProductRecordStaticsCommand{} | ||
17 | + if err := json.Unmarshal(t.Payload(), cmd); err != nil { | ||
18 | + return err | ||
19 | + } | ||
20 | + log.Logger.Debug(fmt.Sprintf("【生产记录统计】 消费 生产记录ID:%v 类型:%v 工段:%v(%v) 重量:%v", cmd.ProductRecordId, cmd.ProductRecordType, | ||
21 | + cmd.WorkStation.SectionName, cmd.WorkStation.WorkStationId, cmd.ProductRecordInfo.Weigh)) | ||
22 | + _, err := productPlanService.ProductRecordStatics(cmd) | ||
23 | + if err != nil { | ||
24 | + log.Logger.Error(err.Error()) | ||
25 | + } | ||
26 | + return err | ||
27 | +} |
@@ -14,7 +14,7 @@ import ( | @@ -14,7 +14,7 @@ import ( | ||
14 | func WorkshopWorkTimeRecordStatics(c context.Context, t *asynq.Task) error { | 14 | func WorkshopWorkTimeRecordStatics(c context.Context, t *asynq.Task) error { |
15 | svr := service.NewAttendanceService(nil) | 15 | svr := service.NewAttendanceService(nil) |
16 | cmd := &command.WorkshopWorkTimeRecordStaticsCommand{} | 16 | cmd := &command.WorkshopWorkTimeRecordStaticsCommand{} |
17 | - if err := json.Unmarshal(t.Payload(), cmd); err != nil { | 17 | + if err := json.Unmarshal(t.Payload(), cmd); err != nil || cmd == nil { |
18 | return err | 18 | return err |
19 | } | 19 | } |
20 | log.Logger.Debug(fmt.Sprintf("【考勤记录统计】 消费 记录ID:%v 时间:%v", cmd.ProductAttendanceId, cmd.WorkTimeBefore)) | 20 | log.Logger.Debug(fmt.Sprintf("【考勤记录统计】 消费 记录ID:%v 时间:%v", cmd.ProductAttendanceId, cmd.WorkTimeBefore)) |
pkg/port/task/task_worker_attendance.go
0 → 100644
1 | +package task | ||
2 | + | ||
3 | +import ( | ||
4 | + "context" | ||
5 | + "encoding/json" | ||
6 | + "fmt" | ||
7 | + "github.com/hibiken/asynq" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/attendance/command" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/attendance/service" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
11 | +) | ||
12 | + | ||
13 | +// 员工工时汇报 | ||
14 | +func WorkerAttendanceReport(c context.Context, t *asynq.Task) error { | ||
15 | + svr := service.NewAttendanceService(nil) | ||
16 | + cmd := &command.WorkerAttendanceReportCommand{} | ||
17 | + if err := json.Unmarshal(t.Payload(), cmd); err != nil { | ||
18 | + return err | ||
19 | + } | ||
20 | + log.Logger.Debug(fmt.Sprintf("【员工考勤记录汇报】 消费 设备:%v 用户编号:%v 时间:%v ", cmd.Sn, cmd.UserNo, cmd.DeviceZkTeco)) | ||
21 | + _, err := svr.WorkerAttendanceReport(cmd) | ||
22 | + if err != nil { | ||
23 | + log.Logger.Error(err.Error()) | ||
24 | + } | ||
25 | + return nil | ||
26 | +} |
-
请 注册 或 登录 后发表评论