feat: 完成客户第12条需求+多系统改造

1. 新增预警表添加工单号字段,支持按工单号检索预警
2. 添加工单过滤在制品/绩效报表/预警中心查询
3. 补全WMS台账字段口径与权限配置
4. 修复备料单与数量不符处理流程
5. 新增配送进度/库位联动/自动出库功能
6. 修复AGV配送状态更新逻辑
7. 优化退料与库存管理细节
This commit is contained in:
SunYF
2026-09-19 17:04:58 +08:00
parent 62e45b7379
commit 05b0b8a909
89 changed files with 7912 additions and 429 deletions
+94 -4
View File
@@ -41,8 +41,24 @@ type MaterialRequest struct {
StationNo int `json:"stationNo,omitempty"`
// 该物料所属装配工序(1~12)
ProcessCode int `json:"processCode,omitempty"`
// 已发料数量(分批出库累加)
// 已发量(分批出库累加;幂等基准,勿与已接料混用
SentQty float64 `json:"sentQty,omitempty"`
// 已接料量(工位扫码接料累加)
ReceivedQty float64 `json:"receivedQty,omitempty"`
// 最近接料时间(unix 秒)
ReceivedAt int64 `json:"receivedAt,omitempty"`
// 接料人
ReceiveBy string `json:"receiveBy,omitempty"`
// 来源 PLAN/REFILL
Source string `json:"source,omitempty"`
// 超出 BOM 需求的数量
OverQty float64 `json:"overQty,omitempty"`
// 超领原因 损耗/报废/返修/其他
OverReason string `json:"overReason,omitempty"`
// 关联数量不符单号
RefReportNo string `json:"refReportNo,omitempty"`
// 是否需要AGV配送到接驳台
NeedAgv bool `json:"needAgv,omitempty"`
// 发料批次号(分批出库时填写)
BatchNo string `json:"batchNo,omitempty"`
// Operator holds the value of the "operator" field.
@@ -59,11 +75,13 @@ func (*MaterialRequest) scanValues(columns []string) ([]any, error) {
values := make([]any, len(columns))
for i := range columns {
switch columns[i] {
case materialrequest.FieldReqQty, materialrequest.FieldSentQty:
case materialrequest.FieldNeedAgv:
values[i] = new(sql.NullBool)
case materialrequest.FieldReqQty, materialrequest.FieldSentQty, materialrequest.FieldReceivedQty, materialrequest.FieldOverQty:
values[i] = new(sql.NullFloat64)
case materialrequest.FieldID, materialrequest.FieldStationNo, materialrequest.FieldProcessCode:
case materialrequest.FieldID, materialrequest.FieldStationNo, materialrequest.FieldProcessCode, materialrequest.FieldReceivedAt:
values[i] = new(sql.NullInt64)
case materialrequest.FieldRequestNo, materialrequest.FieldOrderNo, materialrequest.FieldPlanDate, materialrequest.FieldMaterialCode, materialrequest.FieldMaterialName, materialrequest.FieldUnit, materialrequest.FieldManageMode, materialrequest.FieldStatus, materialrequest.FieldTargetDock, materialrequest.FieldBatchNo, materialrequest.FieldOperator:
case materialrequest.FieldRequestNo, materialrequest.FieldOrderNo, materialrequest.FieldPlanDate, materialrequest.FieldMaterialCode, materialrequest.FieldMaterialName, materialrequest.FieldUnit, materialrequest.FieldManageMode, materialrequest.FieldStatus, materialrequest.FieldTargetDock, materialrequest.FieldReceiveBy, materialrequest.FieldSource, materialrequest.FieldOverReason, materialrequest.FieldRefReportNo, materialrequest.FieldBatchNo, materialrequest.FieldOperator:
values[i] = new(sql.NullString)
case materialrequest.FieldCreatedAt, materialrequest.FieldUpdatedAt:
values[i] = new(sql.NullTime)
@@ -166,6 +184,54 @@ func (_m *MaterialRequest) assignValues(columns []string, values []any) error {
} else if value.Valid {
_m.SentQty = value.Float64
}
case materialrequest.FieldReceivedQty:
if value, ok := values[i].(*sql.NullFloat64); !ok {
return fmt.Errorf("unexpected type %T for field receivedQty", values[i])
} else if value.Valid {
_m.ReceivedQty = value.Float64
}
case materialrequest.FieldReceivedAt:
if value, ok := values[i].(*sql.NullInt64); !ok {
return fmt.Errorf("unexpected type %T for field receivedAt", values[i])
} else if value.Valid {
_m.ReceivedAt = value.Int64
}
case materialrequest.FieldReceiveBy:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field receiveBy", values[i])
} else if value.Valid {
_m.ReceiveBy = value.String
}
case materialrequest.FieldSource:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field source", values[i])
} else if value.Valid {
_m.Source = value.String
}
case materialrequest.FieldOverQty:
if value, ok := values[i].(*sql.NullFloat64); !ok {
return fmt.Errorf("unexpected type %T for field overQty", values[i])
} else if value.Valid {
_m.OverQty = value.Float64
}
case materialrequest.FieldOverReason:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field overReason", values[i])
} else if value.Valid {
_m.OverReason = value.String
}
case materialrequest.FieldRefReportNo:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field refReportNo", values[i])
} else if value.Valid {
_m.RefReportNo = value.String
}
case materialrequest.FieldNeedAgv:
if value, ok := values[i].(*sql.NullBool); !ok {
return fmt.Errorf("unexpected type %T for field needAgv", values[i])
} else if value.Valid {
_m.NeedAgv = value.Bool
}
case materialrequest.FieldBatchNo:
if value, ok := values[i].(*sql.NullString); !ok {
return fmt.Errorf("unexpected type %T for field batchNo", values[i])
@@ -266,6 +332,30 @@ func (_m *MaterialRequest) String() string {
builder.WriteString("sentQty=")
builder.WriteString(fmt.Sprintf("%v", _m.SentQty))
builder.WriteString(", ")
builder.WriteString("receivedQty=")
builder.WriteString(fmt.Sprintf("%v", _m.ReceivedQty))
builder.WriteString(", ")
builder.WriteString("receivedAt=")
builder.WriteString(fmt.Sprintf("%v", _m.ReceivedAt))
builder.WriteString(", ")
builder.WriteString("receiveBy=")
builder.WriteString(_m.ReceiveBy)
builder.WriteString(", ")
builder.WriteString("source=")
builder.WriteString(_m.Source)
builder.WriteString(", ")
builder.WriteString("overQty=")
builder.WriteString(fmt.Sprintf("%v", _m.OverQty))
builder.WriteString(", ")
builder.WriteString("overReason=")
builder.WriteString(_m.OverReason)
builder.WriteString(", ")
builder.WriteString("refReportNo=")
builder.WriteString(_m.RefReportNo)
builder.WriteString(", ")
builder.WriteString("needAgv=")
builder.WriteString(fmt.Sprintf("%v", _m.NeedAgv))
builder.WriteString(", ")
builder.WriteString("batchNo=")
builder.WriteString(_m.BatchNo)
builder.WriteString(", ")