作者 yangfu

增加工厂日历

@@ -2,6 +2,7 @@ package command @@ -2,6 +2,7 @@ package command
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
5 "reflect" 6 "reflect"
6 "strings" 7 "strings"
7 8
@@ -34,7 +35,15 @@ type CreateProductCalendarCommand struct { @@ -34,7 +35,15 @@ type CreateProductCalendarCommand struct {
34 } 35 }
35 36
36 func (createProductCalendarCommand *CreateProductCalendarCommand) Valid(validation *validation.Validation) { 37 func (createProductCalendarCommand *CreateProductCalendarCommand) Valid(validation *validation.Validation) {
37 - validation.SetError("CustomValid", "未实现的自定义认证") 38 + //validation.SetError("CustomValid", "未实现的自定义认证")
  39 + if err := utils.ValidWorkTime(createProductCalendarCommand.InWorkAt); err != nil {
  40 + validation.Error(err.Error())
  41 + return
  42 + }
  43 + if err := utils.ValidWorkTime(createProductCalendarCommand.OutWorkAt); err != nil {
  44 + validation.Error(err.Error())
  45 + return
  46 + }
38 } 47 }
39 48
40 func (createProductCalendarCommand *CreateProductCalendarCommand) ValidateCommand() error { 49 func (createProductCalendarCommand *CreateProductCalendarCommand) ValidateCommand() error {
@@ -14,7 +14,7 @@ type RemoveProductCalendarCommand struct { @@ -14,7 +14,7 @@ type RemoveProductCalendarCommand struct {
14 } 14 }
15 15
16 func (removeProductCalendarCommand *RemoveProductCalendarCommand) Valid(validation *validation.Validation) { 16 func (removeProductCalendarCommand *RemoveProductCalendarCommand) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 17 + //validation.SetError("CustomValid", "未实现的自定义认证")
18 } 18 }
19 19
20 func (removeProductCalendarCommand *RemoveProductCalendarCommand) ValidateCommand() error { 20 func (removeProductCalendarCommand *RemoveProductCalendarCommand) ValidateCommand() error {
@@ -32,7 +32,7 @@ type UpdateProductCalendarCommand struct { @@ -32,7 +32,7 @@ type UpdateProductCalendarCommand struct {
32 } 32 }
33 33
34 func (updateProductCalendarCommand *UpdateProductCalendarCommand) Valid(validation *validation.Validation) { 34 func (updateProductCalendarCommand *UpdateProductCalendarCommand) Valid(validation *validation.Validation) {
35 - validation.SetError("CustomValid", "未实现的自定义认证") 35 + //validation.SetError("CustomValid", "未实现的自定义认证")
36 } 36 }
37 37
38 func (updateProductCalendarCommand *UpdateProductCalendarCommand) ValidateCommand() error { 38 func (updateProductCalendarCommand *UpdateProductCalendarCommand) ValidateCommand() error {
  1 +package dto
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  5 + "strings"
  6 +)
  7 +
  8 +type ProductCalendarDto struct {
  9 + // 工厂日历ID
  10 + ProductCalendarId int `json:"productCalendarId,omitempty"`
  11 + // 企业id
  12 + //CompanyId int `json:"companyId,omitempty"`
  13 + // 组织ID
  14 + //OrgId int `json:"orgId,omitempty"`
  15 + // 工作位置
  16 + *domain.WorkStation
  17 + // 上班班次 1:全天 2:白班 4:中班 8:夜班
  18 + WorkOn int `json:"workOn,omitempty"`
  19 + // 日历选择
  20 + CalendarSelected []string `json:"calendarSelected,omitempty"`
  21 + // 上岗时间
  22 + InWorkAt string `json:"inWorkAt,omitempty"`
  23 + // 下岗时间
  24 + OutWorkAt string `json:"outWorkAt,omitempty"`
  25 + // 休息时间 (单位 h)
  26 + BreakTime float64 `json:"breakTime,omitempty"`
  27 + // 工时 (单位 h)
  28 + WorkTime float64 `json:"workTime,omitempty"`
  29 + // 已选择日历
  30 + CalendarSelectedString string `json:"calendarSelectedString,omitempty"`
  31 +}
  32 +
  33 +func (d *ProductCalendarDto) LoadDto(m *domain.ProductCalendar) *ProductCalendarDto {
  34 + d.ProductCalendarId = m.ProductCalendarId
  35 + d.WorkStation = m.WorkStation
  36 + d.WorkOn = m.WorkOn
  37 + d.CalendarSelected = m.CalendarSelected
  38 + d.InWorkAt = m.InWorkAt
  39 + d.OutWorkAt = m.OutWorkAt
  40 + d.BreakTime = m.BreakTime
  41 + d.WorkTime = m.WorkTime
  42 + d.CalendarSelectedString = strings.Join(m.CalendarSelected, "/")
  43 + return d
  44 +}
@@ -14,7 +14,7 @@ type GetProductCalendarQuery struct { @@ -14,7 +14,7 @@ type GetProductCalendarQuery struct {
14 } 14 }
15 15
16 func (getProductCalendarQuery *GetProductCalendarQuery) Valid(validation *validation.Validation) { 16 func (getProductCalendarQuery *GetProductCalendarQuery) Valid(validation *validation.Validation) {
17 - validation.SetError("CustomValid", "未实现的自定义认证") 17 + //validation.SetError("CustomValid", "未实现的自定义认证")
18 } 18 }
19 19
20 func (getProductCalendarQuery *GetProductCalendarQuery) ValidateQuery() error { 20 func (getProductCalendarQuery *GetProductCalendarQuery) ValidateQuery() error {
@@ -16,7 +16,7 @@ type ListProductCalendarQuery struct { @@ -16,7 +16,7 @@ type ListProductCalendarQuery struct {
16 } 16 }
17 17
18 func (listProductCalendarQuery *ListProductCalendarQuery) Valid(validation *validation.Validation) { 18 func (listProductCalendarQuery *ListProductCalendarQuery) Valid(validation *validation.Validation) {
19 - validation.SetError("CustomValid", "未实现的自定义认证") 19 + //validation.SetError("CustomValid", "未实现的自定义认证")
20 } 20 }
21 21
22 func (listProductCalendarQuery *ListProductCalendarQuery) ValidateQuery() error { 22 func (listProductCalendarQuery *ListProductCalendarQuery) ValidateQuery() error {
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/domain"
  6 + "reflect"
  7 + "strings"
  8 +
  9 + "github.com/beego/beego/v2/core/validation"
  10 +)
  11 +
  12 +type SearchProductCalendarQuery struct {
  13 + // 查询偏离量
  14 + Offset int `cname:"查询偏离量" json:"offset"`
  15 + // 查询限制
  16 + Limit int `cname:"查询限制" json:"limit"`
  17 + // 当前公司
  18 + CompanyId int `cname:"当前公司" json:"companyId,omitempty" valid:"Required"`
  19 + // 当前登录的组织
  20 + OrgId int `cname:"当前登录的组织" json:"orgId,omitempty" valid:"Required"`
  21 + // 页码
  22 + PageNumber int `cname:"页码" json:"pageNumber,omitempty"`
  23 + // 页数
  24 + PageSize int `cname:"页数" json:"pageSize,omitempty"`
  25 + // 车间名称
  26 + WorkshopName string `cname:"车间名称" json:"workshopName,omitempty"`
  27 + // 生产线名称
  28 + //LineName string `cname:"生产线名称" json:"lineName,omitempty"`
  29 + // 工段名称
  30 + //SectionName string `cname:"工段名称" json:"sectionName,omitempty"`
  31 + // 班次
  32 + WorkOn int `cname:"班次" json:"workOn,omitempty"`
  33 +}
  34 +
  35 +func (cmd *SearchProductCalendarQuery) Valid(validation *validation.Validation) {
  36 + cmd.Offset, cmd.Limit = domain.Pagination(cmd.PageNumber, cmd.PageSize)
  37 +}
  38 +
  39 +func (cmd *SearchProductCalendarQuery) ValidateQuery() error {
  40 + valid := validation.Validation{}
  41 + b, err := valid.Valid(cmd)
  42 + if err != nil {
  43 + return err
  44 + }
  45 + if !b {
  46 + elem := reflect.TypeOf(cmd).Elem()
  47 + for _, validErr := range valid.Errors {
  48 + field, isExist := elem.FieldByName(validErr.Field)
  49 + if isExist {
  50 + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1))
  51 + } else {
  52 + return fmt.Errorf(validErr.Message)
  53 + }
  54 + }
  55 + }
  56 + return nil
  57 +}
@@ -6,8 +6,11 @@ import ( @@ -6,8 +6,11 @@ import (
6 "github.com/linmadan/egglib-go/utils/tool_funs" 6 "github.com/linmadan/egglib-go/utils/tool_funs"
7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory" 7 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/factory"
8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productCalendar/command" 8 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productCalendar/command"
  9 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productCalendar/dto"
9 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productCalendar/query" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/application/productCalendar/query"
10 "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/utils"
  13 + "time"
11 ) 14 )
12 15
13 // 工厂日历服务 16 // 工厂日历服务
@@ -15,8 +18,10 @@ type ProductCalendarService struct { @@ -15,8 +18,10 @@ type ProductCalendarService struct {
15 } 18 }
16 19
17 // 创建工厂日历服务 20 // 创建工厂日历服务
18 -func (productCalendarService *ProductCalendarService) CreateProductCalendar(createProductCalendarCommand *command.CreateProductCalendarCommand) (interface{}, error) {  
19 - if err := createProductCalendarCommand.ValidateCommand(); err != nil { 21 +func (productCalendarService *ProductCalendarService) CreateProductCalendar(operateInfo *domain.OperateInfo, cmd *command.CreateProductCalendarCommand) (interface{}, error) {
  22 + cmd.CompanyId = operateInfo.CompanyId
  23 + cmd.OrgId = operateInfo.OrgId
  24 + if err := cmd.ValidateCommand(); err != nil {
20 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 25 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
21 } 26 }
22 transactionContext, err := factory.CreateTransactionContext(nil) 27 transactionContext, err := factory.CreateTransactionContext(nil)
@@ -29,27 +34,42 @@ func (productCalendarService *ProductCalendarService) CreateProductCalendar(crea @@ -29,27 +34,42 @@ func (productCalendarService *ProductCalendarService) CreateProductCalendar(crea
29 defer func() { 34 defer func() {
30 transactionContext.RollbackTransaction() 35 transactionContext.RollbackTransaction()
31 }() 36 }()
32 - newProductCalendar := &domain.ProductCalendar{  
33 - CompanyId: createProductCalendarCommand.CompanyId,  
34 - OrgId: createProductCalendarCommand.OrgId,  
35 - //WorkshopId: createProductCalendarCommand.WorkshopId,  
36 - //LineId: createProductCalendarCommand.LineId,  
37 - //SectionId: createProductCalendarCommand.SectionId,  
38 - //WorkOn: createProductCalendarCommand.WorkOn,  
39 - CalendarSelected: createProductCalendarCommand.CalendarSelected,  
40 - InWorkAt: createProductCalendarCommand.InWorkAt,  
41 - OutWorkAt: createProductCalendarCommand.OutWorkAt,  
42 - BreakTime: createProductCalendarCommand.BreakTime,  
43 - WorkTime: createProductCalendarCommand.WorkTime, 37 +
  38 + var workStation *domain.WorkStation
  39 + _, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId)
  40 + if err != nil {
  41 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
44 } 42 }
45 - var productCalendarRepository domain.ProductCalendarRepository  
46 - if value, err := factory.CreateProductCalendarRepository(map[string]interface{}{  
47 - "transactionContext": transactionContext,  
48 - }); err != nil { 43 +
  44 + // 判断同一个工作位置班次下,是否已重复排班
  45 + productCalendarRepository, _, _ := factory.FastPgProductCalendar(transactionContext, 0)
  46 + if total, _, err := productCalendarRepository.Find(map[string]interface{}{
  47 + "companyId": cmd.CompanyId,
  48 + "orgId": cmd.OrgId,
  49 + "workStationId": workStation.WorkStationId,
  50 + "workOn": cmd.WorkOn,
  51 + "limit": 1,
  52 + }); err == nil && total > 0 {
  53 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "工厂日历已存在")
  54 + }
  55 +
  56 + newProductCalendar := &domain.ProductCalendar{
  57 + CompanyId: cmd.CompanyId,
  58 + OrgId: cmd.OrgId,
  59 + WorkStation: workStation,
  60 + WorkOn: cmd.WorkOn,
  61 + CalendarSelected: cmd.CalendarSelected,
  62 + InWorkAt: cmd.InWorkAt,
  63 + OutWorkAt: cmd.OutWorkAt,
  64 + BreakTime: cmd.BreakTime,
  65 + //WorkTime: cmd.WorkTime,
  66 + CreatedAt: time.Now(),
  67 + UpdatedAt: time.Now(),
  68 + }
  69 + if err = newProductCalendar.ResetWorkTime(cmd.WorkTime); err != nil {
49 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 70 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
50 - } else {  
51 - productCalendarRepository = value  
52 } 71 }
  72 +
53 if productCalendar, err := productCalendarRepository.Save(newProductCalendar); err != nil { 73 if productCalendar, err := productCalendarRepository.Save(newProductCalendar); err != nil {
54 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 74 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
55 } else { 75 } else {
@@ -93,7 +113,10 @@ func (productCalendarService *ProductCalendarService) GetProductCalendar(getProd @@ -93,7 +113,10 @@ func (productCalendarService *ProductCalendarService) GetProductCalendar(getProd
93 if err := transactionContext.CommitTransaction(); err != nil { 113 if err := transactionContext.CommitTransaction(); err != nil {
94 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 114 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
95 } 115 }
96 - return productCalendar, nil 116 +
  117 + result := &dto.ProductCalendarDto{}
  118 + result.LoadDto(productCalendar)
  119 + return result, nil
97 } 120 }
98 } 121 }
99 122
@@ -174,8 +197,8 @@ func (productCalendarService *ProductCalendarService) RemoveProductCalendar(remo @@ -174,8 +197,8 @@ func (productCalendarService *ProductCalendarService) RemoveProductCalendar(remo
174 } 197 }
175 198
176 // 更新工厂日历服务 199 // 更新工厂日历服务
177 -func (productCalendarService *ProductCalendarService) UpdateProductCalendar(updateProductCalendarCommand *command.UpdateProductCalendarCommand) (interface{}, error) {  
178 - if err := updateProductCalendarCommand.ValidateCommand(); err != nil { 200 +func (productCalendarService *ProductCalendarService) UpdateProductCalendar(cmd *command.UpdateProductCalendarCommand) (interface{}, error) {
  201 + if err := cmd.ValidateCommand(); err != nil {
179 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 202 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
180 } 203 }
181 transactionContext, err := factory.CreateTransactionContext(nil) 204 transactionContext, err := factory.CreateTransactionContext(nil)
@@ -189,21 +212,42 @@ func (productCalendarService *ProductCalendarService) UpdateProductCalendar(upda @@ -189,21 +212,42 @@ func (productCalendarService *ProductCalendarService) UpdateProductCalendar(upda
189 transactionContext.RollbackTransaction() 212 transactionContext.RollbackTransaction()
190 }() 213 }()
191 var productCalendarRepository domain.ProductCalendarRepository 214 var productCalendarRepository domain.ProductCalendarRepository
192 - if value, err := factory.CreateProductCalendarRepository(map[string]interface{}{  
193 - "transactionContext": transactionContext,  
194 - }); err != nil { 215 + var productCalendar *domain.ProductCalendar
  216 + productCalendarRepository, productCalendar, err = factory.FastPgProductCalendar(transactionContext, cmd.ProductCalendarId)
  217 + if err != nil {
195 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 218 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
196 - } else {  
197 - productCalendarRepository = value  
198 } 219 }
199 - productCalendar, err := productCalendarRepository.FindOne(map[string]interface{}{"productCalendarId": updateProductCalendarCommand.ProductCalendarId}) 220 +
  221 + var workStation *domain.WorkStation
  222 + _, workStation, err = factory.FastPgWorkstation(transactionContext, cmd.WorkshopId, cmd.LineId, cmd.SectionId, factory.WithSetPrincipal())
200 if err != nil { 223 if err != nil {
201 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 224 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
202 } 225 }
203 - if productCalendar == nil {  
204 - return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updateProductCalendarCommand.ProductCalendarId))) 226 +
  227 + // 判断同一个工作位置班次下,是否已重复排班
  228 + if productCalendar.WorkOn != cmd.WorkOn || productCalendar.WorkStation.WorkStationId != workStation.WorkStationId {
  229 + if total, _, err := productCalendarRepository.Find(map[string]interface{}{
  230 + "companyId": productCalendar.CompanyId,
  231 + "orgId": productCalendar.OrgId,
  232 + "workStationId": workStation.WorkStationId,
  233 + "workOn": cmd.WorkOn,
  234 + "limit": 1,
  235 + }); err == nil && total > 0 {
  236 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "工厂日历已存在")
  237 + }
205 } 238 }
206 - if err := productCalendar.Update(tool_funs.SimpleStructToMap(updateProductCalendarCommand)); err != nil { 239 +
  240 + productCalendar.WorkStation = workStation
  241 + productCalendar.WorkOn = cmd.WorkOn
  242 + productCalendar.CalendarSelected = cmd.CalendarSelected
  243 + productCalendar.InWorkAt = cmd.InWorkAt
  244 + productCalendar.OutWorkAt = cmd.OutWorkAt
  245 + productCalendar.BreakTime = cmd.BreakTime
  246 + if err = productCalendar.ResetWorkTime(cmd.WorkTime); err != nil {
  247 + return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
  248 + }
  249 +
  250 + if err := productCalendar.Update(tool_funs.SimpleStructToMap(cmd)); err != nil {
207 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error()) 251 return nil, application.ThrowError(application.BUSINESS_ERROR, err.Error())
208 } 252 }
209 if productCalendar, err := productCalendarRepository.Save(productCalendar); err != nil { 253 if productCalendar, err := productCalendarRepository.Save(productCalendar); err != nil {
@@ -216,6 +260,45 @@ func (productCalendarService *ProductCalendarService) UpdateProductCalendar(upda @@ -216,6 +260,45 @@ func (productCalendarService *ProductCalendarService) UpdateProductCalendar(upda
216 } 260 }
217 } 261 }
218 262
  263 +// 返回工厂日历服务列表
  264 +func (productCalendarService *ProductCalendarService) SearchProductCalendar(operateInfo *domain.OperateInfo, listProductCalendarQuery *query.SearchProductCalendarQuery) (int64, interface{}, error) {
  265 + listProductCalendarQuery.OrgId = operateInfo.OrgId
  266 + listProductCalendarQuery.CompanyId = operateInfo.CompanyId
  267 + if err := listProductCalendarQuery.ValidateQuery(); err != nil {
  268 + return 0, nil, application.ThrowError(application.ARG_ERROR, err.Error())
  269 + }
  270 + transactionContext, err := factory.CreateTransactionContext(nil)
  271 + if err != nil {
  272 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  273 + }
  274 + if err := transactionContext.StartTransaction(); err != nil {
  275 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  276 + }
  277 + defer func() {
  278 + transactionContext.RollbackTransaction()
  279 + }()
  280 + var productCalendarRepository domain.ProductCalendarRepository
  281 + productCalendarRepository, _, _ = factory.FastPgProductCalendar(transactionContext, 0)
  282 +
  283 + count, productCalendars, err := productCalendarRepository.Find(utils.ObjectToMap(listProductCalendarQuery))
  284 + if err != nil {
  285 + return 0, nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  286 + }
  287 + if err := transactionContext.CommitTransaction(); err != nil {
  288 + return 0, nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  289 + }
  290 +
  291 + var result = make([]*dto.ProductCalendarDto, 0)
  292 + for i := range productCalendars {
  293 + item := productCalendars[i]
  294 + newJobDto := &dto.ProductCalendarDto{}
  295 + newJobDto.LoadDto(item)
  296 + result = append(result, newJobDto)
  297 + }
  298 +
  299 + return count, result, nil
  300 +}
  301 +
219 func NewProductCalendarService(options map[string]interface{}) *ProductCalendarService { 302 func NewProductCalendarService(options map[string]interface{}) *ProductCalendarService {
220 newProductCalendarService := &ProductCalendarService{} 303 newProductCalendarService := &ProductCalendarService{}
221 return newProductCalendarService 304 return newProductCalendarService
1 package domain 1 package domain
2 2
3 -import "time" 3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-manufacture/pkg/infrastructure/utils"
  5 + "time"
  6 +)
4 7
5 // 工厂日历 8 // 工厂日历
6 type ProductCalendar struct { 9 type ProductCalendar struct {
@@ -47,62 +50,24 @@ func (productCalendar *ProductCalendar) Identify() interface{} { @@ -47,62 +50,24 @@ func (productCalendar *ProductCalendar) Identify() interface{} {
47 } 50 }
48 51
49 func (productCalendar *ProductCalendar) Update(data map[string]interface{}) error { 52 func (productCalendar *ProductCalendar) Update(data map[string]interface{}) error {
50 - if productCalendarId, ok := data["productCalendarId"]; ok {  
51 - productCalendar.ProductCalendarId = productCalendarId.(int)  
52 - }  
53 - if companyId, ok := data["companyId"]; ok {  
54 - productCalendar.CompanyId = companyId.(int)  
55 - }  
56 - if orgId, ok := data["orgId"]; ok {  
57 - productCalendar.OrgId = orgId.(int)  
58 - }  
59 - if workStationId, ok := data["workStationId"]; ok {  
60 - productCalendar.WorkStation.WorkStationId = workStationId.(string)  
61 - }  
62 - if workshopId, ok := data["workshopId"]; ok {  
63 - productCalendar.WorkStation.WorkshopId = workshopId.(int)  
64 - }  
65 - if workshopName, ok := data["workshopName"]; ok {  
66 - productCalendar.WorkStation.WorkshopName = workshopName.(string)  
67 - }  
68 - if lineId, ok := data["lineId"]; ok {  
69 - productCalendar.WorkStation.LineId = lineId.(int)  
70 - }  
71 - if lineName, ok := data["lineName"]; ok {  
72 - productCalendar.WorkStation.LineName = lineName.(string)  
73 - }  
74 - if sectionId, ok := data["sectionId"]; ok {  
75 - productCalendar.WorkStation.SectionId = sectionId.(int)  
76 - }  
77 - if sectionName, ok := data["sectionName"]; ok {  
78 - productCalendar.WorkStation.SectionName = sectionName.(string)  
79 - }  
80 - if workOn, ok := data["workOn"]; ok {  
81 - productCalendar.WorkOn = workOn.(int)  
82 - }  
83 - //if calendarSelected, ok := data["calendarSelected"]; ok {  
84 - // productCalendar.CalendarSelected = calendarSelected.(array)  
85 - //}  
86 - if inWorkAt, ok := data["inWorkAt"]; ok {  
87 - productCalendar.InWorkAt = inWorkAt.(string)  
88 - }  
89 - if outWorkAt, ok := data["outWorkAt"]; ok {  
90 - productCalendar.OutWorkAt = outWorkAt.(string)  
91 - }  
92 - if breakTime, ok := data["breakTime"]; ok {  
93 - productCalendar.BreakTime = breakTime.(float64)  
94 - }  
95 - if workTime, ok := data["workTime"]; ok {  
96 - productCalendar.WorkTime = workTime.(float64)  
97 - }  
98 - if createdAt, ok := data["createdAt"]; ok {  
99 - productCalendar.CreatedAt = createdAt.(time.Time) 53 + productCalendar.UpdatedAt = time.Now()
  54 + return nil
  55 +}
  56 +
  57 +func (productCalendar *ProductCalendar) ResetWorkTime(v float64) error {
  58 + if v != 0 {
  59 + productCalendar.WorkTime = v
  60 + return nil
100 } 61 }
101 - if updatedAt, ok := data["updatedAt"]; ok {  
102 - productCalendar.UpdatedAt = updatedAt.(time.Time) 62 + td, err := utils.ComputeTimeDuration(productCalendar.InWorkAt, productCalendar.OutWorkAt)
  63 + if err != nil {
  64 + return err
103 } 65 }
104 - if deletedAt, ok := data["deletedAt"]; ok {  
105 - productCalendar.DeletedAt = deletedAt.(time.Time) 66 + if td.Hours() <= productCalendar.BreakTime {
  67 + productCalendar.WorkTime = 0
  68 + return nil
106 } 69 }
  70 + // 工作时长 = (上班时间-下班时间)- 休息时间
  71 + productCalendar.WorkTime = td.Hours() - productCalendar.BreakTime
107 return nil 72 return nil
108 } 73 }
@@ -18,7 +18,7 @@ type ProductCalendar struct { @@ -18,7 +18,7 @@ type ProductCalendar struct {
18 // 上班班次 1:全天 2:白班 4:中班 8:夜班 18 // 上班班次 1:全天 2:白班 4:中班 8:夜班
19 WorkOn int `comment:"上班班次 1:全天 2:白班 4:中班 8:夜班"` 19 WorkOn int `comment:"上班班次 1:全天 2:白班 4:中班 8:夜班"`
20 // 日历选择 20 // 日历选择
21 - CalendarSelected []string `comment:"日历选择" pg:",array"` 21 + CalendarSelected []string `comment:"日历选择"`
22 // 上岗时间 22 // 上岗时间
23 InWorkAt string `comment:"上岗时间"` 23 InWorkAt string `comment:"上岗时间"`
24 // 下岗时间 24 // 下岗时间
@@ -63,7 +63,7 @@ func (repository *ProductCalendarRepository) Save(productCalendar *domain.Produc @@ -63,7 +63,7 @@ func (repository *ProductCalendarRepository) Save(productCalendar *domain.Produc
63 &productCalendar.UpdatedAt, 63 &productCalendar.UpdatedAt,
64 &productCalendar.DeletedAt, 64 &productCalendar.DeletedAt,
65 ), 65 ),
66 - fmt.Sprintf("INSERT INTO product_calendars (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet), 66 + fmt.Sprintf("INSERT INTO manufacture.product_calendar (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet),
67 productCalendar.CompanyId, 67 productCalendar.CompanyId,
68 productCalendar.OrgId, 68 productCalendar.OrgId,
69 productCalendar.WorkStation, 69 productCalendar.WorkStation,
@@ -95,7 +95,7 @@ func (repository *ProductCalendarRepository) Save(productCalendar *domain.Produc @@ -95,7 +95,7 @@ func (repository *ProductCalendarRepository) Save(productCalendar *domain.Produc
95 &productCalendar.UpdatedAt, 95 &productCalendar.UpdatedAt,
96 &productCalendar.DeletedAt, 96 &productCalendar.DeletedAt,
97 ), 97 ),
98 - fmt.Sprintf("UPDATE product_calendars SET %s WHERE product_calendar_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet), 98 + fmt.Sprintf("UPDATE manufacture.product_calendar SET %s WHERE product_calendar_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
99 productCalendar.CompanyId, 99 productCalendar.CompanyId,
100 productCalendar.OrgId, 100 productCalendar.OrgId,
101 productCalendar.WorkStation, 101 productCalendar.WorkStation,
@@ -146,7 +146,14 @@ func (repository *ProductCalendarRepository) Find(queryOptions map[string]interf @@ -146,7 +146,14 @@ func (repository *ProductCalendarRepository) Find(queryOptions map[string]interf
146 var productCalendarModels []*models.ProductCalendar 146 var productCalendarModels []*models.ProductCalendar
147 productCalendars := make([]*domain.ProductCalendar, 0) 147 productCalendars := make([]*domain.ProductCalendar, 0)
148 query := sqlbuilder.BuildQuery(tx.Model(&productCalendarModels), queryOptions) 148 query := sqlbuilder.BuildQuery(tx.Model(&productCalendarModels), queryOptions)
149 - query.SetOffsetAndLimit(20) 149 + query.SetWhereByQueryOption("company_id = ?", "companyId")
  150 + query.SetWhereByQueryOption("org_id = ?", "orgId")
  151 + query.SetWhereByQueryOption("work_station->>'workStationId'=?", "workStationId")
  152 + query.SetWhereByQueryOption("work_on & ? >0", "workOn")
  153 + if v, ok := queryOptions["workshopName"]; ok && len(v.(string)) > 0 {
  154 + query.Where(fmt.Sprintf(`work_station->>'workshopName' like '%%%v%%'`, v))
  155 + }
  156 + query.SetOffsetAndLimit(domain.MaxQueryRow)
150 query.SetOrderDirect("product_calendar_id", "DESC") 157 query.SetOrderDirect("product_calendar_id", "DESC")
151 if count, err := query.SelectAndCount(); err != nil { 158 if count, err := query.SelectAndCount(); err != nil {
152 return 0, productCalendars, err 159 return 0, productCalendars, err
@@ -288,3 +288,30 @@ func ValidWorkTime(t string) error { @@ -288,3 +288,30 @@ func ValidWorkTime(t string) error {
288 } 288 }
289 return nil 289 return nil
290 } 290 }
  291 +
  292 +// 计算两个时间间隔的时间
  293 +func ComputeTimeDuration(t1, t2 string) (result time.Duration, err error) {
  294 + if err = ValidWorkTime(t1); err != nil {
  295 + return
  296 + }
  297 + if err = ValidWorkTime(t2); err != nil {
  298 + return
  299 + }
  300 + t1s := strings.Split(t1, ":")
  301 + t1sHour, _ := strconv.Atoi(t1s[0])
  302 + t1sMin, _ := strconv.Atoi(t1s[1])
  303 +
  304 + t2s := strings.Split(t2, ":")
  305 + t2sHour, _ := strconv.Atoi(t2s[0])
  306 + t2sMin, _ := strconv.Atoi(t2s[1])
  307 + var t1t, t2t time.Time
  308 + if t1sHour < t2sHour {
  309 + t1t = time.Date(2006, 1, 1, t1sHour, t1sMin, 0, 0, time.Local)
  310 + t2t = time.Date(2006, 1, 1, t2sHour, t2sMin, 0, 0, time.Local)
  311 + } else {
  312 + t1t = time.Date(2006, 1, 1, t1sHour, t1sMin, 0, 0, time.Local)
  313 + t2t = time.Date(2006, 1, 2, t2sHour, t2sMin, 0, 0, time.Local)
  314 + }
  315 + ts := t2t.Sub(t1t)
  316 + return ts, nil
  317 +}
@@ -3,6 +3,7 @@ package utils @@ -3,6 +3,7 @@ package utils
3 import ( 3 import (
4 "github.com/stretchr/testify/assert" 4 "github.com/stretchr/testify/assert"
5 "testing" 5 "testing"
  6 + "time"
6 ) 7 )
7 8
8 func TestTimeSpan(t *testing.T) { 9 func TestTimeSpan(t *testing.T) {
@@ -26,3 +27,28 @@ func TestTimeSpan(t *testing.T) { @@ -26,3 +27,28 @@ func TestTimeSpan(t *testing.T) {
26 } 27 }
27 } 28 }
28 } 29 }
  30 +
  31 +func TestComputeTimeDuration(t *testing.T) {
  32 + assertDuration := func(s string) time.Duration {
  33 + t, _ := time.ParseDuration(s)
  34 + return t
  35 + }
  36 + inputs := []struct {
  37 + t1 string
  38 + t2 string
  39 + ts time.Duration
  40 + }{
  41 + {
  42 + "9:00", "18:00", assertDuration("9h"),
  43 + },
  44 + {
  45 + "23:00", "6:00", assertDuration("7h"),
  46 + },
  47 + }
  48 + for i := range inputs {
  49 + input := inputs[i]
  50 + out, err := ComputeTimeDuration(input.t1, input.t2)
  51 + assert.Nil(t, err)
  52 + assert.Equal(t, input.ts, out)
  53 + }
  54 +}
@@ -15,7 +15,7 @@ func (controller *ProductCalendarController) CreateProductCalendar() { @@ -15,7 +15,7 @@ func (controller *ProductCalendarController) CreateProductCalendar() {
15 productCalendarService := service.NewProductCalendarService(nil) 15 productCalendarService := service.NewProductCalendarService(nil)
16 createProductCalendarCommand := &command.CreateProductCalendarCommand{} 16 createProductCalendarCommand := &command.CreateProductCalendarCommand{}
17 controller.Unmarshal(createProductCalendarCommand) 17 controller.Unmarshal(createProductCalendarCommand)
18 - data, err := productCalendarService.CreateProductCalendar(createProductCalendarCommand) 18 + data, err := productCalendarService.CreateProductCalendar(ParseOperateInfo(controller.BaseController), createProductCalendarCommand)
19 controller.Response(data, err) 19 controller.Response(data, err)
20 } 20 }
21 21
@@ -58,3 +58,11 @@ func (controller *ProductCalendarController) ListProductCalendar() { @@ -58,3 +58,11 @@ func (controller *ProductCalendarController) ListProductCalendar() {
58 data, err := productCalendarService.ListProductCalendar(listProductCalendarQuery) 58 data, err := productCalendarService.ListProductCalendar(listProductCalendarQuery)
59 controller.Response(data, err) 59 controller.Response(data, err)
60 } 60 }
  61 +
  62 +func (controller *ProductCalendarController) SearchProductCalendar() {
  63 + productCalendarService := service.NewProductCalendarService(nil)
  64 + cmd := &query.SearchProductCalendarQuery{}
  65 + Must(controller.Unmarshal(cmd))
  66 + total, data, err := productCalendarService.SearchProductCalendar(ParseOperateInfo(controller.BaseController), cmd)
  67 + ResponseGrid(controller.BaseController, total, data, err)
  68 +}
@@ -11,4 +11,6 @@ func init() { @@ -11,4 +11,6 @@ func init() {
11 web.Router("/product-calendars/:productCalendarId", &controllers.ProductCalendarController{}, "Get:GetProductCalendar") 11 web.Router("/product-calendars/:productCalendarId", &controllers.ProductCalendarController{}, "Get:GetProductCalendar")
12 web.Router("/product-calendars/:productCalendarId", &controllers.ProductCalendarController{}, "Delete:RemoveProductCalendar") 12 web.Router("/product-calendars/:productCalendarId", &controllers.ProductCalendarController{}, "Delete:RemoveProductCalendar")
13 web.Router("/product-calendars/", &controllers.ProductCalendarController{}, "Get:ListProductCalendar") 13 web.Router("/product-calendars/", &controllers.ProductCalendarController{}, "Get:ListProductCalendar")
  14 +
  15 + web.Router("/product-calendars/search", &controllers.ProductCalendarController{}, "Post:SearchProductCalendar")
14 } 16 }