work_order_sub.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package model
  2. import (
  3. "fmt"
  4. "kpt-pasture/util"
  5. "strings"
  6. "time"
  7. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  8. "go.uber.org/zap"
  9. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  10. )
  11. // 执行时间超过当前创单时间5秒的工单,不生效
  12. const (
  13. expireTimeSec = 5
  14. secondsInDay = 86400
  15. )
  16. type WorkOrderSub struct {
  17. Id int64 `json:"id"`
  18. WorkOrderSubNumber string `json:"workOrderSubNumber"`
  19. WorkOrderMasterId int64 `json:"workOrderMasterId"`
  20. ExecTime int64 `json:"execTime"`
  21. Status pasturePb.WorkOrderStatus_Kind `json:"status"`
  22. ExecUserId int64 `json:"execUserId"`
  23. SetUserIds string `json:"setUserIds"`
  24. IsShow pasturePb.IsShow_Kind `json:"isShow"`
  25. FinishTime int64 `json:"finishTime"`
  26. Remarks string `json:"remarks"`
  27. CreatedAt int64 `json:"createdAt"`
  28. UpdatedAt int64 `json:"updatedAt"`
  29. }
  30. func (w *WorkOrderSub) TableName() string {
  31. return "work_order_sub"
  32. }
  33. func NewWorkOrderSub(req *WorkOrderMaster) []*WorkOrderSub {
  34. workOrderSubList := make([]*WorkOrderSub, 0)
  35. if req.IsShow == pasturePb.IsShow_No {
  36. return workOrderSubList
  37. }
  38. nowTime := time.Now()
  39. execTime, err := util.ConvertParseLocalUnix(req.ExecTime)
  40. if err != nil {
  41. zaplog.Error("NewWorkOrderSub", zap.Any("ConvertParseLocalUnix", err))
  42. return workOrderSubList
  43. }
  44. isToday := execTime <= nowTime.Unix()+expireTimeSec
  45. // 一次性工单就生成当天的工单记录
  46. if req.Frequency == pasturePb.WorkOrderFrequency_None && isToday {
  47. return workOrderSubList
  48. }
  49. switch req.Frequency {
  50. case pasturePb.WorkOrderFrequency_None:
  51. currentExecTime := execTime
  52. workOrderSubList = append(workOrderSubList, &WorkOrderSub{
  53. WorkOrderMasterId: req.Id,
  54. ExecTime: currentExecTime,
  55. ExecUserId: 0,
  56. SetUserIds: req.ExecPersons,
  57. WorkOrderSubNumber: fmt.Sprintf("s%s%d", LayoutDate, time.Now().Unix()),
  58. Status: pasturePb.WorkOrderStatus_Created,
  59. IsShow: pasturePb.IsShow_Ok,
  60. Remarks: "",
  61. })
  62. case pasturePb.WorkOrderFrequency_Daily, pasturePb.WorkOrderFrequency_Weekly, pasturePb.WorkOrderFrequency_Monthly:
  63. // 本月剩余天数
  64. remainingDays := util.GetMonthRemainDay()
  65. for i := 0; i < remainingDays; i++ {
  66. if isToday && i == 0 {
  67. continue
  68. }
  69. currentExecTime := execTime + int64(i)*secondsInDay
  70. t := time.Unix(currentExecTime, 0)
  71. if shouldGenerateSubOrder(req.Frequency, t, req.WeekMonthValue) {
  72. sub := &WorkOrderSub{
  73. WorkOrderMasterId: req.Id,
  74. ExecTime: currentExecTime,
  75. ExecUserId: 0,
  76. WorkOrderSubNumber: fmt.Sprintf("s%s%d", LayoutDate, execTime),
  77. Status: pasturePb.WorkOrderStatus_Created,
  78. IsShow: pasturePb.IsShow_Ok,
  79. SetUserIds: req.ExecPersons,
  80. Remarks: "",
  81. }
  82. workOrderSubList = append(workOrderSubList, sub)
  83. }
  84. }
  85. }
  86. return workOrderSubList
  87. }
  88. func shouldGenerateSubOrder(frequency pasturePb.WorkOrderFrequency_Kind, t time.Time, weekMonth string) bool {
  89. switch frequency {
  90. case pasturePb.WorkOrderFrequency_Daily:
  91. return true
  92. case pasturePb.WorkOrderFrequency_Weekly, pasturePb.WorkOrderFrequency_Monthly:
  93. weekMonthDays := strings.Split(weekMonth, ",")
  94. dayOfWeekOrMonth := int64(t.Weekday())
  95. if frequency == pasturePb.WorkOrderFrequency_Monthly {
  96. dayOfWeekOrMonth = int64(t.Day())
  97. }
  98. for _, day := range weekMonthDays {
  99. if day == fmt.Sprintf("%d", dayOfWeekOrMonth) {
  100. return true
  101. }
  102. }
  103. }
  104. return false
  105. }
  106. type WorkOrderSubSlice []*WorkOrderSub
  107. func (w WorkOrderSubSlice) ToPB(mMap map[int64]*WorkOrderMaster, priorityMap map[pasturePb.Priority_Kind]string) []*pasturePb.UserWorkOrderList {
  108. res := make([]*pasturePb.UserWorkOrderList, len(w))
  109. for i, v := range w {
  110. res[i] = &pasturePb.UserWorkOrderList{
  111. WorkOrderNumber: v.WorkOrderSubNumber,
  112. WorkOrderName: mMap[v.WorkOrderMasterId].Name,
  113. WorkOrderId: int32(v.WorkOrderMasterId),
  114. WorkOrderCategoryName: mMap[v.WorkOrderMasterId].CategoryName,
  115. WorkOrderPriorityName: priorityMap[mMap[v.WorkOrderMasterId].Priority],
  116. Photos: strings.Split(mMap[v.WorkOrderMasterId].Photos, ","),
  117. Remarks: mMap[v.WorkOrderMasterId].Remarks,
  118. Status: v.Status,
  119. }
  120. }
  121. return res
  122. }