work_order_sub.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. IsShow pasturePb.IsShow_Kind `json:"isShow"`
  24. FinishTime int64 `json:"finishTime"`
  25. Remarks string `json:"remarks"`
  26. CreatedAt int64 `json:"createdAt"`
  27. UpdatedAt int64 `json:"updatedAt"`
  28. }
  29. func (w *WorkOrderSub) TableName() string {
  30. return "work_order_sub"
  31. }
  32. func NewWorkOrderSub(req *WorkOrderMaster) []*WorkOrderSub {
  33. workOrderSubList := make([]*WorkOrderSub, 0)
  34. if req.IsShow == pasturePb.IsShow_No {
  35. return workOrderSubList
  36. }
  37. nowTime := time.Now()
  38. execTime, err := util.ConvertParseLocalUnix(req.ExecTime)
  39. if err != nil {
  40. zaplog.Error("NewWorkOrderSub", zap.Any("ConvertParseLocalUnix", err))
  41. return workOrderSubList
  42. }
  43. isToday := execTime <= nowTime.Unix()+expireTimeSec
  44. // 一次性工单就生成当天的工单记录
  45. if req.Frequency == pasturePb.WorkOrderFrequency_None && isToday {
  46. return workOrderSubList
  47. }
  48. switch req.Frequency {
  49. case pasturePb.WorkOrderFrequency_None:
  50. currentExecTime := execTime
  51. workOrderSubList = append(workOrderSubList, &WorkOrderSub{
  52. WorkOrderMasterId: req.Id,
  53. ExecTime: currentExecTime,
  54. ExecUserId: 0,
  55. WorkOrderSubNumber: fmt.Sprintf("s%s%d", LayoutDate, time.Now().Unix()),
  56. Status: pasturePb.WorkOrderStatus_Created,
  57. IsShow: pasturePb.IsShow_Ok,
  58. Remarks: "",
  59. })
  60. case pasturePb.WorkOrderFrequency_Daily, pasturePb.WorkOrderFrequency_Weekly, pasturePb.WorkOrderFrequency_Monthly:
  61. // 本月剩余天数
  62. remainingDays := util.GetMonthRemainDay()
  63. for i := 0; i < remainingDays; i++ {
  64. if isToday && i == 0 {
  65. continue
  66. }
  67. currentExecTime := execTime + int64(i)*secondsInDay
  68. t := time.Unix(currentExecTime, 0)
  69. if shouldGenerateSubOrder(req.Frequency, t, req.WeekMonthValue) {
  70. sub := &WorkOrderSub{
  71. WorkOrderMasterId: req.Id,
  72. ExecTime: currentExecTime,
  73. ExecUserId: 0,
  74. WorkOrderSubNumber: fmt.Sprintf("s%s%d", LayoutDate, execTime),
  75. Status: pasturePb.WorkOrderStatus_Created,
  76. IsShow: pasturePb.IsShow_Ok,
  77. Remarks: "",
  78. }
  79. workOrderSubList = append(workOrderSubList, sub)
  80. }
  81. }
  82. }
  83. return workOrderSubList
  84. }
  85. func shouldGenerateSubOrder(frequency pasturePb.WorkOrderFrequency_Kind, t time.Time, weekMonth string) bool {
  86. switch frequency {
  87. case pasturePb.WorkOrderFrequency_Daily:
  88. return true
  89. case pasturePb.WorkOrderFrequency_Weekly, pasturePb.WorkOrderFrequency_Monthly:
  90. weekMonthDays := strings.Split(weekMonth, ",")
  91. dayOfWeekOrMonth := int64(t.Weekday())
  92. if frequency == pasturePb.WorkOrderFrequency_Monthly {
  93. dayOfWeekOrMonth = int64(t.Day())
  94. }
  95. for _, day := range weekMonthDays {
  96. if day == fmt.Sprintf("%d", dayOfWeekOrMonth) {
  97. return true
  98. }
  99. }
  100. }
  101. return false
  102. }