# Seed templates into DB + upload dir without login (ASCII) $ErrorActionPreference='Stop' Get-Content 'E:\wwwroot\.env' | ForEach-Object { $line=$_.Trim(); if(-not $line -or $line.StartsWith('#')){return} $i=$line.IndexOf('='); if($i -lt 1){return} Set-Item -Path ("Env:"+$line.Substring(0,$i).Trim()) -Value $line.Substring($i+1).Trim().Trim('"') } $mysql='C:\yutongda\tools\mysql-8.0.39-winx64\bin\mysql.exe' $hostName='127.0.0.1' $Work='E:\wwwroot\inquiry-new\quote-template-seed' $zip='C:\Users\ytd_extdev_0903\incoming\quote-templates-seed.zip' if(-not (Test-Path $zip)){ throw "missing $zip" } if(Test-Path $Work){ Remove-Item $Work -Recurse -Force } Expand-Archive -Path $zip -DestinationPath $Work -Force $manifest=Get-Content (Join-Path $Work 'manifest.json') -Raw -Encoding UTF8 | ConvertFrom-Json $uploadRoot = if($env:JEECG_UPLOAD_PATH){ $env:JEECG_UPLOAD_PATH } else { 'E:\wwwroot\data\upFiles' } $bizPath = Join-Path $uploadRoot 'inquiry\quote-templates' New-Item -ItemType Directory -Force -Path $bizPath | Out-Null $files=Get-ChildItem -Path (Join-Path $Work 'templates') -Recurse -Filter '*.xlsx' | Where-Object { $_.Name -notlike '~$*' } $byName=@{} foreach($f in $files){ if(-not $byName.ContainsKey($f.Name) -or $f.FullName.Length -lt $byName[$f.Name].FullName.Length){ $byName[$f.Name]=$f } } function Sql([string]$q){ & $mysql -h $hostName -P 3306 -u $env:MYSQL_USER "--password=$env:MYSQL_PASSWORD" --default-character-set=utf8mb4 $env:MYSQL_DB -e $q if($LASTEXITCODE -ne 0){ throw "sql fail $LASTEXITCODE" } } $ok=0 foreach($item in $manifest.items){ $name=[string]$item.fileName if(-not $byName.ContainsKey($name)){ Write-Host ("SKIP "+$name); continue } $src=$byName[$name].FullName $id = ([guid]::NewGuid().ToString('N').Substring(0,32)) $vid = ([guid]::NewGuid().ToString('N').Substring(0,32)) $destName = $id + '_' + $name $dest = Join-Path $bizPath $destName Copy-Item $src $dest -Force $objectKey = ('inquiry/quote-templates/' + $destName).Replace('\','/') $sha = (Get-FileHash $dest -Algorithm SHA256).Hash.ToLower() $size = (Get-Item $dest).Length $mode=[string]$item.mode $biz=[string]$item.bizType $cat=[string]$item.category $kw = ($item.keywords | ConvertTo-Json -Compress) $tplName = [IO.Path]::GetFileNameWithoutExtension($name) $status = if($mode -eq 'manual'){ 'enabled' } else { 'enabled' } $mapping = '{"schemaVersion":"quote-template-mapping-v1","fields":{},"note":"seeded_without_parse; re-upload to refresh mapping"}' $points = 0 if($item.suggestedFields){ # 禁止用 ConvertTo-Json 直接塞库:WinPS 可能产出非法 JSON,导致 previewSample 解析失败 $fieldsObj = @{} $item.suggestedFields.PSObject.Properties | ForEach-Object { $fieldsObj[$_.Name]=$_.Value } $fieldsJsonParts = @() foreach($k in $fieldsObj.Keys){ $fieldsJsonParts += ('"' + ($k -replace '\\','\\' -replace '"','\"') + '":"' + ([string]$fieldsObj[$k] -replace '\\','\\' -replace '"','\"') + '"') } $fieldsJson = '{' + ($fieldsJsonParts -join ',') + '}' $mapping = '{"schemaVersion":"quote-template-mapping-v1","fields":' + $fieldsJson + ',"fixedYellowCells":[],"unmappedRequired":[]}' $points = @($fieldsObj.Keys).Count } $esc = { param($s) if($null -eq $s){return ''}; return ([string]$s).Replace("\","\\").Replace("'","''") } $sql = @" INSERT INTO inq_quote_template(id,name,biz_type,category,keywords_json,mode,status,is_default,current_version,use_count,create_by,create_time) VALUES('$id','$(& $esc $tplName)','$(& $esc $biz)','$(& $esc $cat)','$(& $esc $kw)','$mode','$status',0,1,0,'seed',NOW()) ON DUPLICATE KEY UPDATE update_time=NOW(); INSERT INTO inq_quote_template_version(id,template_id,version_no,file_name,format,object_key,sha256,file_size,parse_status,mapping_point_count,mapping_json,parse_message,enabled,create_by,create_time) VALUES('$vid','$id',1,'$(& $esc $name)','excel','$(& $esc $objectKey)','$sha',$size,'parsed',$points,'$(& $esc $mapping)','seed import',$points,1,'seed',NOW()); "@ # enabled=1 for version; fix SQL - enabled column is tinyint $sql = @" INSERT INTO inq_quote_template(id,name,biz_type,category,keywords_json,mode,status,is_default,current_version,use_count,create_by,create_time) VALUES('$id','$(& $esc $tplName)','$(& $esc $biz)','$(& $esc $cat)','$(& $esc $kw)','$mode','$status',0,1,0,'seed',NOW()); INSERT INTO inq_quote_template_version(id,template_id,version_no,file_name,format,object_key,sha256,file_size,parse_status,mapping_point_count,mapping_json,parse_message,enabled,create_by,create_time) VALUES('$vid','$id',1,'$(& $esc $name)','excel','$(& $esc $objectKey)','$sha',$size,'parsed',$points,'$(& $esc $mapping)','seed import',1,'seed',NOW()); "@ Sql $sql Write-Host ("OK " + $name + " id=" + $id + " points=" + $points) $ok++ } Sql "SELECT COUNT(*) AS templates FROM inq_quote_template; SELECT COUNT(*) AS versions FROM inq_quote_template_version;" Write-Host ("SQL_SEED_DONE ok="+$ok)