| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 | package modelimport (	"fmt"	"kpt-pasture/util"	"strings"	"time"	"gitee.com/xuyiping_admin/pkg/logger/zaplog"	"go.uber.org/zap"	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow")// 执行时间超过当前创单时间5秒的工单,不生效const (	expireTimeSec = 5	secondsInDay  = 86400)type WorkOrderSub struct {	Id                 int64                          `json:"id"`	WorkOrderSubNumber string                         `json:"workOrderSubNumber"`	WorkOrderMasterId  int64                          `json:"workOrderMasterId"`	ExecTime           int64                          `json:"execTime"`	Status             pasturePb.WorkOrderStatus_Kind `json:"status"`	ExecUserId         int64                          `json:"execUserId"`	SetUserIds         string                         `json:"setUserIds"`	IsShow             pasturePb.IsShow_Kind          `json:"isShow"`	FinishTime         int64                          `json:"finishTime"`	Remarks            string                         `json:"remarks"`	CreatedAt          int64                          `json:"createdAt"`	UpdatedAt          int64                          `json:"updatedAt"`}func (w *WorkOrderSub) TableName() string {	return "work_order_sub"}func NewWorkOrderSub(req *WorkOrderMaster) []*WorkOrderSub {	workOrderSubList := make([]*WorkOrderSub, 0)	if req.IsShow == pasturePb.IsShow_No {		return workOrderSubList	}	nowTime := time.Now().Local()	execTime, err := util.ConvertParseLocalUnix(req.ExecTime)	if err != nil {		zaplog.Error("NewWorkOrderSub", zap.Any("ConvertParseLocalUnix", err))		return workOrderSubList	}	isToday := execTime <= nowTime.Unix()+expireTimeSec	// 一次性工单就生成当天的工单记录	if req.Frequency == pasturePb.WorkOrderFrequency_None && isToday {		return workOrderSubList	}	switch req.Frequency {	case pasturePb.WorkOrderFrequency_None:		currentExecTime := execTime		workOrderSubList = append(workOrderSubList, &WorkOrderSub{			WorkOrderMasterId:  req.Id,			ExecTime:           currentExecTime,			ExecUserId:         0,			SetUserIds:         req.ExecPersons,			WorkOrderSubNumber: fmt.Sprintf("s%s%d", LayoutDate, time.Now().Local().Unix()),			Status:             pasturePb.WorkOrderStatus_Created,			IsShow:             pasturePb.IsShow_Ok,			Remarks:            "",		})	case pasturePb.WorkOrderFrequency_Daily, pasturePb.WorkOrderFrequency_Weekly, pasturePb.WorkOrderFrequency_Monthly:		// 本月剩余天数		remainingDays := util.GetMonthRemainDay()		for i := 0; i < remainingDays; i++ {			if isToday && i == 0 {				continue			}			currentExecTime := execTime + int64(i)*secondsInDay			t := time.Unix(currentExecTime, 0).Local()			if shouldGenerateSubOrder(req.Frequency, t, req.WeekMonthValue) {				sub := &WorkOrderSub{					WorkOrderMasterId:  req.Id,					ExecTime:           currentExecTime,					ExecUserId:         0,					WorkOrderSubNumber: fmt.Sprintf("s%s%d", LayoutDate, execTime),					Status:             pasturePb.WorkOrderStatus_Created,					IsShow:             pasturePb.IsShow_Ok,					SetUserIds:         req.ExecPersons,					Remarks:            "",				}				workOrderSubList = append(workOrderSubList, sub)			}		}	}	return workOrderSubList}func shouldGenerateSubOrder(frequency pasturePb.WorkOrderFrequency_Kind, t time.Time, weekMonth string) bool {	switch frequency {	case pasturePb.WorkOrderFrequency_Daily:		return true	case pasturePb.WorkOrderFrequency_Weekly, pasturePb.WorkOrderFrequency_Monthly:		weekMonthDays := strings.Split(weekMonth, ",")		dayOfWeekOrMonth := int64(t.Weekday())		if frequency == pasturePb.WorkOrderFrequency_Monthly {			dayOfWeekOrMonth = int64(t.Day())		}		for _, day := range weekMonthDays {			if day == fmt.Sprintf("%d", dayOfWeekOrMonth) {				return true			}		}	}	return false}type WorkOrderSubSlice []*WorkOrderSubfunc (w WorkOrderSubSlice) ToPB(mMap map[int64]*WorkOrderMaster, priorityMap map[pasturePb.Priority_Kind]string) []*pasturePb.UserWorkOrderList {	res := make([]*pasturePb.UserWorkOrderList, len(w))	for i, v := range w {		res[i] = &pasturePb.UserWorkOrderList{			WorkOrderNumber:       v.WorkOrderSubNumber,			WorkOrderName:         mMap[v.WorkOrderMasterId].Name,			WorkOrderId:           int32(v.WorkOrderMasterId),			WorkOrderCategoryName: mMap[v.WorkOrderMasterId].CategoryName,			WorkOrderPriorityName: priorityMap[mMap[v.WorkOrderMasterId].Priority],			Photos:                strings.Split(mMap[v.WorkOrderMasterId].Photos, ","),			Remarks:               mMap[v.WorkOrderMasterId].Remarks,			Status:                v.Status,		}	}	return res}
 |