From da02be0a4f89b72fefc6e03b9214502c6323beb9 Mon Sep 17 00:00:00 2001 From: Frudrax Cheng Date: Thu, 28 May 2026 09:12:01 +0800 Subject: [PATCH] feat: update aftersales service types and serial format --- models/models.go | 4 ++-- services/aftersales_service.go | 15 ++++++++------- services/aftersales_service_test.go | 12 ++++++------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/models/models.go b/models/models.go index 46f79e1..19c1c60 100644 --- a/models/models.go +++ b/models/models.go @@ -272,7 +272,7 @@ type CreateAftersalesOrderDTO struct { CompanyAddress string `json:"companyAddress" validate:"required"` ContactName string `json:"contactName" validate:"required"` ContactPhone string `json:"contactPhone" validate:"required,len=11"` - ServiceType string `json:"serviceType" validate:"required,oneof=software hardware other"` + ServiceType string `json:"serviceType" validate:"required,oneof=software hardware maintenance"` IssueDescription string `json:"issueDescription" validate:"required"` TechnicianID *uint `json:"technicianId,omitempty"` } @@ -282,7 +282,7 @@ type UpdateAftersalesOrderDTO struct { CompanyAddress string `json:"companyAddress,omitempty"` ContactName string `json:"contactName,omitempty"` ContactPhone string `json:"contactPhone,omitempty" validate:"omitempty,len=11"` - ServiceType string `json:"serviceType,omitempty" validate:"omitempty,oneof=software hardware other"` + ServiceType string `json:"serviceType,omitempty" validate:"omitempty,oneof=software hardware maintenance"` IssueDescription string `json:"issueDescription,omitempty"` ResolutionNote string `json:"resolutionNote,omitempty"` TechnicianID *uint `json:"technicianId,omitempty"` diff --git a/services/aftersales_service.go b/services/aftersales_service.go index 0481680..014453a 100644 --- a/services/aftersales_service.go +++ b/services/aftersales_service.go @@ -108,26 +108,27 @@ func normalizeAftersalesSerial(sn string) string { } // generateUniqueSerial 生成唯一的售后工单序列号 -// 格式:zjbf-sh-YYMMNN,YY=年份后两位,MM=月份,NN=当月第几单(至少 2 位,溢出自然加宽) +// 格式:zjbf-sh-YYMMDDNN,YY=年份后两位,MM=月份,DD=日期,NN=当天第几单(至少 2 位,溢出自然加宽) func (s *AftersalesService) generateUniqueSerial() (string, error) { now := time.Now() yy := now.Year() % 100 mm := int(now.Month()) + dd := now.Day() - monthStart := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location()) - nextMonth := monthStart.AddDate(0, 1, 0) + dayStart := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) + nextDay := dayStart.AddDate(0, 0, 1) - // 统计本月已创建工单数(含软删除,避免编号回收) + // 统计当天已创建工单数(含软删除,避免编号回收) var count int64 if err := database.DB.Unscoped().Model(&models.AftersalesOrder{}). - Where("created_at >= ? AND created_at < ?", monthStart, nextMonth). + Where("created_at >= ? AND created_at < ?", dayStart, nextDay). Count(&count).Error; err != nil { - return "", fmt.Errorf("统计当月工单数失败: %w", err) + return "", fmt.Errorf("统计当日工单数失败: %w", err) } seq := int(count) + 1 for attempt := 0; attempt < 100; attempt++ { - candidate := fmt.Sprintf("%s%02d%02d%02d", aftersalesSerialPrefix, yy, mm, seq) + candidate := fmt.Sprintf("%s%02d%02d%02d%02d", aftersalesSerialPrefix, yy, mm, dd, seq) var existing models.AftersalesOrder result := database.DB.Unscoped().Where("serial_number = ?", candidate).First(&existing) diff --git a/services/aftersales_service_test.go b/services/aftersales_service_test.go index b965314..4c49813 100644 --- a/services/aftersales_service_test.go +++ b/services/aftersales_service_test.go @@ -55,7 +55,7 @@ func createOrderFor(t *testing.T, user models.User, phone string) *models.Afters return order } -func TestAftersalesService_Create_GeneratesYYMMNNSerial(t *testing.T) { +func TestAftersalesService_Create_GeneratesYYMMDDNNSerial(t *testing.T) { user := seedTechnician(t, "aftersales_create_tech") defer database.DB.Unscoped().Delete(&user) @@ -72,7 +72,7 @@ func TestAftersalesService_Create_GeneratesYYMMNNSerial(t *testing.T) { assert.NoError(t, err) assert.NotNil(t, order) assert.True(t, strings.HasPrefix(order.SerialNumber, "zjbf-sh-")) - assert.Len(t, order.SerialNumber, len("zjbf-sh-")+6, "default serial should be 6 digits (YYMMNN)") + assert.Len(t, order.SerialNumber, len("zjbf-sh-")+8, "default serial should be 8 digits (YYMMDDNN)") assert.Equal(t, WorkOrderStatusCreated, order.WorkOrderStatus) assert.Equal(t, AuthorizationStatusPending, order.AuthorizationStatus) assert.NotNil(t, order.TechnicianID) @@ -82,25 +82,25 @@ func TestAftersalesService_Create_GeneratesYYMMNNSerial(t *testing.T) { database.DB.Unscoped().Where("company_name = ?", "AftersalesSerialCo").Delete(&models.Company{}) } -func TestAftersalesService_Create_SerialIncrementsWithinMonth(t *testing.T) { +func TestAftersalesService_Create_SerialIncrementsWithinDay(t *testing.T) { user := seedTechnician(t, "aftersales_seq_tech") defer database.DB.Unscoped().Delete(&user) svc := AftersalesService{} first, err := svc.Create(models.CreateAftersalesOrderDTO{ CompanyName: "SeqCo", CompanyAddress: "addr", ContactName: "A", ContactPhone: "13800002000", - ServiceType: "other", IssueDescription: "issue 1", + ServiceType: "maintenance", IssueDescription: "issue 1", }, user.ID) assert.NoError(t, err) second, err := svc.Create(models.CreateAftersalesOrderDTO{ CompanyName: "SeqCo", CompanyAddress: "addr", ContactName: "A", ContactPhone: "13800002000", - ServiceType: "other", IssueDescription: "issue 2", + ServiceType: "maintenance", IssueDescription: "issue 2", }, user.ID) assert.NoError(t, err) assert.NotEqual(t, first.SerialNumber, second.SerialNumber) - // 第二单的序号应大于第一单(按月递增) + // 第二单的序号应大于第一单(按天递增) assert.True(t, second.SerialNumber > first.SerialNumber) database.DB.Unscoped().Delete(first)