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
|
}
|
}
|