1. 通用优化: - 统一系统标题为"库房客户端"/"MES产线控制",移除北自所前缀 - 调整内置账号密码为统一123456,优化密码校验逻辑 - 新增数据库自动创建逻辑,简化部署流程 - 修复日志时间格式配置,优化日志输出 - 新增纯数字密码安全提示 2. MES系统优化: - 新增日排产管理功能,支持增删改查与自动算料生成备料单 - 重构BOM模块,改为按产品编码维护而非工单维度 - 新增工艺参数模板配置与手动报工页面 - 新增产品类型自动编码功能 - 优化菜单结构,调整工单管理、扫码报工等页面名称与路由 - 新增删除日排产接口与权限保护 - 修复物料清单查询逻辑,适配新BOM结构 - 新增refreshToken支持,优化登录会话管理 3. WMS系统优化: - 新增基础数据维护页面,支持区域与物料档案管理 - 新增工单列表下拉接口,对接MES获取未完成工单优先展示 - 优化入库管理提示文案,替换英文提示为中文 - 修复精密件入库校验逻辑,优化错误提示 - 优化Excel导入功能,新增备注字段支持 - 优化登录页面与菜单文案,统一备料台账名称 - 新增自动打开浏览器功能,优化客户端启动体验 - 修复备料出库页面查询提示文案 - 新增WMS与MES对接配置,完善内部API调用逻辑 4. 其他优化: - 删除冗余的旧版静态资源文件,更新资源引用路径 - 新增帮助文档,完善基础数据模块说明 - 修复多处文案不统一、英文残留问题
69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"bj_power_mes/ent"
|
|
"bj_power_mes/ent/materialrequest"
|
|
"bj_power_mes/ent/workorder"
|
|
)
|
|
|
|
// GenerateMaterialRequest 按日排产自动算料生成备料单
|
|
// 数量 = 该日所有工单计划数量 × 产品BOM单台用量×(1+损耗率),材料来源=该工单产品的 BOM
|
|
func (s *Service) GenerateMaterialRequest(ctx context.Context, planDate string, operator string) (int, error) {
|
|
plans, err := s.ListDailyPlans(ctx, "", planDate)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if len(plans) == 0 {
|
|
return 0, errors.New("该日期没有排产计划")
|
|
}
|
|
created := 0
|
|
for _, plan := range plans {
|
|
// 解析工单 → 产品编码 → 该产品 BOM
|
|
wo, err := s.ctx.EntClient.WorkOrder.Query().
|
|
Where(workorder.WorkOrderNo(plan.OrderNo)).Only(ctx)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
bom, err := s.ListBom(ctx, wo.ProductCode)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
for _, item := range bom {
|
|
reqQty := float64(plan.PlanQty) * item.UnitQty * (1 + item.LossRate/100)
|
|
if reqQty <= 0 {
|
|
continue
|
|
}
|
|
reqNo := fmt.Sprintf("MR%s%03d", time.Now().Format("20060102150405"), len(bom))
|
|
_ = s.ctx.EntClient.MaterialRequest.Create().
|
|
SetRequestNo(reqNo).SetOrderNo(plan.OrderNo).SetPlanDate(plan.PlanDate).
|
|
SetMaterialCode(item.MaterialCode).SetMaterialName(item.MaterialName).
|
|
SetUnit(item.Unit).SetManageMode(item.ManageMode).SetReqQty(reqQty).
|
|
SetStatus("PENDING").SetOperator(operator).
|
|
SetTargetDock("").Exec(ctx)
|
|
created++
|
|
}
|
|
}
|
|
s.ctx.EventLog.Write(ctx, "material.request.generate", "", operator, "material_request", planDate, "按日排产自动生成备料单", map[string]any{"planDate": planDate, "count": created})
|
|
return created, nil
|
|
}
|
|
|
|
// ListMaterialRequests 查询备料单
|
|
func (s *Service) ListMaterialRequests(ctx context.Context, orderNo, planDate, status string) ([]*ent.MaterialRequest, error) {
|
|
q := s.ctx.EntClient.MaterialRequest.Query()
|
|
if orderNo != "" {
|
|
q = q.Where(materialrequest.OrderNo(orderNo))
|
|
}
|
|
if planDate != "" {
|
|
q = q.Where(materialrequest.PlanDate(planDate))
|
|
}
|
|
if status != "" {
|
|
q = q.Where(materialrequest.Status(status))
|
|
}
|
|
return q.Order(materialrequest.ByID()).All(ctx)
|
|
}
|