正在显示
44 个修改的文件
包含
1522 行增加
和
66 行删除
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/beego/beego/v2/core/validation" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 7 | + "reflect" | ||
| 8 | + "strings" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type WorkshopWorkTimeRecordStaticsCommand struct { | ||
| 12 | + *domain.ProductAttendanceRecord | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +// Type is a string value that indicates the type of the task. | ||
| 16 | +//func (t *ProductRecordStaticsCommand) Type() string | ||
| 17 | + | ||
| 18 | +// Payload is the data needed for task execution. | ||
| 19 | +//func (t *ProductRecordStaticsCommand) Payload() []byte | ||
| 20 | + | ||
| 21 | +func (removeProductRecordCommand *WorkshopWorkTimeRecordStaticsCommand) Valid(validation *validation.Validation) { | ||
| 22 | + //validation.SetError("CustomValid", "未实现的自定义认证") | ||
| 23 | +} | ||
| 24 | + | ||
| 25 | +func (removeProductRecordCommand *WorkshopWorkTimeRecordStaticsCommand) ValidateCommand() error { | ||
| 26 | + valid := validation.Validation{} | ||
| 27 | + b, err := valid.Valid(removeProductRecordCommand) | ||
| 28 | + if err != nil { | ||
| 29 | + return err | ||
| 30 | + } | ||
| 31 | + if !b { | ||
| 32 | + elem := reflect.TypeOf(removeProductRecordCommand).Elem() | ||
| 33 | + for _, validErr := range valid.Errors { | ||
| 34 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 35 | + if isExist { | ||
| 36 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 37 | + } else { | ||
| 38 | + return fmt.Errorf(validErr.Message) | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + return nil | ||
| 43 | +} |
| 1 | +package dto | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | +) | ||
| 6 | + | ||
| 7 | +type EmployeeAttendanceRecordDto struct { | ||
| 8 | + // 考勤记录ID | ||
| 9 | + ProductAttendanceId int `json:"productAttendanceId"` | ||
| 10 | + // 签到日期 | ||
| 11 | + SignDate string `json:"signDate"` | ||
| 12 | + // 工作位置 | ||
| 13 | + *domain.WorkStation | ||
| 14 | + // 生产工人 | ||
| 15 | + ProductWorker *domain.User `json:"productWorker,omitempty"` | ||
| 16 | + // 考勤类型 1.正常 2.支援 | ||
| 17 | + AttendanceType int `json:"attendanceType,omitempty"` | ||
| 18 | + //*domain.ProductAttendanceRecordExt | ||
| 19 | + // 考勤状态 1.未审核 2:已审核 4.自动审核 | ||
| 20 | + AttendanceStatus int `json:"attendanceStatus"` | ||
| 21 | + // 工时 | ||
| 22 | + WorkTime float64 `json:"workTime"` | ||
| 23 | + // 组织名称 | ||
| 24 | + OrgName string `json:"orgName"` | ||
| 25 | + // 权限标识 (当前登录组织匹配为true,否则false) | ||
| 26 | + AuthFlag bool `json:"authFlag"` | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +func (d *EmployeeAttendanceRecordDto) LoadDto(m *domain.ProductAttendanceRecord, orgId int) *EmployeeAttendanceRecordDto { | ||
| 30 | + d.ProductAttendanceId = m.ProductAttendanceId | ||
| 31 | + d.AttendanceType = m.AttendanceType | ||
| 32 | + d.ProductWorker = m.ProductWorker | ||
| 33 | + d.WorkStation = m.WorkStation | ||
| 34 | + if !m.SignIn.IsZero() { | ||
| 35 | + //d.SignIn = m.SignIn.Format("15:04:05") | ||
| 36 | + d.SignDate = m.SignIn.Format("2006-01-02") | ||
| 37 | + } | ||
| 38 | + d.WorkTime = m.WorkTimeAfter | ||
| 39 | + //d.WorkTimeAfter = m.WorkTimeAfter | ||
| 40 | + d.AttendanceStatus = m.AttendanceStatus | ||
| 41 | + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) | ||
| 42 | + if m.Ext != nil { | ||
| 43 | + d.OrgName = m.Ext.OrgName | ||
| 44 | + //d.ProductAttendanceRecordExt = m.Ext.AttendanceExt | ||
| 45 | + } | ||
| 46 | + return d | ||
| 47 | +} |
| 1 | +package dto | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | +) | ||
| 6 | + | ||
| 7 | +type WorkshopWorkTimeRecordDto struct { | ||
| 8 | + // 车间工时记录ID | ||
| 9 | + WorkshopWorkTimeRecordId int `json:"workshopWorkTimeRecordId"` | ||
| 10 | + // 工作位置 | ||
| 11 | + *domain.WorkStation | ||
| 12 | + // 签到日期 | ||
| 13 | + //SignDate string `json:"signDate"` | ||
| 14 | + // 记录信息 | ||
| 15 | + *domain.WorkshopWorkTimeRecordInfo | ||
| 16 | + // 记录日期 | ||
| 17 | + RecordDate string `json:"recordDate"` | ||
| 18 | + // 组织名称 | ||
| 19 | + OrgName string `json:"orgName"` | ||
| 20 | + // 权限标识 (当前登录组织匹配为true,否则false) | ||
| 21 | + AuthFlag bool `json:"authFlag"` | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +func (d *WorkshopWorkTimeRecordDto) LoadDto(m *domain.WorkshopWorkTimeRecord, orgId int) *WorkshopWorkTimeRecordDto { | ||
| 25 | + d.WorkshopWorkTimeRecordId = m.WorkshopWorkTimeRecordId | ||
| 26 | + d.WorkStation = m.WorkStation | ||
| 27 | + d.WorkshopWorkTimeRecordInfo = m.WorkshopWorkTimeRecordInfo | ||
| 28 | + d.WorkStation = m.WorkStation | ||
| 29 | + d.RecordDate = m.RecordDate.Format("2006-01-02") | ||
| 30 | + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) | ||
| 31 | + if m.Ext != nil { | ||
| 32 | + d.OrgName = m.Ext.OrgName | ||
| 33 | + //d.ProductAttendanceRecordExt = m.Ext.AttendanceExt | ||
| 34 | + } | ||
| 35 | + return d | ||
| 36 | +} |
| 1 | +package query | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
| 7 | + "reflect" | ||
| 8 | + "strings" | ||
| 9 | + "time" | ||
| 10 | + | ||
| 11 | + "github.com/beego/beego/v2/core/validation" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type SearchEmployeeAttendanceQuery struct { | ||
| 15 | + // 查询偏离量 | ||
| 16 | + Offset int `cname:"查询偏离量" json:"offset"` | ||
| 17 | + // 查询限制 | ||
| 18 | + Limit int `cname:"查询限制" json:"limit"` | ||
| 19 | + // 当前公司 | ||
| 20 | + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"` | ||
| 21 | + // 当前登录的组织 | ||
| 22 | + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty" ` | ||
| 23 | + // 匹配多个组织 | ||
| 24 | + InOrgIds []int `cname:"匹配多个组织" json:"inOrgIds,omitempty" ` | ||
| 25 | + // 页码 | ||
| 26 | + PageNumber int `cname:"页码" json:"pageNumber,omitempty"` | ||
| 27 | + // 页数 | ||
| 28 | + PageSize int `cname:"页数" json:"pageSize,omitempty"` | ||
| 29 | + // 车间名称 | ||
| 30 | + WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"` | ||
| 31 | + // 生产线名称 | ||
| 32 | + LineName string `cname:"生产线名称" json:"lineName,omitempty"` | ||
| 33 | + // 工段名称 | ||
| 34 | + SectionName string `cname:"工段名称" json:"sectionName,omitempty"` | ||
| 35 | + // 姓名 | ||
| 36 | + UserName string `cname:"姓名" json:"userName,omitempty"` | ||
| 37 | + // 考勤状态 1.未审核 2:已审核 4.自动审核 | ||
| 38 | + AttendanceStatus int `cname:"考勤状态 1.未审核 2:已审核 4.自动审核" json:"attendanceStatus,omitempty"` | ||
| 39 | + // 开始时间 | ||
| 40 | + BeginTime string `cname:"开始时间" json:"beginTime"` | ||
| 41 | + // 结束时间 | ||
| 42 | + EndTime string `cname:"结束时间" json:"endTime"` | ||
| 43 | + | ||
| 44 | + // 开始时间 | ||
| 45 | + SignBeginTime time.Time `cname:"开始时间" json:"signBeginTime"` | ||
| 46 | + // 结束时间 | ||
| 47 | + SignEndTime time.Time `cname:"结束时间" json:"signEndTime"` | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +func (cmd *SearchEmployeeAttendanceQuery) Valid(validation *validation.Validation) { | ||
| 51 | + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize) | ||
| 52 | + var err error | ||
| 53 | + if len(cmd.BeginTime) > 0 { | ||
| 54 | + if cmd.SignBeginTime, err = time.Parse("2006-01-02 15:04:05", cmd.BeginTime); err != nil { | ||
| 55 | + log.Logger.Error(err.Error()) | ||
| 56 | + validation.Error("开始时间有误") | ||
| 57 | + return | ||
| 58 | + } | ||
| 59 | + } | ||
| 60 | + if len(cmd.EndTime) > 0 { | ||
| 61 | + if cmd.SignEndTime, err = time.Parse("2006-01-02 15:04:05", cmd.EndTime); err != nil { | ||
| 62 | + log.Logger.Error(err.Error()) | ||
| 63 | + validation.Error("结束时间有误") | ||
| 64 | + return | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + cmd.AttendanceStatus = 6 // 审核 + 自动审核 | ||
| 68 | +} | ||
| 69 | + | ||
| 70 | +func (cmd *SearchEmployeeAttendanceQuery) ValidateQuery() error { | ||
| 71 | + valid := validation.Validation{} | ||
| 72 | + b, err := valid.Valid(cmd) | ||
| 73 | + if err != nil { | ||
| 74 | + return err | ||
| 75 | + } | ||
| 76 | + if !b { | ||
| 77 | + elem := reflect.TypeOf(cmd).Elem() | ||
| 78 | + for _, validErr := range valid.Errors { | ||
| 79 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 80 | + if isExist { | ||
| 81 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 82 | + } else { | ||
| 83 | + return fmt.Errorf(validErr.Message) | ||
| 84 | + } | ||
| 85 | + } | ||
| 86 | + } | ||
| 87 | + return nil | ||
| 88 | +} |
| @@ -51,7 +51,9 @@ func (attendanceService *AttendanceService) ApproveAttendance(cmd *command.Appro | @@ -51,7 +51,9 @@ func (attendanceService *AttendanceService) ApproveAttendance(cmd *command.Appro | ||
| 51 | if _, err := productAttendanceRecordRepository.Save(attendance); err != nil { | 51 | if _, err := productAttendanceRecordRepository.Save(attendance); err != nil { |
| 52 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 52 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 53 | } | 53 | } |
| 54 | - | 54 | + if err := domainService.SendWorkshopWorkTimeStaticJob(attendance); err != nil { |
| 55 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 56 | + } | ||
| 55 | if err := transactionContext.CommitTransaction(); err != nil { | 57 | if err := transactionContext.CommitTransaction(); err != nil { |
| 56 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 58 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| 57 | } | 59 | } |
| @@ -310,6 +312,74 @@ func (attendanceService *AttendanceService) SearchAttendance(operateInfo *domain | @@ -310,6 +312,74 @@ func (attendanceService *AttendanceService) SearchAttendance(operateInfo *domain | ||
| 310 | return count, result, nil | 312 | return count, result, nil |
| 311 | } | 313 | } |
| 312 | 314 | ||
| 315 | +// 员工工时统计 | ||
| 316 | +func (attendanceService *AttendanceService) SearchEmployeeAttendanceStatics(operateInfo *domain.OperateInfo, cmd *query.SearchEmployeeAttendanceQuery) (int64, interface{}, error) { | ||
| 317 | + if err := cmd.ValidateQuery(); err != nil { | ||
| 318 | + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 319 | + } | ||
| 320 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 321 | + if err != nil { | ||
| 322 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 323 | + } | ||
| 324 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 325 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 326 | + } | ||
| 327 | + defer func() { | ||
| 328 | + transactionContext.RollbackTransaction() | ||
| 329 | + }() | ||
| 330 | + var attendanceRepository domain.ProductAttendanceRecordRepository | ||
| 331 | + attendanceRepository, _, _ = factory.FastPgAttendance(transactionContext, 0) | ||
| 332 | + | ||
| 333 | + queryOptions := utils.ObjectToMap(cmd) | ||
| 334 | + count, attendances, err := attendanceRepository.Find(queryOptions) | ||
| 335 | + if err != nil { | ||
| 336 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 337 | + } | ||
| 338 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 339 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 340 | + } | ||
| 341 | + var result = make([]*dto.EmployeeAttendanceRecordDto, 0) | ||
| 342 | + for i := range attendances { | ||
| 343 | + newItem := &dto.EmployeeAttendanceRecordDto{} | ||
| 344 | + result = append(result, newItem.LoadDto(attendances[i], operateInfo.OrgId)) | ||
| 345 | + } | ||
| 346 | + return count, result, nil | ||
| 347 | +} | ||
| 348 | + | ||
| 349 | +// 车间工时统计 | ||
| 350 | +func (attendanceService *AttendanceService) SearchWorkshopWorkTimeStatics(operateInfo *domain.OperateInfo, cmd *query.SearchEmployeeAttendanceQuery) (int64, interface{}, error) { | ||
| 351 | + if err := cmd.ValidateQuery(); err != nil { | ||
| 352 | + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 353 | + } | ||
| 354 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 355 | + if err != nil { | ||
| 356 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 357 | + } | ||
| 358 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 359 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 360 | + } | ||
| 361 | + defer func() { | ||
| 362 | + transactionContext.RollbackTransaction() | ||
| 363 | + }() | ||
| 364 | + var attendanceRepository domain.WorkshopWorkTimeRecordRepository | ||
| 365 | + attendanceRepository, _, _ = factory.FastPgWorkshopWorkTimeRecord(transactionContext, 0) | ||
| 366 | + | ||
| 367 | + queryOptions := utils.ObjectToMap(cmd) | ||
| 368 | + count, attendances, err := attendanceRepository.Find(queryOptions) | ||
| 369 | + if err != nil { | ||
| 370 | + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 371 | + } | ||
| 372 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 373 | + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 374 | + } | ||
| 375 | + var result = make([]*dto.WorkshopWorkTimeRecordDto, 0) | ||
| 376 | + for i := range attendances { | ||
| 377 | + newItem := &dto.WorkshopWorkTimeRecordDto{} | ||
| 378 | + result = append(result, newItem.LoadDto(attendances[i], operateInfo.OrgId)) | ||
| 379 | + } | ||
| 380 | + return count, result, nil | ||
| 381 | +} | ||
| 382 | + | ||
| 313 | func NewAttendanceService(options map[string]interface{}) *AttendanceService { | 383 | func NewAttendanceService(options map[string]interface{}) *AttendanceService { |
| 314 | newAttendanceService := &AttendanceService{} | 384 | newAttendanceService := &AttendanceService{} |
| 315 | return newAttendanceService | 385 | return newAttendanceService |
| 1 | +package service | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/linmadan/egglib-go/core/application" | ||
| 5 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/attendance/command" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/domainService" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/log" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +// 审核工时 | ||
| 13 | +func (attendanceService *AttendanceService) WorkshopWorkTimeRecordStatics(cmd *command.WorkshopWorkTimeRecordStaticsCommand) (interface{}, error) { | ||
| 14 | + if err := cmd.ValidateCommand(); err != nil { | ||
| 15 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 16 | + } | ||
| 17 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 18 | + if err != nil { | ||
| 19 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 20 | + } | ||
| 21 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 22 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 23 | + } | ||
| 24 | + defer func() { | ||
| 25 | + transactionContext.RollbackTransaction() | ||
| 26 | + }() | ||
| 27 | + | ||
| 28 | + svr, _ := domainService.NewPGWorkshopWorkTimeStaticService(transactionContext.(*pgTransaction.TransactionContext)) | ||
| 29 | + if _, err := svr.WorkshopWorkTimeStatic(cmd.ProductAttendanceRecord); err != nil { | ||
| 30 | + log.Logger.Error(err.Error()) | ||
| 31 | + return nil, err | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 35 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 36 | + } | ||
| 37 | + return struct{}{}, nil | ||
| 38 | +} |
| @@ -22,11 +22,11 @@ type CreateDeviceCommand struct { | @@ -22,11 +22,11 @@ type CreateDeviceCommand struct { | ||
| 22 | // 设备类型 | 22 | // 设备类型 |
| 23 | DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"` | 23 | DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"` |
| 24 | // 车间ID | 24 | // 车间ID |
| 25 | - WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` | 25 | + WorkshopId int `cname:"车间ID" json:"workshopId"` |
| 26 | // 生产线ID | 26 | // 生产线ID |
| 27 | - LineId int `cname:"生产线ID" json:"lineId" valid:"Required"` | 27 | + LineId int `cname:"生产线ID" json:"lineId"` |
| 28 | // 工段ID | 28 | // 工段ID |
| 29 | - SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"` | 29 | + SectionId int `cname:"工段ID" json:"sectionId"` |
| 30 | // 品牌 | 30 | // 品牌 |
| 31 | Brand string `cname:"品牌" json:"brand"` | 31 | Brand string `cname:"品牌" json:"brand"` |
| 32 | // 设备状态 1:正常 2:封存 3:报废 | 32 | // 设备状态 1:正常 2:封存 3:报废 |
| @@ -20,11 +20,11 @@ type UpdateDeviceCommand struct { | @@ -20,11 +20,11 @@ type UpdateDeviceCommand struct { | ||
| 20 | // 设备类型 | 20 | // 设备类型 |
| 21 | DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"` | 21 | DeviceType string `cname:"设备类型" json:"deviceType" valid:"Required"` |
| 22 | // 车间ID | 22 | // 车间ID |
| 23 | - WorkshopId int `cname:"车间ID" json:"workshopId" valid:"Required"` | 23 | + WorkshopId int `cname:"车间ID" json:"workshopId"` |
| 24 | // 生产线ID | 24 | // 生产线ID |
| 25 | - LineId int `cname:"生产线ID" json:"lineId" valid:"Required"` | 25 | + LineId int `cname:"生产线ID" json:"lineId" ` |
| 26 | // 工段ID | 26 | // 工段ID |
| 27 | - SectionId int `cname:"工段ID" json:"sectionId" valid:"Required"` | 27 | + SectionId int `cname:"工段ID" json:"sectionId"` |
| 28 | // 品牌 | 28 | // 品牌 |
| 29 | Brand string `cname:"品牌" json:"brand" valid:"Required"` | 29 | Brand string `cname:"品牌" json:"brand" valid:"Required"` |
| 30 | // 设备状态 1:正常 2:封存 3:报废 | 30 | // 设备状态 1:正常 2:封存 3:报废 |
| @@ -36,6 +36,7 @@ func (d *DeviceDto) LoadDto(m *domain.Device, orgId int) *DeviceDto { | @@ -36,6 +36,7 @@ func (d *DeviceDto) LoadDto(m *domain.Device, orgId int) *DeviceDto { | ||
| 36 | d.DeviceId = m.DeviceId | 36 | d.DeviceId = m.DeviceId |
| 37 | d.DeviceCode = m.DeviceCode | 37 | d.DeviceCode = m.DeviceCode |
| 38 | d.DeviceName = m.DeviceName | 38 | d.DeviceName = m.DeviceName |
| 39 | + d.DeviceModel = m.DeviceModel | ||
| 39 | d.DeviceType = m.DeviceType | 40 | d.DeviceType = m.DeviceType |
| 40 | d.Brand = m.Brand | 41 | d.Brand = m.Brand |
| 41 | d.DeviceStatus = m.DeviceStatus | 42 | d.DeviceStatus = m.DeviceStatus |
| @@ -38,10 +38,13 @@ func (deviceService *DeviceService) CreateDevice(operateInfo *domain.OperateInfo | @@ -38,10 +38,13 @@ func (deviceService *DeviceService) CreateDevice(operateInfo *domain.OperateInfo | ||
| 38 | }() | 38 | }() |
| 39 | 39 | ||
| 40 | var workStation *domain.WorkStation | 40 | var workStation *domain.WorkStation |
| 41 | - _, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId) | 41 | + if cmd.WorkshopId != 0 { |
| 42 | + _, workshop, err := factory.FastPgWorkshop(transactionContext, cmd.WorkshopId) //, cmd.LineId, cmd.SectionId | ||
| 42 | if err != nil { | 43 | if err != nil { |
| 43 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 44 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 44 | } | 45 | } |
| 46 | + workStation, _ = workshop.FindWorkStationOrNil(cmd.WorkshopId, cmd.LineId, cmd.SectionId) | ||
| 47 | + } | ||
| 45 | 48 | ||
| 46 | var userService = domainService.NewUserService() | 49 | var userService = domainService.NewUserService() |
| 47 | var org *domain.Org | 50 | var org *domain.Org |
| @@ -272,10 +275,17 @@ func (deviceService *DeviceService) UpdateDevice(cmd *command.UpdateDeviceComman | @@ -272,10 +275,17 @@ func (deviceService *DeviceService) UpdateDevice(cmd *command.UpdateDeviceComman | ||
| 272 | } | 275 | } |
| 273 | 276 | ||
| 274 | var workStation *domain.WorkStation | 277 | var workStation *domain.WorkStation |
| 275 | - _, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId, factory.WithSetPrincipal()) | 278 | + //_, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId, factory.WithSetPrincipal()) |
| 279 | + //if err != nil { | ||
| 280 | + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 281 | + //} | ||
| 282 | + if cmd.WorkshopId != 0 { | ||
| 283 | + _, workshop, err := factory.FastPgWorkshop(transactionContext, cmd.WorkshopId) //, cmd.LineId, cmd.SectionId | ||
| 276 | if err != nil { | 284 | if err != nil { |
| 277 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 285 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 278 | } | 286 | } |
| 287 | + workStation, _ = workshop.FindWorkStationOrNil(cmd.WorkshopId, cmd.LineId, cmd.SectionId) | ||
| 288 | + } | ||
| 279 | device.WorkStation = workStation | 289 | device.WorkStation = workStation |
| 280 | 290 | ||
| 281 | if cmd.DeviceCode != device.DeviceCode { | 291 | if cmd.DeviceCode != device.DeviceCode { |
| @@ -335,6 +335,32 @@ func FastPgProductRecord(transactionContext application.TransactionContext, id i | @@ -335,6 +335,32 @@ func FastPgProductRecord(transactionContext application.TransactionContext, id i | ||
| 335 | return rep, mod, err | 335 | return rep, mod, err |
| 336 | } | 336 | } |
| 337 | 337 | ||
| 338 | +// FastPgWorkshopWorkTimeRecord 快速返回生产记录 | ||
| 339 | +// | ||
| 340 | +// transactionContext 事务 | ||
| 341 | +// id 对象唯一标识 | ||
| 342 | +func FastPgWorkshopWorkTimeRecord(transactionContext application.TransactionContext, id int, options ...option) (domain.WorkshopWorkTimeRecordRepository, *domain.WorkshopWorkTimeRecord, error) { | ||
| 343 | + var rep domain.WorkshopWorkTimeRecordRepository | ||
| 344 | + var mod *domain.WorkshopWorkTimeRecord | ||
| 345 | + var err error | ||
| 346 | + if value, err := CreateWorkshopWorkTimeRecordRepository(map[string]interface{}{ | ||
| 347 | + "transactionContext": transactionContext, | ||
| 348 | + }); err != nil { | ||
| 349 | + return nil, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 350 | + } else { | ||
| 351 | + rep = value | ||
| 352 | + } | ||
| 353 | + if id > 0 { | ||
| 354 | + if mod, err = rep.FindOne(map[string]interface{}{"workshopWorkTimeRecordId": id}); err != nil { | ||
| 355 | + if err == domain.ErrorNotFound { | ||
| 356 | + return nil, nil, application.ThrowError(application.RES_NO_FIND_ERROR, "该记录不存在") | ||
| 357 | + } | ||
| 358 | + return nil, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 359 | + } | ||
| 360 | + } | ||
| 361 | + return rep, mod, err | ||
| 362 | +} | ||
| 363 | + | ||
| 338 | /***** 2.配置 *****/ | 364 | /***** 2.配置 *****/ |
| 339 | 365 | ||
| 340 | type FastOptions struct { | 366 | type FastOptions struct { |
| @@ -93,3 +93,19 @@ func CreateEmployeeProductRecordRepository(options map[string]interface{}) (doma | @@ -93,3 +93,19 @@ func CreateEmployeeProductRecordRepository(options map[string]interface{}) (doma | ||
| 93 | } | 93 | } |
| 94 | return repository.NewEmployeeProductRecordRepository(transactionContext) | 94 | return repository.NewEmployeeProductRecordRepository(transactionContext) |
| 95 | } | 95 | } |
| 96 | + | ||
| 97 | +func CreateWorkshopProductRecordRepository(options map[string]interface{}) (domain.WorkshopProductRecordRepository, error) { | ||
| 98 | + var transactionContext *pg.TransactionContext | ||
| 99 | + if value, ok := options["transactionContext"]; ok { | ||
| 100 | + transactionContext = value.(*pg.TransactionContext) | ||
| 101 | + } | ||
| 102 | + return repository.NewWorkshopProductRecordRepository(transactionContext) | ||
| 103 | +} | ||
| 104 | + | ||
| 105 | +func CreateWorkshopWorkTimeRecordRepository(options map[string]interface{}) (domain.WorkshopWorkTimeRecordRepository, error) { | ||
| 106 | + var transactionContext *pg.TransactionContext | ||
| 107 | + if value, ok := options["transactionContext"]; ok { | ||
| 108 | + transactionContext = value.(*pg.TransactionContext) | ||
| 109 | + } | ||
| 110 | + return repository.NewWorkshopWorkTimeRecordRepository(transactionContext) | ||
| 111 | +} |
| @@ -4,7 +4,7 @@ import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/d | @@ -4,7 +4,7 @@ import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/d | ||
| 4 | 4 | ||
| 5 | type EmployeeProductRecordDto struct { | 5 | type EmployeeProductRecordDto struct { |
| 6 | // 员工产能记录ID | 6 | // 员工产能记录ID |
| 7 | - EmployeeProductRecordId int `json:"employeeProductRecordId"` | 7 | + EmployeeProductRecordId int `json:"productRecordId"` |
| 8 | // 生产工人 | 8 | // 生产工人 |
| 9 | ProductWorker *domain.User `json:"productWorker,omitempty"` | 9 | ProductWorker *domain.User `json:"productWorker,omitempty"` |
| 10 | *domain.WorkStation | 10 | *domain.WorkStation |
| @@ -40,7 +40,7 @@ func (d *EmployeeProductRecordDto) LoadDto(m *domain.EmployeeProductRecord, orgI | @@ -40,7 +40,7 @@ func (d *EmployeeProductRecordDto) LoadDto(m *domain.EmployeeProductRecord, orgI | ||
| 40 | d.ProductWeigh = m.RealProductWeigh() | 40 | d.ProductWeigh = m.RealProductWeigh() |
| 41 | d.SecondLevelWeigh = m.SecondLevelWeigh | 41 | d.SecondLevelWeigh = m.SecondLevelWeigh |
| 42 | d.QualificationRate = m.QualificationRate() | 42 | d.QualificationRate = m.QualificationRate() |
| 43 | - d.CreatedAt = m.CreatedAt.Format("06-01-02") | 43 | + d.CreatedAt = m.CreatedAt.Format("2006-01-02") |
| 44 | d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) | 44 | d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) |
| 45 | if m.Ext != nil { | 45 | if m.Ext != nil { |
| 46 | d.OrgName = m.Ext.OrgName | 46 | d.OrgName = m.Ext.OrgName |
| 1 | +package dto | ||
| 2 | + | ||
| 3 | +import "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 4 | + | ||
| 5 | +type WorkshopProductRecordDto struct { | ||
| 6 | + // 员工产能记录ID | ||
| 7 | + WorkshopProductRecordId int `json:"productRecordId"` | ||
| 8 | + // 生产工人 | ||
| 9 | + //ProductWorker *domain.User `json:"productWorker,omitempty"` | ||
| 10 | + *domain.WorkStation | ||
| 11 | + // 生产日期 | ||
| 12 | + //ProductDate string `json:"productDate"` | ||
| 13 | + // 计划的产品名称 | ||
| 14 | + PlanProductName string `json:"planProductName,omitempty"` | ||
| 15 | + // 批号 | ||
| 16 | + BatchNumber string `json:"batchNumber,omitempty"` | ||
| 17 | + // 参与类型 1:正常 2:支援 | ||
| 18 | + //ParticipateType int `json:"participateType"` | ||
| 19 | + // 投入量 | ||
| 20 | + DevotedProductWeigh float64 `json:"devotedProductWeigh"` | ||
| 21 | + // 产能 | ||
| 22 | + ProductWeigh float64 `json:"productWeigh"` | ||
| 23 | + // 二级品产能 | ||
| 24 | + SecondLevelWeigh float64 `json:"secondLevelWeigh"` | ||
| 25 | + // 创建时间 | ||
| 26 | + CreatedAt string `json:"createdAt,omitempty"` | ||
| 27 | + // 组织名称 | ||
| 28 | + OrgName string `json:"orgName"` | ||
| 29 | + // 权限标识 (当前登录组织匹配为true,否则false) | ||
| 30 | + AuthFlag bool `json:"authFlag"` | ||
| 31 | + // 合格率 百分比 | ||
| 32 | + QualificationRate int `json:"qualificationRate"` | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +func (d *WorkshopProductRecordDto) LoadDto(m *domain.WorkshopProductRecord, orgId int) *WorkshopProductRecordDto { | ||
| 36 | + d.WorkshopProductRecordId = m.WorkshopProductRecordId | ||
| 37 | + //d.ProductWorker = m.ProductWorker | ||
| 38 | + d.WorkStation = m.WorkStation | ||
| 39 | + d.PlanProductName = m.ProductRecordInfo.PlanProductName | ||
| 40 | + d.BatchNumber = m.ProductRecordInfo.BatchNumber | ||
| 41 | + //d.ParticipateType = m.ParticipateType | ||
| 42 | + d.DevotedProductWeigh = m.DevotedProductWeigh() | ||
| 43 | + d.ProductWeigh = m.RealProductWeigh() | ||
| 44 | + d.SecondLevelWeigh = m.SecondLevelWeigh | ||
| 45 | + d.QualificationRate = m.QualificationRate() | ||
| 46 | + d.CreatedAt = m.ProductDate | ||
| 47 | + d.AuthFlag = domain.CheckOrgAuth(orgId, m.OrgId) | ||
| 48 | + if m.Ext != nil { | ||
| 49 | + d.OrgName = m.Ext.OrgName | ||
| 50 | + } | ||
| 51 | + return d | ||
| 52 | +} |
| @@ -304,6 +304,9 @@ func (productRecordService *ProductRecordService) ProductRecordStatics(cmd *comm | @@ -304,6 +304,9 @@ func (productRecordService *ProductRecordService) ProductRecordStatics(cmd *comm | ||
| 304 | if _, err = svr.EmployeeProductStatics(productRecord); err != nil { | 304 | if _, err = svr.EmployeeProductStatics(productRecord); err != nil { |
| 305 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 305 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 306 | } | 306 | } |
| 307 | + if _, err = svr.WorkshopProductStatics(productRecord); err != nil { | ||
| 308 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
| 309 | + } | ||
| 307 | if err := transactionContext.CommitTransaction(); err != nil { | 310 | if err := transactionContext.CommitTransaction(); err != nil { |
| 308 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 311 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| 309 | } | 312 | } |
| @@ -29,19 +29,19 @@ func (productRecordService *ProductRecordService) SearchWorkshopProductRecord(op | @@ -29,19 +29,19 @@ func (productRecordService *ProductRecordService) SearchWorkshopProductRecord(op | ||
| 29 | //var productRecordRepository domain.ProductRecordRepository | 29 | //var productRecordRepository domain.ProductRecordRepository |
| 30 | //productRecordRepository,_,_ = factory.FastPgProductRecord(transactionContext,0) | 30 | //productRecordRepository,_,_ = factory.FastPgProductRecord(transactionContext,0) |
| 31 | 31 | ||
| 32 | - productRecordRepository, _ := dao.NewEmployeeProductRecordDao(transactionContext.(*pgTransaction.TransactionContext)) | 32 | + productRecordRepository, _ := dao.NewWorkshopProductRecordDao(transactionContext.(*pgTransaction.TransactionContext)) |
| 33 | options := utils.ObjectToMap(listProductRecordQuery) | 33 | options := utils.ObjectToMap(listProductRecordQuery) |
| 34 | - count, productRecords, err := productRecordRepository.SearchEmployeeProductRecord(options) | 34 | + count, productRecords, err := productRecordRepository.SearchWorkshopProductRecord(options) |
| 35 | if err != nil { | 35 | if err != nil { |
| 36 | return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 36 | return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
| 37 | } | 37 | } |
| 38 | if err := transactionContext.CommitTransaction(); err != nil { | 38 | if err := transactionContext.CommitTransaction(); err != nil { |
| 39 | return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 39 | return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| 40 | } | 40 | } |
| 41 | - var result = make([]*dto.EmployeeProductRecordDto, 0) | 41 | + var result = make([]*dto.WorkshopProductRecordDto, 0) |
| 42 | for i := range productRecords { | 42 | for i := range productRecords { |
| 43 | item := productRecords[i] | 43 | item := productRecords[i] |
| 44 | - newItem := &dto.EmployeeProductRecordDto{} | 44 | + newItem := &dto.WorkshopProductRecordDto{} |
| 45 | newItem.LoadDto(item, operateInfo.OrgId) | 45 | newItem.LoadDto(item, operateInfo.OrgId) |
| 46 | result = append(result, newItem) | 46 | result = append(result, newItem) |
| 47 | } | 47 | } |
| @@ -103,9 +103,9 @@ func (device *Device) Update(data map[string]interface{}) error { | @@ -103,9 +103,9 @@ func (device *Device) Update(data map[string]interface{}) error { | ||
| 103 | } | 103 | } |
| 104 | if device.Ext == nil { | 104 | if device.Ext == nil { |
| 105 | device.Ext = &Ext{} | 105 | device.Ext = &Ext{} |
| 106 | - if device.Ext.DeviceExt == nil { | ||
| 107 | - device.Ext.DeviceExt = &DeviceExt{} | ||
| 108 | } | 106 | } |
| 107 | + if device.Ext != nil && device.Ext.DeviceExt == nil { | ||
| 108 | + device.Ext.DeviceExt = &DeviceExt{} | ||
| 109 | } | 109 | } |
| 110 | if orgName, ok := data["orgName"]; ok { | 110 | if orgName, ok := data["orgName"]; ok { |
| 111 | device.Ext.OrgName = orgName.(string) | 111 | device.Ext.OrgName = orgName.(string) |
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
| 6 | + "time" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +// 车间工时记录 | ||
| 10 | +type WorkshopWorkTimeRecord struct { | ||
| 11 | + // 车间工时记录ID | ||
| 12 | + WorkshopWorkTimeRecordId int `json:"workshopWorkTimeRecordId"` | ||
| 13 | + // 工作位置 | ||
| 14 | + WorkStation *WorkStation `json:"workStation"` | ||
| 15 | + // 创建时间 | ||
| 16 | + CreatedAt time.Time `json:"createdAt"` | ||
| 17 | + // 企业id | ||
| 18 | + CompanyId int `json:"companyId"` | ||
| 19 | + // 组织ID | ||
| 20 | + OrgId int `json:"orgId"` | ||
| 21 | + // 记录信息 | ||
| 22 | + WorkshopWorkTimeRecordInfo *WorkshopWorkTimeRecordInfo `json:"workshopWorkTimeRecordInfo"` | ||
| 23 | + // 扩展数据 | ||
| 24 | + Ext *Ext `json:"ext"` | ||
| 25 | + // 记录日期 | ||
| 26 | + RecordDate time.Time `json:"recordDate"` | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +type WorkshopWorkTimeRecordInfo struct { | ||
| 30 | + // 固定工时 | ||
| 31 | + EFTWorkTime float64 `json:"eft_work_time"` | ||
| 32 | + // 临时工时 | ||
| 33 | + EDWorkTime float64 `json:"ed_work_time"` | ||
| 34 | + // 派遣工时 | ||
| 35 | + EPTWorkTime float64 `json:"ept_work_time"` | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +type WorkshopWorkTimeRecordRepository interface { | ||
| 39 | + Save(workshopWorkTimeRecord *WorkshopWorkTimeRecord) (*WorkshopWorkTimeRecord, error) | ||
| 40 | + Remove(workshopWorkTimeRecord *WorkshopWorkTimeRecord) (*WorkshopWorkTimeRecord, error) | ||
| 41 | + FindOne(queryOptions map[string]interface{}) (*WorkshopWorkTimeRecord, error) | ||
| 42 | + Find(queryOptions map[string]interface{}) (int64, []*WorkshopWorkTimeRecord, error) | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +func (workshopWorkTimeRecord *WorkshopWorkTimeRecord) Identify() interface{} { | ||
| 46 | + if workshopWorkTimeRecord.WorkshopWorkTimeRecordId == 0 { | ||
| 47 | + return nil | ||
| 48 | + } | ||
| 49 | + return workshopWorkTimeRecord.WorkshopWorkTimeRecordId | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +func (workshopWorkTimeRecord *WorkshopWorkTimeRecord) Update(data map[string]interface{}) error { | ||
| 53 | + return nil | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +func TaskKeyWorkshopWorkTimeRecordStatics() string { | ||
| 57 | + return fmt.Sprintf("%v:task:workshop-work-time-record:statics", constant.CACHE_PREFIX) | ||
| 58 | +} |
| @@ -7,6 +7,13 @@ const ( | @@ -7,6 +7,13 @@ const ( | ||
| 7 | ParticipateSupport = 2 | 7 | ParticipateSupport = 2 |
| 8 | ) | 8 | ) |
| 9 | 9 | ||
| 10 | +const ( | ||
| 11 | + ProductSection1 = "打料" | ||
| 12 | + ProductSection2 = "成型" | ||
| 13 | + ProductSection3 = "穿串" | ||
| 14 | + ProductSection4 = "包装" | ||
| 15 | +) | ||
| 16 | + | ||
| 10 | // 员工生产记录 | 17 | // 员工生产记录 |
| 11 | type EmployeeProductRecord struct { | 18 | type EmployeeProductRecord struct { |
| 12 | // 企业id | 19 | // 企业id |
| @@ -35,47 +42,12 @@ type EmployeeProductRecord struct { | @@ -35,47 +42,12 @@ type EmployeeProductRecord struct { | ||
| 35 | Ext *Ext `json:"ext"` | 42 | Ext *Ext `json:"ext"` |
| 36 | // 版本号 | 43 | // 版本号 |
| 37 | Version int `json:"version"` | 44 | Version int `json:"version"` |
| 38 | - // 生产记录信息 | ||
| 39 | - ProductRecordInfo *EmployeeProductRecordInfo `json:"productRecordInfo"` | 45 | + // 生产记录统计信息 |
| 46 | + ProductRecordInfo *ProductRecordStaticInfo `json:"productRecordInfo"` | ||
| 40 | // 生产工人 | 47 | // 生产工人 |
| 41 | ProductWorker *User `comment:"生产工人"` | 48 | ProductWorker *User `comment:"生产工人"` |
| 42 | } | 49 | } |
| 43 | 50 | ||
| 44 | -type EmployeeProductRecordInfo struct { | ||
| 45 | - // 生产日期 | ||
| 46 | - ProductDate string `json:"productDate"` | ||
| 47 | - // 原始上报数据 | ||
| 48 | - //OriginalWeigh float64 `json:"originalWeigh,omitempty"` | ||
| 49 | - // 换算后的产能 | ||
| 50 | - //Weigh float64 `json:"weigh"` | ||
| 51 | - // 产能 - 审核前 | ||
| 52 | - //WeighBefore float64 `json:"weighBefore"` | ||
| 53 | - // 产能-审核后 | ||
| 54 | - //WeighAfter float64 `json:"weighAfter"` | ||
| 55 | - // 审核状态 1:未审核 2:已审核 | ||
| 56 | - //ApproveStatus int64 `json:"approveStatus"` | ||
| 57 | - // 审核时间 | ||
| 58 | - //ApproveAt int64 `json:"approveAt"` | ||
| 59 | - // 审核人 | ||
| 60 | - //ApproveUser *User `json:"approveUser"` | ||
| 61 | - // 物料信息 | ||
| 62 | - //Material *UnitConversion `json:"material,omitempty"` | ||
| 63 | - // 生产计划信息(批次) | ||
| 64 | - //ProductPlan *ProductPlan `json:"productPlan,omitempty"` | ||
| 65 | - // 单位换算ID | ||
| 66 | - //UnitConversionId int `json:"unitConversionId,omitempty"` | ||
| 67 | - | ||
| 68 | - // 生产计划ID | ||
| 69 | - ProductPlanId int `json:"productPlanId,omitempty"` | ||
| 70 | - // 计划的产品名称 | ||
| 71 | - PlanProductName string `json:"planProductName,omitempty"` | ||
| 72 | - // 批号 | ||
| 73 | - BatchNumber string `json:"batchNumber,omitempty"` | ||
| 74 | - | ||
| 75 | - // 生产小组ID | ||
| 76 | - ProductGroupId int `json:"productGroupId,omitempty"` | ||
| 77 | -} | ||
| 78 | - | ||
| 79 | type EmployeeProductRecordRepository interface { | 51 | type EmployeeProductRecordRepository interface { |
| 80 | Save(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error) | 52 | Save(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error) |
| 81 | Remove(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error) | 53 | Remove(employeeProductRecord *EmployeeProductRecord) (*EmployeeProductRecord, error) |
| @@ -94,9 +66,21 @@ func (employeeProductRecord *EmployeeProductRecord) Update(data map[string]inter | @@ -94,9 +66,21 @@ func (employeeProductRecord *EmployeeProductRecord) Update(data map[string]inter | ||
| 94 | return nil | 66 | return nil |
| 95 | } | 67 | } |
| 96 | 68 | ||
| 97 | -func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh float64, productRecordType int) { | 69 | +// 更新生产量 |
| 70 | +func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh float64, productRecordType int, sectionName string) { | ||
| 71 | + if employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh == nil { | ||
| 72 | + employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh = make(map[string]float64) | ||
| 73 | + } | ||
| 98 | if productRecordType == RecordTypeSecondLevelWeigh { | 74 | if productRecordType == RecordTypeSecondLevelWeigh { |
| 75 | + if employeeProductRecord.WorkStation.SectionName == sectionName { | ||
| 99 | employeeProductRecord.SecondLevelWeigh += weigh | 76 | employeeProductRecord.SecondLevelWeigh += weigh |
| 77 | + } else { | ||
| 78 | + if _, ok := employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName]; ok { | ||
| 79 | + employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName] += weigh //存关联级的二级品 | ||
| 80 | + } else { | ||
| 81 | + employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh[sectionName] = weigh | ||
| 82 | + } | ||
| 83 | + } | ||
| 100 | } | 84 | } |
| 101 | if productRecordType == RecordTypeReceiveMaterial { | 85 | if productRecordType == RecordTypeReceiveMaterial { |
| 102 | employeeProductRecord.ProductWeigh += weigh | 86 | employeeProductRecord.ProductWeigh += weigh |
| @@ -108,14 +92,18 @@ func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh flo | @@ -108,14 +92,18 @@ func (employeeProductRecord *EmployeeProductRecord) UpdateProductWeigh(weigh flo | ||
| 108 | employeeProductRecord.Version += 1 | 92 | employeeProductRecord.Version += 1 |
| 109 | } | 93 | } |
| 110 | 94 | ||
| 95 | +// 产能 | ||
| 111 | func (employeeProductRecord *EmployeeProductRecord) RealProductWeigh() float64 { | 96 | func (employeeProductRecord *EmployeeProductRecord) RealProductWeigh() float64 { |
| 112 | - return employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh | 97 | + // 产能 = 总投入量 - 本阶段二级品重量 - 其他上级二级品重量 |
| 98 | + return employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh - employeeProductRecord.ProductRecordInfo.OtherSecondLevelWeigh() | ||
| 113 | } | 99 | } |
| 114 | 100 | ||
| 101 | +// 合格率 | ||
| 115 | func (employeeProductRecord *EmployeeProductRecord) QualificationRate() int { | 102 | func (employeeProductRecord *EmployeeProductRecord) QualificationRate() int { |
| 116 | - if employeeProductRecord.ProductWeigh == employeeProductRecord.SecondLevelWeigh { | 103 | + realProductWeigh := employeeProductRecord.RealProductWeigh() |
| 104 | + if realProductWeigh == 0 { | ||
| 117 | return 0 | 105 | return 0 |
| 118 | } | 106 | } |
| 119 | - result := int((employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh) * 100 / employeeProductRecord.ProductWeigh) | 107 | + result := int(realProductWeigh * 100 / employeeProductRecord.ProductWeigh) |
| 120 | return result | 108 | return result |
| 121 | } | 109 | } |
pkg/domain/product_record_static_info.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +type ProductRecordStaticInfo struct { | ||
| 4 | + // 生产日期 | ||
| 5 | + ProductDate string `json:"productDate"` | ||
| 6 | + // 生产计划ID | ||
| 7 | + ProductPlanId int `json:"productPlanId,omitempty"` | ||
| 8 | + // 计划的产品名称 | ||
| 9 | + PlanProductName string `json:"planProductName,omitempty"` | ||
| 10 | + // 批号 | ||
| 11 | + BatchNumber string `json:"batchNumber,omitempty"` | ||
| 12 | + | ||
| 13 | + // 生产小组ID | ||
| 14 | + ProductGroupId int `json:"productGroupId,omitempty"` | ||
| 15 | + | ||
| 16 | + // 保存其他工段二级品的重量 | ||
| 17 | + OtherSectionSecondLevelWeigh map[string]float64 `json:"sectionSecondLevelWeigh"` | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (info *ProductRecordStaticInfo) OtherSecondLevelWeigh() float64 { | ||
| 21 | + var result float64 | ||
| 22 | + for _, v := range info.OtherSectionSecondLevelWeigh { | ||
| 23 | + result += v | ||
| 24 | + } | ||
| 25 | + return result | ||
| 26 | +} |
pkg/domain/product_record_workshop.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import "time" | ||
| 4 | + | ||
| 5 | +// 员工生产记录 | ||
| 6 | +type WorkshopProductRecord struct { | ||
| 7 | + // 车间生产记录ID | ||
| 8 | + WorkshopProductRecordId int `json:"workshopProductRecordId"` | ||
| 9 | + // 企业id | ||
| 10 | + CompanyId int `json:"companyId"` | ||
| 11 | + // 组织ID | ||
| 12 | + OrgId int `json:"orgId"` | ||
| 13 | + // 工作位置 | ||
| 14 | + WorkStation *WorkStation `json:"workStation"` | ||
| 15 | + // 生产日期 | ||
| 16 | + ProductDate string `json:"productDate"` | ||
| 17 | + // 产能 | ||
| 18 | + ProductWeigh float64 `json:"productWeigh"` | ||
| 19 | + // 二级品产能 | ||
| 20 | + SecondLevelWeigh float64 `json:"secondLevelWeigh"` | ||
| 21 | + // 创建时间 | ||
| 22 | + CreatedAt time.Time `json:"createdAt"` | ||
| 23 | + // 更新时间 | ||
| 24 | + UpdatedAt time.Time `json:"updatedAt"` | ||
| 25 | + // 删除时间 | ||
| 26 | + DeletedAt time.Time `json:"deletedAt"` | ||
| 27 | + // 扩展 | ||
| 28 | + Ext *Ext `json:"ext"` | ||
| 29 | + // 版本号 | ||
| 30 | + Version int `json:"version"` | ||
| 31 | + // 生产记录信息 | ||
| 32 | + ProductRecordInfo *ProductRecordStaticInfo `json:"productRecordInfo"` | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +type WorkshopProductRecordRepository interface { | ||
| 36 | + Save(workshopProductRecord *WorkshopProductRecord) (*WorkshopProductRecord, error) | ||
| 37 | + Remove(workshopProductRecord *WorkshopProductRecord) (*WorkshopProductRecord, error) | ||
| 38 | + FindOne(queryOptions map[string]interface{}) (*WorkshopProductRecord, error) | ||
| 39 | + Find(queryOptions map[string]interface{}) (int64, []*WorkshopProductRecord, error) | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +func (workshopProductRecord *WorkshopProductRecord) Identify() interface{} { | ||
| 43 | + if workshopProductRecord.WorkshopProductRecordId == 0 { | ||
| 44 | + return nil | ||
| 45 | + } | ||
| 46 | + return workshopProductRecord.WorkshopProductRecordId | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +func (workshopProductRecord *WorkshopProductRecord) Update(data map[string]interface{}) error { | ||
| 50 | + return nil | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | +func (employeeProductRecord *WorkshopProductRecord) UpdateProductWeigh(weigh float64, productRecordType int, sectionName string) { | ||
| 54 | + if employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh == nil { | ||
| 55 | + employeeProductRecord.ProductRecordInfo.OtherSectionSecondLevelWeigh = make(map[string]float64) | ||
| 56 | + } | ||
| 57 | + if productRecordType == RecordTypeSecondLevelWeigh { | ||
| 58 | + if employeeProductRecord.WorkStation.SectionName == sectionName { | ||
| 59 | + employeeProductRecord.SecondLevelWeigh += weigh | ||
| 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 | + } | ||
| 67 | + } | ||
| 68 | + if productRecordType == RecordTypeReceiveMaterial { | ||
| 69 | + employeeProductRecord.ProductWeigh += weigh | ||
| 70 | + } | ||
| 71 | + if productRecordType == RecordTypeReturnMaterial { | ||
| 72 | + employeeProductRecord.ProductWeigh -= weigh | ||
| 73 | + } | ||
| 74 | + employeeProductRecord.UpdatedAt = time.Now() | ||
| 75 | + employeeProductRecord.Version += 1 | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +// 产能 | ||
| 79 | +func (employeeProductRecord *WorkshopProductRecord) RealProductWeigh() float64 { | ||
| 80 | + // 产能 = 总投入量 - 本阶段二级品重量 - 其他上级二级品重量 | ||
| 81 | + result := employeeProductRecord.ProductWeigh - employeeProductRecord.SecondLevelWeigh - employeeProductRecord.ProductRecordInfo.OtherSecondLevelWeigh() | ||
| 82 | + return result | ||
| 83 | +} | ||
| 84 | + | ||
| 85 | +// 合格率 | ||
| 86 | +func (employeeProductRecord *WorkshopProductRecord) QualificationRate() int { | ||
| 87 | + realProductWeigh := employeeProductRecord.RealProductWeigh() | ||
| 88 | + if realProductWeigh == 0 { | ||
| 89 | + return 0 | ||
| 90 | + } | ||
| 91 | + // 合格率 = 产能重量 / (总投入重量 - 上级损耗重量) | ||
| 92 | + result := int(realProductWeigh * 100 / (employeeProductRecord.ProductWeigh - employeeProductRecord.ProductRecordInfo.OtherSecondLevelWeigh())) | ||
| 93 | + return result | ||
| 94 | +} | ||
| 95 | +func (employeeProductRecord *WorkshopProductRecord) DevotedProductWeigh() float64 { | ||
| 96 | + result := employeeProductRecord.ProductWeigh - employeeProductRecord.ProductRecordInfo.OtherSecondLevelWeigh() | ||
| 97 | + return result | ||
| 98 | +} |
| @@ -209,6 +209,21 @@ func (workshop *Workshop) FindWorkStation(workshopId, lineId, sectionId int) (*W | @@ -209,6 +209,21 @@ func (workshop *Workshop) FindWorkStation(workshopId, lineId, sectionId int) (*W | ||
| 209 | return NewWorkStation(workshop, line, section), nil | 209 | return NewWorkStation(workshop, line, section), nil |
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | +func (workshop *Workshop) FindWorkStationOrNil(workshopId, lineId, sectionId int) (*WorkStation, error) { | ||
| 213 | + if workshop.WorkshopId != workshopId { | ||
| 214 | + return nil, fmt.Errorf("不存在") | ||
| 215 | + } | ||
| 216 | + line, _ := workshop.FindLine(lineId) | ||
| 217 | + //if err != nil { | ||
| 218 | + // return nil, err | ||
| 219 | + //} | ||
| 220 | + section, _ := workshop.FindSection(lineId, sectionId) | ||
| 221 | + //if err != nil { | ||
| 222 | + // return nil, err | ||
| 223 | + //} | ||
| 224 | + return NewWorkStation(workshop, line, section), nil | ||
| 225 | +} | ||
| 226 | + | ||
| 212 | func (workshop *Workshop) GetProductLines(removed int) []*ProductLine { | 227 | func (workshop *Workshop) GetProductLines(removed int) []*ProductLine { |
| 213 | var result = make([]*ProductLine, 0) | 228 | var result = make([]*ProductLine, 0) |
| 214 | for i := range workshop.ProductLines { | 229 | for i := range workshop.ProductLines { |
| 1 | +package dao | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/go-pg/pg/v10" | ||
| 6 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 7 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | ||
| 11 | + "time" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type WorkshopProductRecordDao struct { | ||
| 15 | + transactionContext *pgTransaction.TransactionContext | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func NewWorkshopProductRecordDao(transactionContext *pgTransaction.TransactionContext) (*WorkshopProductRecordDao, error) { | ||
| 19 | + if transactionContext == nil { | ||
| 20 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 21 | + } else { | ||
| 22 | + return &WorkshopProductRecordDao{ | ||
| 23 | + transactionContext: transactionContext, | ||
| 24 | + }, nil | ||
| 25 | + } | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +// 员工对应批次的生产记录 (生产日期) | ||
| 29 | +func (dao *WorkshopProductRecordDao) WorkshopProductRecord(companyId, orgId, planId int, productTime time.Time) (*domain.WorkshopProductRecord, error) { | ||
| 30 | + tx := dao.transactionContext.PgTx | ||
| 31 | + employeeProductRecordModel := new(models.WorkshopProductRecord) | ||
| 32 | + query := sqlbuilder.BuildQuery(tx.Model(employeeProductRecordModel), map[string]interface{}{}) | ||
| 33 | + query.Where("company_id = ?", companyId) | ||
| 34 | + query.Where("org_id = ?", orgId) | ||
| 35 | + query.Where("product_date = ?", productTime.Format("2006-01-02")) | ||
| 36 | + query.Where("product_record_info ->>'productPlanId' = '?'", planId) | ||
| 37 | + if err := query.First(); err != nil { | ||
| 38 | + if err.Error() == "pg: no rows in result set" { | ||
| 39 | + return nil, domain.ErrorNotFound | ||
| 40 | + } else { | ||
| 41 | + return nil, err | ||
| 42 | + } | ||
| 43 | + } | ||
| 44 | + if employeeProductRecordModel.WorkshopProductRecordId == 0 { | ||
| 45 | + return nil, domain.ErrorNotFound | ||
| 46 | + } else { | ||
| 47 | + return transform.TransformToWorkshopProductRecordDomainModelFromPgModels(employeeProductRecordModel) | ||
| 48 | + } | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +func (dao *WorkshopProductRecordDao) SearchWorkshopProductRecord(queryOptions map[string]interface{}) (int64, []*domain.WorkshopProductRecord, error) { | ||
| 52 | + tx := dao.transactionContext.PgTx | ||
| 53 | + var employeeProductRecordModels []*models.WorkshopProductRecord | ||
| 54 | + employeeProductRecords := make([]*domain.WorkshopProductRecord, 0) | ||
| 55 | + query := sqlbuilder.BuildQuery(tx.Model(&employeeProductRecordModels), queryOptions) | ||
| 56 | + query.SetWhereByQueryOption("company_id = ?", "companyId") | ||
| 57 | + query.SetWhereByQueryOption("org_id = ?", "orgId") | ||
| 58 | + if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { | ||
| 59 | + query.Where(`org_id in (?)`, pg.In(v)) | ||
| 60 | + } | ||
| 61 | + if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 { | ||
| 62 | + query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v)) | ||
| 63 | + } | ||
| 64 | + if v, ok := queryOptions["planProductName"]; ok && len(v.(string)) > 0 { | ||
| 65 | + query.Where(fmt.Sprintf(`product_record_info->>'planProductName' like '%%%v%%'`, v)) | ||
| 66 | + } | ||
| 67 | + if v, ok := queryOptions["productBeginTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 68 | + query.Where("created_at>=?", v.(time.Time)) | ||
| 69 | + } | ||
| 70 | + if v, ok := queryOptions["productEndTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 71 | + query.Where("created_at<?", v.(time.Time)) | ||
| 72 | + } | ||
| 73 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
| 74 | + query.SetOrderDirect("workshop_product_record_id", "DESC") | ||
| 75 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 76 | + return 0, employeeProductRecords, err | ||
| 77 | + } else { | ||
| 78 | + for _, employeeProductRecordModel := range employeeProductRecordModels { | ||
| 79 | + if employeeProductRecord, err := transform.TransformToWorkshopProductRecordDomainModelFromPgModels(employeeProductRecordModel); err != nil { | ||
| 80 | + return 0, employeeProductRecords, err | ||
| 81 | + } else { | ||
| 82 | + employeeProductRecords = append(employeeProductRecords, employeeProductRecord) | ||
| 83 | + } | ||
| 84 | + } | ||
| 85 | + return int64(count), employeeProductRecords, nil | ||
| 86 | + } | ||
| 87 | +} |
| @@ -40,7 +40,7 @@ func (svr *UserService) Organization(id int) (*domain.Org, error) { | @@ -40,7 +40,7 @@ func (svr *UserService) Organization(id int) (*domain.Org, error) { | ||
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | func (svr *UserService) ToUser(from *models.User) *domain.User { | 42 | func (svr *UserService) ToUser(from *models.User) *domain.User { |
| 43 | - return &domain.User{ | 43 | + user := &domain.User{ |
| 44 | UserId: from.UserId, | 44 | UserId: from.UserId, |
| 45 | UserName: from.UserInfo.UserName, | 45 | UserName: from.UserInfo.UserName, |
| 46 | EmployeeType: from.EmployeeType, | 46 | EmployeeType: from.EmployeeType, |
| @@ -48,6 +48,10 @@ func (svr *UserService) ToUser(from *models.User) *domain.User { | @@ -48,6 +48,10 @@ func (svr *UserService) ToUser(from *models.User) *domain.User { | ||
| 48 | Avatar: from.UserInfo.Avatar, | 48 | Avatar: from.UserInfo.Avatar, |
| 49 | Phone: from.UserInfo.Phone, | 49 | Phone: from.UserInfo.Phone, |
| 50 | } | 50 | } |
| 51 | + if user.EmployeeType == 0 { | ||
| 52 | + user.EmployeeType = 1 //默认正式员工 | ||
| 53 | + } | ||
| 54 | + return user | ||
| 51 | } | 55 | } |
| 52 | 56 | ||
| 53 | func (svr *UserService) ToOrg(from *models.Organization) *domain.Org { | 57 | func (svr *UserService) ToOrg(from *models.Organization) *domain.Org { |
| @@ -88,7 +88,7 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | @@ -88,7 +88,7 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | ||
| 88 | log.Logger.Error(err.Error()) | 88 | log.Logger.Error(err.Error()) |
| 89 | continue | 89 | continue |
| 90 | } | 90 | } |
| 91 | - employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType) | 91 | + employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType, productRecord.WorkStation.SectionName) |
| 92 | 92 | ||
| 93 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { | 93 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { |
| 94 | // TODO:异常处理 | 94 | // TODO:异常处理 |
| @@ -101,6 +101,7 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | @@ -101,6 +101,7 @@ func (ptr *PGProductRecordService) EmployeeProductStatics(productRecord *domain. | ||
| 101 | // 4.更新产能 (产能、二级品) (特殊工段处理 打料、成型) | 101 | // 4.更新产能 (产能、二级品) (特殊工段处理 打料、成型) |
| 102 | 102 | ||
| 103 | // 个人 | 103 | // 个人 |
| 104 | + | ||
| 104 | return nil, nil | 105 | return nil, nil |
| 105 | } | 106 | } |
| 106 | 107 | ||
| @@ -118,12 +119,13 @@ func newEmployeeProductRecord(productRecord *domain.ProductRecord, participateTy | @@ -118,12 +119,13 @@ func newEmployeeProductRecord(productRecord *domain.ProductRecord, participateTy | ||
| 118 | UpdatedAt: time.Now(), | 119 | UpdatedAt: time.Now(), |
| 119 | Ext: productPlan.Ext, | 120 | Ext: productPlan.Ext, |
| 120 | Version: 1, | 121 | Version: 1, |
| 121 | - ProductRecordInfo: &domain.EmployeeProductRecordInfo{ | 122 | + ProductRecordInfo: &domain.ProductRecordStaticInfo{ |
| 122 | ProductDate: productRecord.CreatedAt.Format("2006-01-02"), | 123 | ProductDate: productRecord.CreatedAt.Format("2006-01-02"), |
| 123 | ProductPlanId: productRecord.ProductRecordInfo.ProductPlanId, | 124 | ProductPlanId: productRecord.ProductRecordInfo.ProductPlanId, |
| 124 | PlanProductName: productRecord.ProductRecordInfo.PlanProductName, | 125 | PlanProductName: productRecord.ProductRecordInfo.PlanProductName, |
| 125 | BatchNumber: productRecord.ProductRecordInfo.BatchNumber, | 126 | BatchNumber: productRecord.ProductRecordInfo.BatchNumber, |
| 126 | ProductGroupId: productRecord.ProductRecordInfo.ProductGroupId, | 127 | ProductGroupId: productRecord.ProductRecordInfo.ProductGroupId, |
| 128 | + OtherSectionSecondLevelWeigh: make(map[string]float64), | ||
| 127 | }, | 129 | }, |
| 128 | ProductWorker: worker, | 130 | ProductWorker: worker, |
| 129 | } | 131 | } |
| @@ -207,7 +209,7 @@ func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain. | @@ -207,7 +209,7 @@ func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain. | ||
| 207 | if err == domain.ErrorNotFound { | 209 | if err == domain.ErrorNotFound { |
| 208 | employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, productRecord.ProductWorker) | 210 | employeeProductRecord = newEmployeeProductRecord(productRecord, participateType, productPlan, productRecord.ProductWorker) |
| 209 | } | 211 | } |
| 210 | - employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType) | 212 | + employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType, productRecord.WorkStation.SectionName) |
| 211 | 213 | ||
| 212 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { | 214 | if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { |
| 213 | // TODO:异常处理 | 215 | // TODO:异常处理 |
| @@ -217,6 +219,87 @@ func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain. | @@ -217,6 +219,87 @@ func (ptr *PGProductRecordService) personalProductStatics(productRecord *domain. | ||
| 217 | } | 219 | } |
| 218 | 220 | ||
| 219 | //WorkshopProductStatics 车间产能统计 | 221 | //WorkshopProductStatics 车间产能统计 |
| 220 | -func (ptr *PGProductRecordService) WorkshopProductStatics(productRecord *domain.ProductRecord, productPlan *domain.ProductPlan) (interface{}, error) { | 222 | +func (ptr *PGProductRecordService) WorkshopProductStatics(productRecord *domain.ProductRecord) (interface{}, error) { |
| 223 | + var ( | ||
| 224 | + workshopRepository, _ = repository.NewWorkshopRepository(ptr.transactionContext) | ||
| 225 | + productPlanRepository, _ = repository.NewProductPlanRepository(ptr.transactionContext) | ||
| 226 | + //productGroupRepository, _ = repository.NewProductGroupRepository(ptr.transactionContext) | ||
| 227 | + employeeProductRecordRepository, _ = repository.NewWorkshopProductRecordRepository(ptr.transactionContext) | ||
| 228 | + ) | ||
| 229 | + | ||
| 230 | + var ( | ||
| 231 | + cid = productRecord.CompanyId | ||
| 232 | + oid = productRecord.OrgId | ||
| 233 | + planId = productRecord.ProductRecordInfo.ProductPlanId | ||
| 234 | + productPlan *domain.ProductPlan | ||
| 235 | + err error | ||
| 236 | + ) | ||
| 237 | + | ||
| 238 | + productPlan, err = productPlanRepository.FindOne(map[string]interface{}{"productPlanId": planId}) | ||
| 239 | + if err != nil { | ||
| 240 | + return nil, err | ||
| 241 | + } | ||
| 242 | + | ||
| 243 | + switch productRecord.WorkStation.SectionName { | ||
| 244 | + case ProductSection1: | ||
| 245 | + if productRecord.ProductRecordType == domain.RecordTypeSecondLevelWeigh { | ||
| 246 | + //查询生产记录 批次、生产日期、下(成型)所有二级品 | ||
| 247 | + // 更新打料的二级品需要再一次更新成型的二级品 | ||
| 248 | + if section, err := FindSectionByName(workshopRepository, productRecord.WorkStation.WorkshopId, productRecord.WorkStation.LineId, ProductSection2); err == nil && section != nil { | ||
| 249 | + nextProductRecord := *productRecord | ||
| 250 | + nextProductRecord.WorkStation.SectionName = ProductSection2 | ||
| 251 | + nextProductRecord.WorkStation.SectionId = section.SectionId | ||
| 252 | + ptr.WorkshopProductStatics(&nextProductRecord) | ||
| 253 | + } | ||
| 254 | + } | ||
| 255 | + break | ||
| 256 | + } | ||
| 257 | + | ||
| 258 | + var employeeProductRecord *domain.WorkshopProductRecord | ||
| 259 | + employeeProductRecordDao, _ := dao.NewWorkshopProductRecordDao(ptr.transactionContext) | ||
| 260 | + employeeProductRecord, err = employeeProductRecordDao.WorkshopProductRecord(cid, oid, planId, productRecord.CreatedAt) | ||
| 261 | + if err == domain.ErrorNotFound { | ||
| 262 | + employeeProductRecord = newWorkshopProductRecord(productRecord, productPlan) | ||
| 263 | + } else { | ||
| 264 | + log.Logger.Error(err.Error()) | ||
| 221 | return nil, nil | 265 | return nil, nil |
| 266 | + } | ||
| 267 | + employeeProductRecord.UpdateProductWeigh(productRecord.ProductRecordInfo.Weigh, productRecord.ProductRecordType, productRecord.WorkStation.SectionName) | ||
| 268 | + | ||
| 269 | + if employeeProductRecord, err = employeeProductRecordRepository.Save(employeeProductRecord); err != nil { | ||
| 270 | + // TODO:异常处理 | ||
| 271 | + log.Logger.Error(fmt.Sprintf("生产记录:[%v] 处理异常:%v", productRecord.ProductRecordId, err.Error())) | ||
| 272 | + } | ||
| 273 | + return nil, nil | ||
| 274 | +} | ||
| 275 | + | ||
| 276 | +// newEmployeeProductRecord 员工生产记录 | ||
| 277 | +func newWorkshopProductRecord(productRecord *domain.ProductRecord, productPlan *domain.ProductPlan) *domain.WorkshopProductRecord { | ||
| 278 | + record := &domain.WorkshopProductRecord{ | ||
| 279 | + CompanyId: productRecord.CompanyId, | ||
| 280 | + OrgId: productRecord.OrgId, | ||
| 281 | + WorkStation: productRecord.WorkStation, | ||
| 282 | + //WorkOn: productPlan.WorkOn, | ||
| 283 | + //ParticipateType: participateType, | ||
| 284 | + ProductDate: productRecord.CreatedAt.Format("2006-01-02"), | ||
| 285 | + ProductWeigh: 0, | ||
| 286 | + SecondLevelWeigh: 0, | ||
| 287 | + CreatedAt: time.Now(), | ||
| 288 | + UpdatedAt: time.Now(), | ||
| 289 | + Ext: productPlan.Ext, | ||
| 290 | + Version: 1, | ||
| 291 | + ProductRecordInfo: &domain.ProductRecordStaticInfo{ | ||
| 292 | + ProductDate: productRecord.CreatedAt.Format("2006-01-02"), | ||
| 293 | + ProductPlanId: productRecord.ProductRecordInfo.ProductPlanId, | ||
| 294 | + PlanProductName: productRecord.ProductRecordInfo.PlanProductName, | ||
| 295 | + BatchNumber: productRecord.ProductRecordInfo.BatchNumber, | ||
| 296 | + ProductGroupId: productRecord.ProductRecordInfo.ProductGroupId, | ||
| 297 | + OtherSectionSecondLevelWeigh: make(map[string]float64), | ||
| 298 | + }, | ||
| 299 | + } | ||
| 300 | + // 打料、成型有初始值 | ||
| 301 | + if productRecord.WorkStation.SectionName == ProductSection1 || productRecord.WorkStation.SectionName == ProductSection2 { | ||
| 302 | + record.ProductWeigh = productPlan.PlanDevoted.Weight | ||
| 303 | + } | ||
| 304 | + return record | ||
| 222 | } | 305 | } |
| 1 | +package domainService | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "errors" | ||
| 5 | + "fmt" | ||
| 6 | + "github.com/hibiken/asynq" | ||
| 7 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 8 | + "github.com/linmadan/egglib-go/utils/json" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/constant" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/repository" | ||
| 12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils" | ||
| 13 | + "time" | ||
| 14 | +) | ||
| 15 | + | ||
| 16 | +type PGWorkshopWorkTimeStaticService struct { | ||
| 17 | + transactionContext *pgTransaction.TransactionContext | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +//WorkshopWorkTimeStatic 车间工时统计 | ||
| 21 | +func (ptr *PGWorkshopWorkTimeStaticService) WorkshopWorkTimeStatic(productRecord *domain.ProductAttendanceRecord) (interface{}, error) { | ||
| 22 | + workshopWorkTimeRecordRepository, _ := repository.NewWorkshopWorkTimeRecordRepository(ptr.transactionContext) | ||
| 23 | + record, err := workshopWorkTimeRecordRepository.FindOne(map[string]interface{}{ | ||
| 24 | + "companyId": productRecord.CompanyId, | ||
| 25 | + "orgId": productRecord.OrgId, | ||
| 26 | + "workStationId": productRecord.WorkStation.WorkStationId, | ||
| 27 | + "recordDate": utils.GetZeroTime(productRecord.SignIn), | ||
| 28 | + }) | ||
| 29 | + if err != nil && errors.Is(err, domain.ErrorNotFound) { | ||
| 30 | + err = nil | ||
| 31 | + record = &domain.WorkshopWorkTimeRecord{ | ||
| 32 | + WorkStation: productRecord.WorkStation, | ||
| 33 | + CreatedAt: time.Now(), | ||
| 34 | + CompanyId: productRecord.CompanyId, | ||
| 35 | + OrgId: productRecord.OrgId, | ||
| 36 | + Ext: productRecord.Ext, | ||
| 37 | + RecordDate: utils.GetZeroTime(productRecord.SignIn), | ||
| 38 | + WorkshopWorkTimeRecordInfo: &domain.WorkshopWorkTimeRecordInfo{}, | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | + if err != nil { | ||
| 42 | + return nil, err | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + employeeType := productRecord.ProductWorker.EmployeeType | ||
| 46 | + switch employeeType { | ||
| 47 | + case domain.EmployeeFullTime: | ||
| 48 | + record.WorkshopWorkTimeRecordInfo.EFTWorkTime += productRecord.WorkTimeAfter | ||
| 49 | + case domain.EmployeeDispatch: | ||
| 50 | + record.WorkshopWorkTimeRecordInfo.EDWorkTime += productRecord.WorkTimeAfter | ||
| 51 | + case domain.EmployeePartTime: | ||
| 52 | + record.WorkshopWorkTimeRecordInfo.EPTWorkTime += productRecord.WorkTimeAfter | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + if record, err = workshopWorkTimeRecordRepository.Save(record); err != nil { | ||
| 56 | + return nil, err | ||
| 57 | + } | ||
| 58 | + return record, nil | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +func SendWorkshopWorkTimeStaticJob(productRecord *domain.ProductAttendanceRecord) error { | ||
| 62 | + task := asynq.NewTask(domain.TaskKeyWorkshopWorkTimeRecordStatics(), []byte(json.MarshalToString(productRecord))) | ||
| 63 | + | ||
| 64 | + client := asynq.NewClient(asynq.RedisClientOpt{Addr: constant.REDIS_ADDRESS}) | ||
| 65 | + _, err := client.Enqueue(task) | ||
| 66 | + return err | ||
| 67 | +} | ||
| 68 | + | ||
| 69 | +func NewPGWorkshopWorkTimeStaticService(transactionContext *pgTransaction.TransactionContext) (*PGWorkshopWorkTimeStaticService, error) { | ||
| 70 | + if transactionContext == nil { | ||
| 71 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 72 | + } else { | ||
| 73 | + return &PGWorkshopWorkTimeStaticService{ | ||
| 74 | + transactionContext: transactionContext, | ||
| 75 | + }, nil | ||
| 76 | + } | ||
| 77 | +} |
| @@ -40,6 +40,8 @@ func init() { | @@ -40,6 +40,8 @@ func init() { | ||
| 40 | (*models.MaterialGroupK3cloud)(nil), | 40 | (*models.MaterialGroupK3cloud)(nil), |
| 41 | (*models.PrdMoK3cloud)(nil), | 41 | (*models.PrdMoK3cloud)(nil), |
| 42 | (*models.EmployeeProductRecord)(nil), | 42 | (*models.EmployeeProductRecord)(nil), |
| 43 | + (*models.WorkshopProductRecord)(nil), | ||
| 44 | + (*models.WorkshopWorkTimeRecord)(nil), | ||
| 43 | } { | 45 | } { |
| 44 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ | 46 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ |
| 45 | Temp: false, | 47 | Temp: false, |
| @@ -34,7 +34,7 @@ type EmployeeProductRecord struct { | @@ -34,7 +34,7 @@ type EmployeeProductRecord struct { | ||
| 34 | // 版本号 | 34 | // 版本号 |
| 35 | Version int `comment:"版本号"` | 35 | Version int `comment:"版本号"` |
| 36 | // 生产记录信息 | 36 | // 生产记录信息 |
| 37 | - ProductRecordInfo *domain.EmployeeProductRecordInfo `comment:"生产记录信息"` | 37 | + ProductRecordInfo *domain.ProductRecordStaticInfo `comment:"生产记录信息"` |
| 38 | // 生产工人 | 38 | // 生产工人 |
| 39 | ProductWorker *domain.User `comment:"生产工人"` | 39 | ProductWorker *domain.User `comment:"生产工人"` |
| 40 | } | 40 | } |
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +type WorkshopProductRecord struct { | ||
| 9 | + tableName string `comment:"员工生产记录" pg:"manufacture.workshop_product_record"` | ||
| 10 | + // 车间生产记录ID | ||
| 11 | + WorkshopProductRecordId int `comment:"车间生产记录ID" pg:"pk:workshop_product_record_id"` | ||
| 12 | + // 企业id | ||
| 13 | + CompanyId int `comment:"企业id"` | ||
| 14 | + // 组织ID | ||
| 15 | + OrgId int `comment:"组织ID"` | ||
| 16 | + // 工作位置 | ||
| 17 | + WorkStation *domain.WorkStation `comment:"工作位置"` | ||
| 18 | + // 生产日期 | ||
| 19 | + ProductDate string `comment:"生产日期"` | ||
| 20 | + // 产能 | ||
| 21 | + ProductWeigh float64 `comment:"产能"` | ||
| 22 | + // 二级品产能 | ||
| 23 | + SecondLevelWeigh float64 `comment:"二级品产能"` | ||
| 24 | + // 创建时间 | ||
| 25 | + CreatedAt time.Time `comment:"创建时间"` | ||
| 26 | + // 更新时间 | ||
| 27 | + UpdatedAt time.Time `comment:"更新时间"` | ||
| 28 | + // 删除时间 | ||
| 29 | + DeletedAt time.Time `comment:"删除时间"` | ||
| 30 | + // 扩展 | ||
| 31 | + Ext *domain.Ext `comment:"扩展"` | ||
| 32 | + // 版本号 | ||
| 33 | + Version int `comment:"版本号"` | ||
| 34 | + // 生产记录信息 | ||
| 35 | + ProductRecordInfo *domain.ProductRecordStaticInfo `comment:"生产记录信息"` | ||
| 36 | +} |
| 1 | +package models | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +type WorkshopWorkTimeRecord struct { | ||
| 9 | + tableName string `comment:"车间工时记录" pg:"manufacture.workshop_work_time_record"` | ||
| 10 | + // 车间工时记录ID | ||
| 11 | + WorkshopWorkTimeRecordId int `comment:"车间工时记录ID" pg:"pk:workshop_work_time_record_id"` | ||
| 12 | + // 工作位置 | ||
| 13 | + WorkStation *domain.WorkStation `comment:"工作位置"` | ||
| 14 | + // 创建时间 | ||
| 15 | + CreatedAt time.Time `comment:"创建时间"` | ||
| 16 | + // 企业id | ||
| 17 | + CompanyId int `comment:"企业id"` | ||
| 18 | + // 组织ID | ||
| 19 | + OrgId int `comment:"组织ID"` | ||
| 20 | + // 记录信息 | ||
| 21 | + WorkshopWorkTimeRecordInfo *domain.WorkshopWorkTimeRecordInfo `comment:"记录信息"` | ||
| 22 | + // 扩展数据 | ||
| 23 | + Ext *domain.Ext `comment:"扩展数据"` | ||
| 24 | + // 记录日期 | ||
| 25 | + RecordDate time.Time `comment:"记录日期"` | ||
| 26 | +} |
| 1 | +package transform | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func TransformToWorkshopProductRecordDomainModelFromPgModels(workshopProductRecordModel *models.WorkshopProductRecord) (*domain.WorkshopProductRecord, error) { | ||
| 9 | + return &domain.WorkshopProductRecord{ | ||
| 10 | + WorkshopProductRecordId: workshopProductRecordModel.WorkshopProductRecordId, | ||
| 11 | + CompanyId: workshopProductRecordModel.CompanyId, | ||
| 12 | + OrgId: workshopProductRecordModel.OrgId, | ||
| 13 | + WorkStation: workshopProductRecordModel.WorkStation, | ||
| 14 | + ProductDate: workshopProductRecordModel.ProductDate, | ||
| 15 | + ProductWeigh: workshopProductRecordModel.ProductWeigh, | ||
| 16 | + SecondLevelWeigh: workshopProductRecordModel.SecondLevelWeigh, | ||
| 17 | + CreatedAt: workshopProductRecordModel.CreatedAt, | ||
| 18 | + UpdatedAt: workshopProductRecordModel.UpdatedAt, | ||
| 19 | + DeletedAt: workshopProductRecordModel.DeletedAt, | ||
| 20 | + Ext: workshopProductRecordModel.Ext, | ||
| 21 | + Version: workshopProductRecordModel.Version, | ||
| 22 | + ProductRecordInfo: workshopProductRecordModel.ProductRecordInfo, | ||
| 23 | + }, nil | ||
| 24 | +} |
| 1 | +package transform | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 5 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func TransformToWorkshopWorkTimeRecordDomainModelFromPgModels(workshopWorkTimeRecordModel *models.WorkshopWorkTimeRecord) (*domain.WorkshopWorkTimeRecord, error) { | ||
| 9 | + return &domain.WorkshopWorkTimeRecord{ | ||
| 10 | + WorkshopWorkTimeRecordId: workshopWorkTimeRecordModel.WorkshopWorkTimeRecordId, | ||
| 11 | + WorkStation: workshopWorkTimeRecordModel.WorkStation, | ||
| 12 | + CreatedAt: workshopWorkTimeRecordModel.CreatedAt, | ||
| 13 | + CompanyId: workshopWorkTimeRecordModel.CompanyId, | ||
| 14 | + OrgId: workshopWorkTimeRecordModel.OrgId, | ||
| 15 | + WorkshopWorkTimeRecordInfo: workshopWorkTimeRecordModel.WorkshopWorkTimeRecordInfo, | ||
| 16 | + Ext: workshopWorkTimeRecordModel.Ext, | ||
| 17 | + RecordDate: workshopWorkTimeRecordModel.RecordDate, | ||
| 18 | + }, nil | ||
| 19 | +} |
| @@ -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 | + "time" | ||
| 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" |
| @@ -165,7 +166,7 @@ func (repository *ProductAttendanceRecordRepository) Find(queryOptions map[strin | @@ -165,7 +166,7 @@ func (repository *ProductAttendanceRecordRepository) Find(queryOptions map[strin | ||
| 165 | query := sqlbuilder.BuildQuery(tx.Model(&productAttendanceRecordModels), queryOptions) | 166 | query := sqlbuilder.BuildQuery(tx.Model(&productAttendanceRecordModels), queryOptions) |
| 166 | query.SetWhereByQueryOption("company_id = ?", "companyId") | 167 | query.SetWhereByQueryOption("company_id = ?", "companyId") |
| 167 | query.SetWhereByQueryOption("org_id = ?", "orgId") | 168 | query.SetWhereByQueryOption("org_id = ?", "orgId") |
| 168 | - query.SetWhereByQueryOption("attendance_status = ?", "attendanceStatus") | 169 | + query.SetWhereByQueryOption("attendance_status & ? >0", "attendanceStatus") |
| 169 | if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { | 170 | if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { |
| 170 | query.Where(`org_id in (?)`, pg.In(v)) | 171 | query.Where(`org_id in (?)`, pg.In(v)) |
| 171 | } | 172 | } |
| @@ -175,6 +176,18 @@ func (repository *ProductAttendanceRecordRepository) Find(queryOptions map[strin | @@ -175,6 +176,18 @@ func (repository *ProductAttendanceRecordRepository) Find(queryOptions map[strin | ||
| 175 | if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 { | 176 | if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 { |
| 176 | query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v)) | 177 | query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v)) |
| 177 | } | 178 | } |
| 179 | + if v, ok := queryOptions["lineName"]; ok && len(v.(string)) > 0 { | ||
| 180 | + query.Where(fmt.Sprintf(`work_station->>'lineName' like '%%%v%%'`, v)) | ||
| 181 | + } | ||
| 182 | + if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 { | ||
| 183 | + query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v)) | ||
| 184 | + } | ||
| 185 | + if v, ok := queryOptions["signBeginTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 186 | + query.Where("created_at>=?", v.(time.Time)) | ||
| 187 | + } | ||
| 188 | + if v, ok := queryOptions["signEndTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 189 | + query.Where("created_at<?", v.(time.Time)) | ||
| 190 | + } | ||
| 178 | query.SetOffsetAndLimit(domain.MaxQueryRow) | 191 | query.SetOffsetAndLimit(domain.MaxQueryRow) |
| 179 | query.SetOrderDirect("product_attendance_id", "DESC") | 192 | query.SetOrderDirect("product_attendance_id", "DESC") |
| 180 | if count, err := query.SelectAndCount(); err != nil { | 193 | if count, err := query.SelectAndCount(); err != nil { |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/go-pg/pg/v10" | ||
| 6 | + | ||
| 7 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 8 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 9 | + "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 10 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +type WorkshopProductRecordRepository struct { | ||
| 16 | + transactionContext *pgTransaction.TransactionContext | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (repository *WorkshopProductRecordRepository) nextIdentify() (int64, error) { | ||
| 20 | + IdWorker, err := snowflake.NewIdWorker(1) | ||
| 21 | + if err != nil { | ||
| 22 | + return 0, err | ||
| 23 | + } | ||
| 24 | + id, err := IdWorker.NextId() | ||
| 25 | + return id, err | ||
| 26 | +} | ||
| 27 | +func (repository *WorkshopProductRecordRepository) Save(workshopProductRecord *domain.WorkshopProductRecord) (*domain.WorkshopProductRecord, error) { | ||
| 28 | + sqlBuildFields := []string{ | ||
| 29 | + "workshop_product_record_id", | ||
| 30 | + "company_id", | ||
| 31 | + "org_id", | ||
| 32 | + "work_station", | ||
| 33 | + "product_date", | ||
| 34 | + "product_weigh", | ||
| 35 | + "second_level_weigh", | ||
| 36 | + "created_at", | ||
| 37 | + "updated_at", | ||
| 38 | + "deleted_at", | ||
| 39 | + "ext", | ||
| 40 | + "version", | ||
| 41 | + "product_record_info", | ||
| 42 | + } | ||
| 43 | + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "workshop_product_record_id", "deleted_at")) | ||
| 44 | + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "workshop_product_record_id", "deleted_at")) | ||
| 45 | + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
| 46 | + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "workshop_product_record_id", "deleted_at") | ||
| 47 | + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields) | ||
| 48 | + tx := repository.transactionContext.PgTx | ||
| 49 | + if workshopProductRecord.Identify() == nil { | ||
| 50 | + if _, err := tx.QueryOne( | ||
| 51 | + pg.Scan( | ||
| 52 | + &workshopProductRecord.WorkshopProductRecordId, | ||
| 53 | + &workshopProductRecord.CompanyId, | ||
| 54 | + &workshopProductRecord.OrgId, | ||
| 55 | + &workshopProductRecord.WorkStation, | ||
| 56 | + &workshopProductRecord.ProductDate, | ||
| 57 | + &workshopProductRecord.ProductWeigh, | ||
| 58 | + &workshopProductRecord.SecondLevelWeigh, | ||
| 59 | + &workshopProductRecord.CreatedAt, | ||
| 60 | + &workshopProductRecord.UpdatedAt, | ||
| 61 | + &workshopProductRecord.DeletedAt, | ||
| 62 | + &workshopProductRecord.Ext, | ||
| 63 | + &workshopProductRecord.Version, | ||
| 64 | + &workshopProductRecord.ProductRecordInfo, | ||
| 65 | + ), | ||
| 66 | + fmt.Sprintf("INSERT INTO manufacture.workshop_product_record (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), | ||
| 67 | + workshopProductRecord.CompanyId, | ||
| 68 | + workshopProductRecord.OrgId, | ||
| 69 | + workshopProductRecord.WorkStation, | ||
| 70 | + workshopProductRecord.ProductDate, | ||
| 71 | + workshopProductRecord.ProductWeigh, | ||
| 72 | + workshopProductRecord.SecondLevelWeigh, | ||
| 73 | + workshopProductRecord.CreatedAt, | ||
| 74 | + workshopProductRecord.UpdatedAt, | ||
| 75 | + workshopProductRecord.Ext, | ||
| 76 | + workshopProductRecord.Version, | ||
| 77 | + workshopProductRecord.ProductRecordInfo, | ||
| 78 | + ); err != nil { | ||
| 79 | + return workshopProductRecord, err | ||
| 80 | + } | ||
| 81 | + } else { | ||
| 82 | + if _, err := tx.QueryOne( | ||
| 83 | + pg.Scan( | ||
| 84 | + &workshopProductRecord.WorkshopProductRecordId, | ||
| 85 | + &workshopProductRecord.CompanyId, | ||
| 86 | + &workshopProductRecord.OrgId, | ||
| 87 | + &workshopProductRecord.WorkStation, | ||
| 88 | + &workshopProductRecord.ProductDate, | ||
| 89 | + &workshopProductRecord.ProductWeigh, | ||
| 90 | + &workshopProductRecord.SecondLevelWeigh, | ||
| 91 | + &workshopProductRecord.CreatedAt, | ||
| 92 | + &workshopProductRecord.UpdatedAt, | ||
| 93 | + &workshopProductRecord.DeletedAt, | ||
| 94 | + &workshopProductRecord.Ext, | ||
| 95 | + &workshopProductRecord.Version, | ||
| 96 | + &workshopProductRecord.ProductRecordInfo, | ||
| 97 | + ), | ||
| 98 | + fmt.Sprintf("UPDATE manufacture.workshop_product_record SET %s WHERE workshop_product_record_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), | ||
| 99 | + workshopProductRecord.CompanyId, | ||
| 100 | + workshopProductRecord.OrgId, | ||
| 101 | + workshopProductRecord.WorkStation, | ||
| 102 | + workshopProductRecord.ProductDate, | ||
| 103 | + workshopProductRecord.ProductWeigh, | ||
| 104 | + workshopProductRecord.SecondLevelWeigh, | ||
| 105 | + workshopProductRecord.CreatedAt, | ||
| 106 | + workshopProductRecord.UpdatedAt, | ||
| 107 | + workshopProductRecord.Ext, | ||
| 108 | + workshopProductRecord.Version, | ||
| 109 | + workshopProductRecord.ProductRecordInfo, | ||
| 110 | + workshopProductRecord.Identify(), | ||
| 111 | + ); err != nil { | ||
| 112 | + return workshopProductRecord, err | ||
| 113 | + } | ||
| 114 | + } | ||
| 115 | + return workshopProductRecord, nil | ||
| 116 | +} | ||
| 117 | +func (repository *WorkshopProductRecordRepository) Remove(workshopProductRecord *domain.WorkshopProductRecord) (*domain.WorkshopProductRecord, error) { | ||
| 118 | + tx := repository.transactionContext.PgTx | ||
| 119 | + workshopProductRecordModel := new(models.WorkshopProductRecord) | ||
| 120 | + workshopProductRecordModel.WorkshopProductRecordId = workshopProductRecord.Identify().(int) | ||
| 121 | + if _, err := tx.Model(workshopProductRecordModel).WherePK().Delete(); err != nil { | ||
| 122 | + return workshopProductRecord, err | ||
| 123 | + } | ||
| 124 | + return workshopProductRecord, nil | ||
| 125 | +} | ||
| 126 | +func (repository *WorkshopProductRecordRepository) FindOne(queryOptions map[string]interface{}) (*domain.WorkshopProductRecord, error) { | ||
| 127 | + tx := repository.transactionContext.PgTx | ||
| 128 | + workshopProductRecordModel := new(models.WorkshopProductRecord) | ||
| 129 | + query := sqlbuilder.BuildQuery(tx.Model(workshopProductRecordModel), queryOptions) | ||
| 130 | + query.SetWhereByQueryOption("workshop_product_record.workshop_product_record_id = ?", "workshopProductRecordId") | ||
| 131 | + if err := query.First(); err != nil { | ||
| 132 | + if err.Error() == "pg: no rows in result set" { | ||
| 133 | + return nil, fmt.Errorf("没有此资源") | ||
| 134 | + } else { | ||
| 135 | + return nil, err | ||
| 136 | + } | ||
| 137 | + } | ||
| 138 | + if workshopProductRecordModel.WorkshopProductRecordId == 0 { | ||
| 139 | + return nil, nil | ||
| 140 | + } else { | ||
| 141 | + return transform.TransformToWorkshopProductRecordDomainModelFromPgModels(workshopProductRecordModel) | ||
| 142 | + } | ||
| 143 | +} | ||
| 144 | +func (repository *WorkshopProductRecordRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.WorkshopProductRecord, error) { | ||
| 145 | + tx := repository.transactionContext.PgTx | ||
| 146 | + var workshopProductRecordModels []*models.WorkshopProductRecord | ||
| 147 | + workshopProductRecords := make([]*domain.WorkshopProductRecord, 0) | ||
| 148 | + query := sqlbuilder.BuildQuery(tx.Model(&workshopProductRecordModels), queryOptions) | ||
| 149 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
| 150 | + query.SetOrderDirect("workshop_product_record_id", "DESC") | ||
| 151 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 152 | + return 0, workshopProductRecords, err | ||
| 153 | + } else { | ||
| 154 | + for _, workshopProductRecordModel := range workshopProductRecordModels { | ||
| 155 | + if workshopProductRecord, err := transform.TransformToWorkshopProductRecordDomainModelFromPgModels(workshopProductRecordModel); err != nil { | ||
| 156 | + return 0, workshopProductRecords, err | ||
| 157 | + } else { | ||
| 158 | + workshopProductRecords = append(workshopProductRecords, workshopProductRecord) | ||
| 159 | + } | ||
| 160 | + } | ||
| 161 | + return int64(count), workshopProductRecords, nil | ||
| 162 | + } | ||
| 163 | +} | ||
| 164 | +func NewWorkshopProductRecordRepository(transactionContext *pgTransaction.TransactionContext) (*WorkshopProductRecordRepository, error) { | ||
| 165 | + if transactionContext == nil { | ||
| 166 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 167 | + } else { | ||
| 168 | + return &WorkshopProductRecordRepository{ | ||
| 169 | + transactionContext: transactionContext, | ||
| 170 | + }, nil | ||
| 171 | + } | ||
| 172 | +} |
| 1 | +package repository | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/go-pg/pg/v10" | ||
| 6 | + "time" | ||
| 7 | + | ||
| 8 | + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | ||
| 9 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
| 10 | + "github.com/linmadan/egglib-go/utils/snowflake" | ||
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain" | ||
| 12 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/models" | ||
| 13 | + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/pg/transform" | ||
| 14 | +) | ||
| 15 | + | ||
| 16 | +type WorkshopWorkTimeRecordRepository struct { | ||
| 17 | + transactionContext *pgTransaction.TransactionContext | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func (repository *WorkshopWorkTimeRecordRepository) nextIdentify() (int64, error) { | ||
| 21 | + IdWorker, err := snowflake.NewIdWorker(1) | ||
| 22 | + if err != nil { | ||
| 23 | + return 0, err | ||
| 24 | + } | ||
| 25 | + id, err := IdWorker.NextId() | ||
| 26 | + return id, err | ||
| 27 | +} | ||
| 28 | +func (repository *WorkshopWorkTimeRecordRepository) Save(workshopWorkTimeRecord *domain.WorkshopWorkTimeRecord) (*domain.WorkshopWorkTimeRecord, error) { | ||
| 29 | + sqlBuildFields := []string{ | ||
| 30 | + "workshop_work_time_record_id", | ||
| 31 | + "work_station", | ||
| 32 | + "created_at", | ||
| 33 | + "company_id", | ||
| 34 | + "org_id", | ||
| 35 | + "workshop_work_time_record_info", | ||
| 36 | + "ext", | ||
| 37 | + "record_date", | ||
| 38 | + } | ||
| 39 | + insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "workshop_work_time_record_id")) | ||
| 40 | + insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlbuilder.RemoveSqlFields(sqlBuildFields, "workshop_work_time_record_id")) | ||
| 41 | + returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) | ||
| 42 | + updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "workshop_work_time_record_id") | ||
| 43 | + updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields) | ||
| 44 | + tx := repository.transactionContext.PgTx | ||
| 45 | + if workshopWorkTimeRecord.Identify() == nil { | ||
| 46 | + if _, err := tx.QueryOne( | ||
| 47 | + pg.Scan( | ||
| 48 | + &workshopWorkTimeRecord.WorkshopWorkTimeRecordId, | ||
| 49 | + &workshopWorkTimeRecord.WorkStation, | ||
| 50 | + &workshopWorkTimeRecord.CreatedAt, | ||
| 51 | + &workshopWorkTimeRecord.CompanyId, | ||
| 52 | + &workshopWorkTimeRecord.OrgId, | ||
| 53 | + &workshopWorkTimeRecord.WorkshopWorkTimeRecordInfo, | ||
| 54 | + &workshopWorkTimeRecord.Ext, | ||
| 55 | + &workshopWorkTimeRecord.RecordDate, | ||
| 56 | + ), | ||
| 57 | + fmt.Sprintf("INSERT INTO manufacture.workshop_work_time_record (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), | ||
| 58 | + //workshopWorkTimeRecord.WorkshopWorkTimeRecordId, | ||
| 59 | + workshopWorkTimeRecord.WorkStation, | ||
| 60 | + workshopWorkTimeRecord.CreatedAt, | ||
| 61 | + workshopWorkTimeRecord.CompanyId, | ||
| 62 | + workshopWorkTimeRecord.OrgId, | ||
| 63 | + workshopWorkTimeRecord.WorkshopWorkTimeRecordInfo, | ||
| 64 | + workshopWorkTimeRecord.Ext, | ||
| 65 | + workshopWorkTimeRecord.RecordDate, | ||
| 66 | + ); err != nil { | ||
| 67 | + return workshopWorkTimeRecord, err | ||
| 68 | + } | ||
| 69 | + } else { | ||
| 70 | + if _, err := tx.QueryOne( | ||
| 71 | + pg.Scan( | ||
| 72 | + &workshopWorkTimeRecord.WorkshopWorkTimeRecordId, | ||
| 73 | + &workshopWorkTimeRecord.WorkStation, | ||
| 74 | + &workshopWorkTimeRecord.CreatedAt, | ||
| 75 | + &workshopWorkTimeRecord.CompanyId, | ||
| 76 | + &workshopWorkTimeRecord.OrgId, | ||
| 77 | + &workshopWorkTimeRecord.WorkshopWorkTimeRecordInfo, | ||
| 78 | + &workshopWorkTimeRecord.Ext, | ||
| 79 | + &workshopWorkTimeRecord.RecordDate, | ||
| 80 | + ), | ||
| 81 | + fmt.Sprintf("UPDATE manufacture.workshop_work_time_record SET %s WHERE workshop_work_time_record_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), | ||
| 82 | + //workshopWorkTimeRecord.WorkshopWorkTimeRecordId, | ||
| 83 | + workshopWorkTimeRecord.WorkStation, | ||
| 84 | + workshopWorkTimeRecord.CreatedAt, | ||
| 85 | + workshopWorkTimeRecord.CompanyId, | ||
| 86 | + workshopWorkTimeRecord.OrgId, | ||
| 87 | + workshopWorkTimeRecord.WorkshopWorkTimeRecordInfo, | ||
| 88 | + workshopWorkTimeRecord.Ext, | ||
| 89 | + workshopWorkTimeRecord.RecordDate, | ||
| 90 | + workshopWorkTimeRecord.Identify(), | ||
| 91 | + ); err != nil { | ||
| 92 | + return workshopWorkTimeRecord, err | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | + return workshopWorkTimeRecord, nil | ||
| 96 | +} | ||
| 97 | +func (repository *WorkshopWorkTimeRecordRepository) Remove(workshopWorkTimeRecord *domain.WorkshopWorkTimeRecord) (*domain.WorkshopWorkTimeRecord, error) { | ||
| 98 | + tx := repository.transactionContext.PgTx | ||
| 99 | + workshopWorkTimeRecordModel := new(models.WorkshopWorkTimeRecord) | ||
| 100 | + workshopWorkTimeRecordModel.WorkshopWorkTimeRecordId = workshopWorkTimeRecord.Identify().(int) | ||
| 101 | + if _, err := tx.Model(workshopWorkTimeRecordModel).WherePK().Delete(); err != nil { | ||
| 102 | + return workshopWorkTimeRecord, err | ||
| 103 | + } | ||
| 104 | + return workshopWorkTimeRecord, nil | ||
| 105 | +} | ||
| 106 | +func (repository *WorkshopWorkTimeRecordRepository) FindOne(queryOptions map[string]interface{}) (*domain.WorkshopWorkTimeRecord, error) { | ||
| 107 | + tx := repository.transactionContext.PgTx | ||
| 108 | + workshopWorkTimeRecordModel := new(models.WorkshopWorkTimeRecord) | ||
| 109 | + query := sqlbuilder.BuildQuery(tx.Model(workshopWorkTimeRecordModel), queryOptions) | ||
| 110 | + query.SetWhereByQueryOption("workshop_work_time_record.workshop_work_time_record_id = ?", "workshopWorkTimeRecordId") | ||
| 111 | + if err := query.First(); err != nil { | ||
| 112 | + if err.Error() == "pg: no rows in result set" { | ||
| 113 | + return nil, domain.ErrorNotFound | ||
| 114 | + } else { | ||
| 115 | + return nil, err | ||
| 116 | + } | ||
| 117 | + } | ||
| 118 | + if workshopWorkTimeRecordModel.WorkshopWorkTimeRecordId == 0 { | ||
| 119 | + return nil, nil | ||
| 120 | + } else { | ||
| 121 | + return transform.TransformToWorkshopWorkTimeRecordDomainModelFromPgModels(workshopWorkTimeRecordModel) | ||
| 122 | + } | ||
| 123 | +} | ||
| 124 | +func (repository *WorkshopWorkTimeRecordRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.WorkshopWorkTimeRecord, error) { | ||
| 125 | + tx := repository.transactionContext.PgTx | ||
| 126 | + var workshopWorkTimeRecordModels []*models.WorkshopWorkTimeRecord | ||
| 127 | + workshopWorkTimeRecords := make([]*domain.WorkshopWorkTimeRecord, 0) | ||
| 128 | + query := sqlbuilder.BuildQuery(tx.Model(&workshopWorkTimeRecordModels), queryOptions) | ||
| 129 | + | ||
| 130 | + query.SetWhereByQueryOption("company_id = ?", "companyId") | ||
| 131 | + query.SetWhereByQueryOption("org_id = ?", "orgId") | ||
| 132 | + if v, ok := queryOptions["inOrgIds"]; ok && len(v.([]int)) > 0 { | ||
| 133 | + query.Where(`org_id in (?)`, pg.In(v)) | ||
| 134 | + } | ||
| 135 | + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 { | ||
| 136 | + query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v)) | ||
| 137 | + } | ||
| 138 | + if v, ok := queryOptions["lineName"]; ok && len(v.(string)) > 0 { | ||
| 139 | + query.Where(fmt.Sprintf(`work_station->>'lineName' like '%%%v%%'`, v)) | ||
| 140 | + } | ||
| 141 | + //if v, ok := queryOptions["sectionName"]; ok && len(v.(string)) > 0 { | ||
| 142 | + // query.Where(fmt.Sprintf(`work_station->>'sectionName' like '%%%v%%'`, v)) | ||
| 143 | + //} | ||
| 144 | + if v, ok := queryOptions["signBeginTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 145 | + query.Where("record_date>=?", v.(time.Time)) | ||
| 146 | + } | ||
| 147 | + if v, ok := queryOptions["signEndTime"]; ok && !((v.(time.Time)).IsZero()) { | ||
| 148 | + query.Where("record_date<?", v.(time.Time)) | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + query.SetOffsetAndLimit(domain.MaxQueryRow) | ||
| 152 | + query.SetOrderDirect("record_date", "DESC") | ||
| 153 | + query.SetOrderDirect("workshop_work_time_record_id", "DESC") | ||
| 154 | + if count, err := query.SelectAndCount(); err != nil { | ||
| 155 | + return 0, workshopWorkTimeRecords, err | ||
| 156 | + } else { | ||
| 157 | + for _, workshopWorkTimeRecordModel := range workshopWorkTimeRecordModels { | ||
| 158 | + if workshopWorkTimeRecord, err := transform.TransformToWorkshopWorkTimeRecordDomainModelFromPgModels(workshopWorkTimeRecordModel); err != nil { | ||
| 159 | + return 0, workshopWorkTimeRecords, err | ||
| 160 | + } else { | ||
| 161 | + workshopWorkTimeRecords = append(workshopWorkTimeRecords, workshopWorkTimeRecord) | ||
| 162 | + } | ||
| 163 | + } | ||
| 164 | + return int64(count), workshopWorkTimeRecords, nil | ||
| 165 | + } | ||
| 166 | +} | ||
| 167 | +func NewWorkshopWorkTimeRecordRepository(transactionContext *pgTransaction.TransactionContext) (*WorkshopWorkTimeRecordRepository, error) { | ||
| 168 | + if transactionContext == nil { | ||
| 169 | + return nil, fmt.Errorf("transactionContext参数不能为nil") | ||
| 170 | + } else { | ||
| 171 | + return &WorkshopWorkTimeRecordRepository{ | ||
| 172 | + transactionContext: transactionContext, | ||
| 173 | + }, nil | ||
| 174 | + } | ||
| 175 | +} |
pkg/infrastructure/utils/time.go
0 → 100644
| 1 | +package utils | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "strconv" | ||
| 5 | + "time" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func GetDayBegin() time.Time { | ||
| 9 | + t := time.Now() | ||
| 10 | + today, _ := time.Parse("2006-01-02", t.Format("2006-01-02")) | ||
| 11 | + return today | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func GetDayEnd() time.Time { | ||
| 15 | + t := GetDayBegin() | ||
| 16 | + nextDay := t.AddDate(0, 0, 1) | ||
| 17 | + return nextDay | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +// GetFirstDateOfMonth 获取传入的时间所在月份的第一天,即某月第一天的0点。如传入time.Now(), 返回当前月份的第一天0点时间。 | ||
| 21 | +func GetFirstDateOfMonth(d time.Time) time.Time { | ||
| 22 | + d = d.AddDate(0, 0, -d.Day()+1) | ||
| 23 | + return GetZeroTime(d) | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +// GetNextMonthFirstDay 获取传入的时间所在月份的最后一天,即某月最后一天的23:59:59。如传入time.Now(), 返回当前月份的最后一天的23:59:59。 | ||
| 27 | +func GetNextMonthFirstDay(d time.Time) time.Time { | ||
| 28 | + d = GetFirstDateOfMonth(d).AddDate(0, 1, 0) | ||
| 29 | + return GetZeroTime(d) | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +// GetZeroTime 获取某一天的0点时间 | ||
| 33 | +func GetZeroTime(d time.Time) time.Time { | ||
| 34 | + return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, time.Local) | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +// GetNextDayZeroTime 获取某一天的23点59分59秒 | ||
| 38 | +func GetNextDayZeroTime(d time.Time) time.Time { | ||
| 39 | + return time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, 1) | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +// TransformTimestampToTime 根据13位时间戳返回日期时间格式时间 | ||
| 43 | +func TransformTimestampToTime(timeStamp int64) time.Time { | ||
| 44 | + t := strconv.FormatInt(timeStamp, 10) | ||
| 45 | + tIpartStr := t[0:10] | ||
| 46 | + //tDecpartStr := t[10:13] | ||
| 47 | + ipart, _ := strconv.ParseInt(tIpartStr, 10, 64) | ||
| 48 | + //decpart, _ := strconv.ParseInt(tDecpartStr, 10, 64) | ||
| 49 | + myTime := time.Unix(ipart, 0) | ||
| 50 | + //(myTime) | ||
| 51 | + return time.Date(myTime.Year(), myTime.Month(), myTime.Day(), myTime.Hour(), myTime.Minute(), myTime.Second(), 0, time.Local) | ||
| 52 | +} |
| @@ -78,3 +78,27 @@ func (controller *AttendanceController) SearchAttendance() { | @@ -78,3 +78,27 @@ func (controller *AttendanceController) SearchAttendance() { | ||
| 78 | total, data, err := attendanceService.SearchAttendance(operateInfo, cmd) | 78 | total, data, err := attendanceService.SearchAttendance(operateInfo, cmd) |
| 79 | ResponseGrid(controller.BaseController, total, data, err) | 79 | ResponseGrid(controller.BaseController, total, data, err) |
| 80 | } | 80 | } |
| 81 | + | ||
| 82 | +func (controller *AttendanceController) SearchEmployeeAttendanceStatics() { | ||
| 83 | + attendanceService := service.NewAttendanceService(nil) | ||
| 84 | + cmd := &query.SearchEmployeeAttendanceQuery{} | ||
| 85 | + controller.Unmarshal(cmd) | ||
| 86 | + operateInfo := ParseOperateInfo(controller.BaseController) | ||
| 87 | + //cmd.OrgId = operateInfo.OrgId | ||
| 88 | + cmd.CompanyId = operateInfo.CompanyId | ||
| 89 | + cmd.InOrgIds = operateInfo.OrgIds | ||
| 90 | + total, data, err := attendanceService.SearchEmployeeAttendanceStatics(operateInfo, cmd) | ||
| 91 | + ResponseGrid(controller.BaseController, total, data, err) | ||
| 92 | +} | ||
| 93 | + | ||
| 94 | +func (controller *AttendanceController) SearchWorkshopWorkTimeStatics() { | ||
| 95 | + attendanceService := service.NewAttendanceService(nil) | ||
| 96 | + cmd := &query.SearchEmployeeAttendanceQuery{} | ||
| 97 | + controller.Unmarshal(cmd) | ||
| 98 | + operateInfo := ParseOperateInfo(controller.BaseController) | ||
| 99 | + //cmd.OrgId = operateInfo.OrgId | ||
| 100 | + cmd.CompanyId = operateInfo.CompanyId | ||
| 101 | + cmd.InOrgIds = operateInfo.OrgIds | ||
| 102 | + total, data, err := attendanceService.SearchWorkshopWorkTimeStatics(operateInfo, cmd) | ||
| 103 | + ResponseGrid(controller.BaseController, total, data, err) | ||
| 104 | +} |
| @@ -90,3 +90,15 @@ func (controller *ProductRecordController) SearchEmployeeProductRecord() { | @@ -90,3 +90,15 @@ func (controller *ProductRecordController) SearchEmployeeProductRecord() { | ||
| 90 | total, data, err := productPlanService.SearchEmployeeProductRecord(ParseOperateInfo(controller.BaseController), cmd) | 90 | total, data, err := productPlanService.SearchEmployeeProductRecord(ParseOperateInfo(controller.BaseController), cmd) |
| 91 | ResponseGrid(controller.BaseController, total, data, err) | 91 | ResponseGrid(controller.BaseController, total, data, err) |
| 92 | } | 92 | } |
| 93 | + | ||
| 94 | +func (controller *ProductRecordController) SearchWorkshopProductRecord() { | ||
| 95 | + productPlanService := service.NewProductRecordService(nil) | ||
| 96 | + cmd := &query.SearchWorkshopProductRecordQuery{} | ||
| 97 | + Must(controller.Unmarshal(cmd)) | ||
| 98 | + operateInfo := ParseOperateInfo(controller.BaseController) | ||
| 99 | + //cmd.OrgId = operateInfo.OrgId | ||
| 100 | + cmd.CompanyId = operateInfo.CompanyId | ||
| 101 | + cmd.InOrgIds = operateInfo.OrgIds | ||
| 102 | + total, data, err := productPlanService.SearchWorkshopProductRecord(ParseOperateInfo(controller.BaseController), cmd) | ||
| 103 | + ResponseGrid(controller.BaseController, total, data, err) | ||
| 104 | +} |
| @@ -13,4 +13,6 @@ func init() { | @@ -13,4 +13,6 @@ func init() { | ||
| 13 | web.Router("/attendances/", &controllers.AttendanceController{}, "Get:ListAttendance") | 13 | web.Router("/attendances/", &controllers.AttendanceController{}, "Get:ListAttendance") |
| 14 | web.Router("/attendances/approve", &controllers.AttendanceController{}, "Post:ApproveAttendance") | 14 | web.Router("/attendances/approve", &controllers.AttendanceController{}, "Post:ApproveAttendance") |
| 15 | web.Router("/attendances/search", &controllers.AttendanceController{}, "Post:SearchAttendance") | 15 | web.Router("/attendances/search", &controllers.AttendanceController{}, "Post:SearchAttendance") |
| 16 | + web.Router("/attendances/employee-attendance-statics/search", &controllers.AttendanceController{}, "Post:SearchEmployeeAttendanceStatics") | ||
| 17 | + web.Router("/attendances/workshop-attendance-statics/search", &controllers.AttendanceController{}, "Post:SearchWorkshopWorkTimeStatics") | ||
| 16 | } | 18 | } |
| @@ -14,4 +14,5 @@ func init() { | @@ -14,4 +14,5 @@ func init() { | ||
| 14 | web.Router("/product-records/approve", &controllers.ProductRecordController{}, "Post:ApproveProductRecord") | 14 | web.Router("/product-records/approve", &controllers.ProductRecordController{}, "Post:ApproveProductRecord") |
| 15 | web.Router("/product-records/search", &controllers.ProductRecordController{}, "Post:SearchProductRecord") | 15 | web.Router("/product-records/search", &controllers.ProductRecordController{}, "Post:SearchProductRecord") |
| 16 | web.Router("/product-records/employee-productive/search", &controllers.ProductRecordController{}, "Post:SearchEmployeeProductRecord") | 16 | web.Router("/product-records/employee-productive/search", &controllers.ProductRecordController{}, "Post:SearchEmployeeProductRecord") |
| 17 | + web.Router("/product-records/workshop-productive/search", &controllers.ProductRecordController{}, "Post:SearchWorkshopProductRecord") | ||
| 17 | } | 18 | } |
| @@ -23,7 +23,7 @@ func Run() { | @@ -23,7 +23,7 @@ func Run() { | ||
| 23 | h := asynq.NewServeMux() | 23 | h := asynq.NewServeMux() |
| 24 | // ... Register handlers | 24 | // ... Register handlers |
| 25 | h.HandleFunc(domain.TaskKeyPatternProductRecordStatics(), HandlerProductRecordStatics) | 25 | h.HandleFunc(domain.TaskKeyPatternProductRecordStatics(), HandlerProductRecordStatics) |
| 26 | - | 26 | + h.HandleFunc(domain.TaskKeyWorkshopWorkTimeRecordStatics(), WorkshopWorkTimeRecordStatics) |
| 27 | log.Logger.Info("aysnq task running ...") | 27 | log.Logger.Info("aysnq task running ...") |
| 28 | // Run blocks and waits for os signal to terminate the program. | 28 | // Run blocks and waits for os signal to terminate the program. |
| 29 | if err := srv.Run(h); err != nil { | 29 | if err := srv.Run(h); err != nil { |
pkg/port/task/task_work_time_static.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 WorkshopWorkTimeRecordStatics(c context.Context, t *asynq.Task) error { | ||
| 15 | + svr := service.NewAttendanceService(nil) | ||
| 16 | + cmd := &command.WorkshopWorkTimeRecordStaticsCommand{} | ||
| 17 | + if err := json.Unmarshal(t.Payload(), cmd); err != nil { | ||
| 18 | + return err | ||
| 19 | + } | ||
| 20 | + log.Logger.Debug(fmt.Sprintf("【考勤记录统计】 消费 记录ID:%v 时间:%v", cmd.ProductAttendanceId, cmd.WorkTimeBefore)) | ||
| 21 | + _, err := svr.WorkshopWorkTimeRecordStatics(cmd) | ||
| 22 | + if err != nil { | ||
| 23 | + log.Logger.Error(err.Error()) | ||
| 24 | + } | ||
| 25 | + return nil | ||
| 26 | +} |
-
请 注册 或 登录 后发表评论