feat: 装配线看板修正、统一密钥Hardman_2026、操作日志追溯、日志按天存储
Dashboard 移除 CNC/清洗机等不存在设备,改为纯装配线看板(扫码枪+拧紧枪+人工);JWT/内部token统一为 Hardman_2026 写入各 etc/*.yaml,MES 建表 DSN 改读 yaml;event_log 增加 workOrderNo/operator,BOM/备料/PLC下发/拧紧/扫码报工/半成品/AGV 全链路埋点,日志页支持工单号/操作人筛选;MES/WMS 日志按天存储(dailyWriter),WMS SetWriter 用 logx.NewWriter 适配
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
|
||||
"bj_power_wms/internal/config"
|
||||
"bj_power_wms/internal/handler"
|
||||
"bj_power_wms/internal/logdaily"
|
||||
"bj_power_wms/internal/svc"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/conf"
|
||||
@@ -21,6 +22,14 @@ func main() {
|
||||
var c config.Config
|
||||
conf.MustLoad(*configFile, &c)
|
||||
|
||||
// 日志按天存储:logs/bj_power_wms-2026-01-02.log,保留 30 天
|
||||
if c.Log.Mode == "file" {
|
||||
logx.SetUp(c.Log)
|
||||
w := logdaily.New(c.Log.Path, c.Name, 30)
|
||||
defer w.Close()
|
||||
logx.SetWriter(logx.NewWriter(w))
|
||||
}
|
||||
|
||||
server := rest.MustNewServer(c.RestConf)
|
||||
defer server.Stop()
|
||||
|
||||
|
||||
@@ -14,12 +14,12 @@ Postgres:
|
||||
|
||||
# JWT(短有效期 + 滑动续签)
|
||||
Auth:
|
||||
AccessSecret: bj-power-wms-secret-2026
|
||||
AccessSecret: Hardman_2026
|
||||
AccessExpire: 1800
|
||||
|
||||
# 项目间内部 API 写死 token
|
||||
Internal:
|
||||
Token: bj-power-internal-2026
|
||||
Token: Hardman_2026
|
||||
|
||||
Log:
|
||||
Mode: file
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
// Package logdaily 提供按天滚动的日志写入器(供 go-zero logx.SetWriter 使用)
|
||||
package logdaily
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type dailyWriter struct {
|
||||
mu sync.Mutex
|
||||
dir string
|
||||
base string
|
||||
keepDays int
|
||||
date string
|
||||
f *os.File
|
||||
}
|
||||
|
||||
// New 创建按天滚动的写入器:文件名 dir/base-2006-01-02.log,跨天自动切换,
|
||||
// 超过 keepDays 天的旧日志在跨天时清理(keepDays<=0 表示永久保留)。
|
||||
func New(dir, base string, keepDays int) io.WriteCloser {
|
||||
return &dailyWriter{dir: dir, base: base, keepDays: keepDays}
|
||||
}
|
||||
|
||||
func (w *dailyWriter) filename(date string) string {
|
||||
return filepath.Join(w.dir, w.base+"-"+date+".log")
|
||||
}
|
||||
|
||||
func (w *dailyWriter) Write(p []byte) (int, error) {
|
||||
w.mu.Lock()
|
||||
defer w.mu.Unlock()
|
||||
|
||||
today := time.Now().Format("2006-01-02")
|
||||
if w.f == nil || today != w.date {
|
||||
if w.f != nil {
|
||||
_ = w.f.Close()
|
||||
}
|
||||
if err := os.MkdirAll(w.dir, 0o755); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
f, err := os.OpenFile(w.filename(today), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
w.f = f
|
||||
w.date = today
|
||||
w.cleanup()
|
||||
}
|
||||
return w.f.Write(p)
|
||||
}
|
||||
|
||||
func (w *dailyWriter) Close() error {
|
||||
w.mu.Lock()
|
||||
defer w.mu.Unlock()
|
||||
if w.f != nil {
|
||||
return w.f.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *dailyWriter) cleanup() {
|
||||
if w.keepDays <= 0 {
|
||||
return
|
||||
}
|
||||
entries, err := os.ReadDir(w.dir)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
cutoff := time.Now().AddDate(0, 0, -w.keepDays)
|
||||
for _, e := range entries {
|
||||
if e.IsDir() || !strings.HasPrefix(e.Name(), w.base+"-") || !strings.HasSuffix(e.Name(), ".log") {
|
||||
continue
|
||||
}
|
||||
datePart := strings.TrimSuffix(strings.TrimPrefix(e.Name(), w.base+"-"), ".log")
|
||||
t, err := time.ParseInLocation("2006-01-02", datePart, time.Local)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
if t.Before(cutoff) {
|
||||
_ = os.Remove(filepath.Join(w.dir, e.Name()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
_ io.WriteCloser = (*dailyWriter)(nil)
|
||||
_ io.Writer = (*dailyWriter)(nil)
|
||||
)
|
||||
Reference in New Issue
Block a user