feat&fix: 完善半成品/序列号闭环流转逻辑

1. 调整物料编码字段为可空,优化注释说明
2. 修复Vite构建自动清空产物目录冲突问题
3. 优化前端提示文案与表单占位符
4. 为各前端项目添加内联SVG图标
5. 重构MES半成品流转逻辑,不再静默吞掉WMS错误并记录日志
6. 生成并添加空的WMS客户端静态文件
7. 完善Ent ORM模型的空值支持与查询谓词
8. 优化半成品入库接口,支持doneProcessCodes数组格式,新增SN反查物料编码逻辑
9. 更新帮助文档与操作手册
This commit is contained in:
SunYF
2026-09-01 14:30:26 +08:00
parent bb22148625
commit 47573e44b0
25 changed files with 267 additions and 32 deletions
+2 -2
View File
@@ -373,7 +373,7 @@ var (
SemiFinishedsColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt, Increment: true},
{Name: "sn", Type: field.TypeString, Unique: true},
{Name: "material_code", Type: field.TypeString},
{Name: "material_code", Type: field.TypeString, Nullable: true},
{Name: "completed_process", Type: field.TypeString, Nullable: true},
{Name: "quantity", Type: field.TypeInt, Default: 1},
{Name: "zone_code", Type: field.TypeString, Nullable: true},
@@ -404,7 +404,7 @@ var (
SerialNumbersColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt, Increment: true},
{Name: "sn_code", Type: field.TypeString, Unique: true},
{Name: "material_code", Type: field.TypeString},
{Name: "material_code", Type: field.TypeString, Nullable: true},
{Name: "batch_no", Type: field.TypeString, Nullable: true},
{Name: "status", Type: field.TypeString, Default: "在库"},
{Name: "current_zone", Type: field.TypeString, Nullable: true},
+38
View File
@@ -10250,9 +10250,22 @@ func (m *SemiFinishedMutation) OldMaterialCode(ctx context.Context) (v string, e
return oldValue.MaterialCode, nil
}
// ClearMaterialCode clears the value of the "material_code" field.
func (m *SemiFinishedMutation) ClearMaterialCode() {
m.material_code = nil
m.clearedFields[semifinished.FieldMaterialCode] = struct{}{}
}
// MaterialCodeCleared returns if the "material_code" field was cleared in this mutation.
func (m *SemiFinishedMutation) MaterialCodeCleared() bool {
_, ok := m.clearedFields[semifinished.FieldMaterialCode]
return ok
}
// ResetMaterialCode resets all changes to the "material_code" field.
func (m *SemiFinishedMutation) ResetMaterialCode() {
m.material_code = nil
delete(m.clearedFields, semifinished.FieldMaterialCode)
}
// SetCompletedProcess sets the "completed_process" field.
@@ -10862,6 +10875,9 @@ func (m *SemiFinishedMutation) AddField(name string, value ent.Value) error {
// mutation.
func (m *SemiFinishedMutation) ClearedFields() []string {
var fields []string
if m.FieldCleared(semifinished.FieldMaterialCode) {
fields = append(fields, semifinished.FieldMaterialCode)
}
if m.FieldCleared(semifinished.FieldCompletedProcess) {
fields = append(fields, semifinished.FieldCompletedProcess)
}
@@ -10885,6 +10901,9 @@ func (m *SemiFinishedMutation) FieldCleared(name string) bool {
// error if the field is not defined in the schema.
func (m *SemiFinishedMutation) ClearField(name string) error {
switch name {
case semifinished.FieldMaterialCode:
m.ClearMaterialCode()
return nil
case semifinished.FieldCompletedProcess:
m.ClearCompletedProcess()
return nil
@@ -11171,9 +11190,22 @@ func (m *SerialNumberMutation) OldMaterialCode(ctx context.Context) (v string, e
return oldValue.MaterialCode, nil
}
// ClearMaterialCode clears the value of the "material_code" field.
func (m *SerialNumberMutation) ClearMaterialCode() {
m.material_code = nil
m.clearedFields[serialnumber.FieldMaterialCode] = struct{}{}
}
// MaterialCodeCleared returns if the "material_code" field was cleared in this mutation.
func (m *SerialNumberMutation) MaterialCodeCleared() bool {
_, ok := m.clearedFields[serialnumber.FieldMaterialCode]
return ok
}
// ResetMaterialCode resets all changes to the "material_code" field.
func (m *SerialNumberMutation) ResetMaterialCode() {
m.material_code = nil
delete(m.clearedFields, serialnumber.FieldMaterialCode)
}
// SetBatchNo sets the "batch_no" field.
@@ -11877,6 +11909,9 @@ func (m *SerialNumberMutation) AddField(name string, value ent.Value) error {
// mutation.
func (m *SerialNumberMutation) ClearedFields() []string {
var fields []string
if m.FieldCleared(serialnumber.FieldMaterialCode) {
fields = append(fields, serialnumber.FieldMaterialCode)
}
if m.FieldCleared(serialnumber.FieldBatchNo) {
fields = append(fields, serialnumber.FieldBatchNo)
}
@@ -11906,6 +11941,9 @@ func (m *SerialNumberMutation) FieldCleared(name string) bool {
// error if the field is not defined in the schema.
func (m *SerialNumberMutation) ClearField(name string) error {
switch name {
case serialnumber.FieldMaterialCode:
m.ClearMaterialCode()
return nil
case serialnumber.FieldBatchNo:
m.ClearBatchNo()
return nil
+1 -1
View File
@@ -18,7 +18,7 @@ type SemiFinished struct {
ID int `json:"id,omitempty"`
// 半成品 SN
Sn string `json:"sn,omitempty"`
// 物料编码
// 物料编码MES 未传时按 SN 反查,可空)
MaterialCode string `json:"materialCode,omitempty"`
// 已完成工序(如 135)
CompletedProcess string `json:"completedProcess,omitempty"`
+10
View File
@@ -218,6 +218,16 @@ func MaterialCodeHasSuffix(v string) predicate.SemiFinished {
return predicate.SemiFinished(sql.FieldHasSuffix(FieldMaterialCode, v))
}
// MaterialCodeIsNil applies the IsNil predicate on the "material_code" field.
func MaterialCodeIsNil() predicate.SemiFinished {
return predicate.SemiFinished(sql.FieldIsNull(FieldMaterialCode))
}
// MaterialCodeNotNil applies the NotNil predicate on the "material_code" field.
func MaterialCodeNotNil() predicate.SemiFinished {
return predicate.SemiFinished(sql.FieldNotNull(FieldMaterialCode))
}
// MaterialCodeEqualFold applies the EqualFold predicate on the "material_code" field.
func MaterialCodeEqualFold(v string) predicate.SemiFinished {
return predicate.SemiFinished(sql.FieldEqualFold(FieldMaterialCode, v))
+28 -3
View File
@@ -33,6 +33,14 @@ func (_c *SemiFinishedCreate) SetMaterialCode(v string) *SemiFinishedCreate {
return _c
}
// SetNillableMaterialCode sets the "material_code" field if the given value is not nil.
func (_c *SemiFinishedCreate) SetNillableMaterialCode(v *string) *SemiFinishedCreate {
if v != nil {
_c.SetMaterialCode(*v)
}
return _c
}
// SetCompletedProcess sets the "completed_process" field.
func (_c *SemiFinishedCreate) SetCompletedProcess(v string) *SemiFinishedCreate {
_c.mutation.SetCompletedProcess(v)
@@ -189,9 +197,6 @@ func (_c *SemiFinishedCreate) check() error {
if _, ok := _c.mutation.Sn(); !ok {
return &ValidationError{Name: "sn", err: errors.New(`ent: missing required field "SemiFinished.sn"`)}
}
if _, ok := _c.mutation.MaterialCode(); !ok {
return &ValidationError{Name: "material_code", err: errors.New(`ent: missing required field "SemiFinished.material_code"`)}
}
if _, ok := _c.mutation.Quantity(); !ok {
return &ValidationError{Name: "quantity", err: errors.New(`ent: missing required field "SemiFinished.quantity"`)}
}
@@ -343,6 +348,12 @@ func (u *SemiFinishedUpsert) UpdateMaterialCode() *SemiFinishedUpsert {
return u
}
// ClearMaterialCode clears the value of the "material_code" field.
func (u *SemiFinishedUpsert) ClearMaterialCode() *SemiFinishedUpsert {
u.SetNull(semifinished.FieldMaterialCode)
return u
}
// SetCompletedProcess sets the "completed_process" field.
func (u *SemiFinishedUpsert) SetCompletedProcess(v string) *SemiFinishedUpsert {
u.Set(semifinished.FieldCompletedProcess, v)
@@ -531,6 +542,13 @@ func (u *SemiFinishedUpsertOne) UpdateMaterialCode() *SemiFinishedUpsertOne {
})
}
// ClearMaterialCode clears the value of the "material_code" field.
func (u *SemiFinishedUpsertOne) ClearMaterialCode() *SemiFinishedUpsertOne {
return u.Update(func(s *SemiFinishedUpsert) {
s.ClearMaterialCode()
})
}
// SetCompletedProcess sets the "completed_process" field.
func (u *SemiFinishedUpsertOne) SetCompletedProcess(v string) *SemiFinishedUpsertOne {
return u.Update(func(s *SemiFinishedUpsert) {
@@ -903,6 +921,13 @@ func (u *SemiFinishedUpsertBulk) UpdateMaterialCode() *SemiFinishedUpsertBulk {
})
}
// ClearMaterialCode clears the value of the "material_code" field.
func (u *SemiFinishedUpsertBulk) ClearMaterialCode() *SemiFinishedUpsertBulk {
return u.Update(func(s *SemiFinishedUpsert) {
s.ClearMaterialCode()
})
}
// SetCompletedProcess sets the "completed_process" field.
func (u *SemiFinishedUpsertBulk) SetCompletedProcess(v string) *SemiFinishedUpsertBulk {
return u.Update(func(s *SemiFinishedUpsert) {
+18
View File
@@ -55,6 +55,12 @@ func (_u *SemiFinishedUpdate) SetNillableMaterialCode(v *string) *SemiFinishedUp
return _u
}
// ClearMaterialCode clears the value of the "material_code" field.
func (_u *SemiFinishedUpdate) ClearMaterialCode() *SemiFinishedUpdate {
_u.mutation.ClearMaterialCode()
return _u
}
// SetCompletedProcess sets the "completed_process" field.
func (_u *SemiFinishedUpdate) SetCompletedProcess(v string) *SemiFinishedUpdate {
_u.mutation.SetCompletedProcess(v)
@@ -239,6 +245,9 @@ func (_u *SemiFinishedUpdate) sqlSave(ctx context.Context) (_node int, err error
if value, ok := _u.mutation.MaterialCode(); ok {
_spec.SetField(semifinished.FieldMaterialCode, field.TypeString, value)
}
if _u.mutation.MaterialCodeCleared() {
_spec.ClearField(semifinished.FieldMaterialCode, field.TypeString)
}
if value, ok := _u.mutation.CompletedProcess(); ok {
_spec.SetField(semifinished.FieldCompletedProcess, field.TypeString, value)
}
@@ -326,6 +335,12 @@ func (_u *SemiFinishedUpdateOne) SetNillableMaterialCode(v *string) *SemiFinishe
return _u
}
// ClearMaterialCode clears the value of the "material_code" field.
func (_u *SemiFinishedUpdateOne) ClearMaterialCode() *SemiFinishedUpdateOne {
_u.mutation.ClearMaterialCode()
return _u
}
// SetCompletedProcess sets the "completed_process" field.
func (_u *SemiFinishedUpdateOne) SetCompletedProcess(v string) *SemiFinishedUpdateOne {
_u.mutation.SetCompletedProcess(v)
@@ -540,6 +555,9 @@ func (_u *SemiFinishedUpdateOne) sqlSave(ctx context.Context) (_node *SemiFinish
if value, ok := _u.mutation.MaterialCode(); ok {
_spec.SetField(semifinished.FieldMaterialCode, field.TypeString, value)
}
if _u.mutation.MaterialCodeCleared() {
_spec.ClearField(semifinished.FieldMaterialCode, field.TypeString)
}
if value, ok := _u.mutation.CompletedProcess(); ok {
_spec.SetField(semifinished.FieldCompletedProcess, field.TypeString, value)
}
+1 -1
View File
@@ -18,7 +18,7 @@ type SerialNumber struct {
ID int `json:"id,omitempty"`
// 序列号
SnCode string `json:"snCode,omitempty"`
// 物料编码
// 物料编码(可为空)
MaterialCode string `json:"materialCode,omitempty"`
// 所属批次
BatchNo string `json:"batchNo,omitempty"`
+10
View File
@@ -228,6 +228,16 @@ func MaterialCodeHasSuffix(v string) predicate.SerialNumber {
return predicate.SerialNumber(sql.FieldHasSuffix(FieldMaterialCode, v))
}
// MaterialCodeIsNil applies the IsNil predicate on the "material_code" field.
func MaterialCodeIsNil() predicate.SerialNumber {
return predicate.SerialNumber(sql.FieldIsNull(FieldMaterialCode))
}
// MaterialCodeNotNil applies the NotNil predicate on the "material_code" field.
func MaterialCodeNotNil() predicate.SerialNumber {
return predicate.SerialNumber(sql.FieldNotNull(FieldMaterialCode))
}
// MaterialCodeEqualFold applies the EqualFold predicate on the "material_code" field.
func MaterialCodeEqualFold(v string) predicate.SerialNumber {
return predicate.SerialNumber(sql.FieldEqualFold(FieldMaterialCode, v))
+28 -3
View File
@@ -33,6 +33,14 @@ func (_c *SerialNumberCreate) SetMaterialCode(v string) *SerialNumberCreate {
return _c
}
// SetNillableMaterialCode sets the "material_code" field if the given value is not nil.
func (_c *SerialNumberCreate) SetNillableMaterialCode(v *string) *SerialNumberCreate {
if v != nil {
_c.SetMaterialCode(*v)
}
return _c
}
// SetBatchNo sets the "batch_no" field.
func (_c *SerialNumberCreate) SetBatchNo(v string) *SerialNumberCreate {
_c.mutation.SetBatchNo(v)
@@ -217,9 +225,6 @@ func (_c *SerialNumberCreate) check() error {
if _, ok := _c.mutation.SnCode(); !ok {
return &ValidationError{Name: "sn_code", err: errors.New(`ent: missing required field "SerialNumber.sn_code"`)}
}
if _, ok := _c.mutation.MaterialCode(); !ok {
return &ValidationError{Name: "material_code", err: errors.New(`ent: missing required field "SerialNumber.material_code"`)}
}
if _, ok := _c.mutation.Status(); !ok {
return &ValidationError{Name: "status", err: errors.New(`ent: missing required field "SerialNumber.status"`)}
}
@@ -379,6 +384,12 @@ func (u *SerialNumberUpsert) UpdateMaterialCode() *SerialNumberUpsert {
return u
}
// ClearMaterialCode clears the value of the "material_code" field.
func (u *SerialNumberUpsert) ClearMaterialCode() *SerialNumberUpsert {
u.SetNull(serialnumber.FieldMaterialCode)
return u
}
// SetBatchNo sets the "batch_no" field.
func (u *SerialNumberUpsert) SetBatchNo(v string) *SerialNumberUpsert {
u.Set(serialnumber.FieldBatchNo, v)
@@ -597,6 +608,13 @@ func (u *SerialNumberUpsertOne) UpdateMaterialCode() *SerialNumberUpsertOne {
})
}
// ClearMaterialCode clears the value of the "material_code" field.
func (u *SerialNumberUpsertOne) ClearMaterialCode() *SerialNumberUpsertOne {
return u.Update(func(s *SerialNumberUpsert) {
s.ClearMaterialCode()
})
}
// SetBatchNo sets the "batch_no" field.
func (u *SerialNumberUpsertOne) SetBatchNo(v string) *SerialNumberUpsertOne {
return u.Update(func(s *SerialNumberUpsert) {
@@ -1004,6 +1022,13 @@ func (u *SerialNumberUpsertBulk) UpdateMaterialCode() *SerialNumberUpsertBulk {
})
}
// ClearMaterialCode clears the value of the "material_code" field.
func (u *SerialNumberUpsertBulk) ClearMaterialCode() *SerialNumberUpsertBulk {
return u.Update(func(s *SerialNumberUpsert) {
s.ClearMaterialCode()
})
}
// SetBatchNo sets the "batch_no" field.
func (u *SerialNumberUpsertBulk) SetBatchNo(v string) *SerialNumberUpsertBulk {
return u.Update(func(s *SerialNumberUpsert) {
+18
View File
@@ -55,6 +55,12 @@ func (_u *SerialNumberUpdate) SetNillableMaterialCode(v *string) *SerialNumberUp
return _u
}
// ClearMaterialCode clears the value of the "material_code" field.
func (_u *SerialNumberUpdate) ClearMaterialCode() *SerialNumberUpdate {
_u.mutation.ClearMaterialCode()
return _u
}
// SetBatchNo sets the "batch_no" field.
func (_u *SerialNumberUpdate) SetBatchNo(v string) *SerialNumberUpdate {
_u.mutation.SetBatchNo(v)
@@ -272,6 +278,9 @@ func (_u *SerialNumberUpdate) sqlSave(ctx context.Context) (_node int, err error
if value, ok := _u.mutation.MaterialCode(); ok {
_spec.SetField(serialnumber.FieldMaterialCode, field.TypeString, value)
}
if _u.mutation.MaterialCodeCleared() {
_spec.ClearField(serialnumber.FieldMaterialCode, field.TypeString)
}
if value, ok := _u.mutation.BatchNo(); ok {
_spec.SetField(serialnumber.FieldBatchNo, field.TypeString, value)
}
@@ -368,6 +377,12 @@ func (_u *SerialNumberUpdateOne) SetNillableMaterialCode(v *string) *SerialNumbe
return _u
}
// ClearMaterialCode clears the value of the "material_code" field.
func (_u *SerialNumberUpdateOne) ClearMaterialCode() *SerialNumberUpdateOne {
_u.mutation.ClearMaterialCode()
return _u
}
// SetBatchNo sets the "batch_no" field.
func (_u *SerialNumberUpdateOne) SetBatchNo(v string) *SerialNumberUpdateOne {
_u.mutation.SetBatchNo(v)
@@ -615,6 +630,9 @@ func (_u *SerialNumberUpdateOne) sqlSave(ctx context.Context) (_node *SerialNumb
if value, ok := _u.mutation.MaterialCode(); ok {
_spec.SetField(serialnumber.FieldMaterialCode, field.TypeString, value)
}
if _u.mutation.MaterialCodeCleared() {
_spec.ClearField(serialnumber.FieldMaterialCode, field.TypeString)
}
if value, ok := _u.mutation.BatchNo(); ok {
_spec.SetField(serialnumber.FieldBatchNo, field.TypeString, value)
}