新增工资/仓储/生产日报等模块,移除旧考勤模块

- 新增 PayRoll(工资)、Wms(仓储)、Prod(车速/缫丝/考勤/丝片检测/丝片台账/纤检日报/质量日报) 模块
- 新增对应 Domain 实体、Application DTO/Service、Api Controller 与前端页面
- 移除旧 Attendance 考勤模块(Controller/Service/Entity/DTO 及 5 个前端页面),由 Prod/Kaoqin 取代
- 调整路由、仪表盘、Lsjl 流丝记录实体与服务
- 更新业务种子数据与 DbSeeder
- 补充工作进度文档 14-27
This commit is contained in:
yanpeng200212
2026-10-27 09:09:57 +08:00
parent 69c4052a64
commit 1f1b184411
119 changed files with 21576 additions and 1668 deletions
@@ -0,0 +1,117 @@
# F9 报表设计器协议宿主
# 注册表 HKCR\f9designer\shell\open\command 指向本脚本:
# powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File "<本脚本>" "%1"
# 前端唤起:ReportDesign.vue 的 openGridDesigner()
# f9designer://open?base=<origin>&rid=<报表Id>&token=<jwt>&code=<报表编号>
#
# 流程:解析协议参数 -> 下载模板 .grf -> 用锐浪 Grid++Report 7 设计器打开(阻塞等待关闭)
# -> 关闭后把模板回传后端 -> 清理临时文件
# 日志:tools/report-designer/logs/designer_yyyyMMdd.log(排查"点了没反应"时看这里)
param([string]$Url)
$ErrorActionPreference = 'Stop'
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$logDir = Join-Path $scriptDir 'logs'
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
$log = Join-Path $logDir ('designer_{0:yyyyMMdd}.log' -f (Get-Date))
function Write-Log($msg) {
$line = '[{0}] {1}' -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), $msg
try { Add-Content -Path $log -Value $line -Encoding UTF8 } catch { }
}
# 失败时弹窗提示(注册表里是 -WindowStyle Hidden,不弹窗的话用户只会看到"点了没反应")
function Show-Error($msg) {
Write-Log "错误: $msg"
try {
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show(
$msg + "`n`n详细日志:" + $log, 'F9 报表设计器', 'OK', 'Error') | Out-Null
} catch { }
}
Write-Log '========== 唤起 =========='
Write-Log "Url: $Url"
try {
# ---------- 1. 解析协议参数 ----------
# 关键:Windows Shell 会在协议主机后补一个 "/",实际收到的是
# f9designer://open/?base=...&rid=...
# 所以不能用固定前缀剥离,直接取第一个 "?" 之后的全部内容。
$qIndex = if ($Url) { $Url.IndexOf('?') } else { -1 }
$raw = if ($qIndex -ge 0) { $Url.Substring($qIndex + 1) } else { '' }
$qs = @{}
foreach ($part in ($raw -split '&')) {
if ([string]::IsNullOrWhiteSpace($part)) { continue }
$kv = $part -split '=', 2
if ($kv.Length -eq 2) {
$key = [Uri]::UnescapeDataString($kv[0]).Trim()
$qs[$key] = [Uri]::UnescapeDataString($kv[1])
}
}
$base = ($qs['base'] + '').TrimEnd('/')
$rid = $qs['rid']
$token = $qs['token']
$code = $qs['code']
Write-Log "base=$base rid=$rid code=$code"
if (-not $base) {
$base = 'http://localhost:5173'
Write-Log "未收到 base 参数,回退默认 $base"
}
if (-not $rid) { throw "缺少 rid 参数(Url=$Url)" }
# ---------- 2. 定位锐浪设计器 ----------
# 可用环境变量 F9_GR7_DESIGNER 覆盖,默认 D:\GridReport7\gr7designer64.exe
$designer = $env:F9_GR7_DESIGNER
if ([string]::IsNullOrWhiteSpace($designer)) { $designer = 'D:\GridReport7\gr7designer64.exe' }
if (-not (Test-Path $designer)) { throw "未找到锐浪设计器:$designer (可设置环境变量 F9_GR7_DESIGNER 指定)" }
Write-Log "设计器: $designer"
# ---------- 3. 下载模板 ----------
$tmp = Join-Path $env:TEMP ('f9_{0}_{1}.grf' -f $rid, [Guid]::NewGuid().ToString('N').Substring(0, 8))
# 下载接口为 [AllowAnonymous],token 走 query 的 access_token
$dl = "$base/api/sys/report/$rid/template?access_token=$token"
Write-Log "下载: $dl"
try {
Invoke-WebRequest -Uri $dl -OutFile $tmp -UseBasicParsing
Write-Log ('已下载 {0} 字节' -f (Get-Item $tmp).Length)
} catch {
Write-Log "下载失败(新报表可能尚无模板),改用空白模板继续:$($_.Exception.Message)"
Set-Content -Path $tmp -Value '' -Encoding UTF8
}
# ---------- 4. 打开设计器并等待关闭 ----------
Write-Log '启动设计器(等待关闭)...'
$proc = Start-Process -FilePath $designer -ArgumentList ('"{0}"' -f $tmp) -PassThru
$proc.WaitForExit()
Write-Log ('设计器已关闭,退出码 {0}' -f $proc.ExitCode)
# ---------- 5. 回传模板 ----------
if ((Get-Item $tmp).Length -gt 0) {
Write-Log '上传模板...'
Add-Type -AssemblyName System.Net.Http
$client = New-Object System.Net.Http.HttpClient
if ($token) { $client.DefaultRequestHeaders.TryAddWithoutValidation('Authorization', "Bearer $token") | Out-Null }
$content = New-Object System.Net.Http.MultipartFormDataContent
$fs = [System.IO.File]::OpenRead($tmp)
try {
$sc = New-Object System.Net.Http.StreamContent($fs)
$content.Add($sc, 'file', [System.IO.Path]::GetFileName($tmp))
$resp = $client.PostAsync("$base/api/sys/report/$rid/template", $content).Result
Write-Log ('上传结果: {0}' -f $resp.StatusCode)
} finally {
$fs.Close()
$client.Dispose()
}
} else {
Write-Log '模板为空,跳过上传'
}
Remove-Item $tmp -Force -ErrorAction SilentlyContinue
Write-Log '完成'
} catch {
Show-Error $($_.Exception.Message)
Write-Log $_.ScriptStackTrace
}