feat: update aftersales service types and serial format

This commit is contained in:
Frudrax Cheng
2026-05-28 09:12:01 +08:00
parent 6a48b0624f
commit da02be0a4f
3 changed files with 16 additions and 15 deletions
+8 -7
View File
@@ -108,26 +108,27 @@ func normalizeAftersalesSerial(sn string) string {
}
// generateUniqueSerial 生成唯一的售后工单序列号
// 格式:zjbf-sh-YYMMNNYY=年份后两位,MM=月份,NN=当第几单(至少 2 位,溢出自然加宽)
// 格式:zjbf-sh-YYMMDDNNYY=年份后两位,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)