作者 庄敏学

Merge branch 'dev' of http://gitlab.fjmaimaimai.com/allied-creation/allied-creat…

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