liujiandao
2024-01-08 dcf9d1324c4ecc23bc0b120ee9af9f0f74cde034
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package service
 
import (
    "fmt"
    "github.com/spf13/cast"
    "gorm.io/gorm"
    "regexp"
    "strconv"
    "time"
    "wms/constvar"
    "wms/models"
    "wms/pkg/blevex"
    "wms/pkg/logx"
    "wms/pkg/structx"
)
 
type HistoryReport struct {
    ID                int                        `json:"ID,omitempty"`
    BaseOperationType constvar.BaseOperationType `json:"baseOperationType,omitempty"`
    Number            string                     `json:"number,omitempty"`            //操作单号
    ProductId         string                     `json:"productId,omitempty"`         //产品编号
    ProductName       string                     `json:"productName,omitempty"`       //产品名称
    OperationTypeName string                     `json:"operationTypeName,omitempty"` //业务名称
    FromLocation      string                     `json:"fromLocation,omitempty"`      //源位置名称
    ToLocation        string                     `json:"toLocation,omitempty"`        //目标位置名称
    Date              time.Time                  `json:"date,omitempty"`              //日期
    Company           string                     `json:"company,omitempty"`           // 供应商/客户
    Carrier           string                     `json:"carrier,omitempty"`           //承运商名称
    WaybillNumber     string                     `json:"waybillNumber"`               //运单号
    ReceiverName      string                     `json:"receiverName"`                //收货人
}
 
const (
    HistoryReportIndexName = "HistoryReport.bleve"
)
 
func InitHistoryReportData() {
    docCount, err := blevex.DocCount(HistoryReportIndexName)
    if err != nil {
        logx.Errorf("InitHistoryReportData get doc count err:%v", err)
        return
    }
    if docCount > 0 {
        return
    }
    records := make([]*models.MoveHistory, 0, 100)
    err = models.NewMoveHistorySearch().Orm.FindInBatches(&records, 100, func(tx *gorm.DB, batch int) error {
        operationIds := make([]int, 0, len(records))
        for _, record := range records {
            operationIds = append(operationIds, record.OperationId)
        }
 
        operations, err := models.NewOperationSearch().SetPreload(true).SetIds(operationIds).FindNotTotal()
        if err != nil {
            return err
        }
        operationMap := make(map[int]*models.Operation, len(operations))
 
        for _, operation := range operations {
            operationMap[operation.Id] = operation
        }
 
        for _, record := range records {
            AddNewHistoryReportRecord(record, operationMap[record.OperationId])
        }
        return nil
    }).Error
 
    if err != nil {
        logx.Errorf("InitHistoryReportData scan err:%v", err)
    }
    return
}
func parseDateString(input string) (time.Time, error) {
    // 定义正则表达式
    regex := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})|(\d{4})/(\d{2})/(\d{2})|(\d{8})`)
 
    // 匹配字符串
    matches := regex.FindStringSubmatch(input)
    if len(matches) == 0 {
        return time.Time{}, fmt.Errorf("Invalid date format")
    }
    // 提取年月日
    year := matches[1] + matches[4] + matches[7]
    month := matches[2] + matches[5]
    day := matches[3] + matches[6]
 
    // 构建时间对象
    parsedTime, err := time.ParseInLocation("20060102", fmt.Sprintf("%s%s%s", year, month, day), time.Local)
    if err != nil {
        return time.Time{}, err
    }
 
    return parsedTime, nil
}
 
func SearchHistoryReport(keyword string, operationType constvar.BaseOperationType, page, pageSize int) (recordIds []int, total uint64, err error) {
    var ids []string
    from := (page - 1) * pageSize
    t, err := parseDateString(keyword)
    if err != nil && t.IsZero() {
        ids, total, err = blevex.ComplexSearch(HistoryReportIndexName, keyword, map[string]interface{}{"baseOperationType": operationType}, from, pageSize)
    } else {
        ids, total, err = blevex.TimeSearch(HistoryReportIndexName, t, map[string]interface{}{"baseOperationType": operationType}, from, pageSize)
    }
 
    if err != nil {
        return
    }
    if len(ids) == 0 {
        return
    }
    recordIds = make([]int, 0, len(ids))
    for _, id := range ids {
        recordIds = append(recordIds, cast.ToInt(id))
    }
    return
}
 
func AddNewHistoryReportRecord(record *models.MoveHistory, operation *models.Operation) {
    var report HistoryReport
    err := structx.AssignTo(record, &report)
    if err != nil {
        logx.Errorf("AddNewHistoryReportRecord AssignTo err:%v", err)
        return
    }
 
    report.Date = record.UpdatedAt
    report.Carrier = operation.LogisticCompany.Name
    report.Company = operation.CompanyName
    report.WaybillNumber = operation.WaybillNumber
    report.ReceiverName = operation.ReceiverName
 
    err = blevex.Add(HistoryReportIndexName, strconv.Itoa(record.Id), report)
    if err != nil {
        logx.Errorf("AddNewHistoryReportRecord bleve add err:%v", err)
        return
    }
}