Files
bj_power/bj_power_workstation/main.go
T

116 lines
3.3 KiB
Go
Raw Normal View History

2026-08-28 15:06:01 +08:00
package main
import (
"context"
"embed"
"flag"
"fmt"
"io/fs"
"os/exec"
"runtime"
"time"
2026-08-28 15:06:01 +08:00
"bj_power_workstation/internal/config"
"bj_power_workstation/internal/handler"
"bj_power_workstation/internal/mes"
"bj_power_workstation/internal/pdfcache"
"bj_power_workstation/internal/store"
"bj_power_workstation/internal/svc"
"bj_power_workstation/internal/syncer"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/rest"
)
//go:embed all:web/static
var webFS embed.FS
var configFile = flag.String("f", "etc/bj_power_workstation.yaml", "the config file")
// openBrowser 用系统默认浏览器打开 url(Windows/macOS/Linux)
func openBrowser(url string) {
var cmd *exec.Cmd
switch runtime.GOOS {
case "windows":
cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", url)
case "darwin":
cmd = exec.Command("open", url)
default:
cmd = exec.Command("xdg-open", url)
}
if err := cmd.Start(); err != nil {
logx.Errorf("自动打开浏览器失败(%s): %v", url, err)
}
}
2026-08-28 15:06:01 +08:00
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c)
// 工位号:由服务端配置文件加载(终端不允许修改)。0=上线位、13=下线位为虚拟工位
// (PAD 上线建档 / 下线完工),1~12 为物理装配工位;启动时强校验 >= 0(工位数以数据库/配置为准,不写死 12)。
if c.Station.StationNo < 0 {
panic(fmt.Sprintf("Station.StationNo 必须 >= 0,当前配置为 %d(请修改 yaml 后重启)", c.Station.StationNo))
}
logx.Infof("固定工位号: %d", c.Station.StationNo)
2026-08-28 15:06:01 +08:00
staticFS, err := fs.Sub(webFS, "web/static")
if err != nil {
panic(fmt.Sprintf("加载内嵌前端资源失败: %v", err))
}
// 本地 SQLite:拧紧数据缓存 + 离线上报队列 + 操作日志 + 内置账号
st, err := store.Open(c.Sqlite.Path)
if err != nil {
panic(fmt.Sprintf("打开本地 SQLite(%s) 失败: %v", c.Sqlite.Path, err))
}
defer st.Close()
if err := store.SeedIfEmpty(st); err != nil {
panic(fmt.Sprintf("初始化内置用户失败: %v", err))
}
rootCtx, cancel := context.WithCancel(context.Background())
defer cancel()
mc := mes.New(c.Mes.BaseURL, c.Internal.Token)
// 后台同步协程:联网时向 MES 补报未同步数据
sy := syncer.New(st, mc)
go sy.Run(rootCtx)
// 拧紧数据由「工艺步骤 + 人工拧枪」驱动:工件走到需要拧紧枪的工艺步骤时,界面聚焦拧紧输入框,
// 人工拧枪把扭矩值打入回车 → POST /api/tightening/record 落本地库并经同步器上报 MES。
// 故此处不再启动任何后台模拟拧紧数据源。
2026-08-28 15:06:01 +08:00
// 工艺文件 PDF 本地预缓存
pdc := pdfcache.New(c.PdfCache.Dir)
ctx := &svc.ServiceContext{
Config: c,
Store: st,
Mes: mc,
Syncer: sy,
PdfCache: pdc,
WebFS: staticFS,
}
server := rest.MustNewServer(c.RestConf)
defer server.Stop()
handler.RegisterHandlers(server, ctx)
fmt.Printf("Starting bj_power_workstation server at %s:%d...\n", c.Host, c.Port)
logx.Infof("Starting bj_power_workstation server at %s:%d...", c.Host, c.Port)
// 启动后自动打开终端页面(等 1 秒让端口就绪;Host=0.0.0.0 时用 127.0.0.1 访问)
go func() {
time.Sleep(time.Second)
openBrowser(fmt.Sprintf("http://127.0.0.1:%d", c.Port))
}()
2026-08-28 15:06:01 +08:00
server.Start()
}