Преглед на файлове

Add 添加WIN平台打包脚本

Yue преди 3 седмици
родител
ревизия
625e12136b

+ 8 - 0
UI/CF.APP/chicken_farm/.env/.env.dev_no_pda_offline

@@ -0,0 +1,8 @@
+APP_ENV=dev.offline
+APP_NAME=养殖场管理系统(脱机)
+APP_VERSION=1.0.0-dev
+BASE_API_URL=http://192.168.0.81:8380
+CLIENT_ID=35aee70ae7224eb9a48bc527955ddedc
+IS_OFFLINE=true
+IS_PDA=false
+WIN_DB_PATH=.demo/data

+ 8 - 0
UI/CF.APP/chicken_farm/.env/.env.prod_no_pda_offline

@@ -0,0 +1,8 @@
+APP_ENV=prod.offline
+APP_NAME=养殖场管理系统(脱机)
+APP_VERSION=1.0.0
+BASE_API_URL=http://shvber.com:5068
+CLIENT_ID=35aee70ae7224eb9a48bc527955ddedc
+IS_OFFLINE=true
+IS_PDA=false
+WIN_DB_PATH=data/db

+ 1 - 0
UI/CF.APP/chicken_farm/.gitignore

@@ -46,3 +46,4 @@ app.*.map.json
 /android/app/profile
 /android/app/release
 
+/release

+ 9 - 1
UI/CF.APP/chicken_farm/.scripts/_build_cmd.txt

@@ -12,4 +12,12 @@ flutter build apk --target-platform android-arm --dart-define-from-file .env/.en
 copy build\app\outputs\flutter-apk\app-release.apk release\app\pda-offline_cf-app.apk
 
 // 安装 app目录下的 apk
-adb install -r release/app/cf-app_20251222111721.apk
+adb install -r release/app/cf-app_20251222111721.apk
+
+// 构建 windows
+flutter build windows --dart-define-from-file .env/.env.prod_no_pda
+// 构建 windows_offline
+flutter build windows --dart-define-from-file .env/.env.prod_no_pda_offline
+
+// 重新构建,model自动生成
+flutter pub run build_runner build

+ 113 - 0
UI/CF.APP/chicken_farm/.scripts/_win_build.bat

@@ -0,0 +1,113 @@
+@echo off
+chcp 65001 >nul 2>&1
+setlocal enabledelayedexpansion
+
+:: ========== 1. 项目根目录初始化 ==========
+set "PROJECT_ROOT=%~dp0\.."
+for %%i in ("%PROJECT_ROOT%") do set "PROJECT_ROOT=%%~fi"
+
+:: ========== 2. 参数校验 ==========
+if "%~1"=="" (
+  echo [Error] 请使用命令: _build_win.bat [prod^|dev] [version] [^|offline]
+  echo [示例]  _build_win.bat prod v1.0.0 offline
+  echo [示例]  _build_win.bat prod v1.0.0
+  pause
+  exit /b 1
+)
+
+if /i not "%~1"=="prod" if /i not "%~1"=="dev" (
+  echo [Error] 参数1无效,仅支持 prod 或 dev
+  pause
+  exit /b 1
+)
+
+:: ========== 3. 环境变量加载 ==========
+set "ENV=%~1_no_pda"
+if not "%~3"=="" if /i "%~3"=="offline" (
+  set "ENV=%~1_no_pda_offline"
+) else if not "%~3"=="" (
+  set "ENV=%~1_no_pda_%~3"
+)
+
+set "BUILD_PLATFORM=windows-x64"
+set "APP_NAME=cf-app"
+
+:: 根据参数组合设置APP_NAME
+if not "%~3"=="" (
+  :: 如果提供了第三个参数
+  if "%~3"=="offline" (
+    set "APP_NAME=win_offline_cf-app"
+  ) else (
+    set "APP_NAME=win_%~3_cf-app"
+  )
+) else (
+  set "APP_NAME=win_cf-app"
+)
+
+set "APP_VERSION=V1.0.0"
+:: 添加版本号到APP_NAME
+if not "%~2"=="" (
+  set "APP_VERSION=%~2"
+)
+
+set "ENV_FILE=%PROJECT_ROOT%\.env\.env.%ENV%"
+if not exist "%ENV_FILE%" (
+  echo [Error] 环境文件不存在: %ENV_FILE%
+  pause
+  exit /b 1
+)
+
+:: ========== 4. 构建参数生成 ==========
+set "DEFINE_ARGS="
+for /f "tokens=1,* delims==" %%a in ('type "%ENV_FILE%" ^| findstr /v "^#" ^| findstr /v "^$"') do (
+  set "DEFINE_ARGS=!DEFINE_ARGS! --dart-define=%%a=%%b"
+)
+
+:: ========== 5. 执行构建 ==========
+echo ==============================================
+echo [INFO] 开始构建: 环境=%ENV% ^| 平台=%BUILD_PLATFORM% ^| 应用=%APP_NAME%
+cd /d "%PROJECT_ROOT%"
+call flutter build windows !DEFINE_ARGS!
+if !errorlevel! neq 0 (
+  echo [Error] Flutter构建失败
+  pause
+  exit /b 1
+)
+
+:: ========== 6. 文件处理优化 ==========
+:: 正确的构建输出路径
+set "WIN_SOURCE=%PROJECT_ROOT%\build\windows\x64\runner\Release"
+set "WIN_DEST=%PROJECT_ROOT%\release\windows\%APP_NAME%_%APP_VERSION%"
+
+if exist "%WIN_SOURCE%" (
+  if not exist "%PROJECT_ROOT%\release\windows" (
+    mkdir "%PROJECT_ROOT%\release\windows"
+  )
+  xcopy /E /I /Y "%WIN_SOURCE%" "%WIN_DEST%"
+  echo ==============================================
+  echo [INFO] Windows应用打包成功: %WIN_DEST%
+  echo ==============================================
+) else (
+  echo [Error] Windows应用源文件不存在: %WIN_SOURCE%
+  pause
+  exit /b 1
+)
+
+:: ========== 7. 打包发布文件 ==========
+echo ==============================================
+echo [INFO] 正在压缩应用包...
+cd /d "%PROJECT_ROOT%"
+
+set "ZIP_NAME=%APP_NAME%_%APP_VERSION%.zip"
+set "ZIP_PATH=%PROJECT_ROOT%\release\windows\%ZIP_NAME%"
+
+:: 使用 PowerShell 命令进行 ZIP 压缩
+powershell -Command "Compress-Archive -Path '%WIN_DEST%\*' -DestinationPath '%ZIP_PATH%' -Force"
+
+if exist "%ZIP_PATH%" (
+  echo [INFO] 应用已成功压缩: %ZIP_PATH%
+) else (
+  echo [Error] 压缩失败,请检查系统是否支持 Compress-Archive
+  pause
+  exit /b 1
+)

+ 61 - 0
UI/CF.APP/chicken_farm/.scripts/win_build_all.bat

@@ -0,0 +1,61 @@
+@echo off
+chcp 936 >nul 2>&1
+setlocal enabledelayedexpansion
+
+:: ========== 全局配置(修复路径问题) ==========
+:: 当前脚本目录(.scripts)
+set "SCRIPT_DIR=%~dp0"
+:: 项目根目录(.scripts 的上级目录)
+set "PROJECT_ROOT=%SCRIPT_DIR%.."
+:: 编译脚本路径(直接指向当前目录的 _win_build.bat,无需重复拼接 .scripts)
+set "BUILD_SCRIPT=%SCRIPT_DIR%_win_build.bat"
+set "VERSION=V1.0.0"
+:: ========== 前置检查 ==========
+if not exist "%BUILD_SCRIPT%" (
+  echo [错误] 未找到编译脚本:%BUILD_SCRIPT%
+  pause
+  exit /b 1
+)
+
+:: ========== 清理缓存 ==========
+call flutter clean
+call flutter pub get
+
+:: ========== 依次执行编译命令 ==========
+echo ==============================================
+echo 开始批量编译所有WIN应用(共2个环境)
+echo ==============================================
+
+:: 1. 编译 prod 基础环境
+echo.
+echo [第1个] 开始编译:prod 基础环境
+call "%BUILD_SCRIPT%" prod "%VERSION%"
+if !errorlevel! neq 0 (
+  echo [错误] prod 基础环境编译失败!
+  pause
+  exit /b 1
+)
+echo [第1个] prod 基础环境编译完成 ??
+
+
+:: 2. 编译 prod_offline 环境
+echo.
+echo [第2个] 开始编译:prod offline 环境
+call "%BUILD_SCRIPT%" prod "%VERSION%" offline
+if !errorlevel! neq 0 (
+  echo [错误] prod offline 环境编译失败!
+  pause
+  exit /b 1
+)
+echo [第2个] prod offline 环境编译完成 ??
+
+:: ========== 批量编译完成 ==========
+echo.
+echo ==============================================
+echo 所有WIN应用编译完成!?
+echo 生成的文件位于:%PROJECT_ROOT%\release\windows\
+echo ==============================================
+
+
+pause
+endlocal

+ 1 - 1
UI/CF.APP/chicken_farm/lib/pages/breeding/batch_create_page_win.dart

@@ -25,7 +25,7 @@ class _BatchCreatePageWinState extends State<BatchCreatePageWin> {
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-      appBar: const VberAppBar(title: '个体绑定[Windows]', showLeftButton: true),
+      appBar: const VberAppBar(title: '个体绑定', showLeftButton: true),
       body: SingleChildScrollView(
         padding: const EdgeInsets.all(16.0),
         child: Column(

+ 1 - 1
UI/CF.APP/chicken_farm/lib/pages/breeding/batch_culling_page_win.dart

@@ -21,7 +21,7 @@ class _BatchCullingPageWinState extends State<BatchCullingPageWin> {
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-      appBar: const VberAppBar(title: '批量淘汰[Windows]', showLeftButton: true),
+      appBar: const VberAppBar(title: '批量淘汰', showLeftButton: true),
       body: SingleChildScrollView(
         padding: const EdgeInsets.all(16.0),
         child: Column(

+ 0 - 2
UI/CF.APP/chicken_farm/lib/pages/breeding/individual_query_page.dart

@@ -1,11 +1,9 @@
 import 'dart:async';
-import 'dart:io';
 import 'package:chicken_farm/components/vb_dict_label.dart';
 import 'package:chicken_farm/core/utils/logger.dart';
 import 'package:flutter/material.dart';
 import 'package:chicken_farm/apis/breeding/_query.dart';
 import 'package:chicken_farm/components/vb_electronic_id_field.dart';
-import 'package:chicken_farm/components/vb_win_electronic_id_field.dart';
 import 'package:chicken_farm/core/utils/toast.dart';
 import 'package:chicken_farm/modes/breeding/chicken.dart';
 import 'package:intl/intl.dart';

+ 1 - 1
UI/CF.APP/chicken_farm/pubspec.yaml

@@ -1,5 +1,5 @@
 name: chicken_farm
-description: "A new Flutter project."
+description: "广明养殖管理系统平台"
 # The following line prevents the package from being accidentally published to
 # pub.dev using `flutter pub publish`. This is preferred for private packages.
 publish_to: 'none' # Remove this line if you wish to publish to pub.dev

BIN
UI/CF.APP/chicken_farm/release/app/pda_cf-app_V1.0.0.apk


BIN
UI/CF.APP/chicken_farm/release/app/pda_no_cf-app_V1.0.0.apk


BIN
UI/CF.APP/chicken_farm/release/app/pda_offline_cf-app_V1.0.0.apk


+ 9 - 5
UI/CF.APP/chicken_farm/windows/runner/main.cpp

@@ -1,4 +1,4 @@
-#include <flutter/dart_project.h>
+#include <flutter/dart_project.h>
 #include <flutter/flutter_view_controller.h>
 #include <windows.h>
 
@@ -6,10 +6,12 @@
 #include "utils.h"
 
 int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
-                      _In_ wchar_t *command_line, _In_ int show_command) {
+                      _In_ wchar_t *command_line, _In_ int show_command)
+{
   // Attach to console when present (e.g., 'flutter run') or create a
   // new console when running with a debugger.
-  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
+  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent())
+  {
     CreateAndAttachConsole();
   }
 
@@ -27,13 +29,15 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
   FlutterWindow window(project);
   Win32Window::Point origin(10, 10);
   Win32Window::Size size(1280, 720);
-  if (!window.Create(L"chicken_farm", origin, size)) {
+  if (!window.Create(L"广明养殖管理平台", origin, size))
+  {
     return EXIT_FAILURE;
   }
   window.SetQuitOnClose(true);
 
   ::MSG msg;
-  while (::GetMessage(&msg, nullptr, 0, 0)) {
+  while (::GetMessage(&msg, nullptr, 0, 0))
+  {
     ::TranslateMessage(&msg);
     ::DispatchMessage(&msg);
   }

+ 5 - 2
UI/CF.APP/chicken_farm/windows/runner/reader/reader_service.cpp

@@ -9,8 +9,11 @@
 
 void PrintLogMessage(const std::string &message)
 {
-  CreateAndAttachConsole();
-  std::cout << message << std::endl;
+  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent())
+  {
+    CreateAndAttachConsole();
+    std::cout << message << std::endl;
+  }
 }
 
 ReaderService *ReaderService::GetInstance()

BIN
UI/CF.APP/chicken_farm/windows/runner/resources/app_icon.ico