Files
bj_power/bj_power_workstation/main.go
T
SunYF d9d4155de6 feat: 为MES和工作站服务添加启动后自动打开浏览器功能
优化WMS客户端URL处理逻辑,移除尾斜杠避免请求404错误
更新工作站配置默认工位号为1
新增数据库字段支持工位页签配置
删除WMS端未完成的权限树形化和范围验证测试文件
删除物料档案对齐方案文档

新增自动打开浏览器的跨平台实现,服务启动后等待1秒后打开管理后台,提升使用便捷性
2026-09-24 17:27:24 +08:00

116 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"context"
"embed"
"flag"
"fmt"
"io/fs"
"os/exec"
"runtime"
"time"
"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)
}
}
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)
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。
// 故此处不再启动任何后台模拟拧紧数据源。
// 工艺文件 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))
}()
server.Start()
}