本次提交覆盖多个业务模块的功能完善与体验优化:
1. **鉴权与配置调整**:
- 统一JWT滑动续签逻辑,简化Token存储,移除RefreshToken相关冗余代码
- 调整多项目配置文件中JWT过期时间为3600秒,统一会话闲置窗口
- 工位配置放开1~12限制,改为仅校验大于0
2. **术语统一替换**:全链路将"精密件"替换为"电气件",修正物料管理描述
3. **功能新增**:
- 新增工位类型、工艺路线与产线点位台账模块
- 添加工艺PDF预览面板、工位终端代理转发接口
- 新增操作日志按操作人列表筛选、工位登出日志记录
- 新增PLC移料指令与产线点位状态管理
4. **业务流程优化**:
- 调整BOM物料删除校验逻辑,优化工单备料计算
- 补充物料图号、检测单号等追溯字段
- 完善工艺流程图与工位绑定关系说明
- 优化前端页面文案与交互细节
5. **代码规范与维护**:
- 新增通用工具函数与前端静态资源
- 整理路由权限与中间件逻辑
- 修复部分接口与配置的不兼容问题
96 lines
2.7 KiB
Python
96 lines
2.7 KiB
Python
p='internal/logic/processflow.go'
|
|
lines=open(p,encoding='utf-8').read().split('\n')
|
|
# find function start
|
|
start=None
|
|
for i,l in enumerate(lines):
|
|
if l.startswith('func (s *Service) StationTask('):
|
|
start=i
|
|
break
|
|
assert start is not None, 'func not found'
|
|
# find matching close brace
|
|
depth=0
|
|
end=None
|
|
for j in range(start,len(lines)):
|
|
depth+=lines[j].count('{')
|
|
depth-=lines[j].count('}')
|
|
if depth==0 and j>start:
|
|
end=j
|
|
break
|
|
assert end is not None, 'no end'
|
|
func='''func (s *Service) StationTask(ctx context.Context, stationNo int) (map[string]any, error) {
|
|
st, err := s.ctx.EntClient.Station.Query().Where(station.StationNo(stationNo)).First(ctx)
|
|
if err != nil {
|
|
return nil, errors.New("工位不存在或未配置")
|
|
}
|
|
var flow *ent.ProcessFlow
|
|
if st.FlowId > 0 {
|
|
flow, _ = s.ctx.EntClient.ProcessFlow.Get(ctx, st.FlowId)
|
|
}
|
|
steps := []*ProcessStepTemplate{}
|
|
if flow != nil && flow.Status == "ACTIVE" {
|
|
steps = s.flowSteps(ctx, flow.ID)
|
|
}
|
|
orderNos := []string{}
|
|
wos, _ := s.ctx.EntClient.WorkOrder.Query().
|
|
Where(workorder.StatusIn("CREATED", "RELEASED", "IN_PROGRESS")).
|
|
Order(ent.Asc(workorder.FieldID)).Limit(10).All(ctx)
|
|
for _, w := range wos {
|
|
orderNos = append(orderNos, w.WorkOrderNo)
|
|
}
|
|
// M4:工位终端按"工艺路线段"驱动(段=并行工位组,谁空停谁)。
|
|
// 解析活跃工单的 routeSnapshot,找出本工位所属的路线段,供终端按段执行流程。
|
|
routeSegments := []map[string]any{}
|
|
for _, w := range wos {
|
|
if len(w.RouteSnapshot) == 0 {
|
|
continue
|
|
}
|
|
for _, seg := range w.RouteSnapshot {
|
|
stations, _ := seg["stations"].([]any)
|
|
inSeg := false
|
|
for _, sv := range stations {
|
|
switch n := sv.(type) {
|
|
case float64:
|
|
if int(n) == stationNo {
|
|
inSeg = true
|
|
}
|
|
case int:
|
|
if n == stationNo {
|
|
inSeg = true
|
|
}
|
|
}
|
|
if inSeg {
|
|
break
|
|
}
|
|
}
|
|
if !inSeg {
|
|
continue
|
|
}
|
|
flowId := 0
|
|
if fv, ok := seg["flowId"].(float64); ok {
|
|
flowId = int(fv)
|
|
} else if fv, ok := seg["flowId"].(int); ok {
|
|
flowId = fv
|
|
}
|
|
routeSegments = append(routeSegments, map[string]any{
|
|
"orderNo": w.WorkOrderNo,
|
|
"seq": seg["seq"],
|
|
"segmentType": seg["segmentType"],
|
|
"flowId": flowId,
|
|
"stations": stations,
|
|
})
|
|
}
|
|
}
|
|
return map[string]any{
|
|
"stationNo": st.StationNo,
|
|
"stationName": st.Name,
|
|
"flow": flow,
|
|
"flowActive": flow != nil && flow.Status == "ACTIVE",
|
|
"steps": steps,
|
|
"orderNos": orderNos,
|
|
"routeSegments": routeSegments,
|
|
}, nil
|
|
}'''
|
|
out=lines[:start]+func.split('\n')+lines[end+1:]
|
|
open(p,'w',encoding='utf-8').write('\n'.join(out))
|
|
print("OK StationTask rewritten")
|