From bd27a69944c31fc8558bdffe2876782baff89b5c Mon Sep 17 00:00:00 2001 From: zzh Date: Thu, 14 May 2026 10:53:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 13 - .gitignore | 66 +- .../scripts/__pycache__/core.cpython-312.pyc | Bin 0 -> 11030 bytes .vscode/settings.json | 2 + 25年11月份对账单-易泰勒.xlsx | Bin 17540 -> 0 bytes AI_ANALYSIS_README.md | 206 ------- FIX_SUMMARY.md | 45 -- RESTART_REQUIRED.md | 43 -- add_customer_name_column.py | 37 -- .../__pycache__/ai_service.cpython-312.pyc | Bin 0 -> 26821 bytes check_reconciliations.py | 31 - cookies.txt | 4 - frontend/assets/login.css.bak | 569 ++++++++++++++++++ frontend/assets/styles.css | 11 +- frontend/index.html | 14 +- frontend/js/components/ai-report.js.bak | 494 +++++++++++++++ frontend/js/components/upload.js | 24 +- frontend/login.html.bak | 268 +++++++++ import_reconciliation_excel.py | 144 ----- init_customer_orders.py | 97 --- init_reconciliations.py | 124 ---- server/__pycache__/ai_routes.cpython-312.pyc | Bin 0 -> 21485 bytes server/__pycache__/app.cpython-312.pyc | Bin 0 -> 303997 bytes .../finance_routes.cpython-312.pyc | Bin 0 -> 41349 bytes .../gunicorn_config.cpython-312.pyc | Bin 0 -> 1413 bytes server/app.py | 4 +- server/app.pyc | Bin 0 -> 182817 bytes server/data.db | Bin 12537856 -> 12632064 bytes test_py/test_login.html => server/database.db | 0 test-meituan-api.html | 145 ----- test-xlsx.html | 37 -- test_fix_total_amount.py | 60 -- test_outsourcing_system.py | 232 ------- test_price_matching.py | 148 ----- test_purchase_demand_ordered.py | 97 --- test_py/check_login.py | 222 ------- test_py/test-theme.html | 71 --- test_py/test_captcha.png | Bin 2132 -> 0 bytes test_py/test_captcha.py | 88 --- test_py/test_import.py | 59 -- test_py/test_sop_feature.py | 173 ------ test_shipment_upload.py | 162 ----- test_toast.html | 120 ---- update_factory.py | 49 -- 发货单-20251121.xls | Bin 31744 -> 0 bytes 45 files changed, 1377 insertions(+), 2482 deletions(-) delete mode 100755 .env.example mode change 100755 => 100644 .gitignore create mode 100755 .shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc create mode 100755 .vscode/settings.json delete mode 100755 25年11月份对账单-易泰勒.xlsx delete mode 100755 AI_ANALYSIS_README.md delete mode 100644 FIX_SUMMARY.md delete mode 100644 RESTART_REQUIRED.md delete mode 100755 add_customer_name_column.py create mode 100755 backend/__pycache__/ai_service.cpython-312.pyc delete mode 100755 check_reconciliations.py delete mode 100755 cookies.txt create mode 100755 frontend/assets/login.css.bak create mode 100755 frontend/js/components/ai-report.js.bak create mode 100755 frontend/login.html.bak delete mode 100755 import_reconciliation_excel.py delete mode 100755 init_customer_orders.py delete mode 100755 init_reconciliations.py create mode 100755 server/__pycache__/ai_routes.cpython-312.pyc create mode 100755 server/__pycache__/app.cpython-312.pyc create mode 100644 server/__pycache__/finance_routes.cpython-312.pyc create mode 100755 server/__pycache__/gunicorn_config.cpython-312.pyc create mode 100755 server/app.pyc rename test_py/test_login.html => server/database.db (100%) delete mode 100755 test-meituan-api.html delete mode 100755 test-xlsx.html delete mode 100755 test_fix_total_amount.py delete mode 100755 test_outsourcing_system.py delete mode 100755 test_price_matching.py delete mode 100755 test_purchase_demand_ordered.py delete mode 100755 test_py/check_login.py delete mode 100755 test_py/test-theme.html delete mode 100755 test_py/test_captcha.png delete mode 100755 test_py/test_captcha.py delete mode 100755 test_py/test_import.py delete mode 100755 test_py/test_sop_feature.py delete mode 100755 test_shipment_upload.py delete mode 100755 test_toast.html delete mode 100755 update_factory.py delete mode 100755 发货单-20251121.xls diff --git a/.env.example b/.env.example deleted file mode 100755 index 731d04b..0000000 --- a/.env.example +++ /dev/null @@ -1,13 +0,0 @@ -# Redis 配置 -# 如果 Redis 在本地运行,使用 127.0.0.1 可以显著提升性能 -REDIS_HOST=127.0.0.1 -REDIS_PORT=6379 -REDIS_DB=0 -REDIS_PASSWORD=Zzh08165511 - -# 管理员密码 -SUPERADMIN_PASSWORD=Zzh08165511 - -# 服务器配置 -HOST=0.0.0.0 -PORT=5000 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index 143a146..5a86d2a --- a/.gitignore +++ b/.gitignore @@ -1,64 +1,8 @@ -# Python -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -env/ -venv/ -ENV/ +node_modules/ build/ -develop-eggs/ dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg - -# Database -*.db -!server/data.db -*.sqlite -*.sqlite3 - -# Logs -*.log -logs/ -server.log - -# Environment variables -.env - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS +coverage/ .DS_Store -Thumbs.db - -# Uploaded files -frontend/assets/avatars/* -!frontend/assets/avatars/.gitkeep - -# Redis dump -dump.rdb - -# Temporary files -*.tmp -*.bak -*.cache - -# Documentation -README/ +*.log +.env* +!.env.example diff --git a/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc b/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc new file mode 100755 index 0000000000000000000000000000000000000000..f23d00eb1a14dc0d8411d396600cde37e5d8fc9d GIT binary patch literal 11030 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 literal 0 HcmV?d00001 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100755 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/25年11月份对账单-易泰勒.xlsx b/25年11月份对账单-易泰勒.xlsx deleted file mode 100755 index c5635a8cad36f332bbdf608c0e5bc457d60389b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17540 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 Rv7ZMEVE9P_D1kq&{vRh;q%{Bl diff --git a/AI_ANALYSIS_README.md b/AI_ANALYSIS_README.md deleted file mode 100755 index 31e5163..0000000 --- a/AI_ANALYSIS_README.md +++ /dev/null @@ -1,206 +0,0 @@ -# 智能生产报表AI分析功能 - -## 功能概述 - -智能报表功能利用AI分析生产数据,自动生成包含以下内容的生产报表: -- 生产总览和关键指标 -- 平台产量分布 -- 质量问题分析 -- AI洞察和改进建议 -- 产量预测 - -## 支持的AI提供商 - -1. **OpenAI** - GPT-3.5/GPT-4 -2. **通义千问** - 阿里云 -3. **文心一言** - 百度 -4. **本地模型** - Ollama等 - -## 配置步骤 - -### 1. 后端配置 - -#### 1.1 安装依赖 -```bash -cd backend -pip install aiohttp fastapi python-dotenv -``` - -#### 1.2 配置环境变量 -```bash -# 复制配置文件 -cp .env.example .env - -# 编辑配置文件 -nano .env -``` - -#### 1.3 配置示例 - -**使用OpenAI:** -``` -AI_PROVIDER=openai -OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx -``` - -**使用通义千问:** -``` -AI_PROVIDER=qwen -QWEN_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx -``` - -**使用文心一言:** -``` -AI_PROVIDER=wenxin -WENXIN_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxx -WENXIN_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxx -``` - -**使用本地模型(Ollama):** -``` -AI_PROVIDER=local -LOCAL_AI_URL=http://localhost:11434/api/generate -LOCAL_MODEL=llama2 -``` - -### 2. 启动本地模型(可选) - -如果使用本地模型,需要先启动Ollama: - -```bash -# 安装Ollama -curl -fsSL https://ollama.ai/install.sh | sh - -# 启动Ollama服务 -ollama serve - -# 下载模型 -ollama pull llama2 -# 或下载中文模型 -ollama pull qwen:7b -``` - -### 3. 集成到后端 - -在主应用中注册AI API路由: - -```python -# main.py 或 app.py -from api_ai import router as ai_router - -app.include_router(ai_router) -``` - -### 4. 前端使用 - -前端已经集成AI报表组件,位于仪表盘页面。用户可以: -- 点击"生成智能报表"按钮 -- 查看AI分析结果 -- 导出报表为文本文件 -- 刷新获取最新分析 - -## API接口 - -### 1. 分析生产数据 -``` -POST /api/ai/analyze -``` - -响应示例: -```json -{ - "summary": { - "totalProduction": 15423, - "goodRate": "98.5%", - "trend": "up", - "insights": [ - "本周产量较上周增长12%,主要得益于圆通订单的增加", - "良品率保持在98%以上,质量管控效果显著", - "建议:继续保持当前生产节奏,关注设备维护" - ] - }, - "platforms": { - "pdd": { - "count": 8934, - "percentage": 57.9, - "trend": "+5.2%" - }, - "yt": { - "count": 6489, - "percentage": 42.1, - "trend": "+18.7%" - } - }, - "quality": { - "topIssues": [ - {"issue": "外观划痕", "count": 23, "percentage": "0.15%"}, - {"issue": "功能异常", "count": 12, "percentage": "0.08%"}, - {"issue": "包装破损", "count": 8, "percentage": "0.05%"} - ] - }, - "prediction": { - "tomorrow": 2250, - "weekRange": "15500-16500", - "confidence": "92%" - }, - "metadata": { - "generated_at": "2024-01-20T10:30:00", - "data_period": "最近30天", - "total_records": 15423, - "ai_provider": "openai" - } -} -``` - -### 2. 获取AI配置信息 -``` -GET /api/ai/config -``` - -### 3. 测试AI连接 -``` -POST /api/ai/test -``` - -### 4. 获取支持的提供商 -``` -GET /api/ai/providers -``` - -## 注意事项 - -1. **API密钥安全**:请妥善保管API密钥,不要提交到版本控制 -2. **成本控制**:使用云端AI服务会产生费用,建议设置使用限额 -3. **响应时间**:AI分析可能需要几秒钟,请耐心等待 -4. **数据隐私**:生产数据会发送给AI服务,请确保符合隐私政策 - -## 故障排除 - -### 1. AI分析失败 -- 检查API密钥是否正确 -- 确认网络连接正常 -- 查看后端日志获取详细错误信息 - -### 2. 本地模型连接失败 -- 确认Ollama服务正在运行 -- 检查模型是否已下载 -- 验证URL配置是否正确 - -### 3. 分析结果不准确 -- 调整提示词(修改ai_service.py中的prompt) -- 尝试不同的AI模型 -- 增加数据量或改进数据质量 - -## 扩展功能 - -1. **自定义分析维度**:可以修改提示词,添加更多分析维度 -2. **定时生成报表**:可以设置定时任务,自动生成日报/周报 -3. **报表模板**:支持多种报表格式(PDF、Excel等) -4. **历史记录**:保存历史分析结果,支持对比查看 - -## 技术支持 - -如有问题,请查看: -1. 后端日志:`/logs/ai_service.log` -2. 浏览器控制台错误信息 -3. API响应状态和错误消息 diff --git a/FIX_SUMMARY.md b/FIX_SUMMARY.md deleted file mode 100644 index 648cebc..0000000 --- a/FIX_SUMMARY.md +++ /dev/null @@ -1,45 +0,0 @@ -# 🎯 问题修复总结 - -## 问题描述 -计算铨宝采购需求时,期初库存显示的是友辉的数据。例如: -- 铨宝的"6*6*7.5支架 TS-1166VW"期初库存应该是 0,但显示 995(友辉的库存) -- 铨宝的"0402B102K500NT"期初库存应该是 0,但显示 1243(友辉的库存) - -## 根本原因 -**`/api/purchase-demand/recalculate` 接口**在查询期初库存时,只用了 `material_code`,没有按 `factory` 过滤: - -```python -# 错误的查询(第7408行) -c.execute('SELECT stock_qty, min_package as stock_min_package FROM initial_stock WHERE material_code=?', (material_code,)) -``` - -当友辉和铨宝有相同的物料编码时,这个查询会返回第一个匹配的记录(通常是友辉的),导致铨宝的采购需求使用了友辉的库存数据。 - -## 修复方案 -在查询时添加工厂过滤条件: - -```python -# 正确的查询(第7409行) -factory = item['factory'] or '友辉' # 从采购需求记录中获取工厂字段 -c.execute('SELECT stock_qty, min_package as stock_min_package FROM initial_stock WHERE material_code=? AND factory=?', (material_code, factory)) -``` - -## 已修复的接口 -1. ✅ `/api/purchase-demand/calculate` - 计算单个产品采购需求 -2. ✅ `/api/purchase-demand/calculate-all` - 计算所有产品采购需求 -3. ✅ `/api/purchase-demand/calculate-from-orders` - 从客户订单计算采购需求 -4. ✅ `/api/purchase-demand/recalculate` - 重新计算现有采购需求(**这个是你使用的接口**) - -## 验证步骤 -1. 重启服务器:`systemctl restart prod-mgmt` -2. 在前端选择"铨宝"工厂 -3. 选择产品(如"AP05商超")并输入数量 -4. 点击"重新计算" -5. 检查采购需求列表中的期初库存字段: - - 铨宝的"6*6*7.5支架 TS-1166VW"应该显示 0 ✅ - - 铨宝的"0402B102K500NT"应该显示 0 ✅ - - 铨宝的"0402B104K160NT"应该显示 30124 ✅ - -## 其他修复 -- ✅ 期初库存导入:支持同一物料在不同工厂独立存在 -- ✅ 数据备份恢复:导入/删除前自动备份,可一键恢复 diff --git a/RESTART_REQUIRED.md b/RESTART_REQUIRED.md deleted file mode 100644 index 1e60367..0000000 --- a/RESTART_REQUIRED.md +++ /dev/null @@ -1,43 +0,0 @@ -# 🔄 需要重启服务器 - -## 修复内容 - -已修复以下问题: - -### 1. 期初库存导入 -- ✅ 支持同一物料编码在不同工厂独立存在 -- ✅ 导入时按 `(material_code, factory)` 组合检查是否存在 - -### 2. 采购需求计算 -- ✅ `calculate_purchase_demand` - 添加工厂参数,按工厂匹配期初库存 -- ✅ `calculate_all_purchase_demand` - 添加工厂参数,按工厂匹配期初库存 -- ✅ `calculate_purchase_demand_from_orders` - 修复INSERT语句字段顺序,factory字段放在最后 - -### 3. 数据备份恢复 -- ✅ 导入Excel前自动备份 -- ✅ 批量删除前自动备份 -- ✅ 恢复数据前自动备份 -- ✅ 前端添加"📦 数据恢复"功能 - -## 重启后需要做的事 - -1. **删除错误的采购需求记录** - - 需求单 D20260401105945062 及其他使用旧代码生成的记录 - - 这些记录的期初库存字段不正确 - -2. **重新计算采购需求** - - 使用修复后的代码重新计算 - - 验证期初库存字段正确匹配工厂 - -3. **验证修复效果** - - 铨宝的"6*6*7.5支架 TS-1166VW"期初库存应该是 0 - - 友辉的"6*6*7.5支架 TS-1166VW"期初库存应该是 995 - -## 如何重启 - -```bash -cd /home/hyx/work/生产管理系统 -# 停止当前服务器(Ctrl+C 或 kill 进程) -# 然后重新启动 -python3 server/app.py -``` diff --git a/add_customer_name_column.py b/add_customer_name_column.py deleted file mode 100755 index fe5aaef..0000000 --- a/add_customer_name_column.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -为 customer_orders 表添加 customer_name 列 -""" - -import sqlite3 -import os - -# 数据库路径 -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -DB_PATH = os.path.join(BASE_DIR, 'server', 'data.db') - -def add_column(): - """添加 customer_name 列""" - if not os.path.exists(DB_PATH): - print(f"错误: 数据库文件不存在: {DB_PATH}") - return - - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - try: - # 尝试添加列 - c.execute('ALTER TABLE customer_orders ADD COLUMN customer_name TEXT') - conn.commit() - print("成功添加 customer_name 列") - except Exception as e: - if 'duplicate column name' in str(e).lower(): - print("customer_name 列已存在") - else: - print(f"添加列失败: {e}") - - conn.close() - -if __name__ == '__main__': - add_column() diff --git a/backend/__pycache__/ai_service.cpython-312.pyc b/backend/__pycache__/ai_service.cpython-312.pyc new file mode 100755 index 0000000000000000000000000000000000000000..8283f48f84e4bd19c3868a21b2f7b3da6192c3ce GIT binary patch literal 26821 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 Tp_hz++=ka^(^vQ+ #sidebar .topnav{flex:1;min-height:0;overflow:visible;padding-right:2px} #app.trackit-layout > #sidebar .sidebar-footer{margin-top:auto;display:flex;flex-direction:column;gap:12px} - #app.trackit-layout > #sidebar .sidebar-actions{display:flex;align-items:center;justify-content:flex-end;gap:14px;padding:12px 6px 2px;border-top:1px solid rgba(226,232,240,.85)} + #app.trackit-layout > #sidebar .sidebar-user-top{display:flex;align-items:center;padding:10px 6px 8px;border-bottom:1px solid rgba(226,232,240,.85);margin-bottom:4px;width:100%} + [data-theme="dark"] #app.trackit-layout > #sidebar .sidebar-user-top{border-bottom-color:rgba(255,255,255,.08)} + #app.trackit-layout > #sidebar .sidebar-user-top .user-avatar-btn{display:flex;align-items:center;gap:8px;background:none;border:none;cursor:pointer;padding:4px 6px;border-radius:8px;transition:background 0.2s;width:100%} + #app.trackit-layout > #sidebar .sidebar-user-top .user-avatar-btn:hover{background:rgba(79,140,255,0.1)} + #app.trackit-layout > #sidebar .sidebar-user-top .user-avatar-img{width:32px;height:32px;border-radius:50%;flex-shrink:0} + #app.trackit-layout > #sidebar .sidebar-user-top .user-name-display{color:var(--text);font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} + #app.trackit-layout > #sidebar .sidebar-user-top .user-dropdown{position:absolute;top:calc(100% + 4px);left:0;bottom:auto;min-width:160px;background:var(--surface);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,0.3);z-index:1000} + #app.trackit-layout > #sidebar .sidebar-actions{display:flex;align-items:center;justify-content:flex-start;gap:14px;padding:12px 6px 2px;border-top:1px solid rgba(226,232,240,.85)} [data-theme="dark"] #app.trackit-layout > #sidebar .sidebar-actions{border-top:1px solid rgba(255,255,255,.08)} - #app.trackit-layout > #sidebar .sidebar-actions .notification-bell-btn{position:relative;background:none;border:none;cursor:pointer;padding:6px;border-radius:10px;display:flex;align-items:center;justify-content:center;transition:all 0.2s ease;color:var(--text-2)} + #app.trackit-layout > #sidebar .sidebar-actions .notification-bell-btn{position:relative;background:none;border:none;cursor:pointer;padding:6px;border-radius:10px;display:flex;align-items:center;justify-content:center;transition:all 0.2s ease;color:var(--text-2);margin-left:auto} #app.trackit-layout > #sidebar .sidebar-actions .notification-bell-btn:hover{background:rgba(79,140,255,0.1);color:var(--primary)} #app.trackit-layout > #sidebar .sidebar-actions .notification-bell-btn .notification-badge{position:absolute;top:-2px;right:-2px;background:var(--danger);color:#fff;border-radius:10px;padding:2px 6px;font-size:10px;font-weight:700;min-width:18px;text-align:center;line-height:1.2;box-shadow:0 2px 4px rgba(239,68,68,0.3)} #app.trackit-layout > #sidebar .sidebar-actions .user-avatar-btn{padding:0;opacity:1} diff --git a/frontend/index.html b/frontend/index.html index 4489079..0b8bf2b 100755 --- a/frontend/index.html +++ b/frontend/index.html @@ -266,13 +266,6 @@ -
+ diff --git a/frontend/js/components/ai-report.js.bak b/frontend/js/components/ai-report.js.bak new file mode 100755 index 0000000..23a7ebd --- /dev/null +++ b/frontend/js/components/ai-report.js.bak @@ -0,0 +1,494 @@ +const AIReport = (() => { + // 添加样式 + const addStyles = () => { + if (document.getElementById('ai-report-styles')) return; + + const style = document.createElement('style'); + style.id = 'ai-report-styles'; + style.textContent = ` + @keyframes spin { + to { transform: rotate(360deg); } + } + @keyframes fadeIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } + } + @keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } + } + @keyframes aiPulse { + 0%, 100% { transform: scale(1); opacity: 1; } + 50% { transform: scale(1.1); opacity: 0.8; } + } + .thinking-content > div:last-child::after { + content: ''; + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + width: 6px; + height: 6px; + background: #667eea; + border-radius: 50%; + animation: pulse 1.5s infinite; + } + `; + document.head.appendChild(style); + }; + return ` +
+ +
+
+ + + +
+
+ + +
+ + 🤖 智能报表 + +
+ + +
+ +
+
+ + + +
+
点击生成智能报表
+
AI将为您分析生产数据并生成洞察
+
+ + + + + + + + + +
+ + +
+
+ +
+
+ + +
+
+
+ `; + }; + + // 生成报表 + const generateReport = async () => { + const placeholderEl = document.getElementById('ai-report-placeholder'); + const loadingEl = document.getElementById('ai-report-loading'); + const resultEl = document.getElementById('ai-report-result'); + const thinkingEl = document.getElementById('ai-report-thinking'); + const timeEl = document.getElementById('ai-report-time'); + + // 显示加载状态 + if(placeholderEl) placeholderEl.style.display = 'none'; + if(loadingEl) loadingEl.style.display = 'flex'; + if(resultEl) resultEl.style.display = 'none'; + + // 显示思考过程容器 + if(thinkingEl) thinkingEl.style.display = 'block'; + + // 模拟思考过程的逐步展示 + const showThinkingProcess = () => { + const thinkingSteps = [ + { title: '数据概览', content: '正在读取最近30天的生产数据...', delay: 500 }, + { title: '数据概览', content: '发现总产量数据,正在分析良品率...', delay: 800 }, + { title: '规律发现', content: '正在分析平台分布规律...', delay: 1200 }, + { title: '规律发现', content: '发现产量趋势,正在计算增长率...', delay: 1600 }, + { title: '原因推断', content: '正在分析质量问题和根本原因...', delay: 2000 }, + { title: '结论形成', content: '正在生成生产建议和预测...', delay: 2400 }, + { title: '结论形成', content: '整合分析结果,准备输出报告...', delay: 2800 } + ]; + + let currentStep = 0; + const thinkingContent = thinkingEl.querySelector('.thinking-content') || thinkingEl; + + const updateThinking = () => { + if (currentStep < thinkingSteps.length) { + const step = thinkingSteps[currentStep]; + const stepHtml = ` +
+
+ ${currentStep + 1}. ${step.title} +
+
+ ${step.content} +
+
+ `; + + if (currentStep === 0) { + thinkingContent.innerHTML = stepHtml; + } else { + thinkingContent.innerHTML += stepHtml; + } + + currentStep++; + setTimeout(updateThinking, step.delay); + } + }; + + updateThinking(); + }; + + // 开始展示思考过程 + showThinkingProcess(); + + try { + // 调用后端AI分析API + const response = await fetch('/api/ai/analyze', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + } + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const reportData = await response.json(); + + // 隐藏加载和思考过程 + if(loadingEl) loadingEl.style.display = 'none'; + if(thinkingEl) thinkingEl.style.display = 'none'; + + // 渲染报表 + renderReport(reportData); + + // 更新时间 + const now = new Date(); + timeEl.textContent = `更新于 ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`; + + } catch (error) { + console.error('生成报表失败:', error); + + // 如果API调用失败,使用模拟数据作为后备 + try { + console.log('使用模拟数据作为后备...'); + const reportData = await analyzeProductionData(); + + // 隐藏加载和思考过程 + if(loadingEl) loadingEl.style.display = 'none'; + if(thinkingEl) thinkingEl.style.display = 'none'; + + renderReport(reportData); + + const now = new Date(); + timeEl.textContent = `更新于 ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')} (模拟)`; + } catch (fallbackError) { + console.error('模拟数据也失败:', fallbackError); + if(loadingEl) loadingEl.style.display = 'none'; + if(thinkingEl) thinkingEl.style.display = 'none'; + if(resultEl) { + resultEl.style.display = 'block'; + resultEl.innerHTML = ` +
+
😞
+
生成失败
+
请检查AI服务配置或稍后重试
+ +
+ `; + } + } + } + }; + + // 模拟AI分析数据 + const analyzeProductionData = async () => { + // 这里应该调用实际的AI API + // 现在返回模拟数据 + return { + summary: { + totalProduction: 15423, + goodRate: '98.5%', + trend: 'up', + insights: [ + '本周产量较上周增长12%,主要得益于圆通订单的增加', + '良品率保持在98%以上,质量管控效果显著', + '建议:继续保持当前生产节奏,关注设备维护' + ] + }, + platforms: { + pdd: { count: 8934, percentage: 57.9, trend: '+5.2%' }, + yt: { count: 6489, percentage: 42.1, trend: '+18.7%' } + }, + quality: { + topIssues: [ + { issue: '外观划痕', count: 23, percentage: '0.15%' }, + { issue: '功能异常', count: 12, percentage: '0.08%' }, + { issue: '包装破损', count: 8, percentage: '0.05%' } + ] + }, + prediction: { + tomorrow: 2250, + weekRange: '15500-16500', + confidence: '92%' + } + }; + }; + + // 渲染报表内容 + const renderReport = (data) => { + const loadingEl = document.getElementById('ai-report-loading'); + const resultEl = document.getElementById('ai-report-result'); + + if(loadingEl) loadingEl.style.display = 'none'; + + // 格式化思考过程 + const formatThinking = (thinking) => { + if (!thinking) return ''; + + // 按步骤分割 + const steps = thinking.split(/第[一二三四五]步[::]/).filter(s => s.trim()); + const stepTitles = ['数据概览', '规律发现', '原因推断', '结论形成']; + + let html = ''; + steps.forEach((step, index) => { + if (step.trim()) { + html += ` +
+
+ ${index + 1}. ${stepTitles[index] || `步骤${index + 1}`} +
+
+ ${step.trim()} +
+
+ `; + } + }); + + return html; + }; + + const html = ` +
+ + ${data.thinking ? ` +
+

+ 🤔 AI思考过程 + 了解AI如何分析数据 +

+
+ ${formatThinking(data.thinking)} +
+
+ ` : ''} + + +
+

📊 生产总览

+
+
+
总产量
+
${data.summary.totalProduction.toLocaleString()}
+
${data.summary.trend === 'up' ? '↑' : '↓'} vs 上周
+
+
+
良品率
+
${data.summary.goodRate}
+
稳定
+
+
+
+ + +
+

📈 平台分布

+
+
+ +
+
+ 拼多多 + ${data.platforms.pdd.count.toLocaleString()} (${data.platforms.pdd.percentage}%) +
+
+
+
+
+
+
+ +
+
+ 圆通 + ${data.platforms.yt.count.toLocaleString()} (${data.platforms.yt.percentage}%) +
+
+
+
+
+
+
+
+ + +
+

🔍 质量分析

+
主要不良项:
+ ${data.quality.topIssues.map(issue => ` +
+ ${issue.issue} + ${issue.count} (${issue.percentage}) +
+ `).join('') || '
暂无不良记录
'} +
+ + +
+

💡 AI洞察

+
    + ${data.summary.insights.map(insight => `
  • ${insight}
  • `).join('')} +
+
+ + +
+

🎯 产量预测

+
+
+
明日预测
+
${data.prediction.tomorrow.toLocaleString()}
+
+
+
本周范围
+
${data.prediction.weekRange}
+
+
+
置信度: ${data.prediction.confidence}
+
+
+ `; + + if(resultEl) { + resultEl.innerHTML = html; + resultEl.style.display = 'block'; + } + }; + + // 导出报表 + const exportReport = () => { + const content = document.getElementById('ai-report-result'); + if (!content || content.style.display === 'none') { + alert('请先生成报表'); + return; + } + + // 创建导出内容 + const text = content.innerText; + const blob = new Blob([`智能生产报表\n\n生成时间: ${new Date().toLocaleString()}\n\n${text}`], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `智能报表_${new Date().toISOString().slice(0, 10)}.txt`; + a.click(); + URL.revokeObjectURL(url); + }; + + // 刷新报表 + const refreshReport = () => { + generateReport(); + }; + + // 添加CSS动画 + const addStyles = () => { + if (document.getElementById('ai-report-styles')) return; + + const style = document.createElement('style'); + style.id = 'ai-report-styles'; + style.textContent = ` + @keyframes fadeIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } + } + @keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } + } + .thinking-content > div:last-child { + position: relative; + } + .thinking-content > div:last-child::after { + content: ''; + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + width: 6px; + height: 6px; + background: #667eea; + border-radius: 50%; + animation: pulse 1.5s infinite; + } + @keyframes aiPulse { + 0%, 100% { transform: scale(1); opacity: 1; } + 50% { transform: scale(1.1); opacity: 0.8; } + } + @keyframes spin { + to { transform: rotate(360deg); } + } + .ai-pulse { + box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.4); + } + `; + document.head.appendChild(style); + }; + +// ... + // 初始化 + const init = () => { + addStyles(); + }; + + // 暴露方法 + return { + init, + generateReport, + exportReport, + refreshReport, + generateAICard + }; +})(); + +// 初始化 +AIReport.init(); diff --git a/frontend/js/components/upload.js b/frontend/js/components/upload.js index 7cb5bab..d83db89 100755 --- a/frontend/js/components/upload.js +++ b/frontend/js/components/upload.js @@ -224,6 +224,7 @@ const Upload = (() => {
+
@@ -963,27 +964,44 @@ const Upload = (() => { // 文件选择后立即验证 addListener(fileEl, 'change', async ()=>{ const file = fileEl.files[0]; - if(!file) return; + const statusEl = document.getElementById('mac-file-status'); + if(!file) { + if(statusEl) statusEl.style.display = 'none'; + return; + } + + // 立即显示文件名,避免用户以为文件消失 + if(statusEl) { + statusEl.style.display = 'block'; + statusEl.style.color = 'var(--text-secondary)'; + statusEl.textContent = `已选择: ${file.name}(验证中...)`; + } try{ const formData = new FormData(); formData.append('file', file); const res = await fetch('/api/validate/mac-file', { method: 'POST', + credentials: 'include', body: formData }); + if(!res.ok){ + if(statusEl) { statusEl.style.color = 'var(--warning, #f59e0b)'; statusEl.textContent = `已选择: ${file.name}(验证接口异常,可直接上传)`; } + return; + } const result = await res.json(); if(!result.valid){ + if(statusEl) { statusEl.style.color = '#ef4444'; statusEl.textContent = `格式错误: ${result.message || '文件格式不正确'}`; } API.toast(result.message || '文件格式不正确'); fileEl.value = ''; return; } + if(statusEl) { statusEl.style.color = '#10b981'; statusEl.textContent = `✓ ${file.name}(${result.message || '验证通过'})`; } API.toast(result.message || '文件验证通过'); }catch(e){ - API.toast('文件验证失败'); - fileEl.value = ''; + if(statusEl) { statusEl.style.color = 'var(--warning, #f59e0b)'; statusEl.textContent = `已选择: ${file.name}(验证异常,可直接上传)`; } } }); diff --git a/frontend/login.html.bak b/frontend/login.html.bak new file mode 100755 index 0000000..ad1999e --- /dev/null +++ b/frontend/login.html.bak @@ -0,0 +1,268 @@ + + + + + +登录 - 韬智生产管理系统 + + + + + + + + + + + + diff --git a/import_reconciliation_excel.py b/import_reconciliation_excel.py deleted file mode 100755 index 867940a..0000000 --- a/import_reconciliation_excel.py +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""从Excel导入对账单数据""" - -import pandas as pd -import sqlite3 -import os -from datetime import datetime, timezone, timedelta - -# 数据库路径 -DB_PATH = os.path.join(os.path.dirname(__file__), 'server', 'data.db') -EXCEL_FILE = '25年11月份对账单-易泰勒.xlsx' - -def get_beijing_time(): - """获取北京时间(UTC+8)的ISO格式字符串""" - beijing_tz = timezone(timedelta(hours=8)) - return datetime.now(beijing_tz).isoformat() - -def import_from_excel(): - """从Excel导入对账单数据""" - # 读取Excel文件 - df = pd.read_excel(EXCEL_FILE) - - # 打印前20行查看结构 - print("Excel文件结构:") - print("=" * 80) - for i in range(min(20, len(df))): - print(f"第{i}行: {df.iloc[i].tolist()}") - print("=" * 80) - - # 查找表头行(包含"序号"的行) - header_row = None - for i in range(len(df)): - row_values = df.iloc[i].tolist() - if any(str(val).strip() == '序号' for val in row_values if pd.notna(val)): - header_row = i - print(f"\n找到表头行: 第{i}行") - print(f"表头内容: {row_values}") - break - - if header_row is None: - print("❌ 未找到表头行(包含'序号'的行)") - return - - # 重新读取,跳过前面的行,使用找到的行作为表头 - df = pd.read_excel(EXCEL_FILE, skiprows=header_row) - - # 设置第一行为列名 - df.columns = df.iloc[0] - df = df[1:] # 删除第一行(已经作为列名) - df = df.reset_index(drop=True) - - print(f"\n数据形状: {df.shape}") - print(f"列名: {df.columns.tolist()}") - print(f"\n前5行数据:") - print(df.head()) - - # 连接数据库 - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - now = get_beijing_time() - imported_count = 0 - - # 遍历数据行 - for idx, row in df.iterrows(): - # 跳过空行或无效行 - if pd.isna(row.get('序号')): - continue - - try: - # 提取数据 - # 处理日期格式 - def format_date(date_val): - if pd.isna(date_val): - return '' - if isinstance(date_val, datetime): - return date_val.strftime('%Y/%m/%d') - date_str = str(date_val).strip() - # 如果已经是 YYYY/MM/DD 格式,保持不变 - if '/' in date_str: - return date_str - # 如果是 YYYY-MM-DD 格式,转换为 YYYY/MM/DD - if '-' in date_str: - return date_str.split()[0].replace('-', '/') - return date_str - - order_date = format_date(row.get('下单时间')) - contract_no = str(row.get('合同编号', '')).strip() if pd.notna(row.get('合同编号')) else '' - material_name = str(row.get('物料名称', '')).strip() if pd.notna(row.get('物料名称')) else '' - spec_model = str(row.get('规格型号', '')).strip() if pd.notna(row.get('规格型号')) else '' - transport_no = str(row.get('运输单号', '')).strip() if pd.notna(row.get('运输单号')) else '' - quantity = int(row.get('数量', 0)) if pd.notna(row.get('数量')) else 0 - unit = str(row.get('单位', 'pcs')).strip() if pd.notna(row.get('单位')) else 'pcs' - unit_price = float(row.get('含税单价', 0)) if pd.notna(row.get('含税单价')) else 0.0 - total_amount = float(row.get('含税金额', 0)) if pd.notna(row.get('含税金额')) else 0.0 - delivery_date = format_date(row.get('交货日期')) - shipment_date = format_date(row.get('出货日期')) - - # 验证必填字段 - if not all([order_date, contract_no, material_name, spec_model, quantity, unit, unit_price]): - print(f"⚠️ 跳过第{idx+1}行: 缺少必填字段") - continue - - # 插入数据库 - c.execute(''' - INSERT INTO reconciliations( - order_date, contract_no, material_name, spec_model, transport_no, - quantity, unit, unit_price, total_amount, delivery_date, shipment_date, - created_by, created_at, updated_at - ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?) - ''', ( - order_date, - contract_no, - material_name, - spec_model, - transport_no, - quantity, - unit, - unit_price, - total_amount, - delivery_date, - shipment_date, - 'admin', - now, - now - )) - - imported_count += 1 - print(f"✅ 导入第{idx+1}行: {contract_no} - {material_name}") - - except Exception as e: - print(f"❌ 导入第{idx+1}行失败: {e}") - continue - - conn.commit() - conn.close() - - print(f"\n{'='*80}") - print(f"✅ 成功导入 {imported_count} 条对账单数据") - print(f"{'='*80}") - -if __name__ == '__main__': - import_from_excel() diff --git a/init_customer_orders.py b/init_customer_orders.py deleted file mode 100755 index 86829f7..0000000 --- a/init_customer_orders.py +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -初始化客户订单数据 -根据图片中的数据填充客户订单表 -""" - -import sqlite3 -import os -from datetime import datetime, timezone, timedelta - -# 数据库路径 -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -DB_PATH = os.path.join(BASE_DIR, 'server', 'data.db') - -def get_beijing_time(): - """获取北京时间(UTC+8)的ISO格式字符串""" - beijing_tz = timezone(timedelta(hours=8)) - return datetime.now(beijing_tz).isoformat() - -# 从图片中提取的订单数据 - 客户:易泰勒 -orders_data = [ - # 2025/4/28 - CGDD001695 - {'order_date': '2025-04-28', 'order_no': 'CGDD001695', 'customer_name': '易泰勒', 'material': 'ETAP05\n基站-5.0\nETAP05', 'quantity': 950, 'unit_price': 315.19}, - {'order_date': '2025-04-28', 'order_no': 'CGDD001695', 'customer_name': '易泰勒', 'material': 'WD1MK0SMD0551\n蓝牙模块\nPCBCOMPONENT_1_-_DUPLICATE', 'quantity': 950, 'unit_price': 1.3}, - {'order_date': '2025-04-28', 'order_no': 'CGDD001695', 'customer_name': '易泰勒', 'material': 'WA0000000040\nPCBA\nCH6121-MODULE-V14', 'quantity': 4750, 'unit_price': 8.05}, - - # 2025/9/4 - CGDD002429 - {'order_date': '2025-09-04', 'order_no': 'CGDD002429', 'customer_name': '易泰勒', 'material': 'ETAP05\n基站-5.0\nETAP05', 'quantity': 1500, 'unit_price': 315.19}, - {'order_date': '2025-09-04', 'order_no': 'CGDD002429', 'customer_name': '易泰勒', 'material': 'WD1MK0SMD0551\n蓝牙模块\nPCBCOMPONENT_1_-_DUPLICATE', 'quantity': 1500, 'unit_price': 1.3}, - {'order_date': '2025-09-04', 'order_no': 'CGDD002429', 'customer_name': '易泰勒', 'material': 'WA0000000040\nPCBA\nCH6121-MODULE-V14', 'quantity': 7500, 'unit_price': 8.05}, - {'order_date': '2025-09-04', 'order_no': 'CGDD002429', 'customer_name': '易泰勒', 'material': 'AP-ET010\n基站-5.0\nETAP05', 'quantity': 500, 'unit_price': 315.19}, - {'order_date': '2025-09-04', 'order_no': 'CGDD002429', 'customer_name': '易泰勒', 'material': 'WD1MK0SMD0551\n蓝牙模块\nPCBCOMPONENT_1_-_DUPLICATE', 'quantity': 500, 'unit_price': 1.3}, - {'order_date': '2025-09-04', 'order_no': 'CGDD002429', 'customer_name': '易泰勒', 'material': 'WA0000000040\nPCBA\nCH6121-MODULE-V14', 'quantity': 2500, 'unit_price': 8.05}, - - # 2025/10/23 - CGDD002878 - {'order_date': '2025-10-23', 'order_no': 'CGDD002878', 'customer_name': '易泰勒', 'material': 'AP-DZ006\n智能灯条基站\nETAP05-D1', 'quantity': 4000, 'unit_price': 239.2}, - {'order_date': '2025-10-23', 'order_no': 'CGDD002878', 'customer_name': '易泰勒', 'material': 'WD1MK0SMD0551\n蓝牙模块\nPCBCOMPONENT_1_-_DUPLICATE', 'quantity': 12000, 'unit_price': 1.1}, - - # 2025/11/13 - CGDD003037 - {'order_date': '2025-11-13', 'order_no': 'CGDD003037', 'customer_name': '易泰勒', 'material': 'AP-DZ009\n智能灯条基站\nETAP05-D1', 'quantity': 500, 'unit_price': 229.61}, - {'order_date': '2025-11-13', 'order_no': 'CGDD003037', 'customer_name': '易泰勒', 'material': 'WD1MK0SMD0551\n蓝牙模块\nPCBCOMPONENT_1_-_DUPLICAT', 'quantity': 1500, 'unit_price': 1.1}, - {'order_date': '2025-11-13', 'order_no': 'CGDD003037', 'customer_name': '易泰勒', 'material': 'AP-DZ006\n智能灯条基站\nETAP05-D1', 'quantity': 4000, 'unit_price': 239.2}, - {'order_date': '2025-11-13', 'order_no': 'CGDD003037', 'customer_name': '易泰勒', 'material': 'WD1MK0SMD0551\n蓝牙模块\nPCBCOMPONENT_1_-_DUPLICATE', 'quantity': 12000, 'unit_price': 1.1}, -] - -def init_orders(): - """初始化客户订单数据""" - if not os.path.exists(DB_PATH): - print(f"错误: 数据库文件不存在: {DB_PATH}") - return - - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - # 检查表是否存在 - c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='customer_orders'") - if not c.fetchone(): - print("错误: customer_orders 表不存在,请先运行服务器以创建表") - conn.close() - return - - # 清空现有数据(可选) - c.execute('DELETE FROM customer_orders') - print("已清空现有订单数据") - - # 插入新数据 - now = get_beijing_time() - inserted_count = 0 - - for order in orders_data: - try: - c.execute('''INSERT INTO customer_orders( - order_date, order_no, customer_name, material, quantity, unit_price, - created_by, created_at, updated_at - ) VALUES(?,?,?,?,?,?,?,?,?)''', ( - order['order_date'], - order['order_no'], - order['customer_name'], - order['material'], - order['quantity'], - order['unit_price'], - 'admin', # 创建者 - now, - now - )) - inserted_count += 1 - except Exception as e: - print(f"插入订单失败: {order['order_no']} - {e}") - - conn.commit() - conn.close() - - print(f"成功插入 {inserted_count} 条订单数据") - -if __name__ == '__main__': - init_orders() diff --git a/init_reconciliations.py b/init_reconciliations.py deleted file mode 100755 index ad6fa77..0000000 --- a/init_reconciliations.py +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""初始化对账单示例数据""" - -import sqlite3 -import os -from datetime import datetime, timezone, timedelta - -# 数据库路径 -DB_PATH = os.path.join(os.path.dirname(__file__), 'server', 'data.db') - -def get_beijing_time(): - """获取北京时间(UTC+8)的ISO格式字符串""" - beijing_tz = timezone(timedelta(hours=8)) - return datetime.now(beijing_tz).isoformat() - -def init_reconciliations(): - """初始化对账单示例数据""" - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - # 示例数据(根据图片中的数据) - sample_data = [ - { - 'order_date': '2025/10/31', - 'contract_no': 'CGDD002876', - 'material_name': '扩产-9988 红黑线', - 'spec_model': 'PCXK0P0NSNT_1_2.54*1C14TE', - 'transport_no': '快递上门', - 'quantity': 45, - 'unit': 'pcs', - 'unit_price': 239.2, - 'total_amount': 10764, - 'delivery_date': '2025/11/3', - 'shipment_date': '2025/11/3' - }, - { - 'order_date': '2025/9/20', - 'contract_no': 'CGDD004562', - 'material_name': '扩产-9988 红黑线', - 'spec_model': 'M1H0EM0N511 PCXK0P0NSNT_1_2.54*1C14TE', - 'transport_no': '快递上门', - 'quantity': 355, - 'unit': 'pcs', - 'unit_price': 1.1, - 'total_amount': 390.5, - 'delivery_date': '2025/11/3', - 'shipment_date': '2025/11/3' - }, - { - 'order_date': '2025/9/20', - 'contract_no': 'CGDD004562', - 'material_name': '扩产-9988 红黑线', - 'spec_model': 'ETAP05-01', - 'transport_no': '快递上门', - 'quantity': 2, - 'unit': 'pcs', - 'unit_price': 245.46, - 'total_amount': 490.92, - 'delivery_date': '2025/11/3', - 'shipment_date': '2025/11/3' - }, - { - 'order_date': '2025/9/20', - 'contract_no': 'CGDD004562', - 'material_name': 'M1H0EM0N511 红黑线', - 'spec_model': 'PCXK0P0NSNT_1_2.54*1C14TE', - 'transport_no': '快递上门', - 'quantity': 6, - 'unit': 'pcs', - 'unit_price': 1.1, - 'total_amount': 6.6, - 'delivery_date': '2025/11/3', - 'shipment_date': '2025/11/3' - }, - { - 'order_date': '2025/10/11', - 'contract_no': 'CGDD002717', - 'material_name': '扩产-9988 红黑线', - 'spec_model': 'ETAP05-01', - 'transport_no': '快递上门', - 'quantity': 500, - 'unit': 'pcs', - 'unit_price': 228.45, - 'total_amount': 114225, - 'delivery_date': '2025/11/3', - 'shipment_date': '2025/11/3' - } - ] - - now = get_beijing_time() - - for data in sample_data: - c.execute(''' - INSERT INTO reconciliations( - order_date, contract_no, material_name, spec_model, transport_no, - quantity, unit, unit_price, total_amount, delivery_date, shipment_date, - created_by, created_at, updated_at - ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?) - ''', ( - data['order_date'], - data['contract_no'], - data['material_name'], - data['spec_model'], - data['transport_no'], - data['quantity'], - data['unit'], - data['unit_price'], - data['total_amount'], - data['delivery_date'], - data['shipment_date'], - 'admin', - now, - now - )) - - conn.commit() - count = len(sample_data) - conn.close() - - print(f'✅ 成功初始化 {count} 条对账单示例数据') - -if __name__ == '__main__': - init_reconciliations() diff --git a/server/__pycache__/ai_routes.cpython-312.pyc b/server/__pycache__/ai_routes.cpython-312.pyc new file mode 100755 index 0000000000000000000000000000000000000000..7286403bd428739aeecdabd4f8b6765d97282c8c GIT binary patch literal 21485 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%0D*-52hDc;D#2MeaTl!Q8rsJ2&m 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 literal 0 HcmV?d00001 diff --git a/server/__pycache__/finance_routes.cpython-312.pyc b/server/__pycache__/finance_routes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12365fff536ce40cd2484e6c1b1d2b081aae51d1 GIT binary patch literal 41349 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 X(8eKQyj7F(*c9ONKQqE3`PBX&NO4us literal 0 HcmV?d00001 diff --git a/server/__pycache__/gunicorn_config.cpython-312.pyc b/server/__pycache__/gunicorn_config.cpython-312.pyc new file mode 100755 index 0000000000000000000000000000000000000000..458b408b3835423f45e0dcfa1deb55b1dc7f4fde GIT binary patch literal 1413 zcmc&z&2Jk;6rZ&>>-Da`V#jF;67{8kg%an&CH+8L02Qf4q7u>`SZ#O4&ZO&IGqXaI=KZbEayh$_<2(g|K2NIAx`9+Dc>9QejNs2}{G8 zmBATHhmpm)Wxz0T*2-bS%45?i;G9*2xDw7=lelmhS!G-Vtl$#hRBy6g?!E<^7;koc z>ITf;|LD`fy}OUDZ|rRSWb9u3ZgB1P+k|vxU-#%Tc^Iv)1neSVyWf7f_uE&4+n?-y ze&tbgYwyE*JHLLhd*!;ZmYbi8zlB%l=jZoTNG(*}^If_Jm)yr-?@vg00pPJRD^%(? zgY$3DCq;zllVb?EDVQ0HTo3Ee@Ew2~=n`5Q&ph*Ak`adlE0>fdx%!aYNwO=bhw7=b zYcub~_o?xYv*Ht6d$~jLLhU%OZ>B}s3tCKv1R@RI&6LnMVatRGZA1c>xoWk)PQb6R z7_>=avA5cgbB)2Zn>)YU8r=P6aP{NCk6VMSn~l-hMl0djb_2gjTXUVB$aVrA+D%x; zCLz^}Fos6~BGgxnjWg?KHqNb|+n$>HUi;bj!MLxU7{cWL#1mPiA@y5Nd1A7QSsoyv zgOxxR=7=I&#N2b>p#tEJI~?@5z;Tfm!1!-PzLVq`m-D4}Lx;r&9MN4{q2Xff zX#>}Y?_BT*uBVs@o5j_wE35!Im#J#W=>y;9NhWp#{IfDZ9{f;EPTf~e#}_(VuZoOq zy+p$hdMk+R@8$W(x)T!KtpCO%JhrXDA%tZ-A3hpu>$Hes1=yZ7ou$6kP(&Y zHY!O^2|Q*Y();FQq=N(E&3?8JX`oL(Co>!Yoa#S+Y#Yt|sVU0I7>2r{ycSpOZzh*^ AqW}N^ literal 0 HcmV?d00001 diff --git a/server/app.py b/server/app.py index bf40b2b..9f69965 100755 --- a/server/app.py +++ b/server/app.py @@ -3728,8 +3728,8 @@ def upload_mac_file(): f.save(temp_path) # 调用batch_import.py脚本 - script_path = '/home/hyx/work/生产管理系统/test_py/batch_import.py' - python_path = '/home/hyx/work/.venv/bin/python' + script_path = '/opt/生产管理系统/test_py/batch_import.py' + python_path = '/usr/bin/python3' try: result = subprocess.run( [python_path, script_path, upload_type], diff --git a/server/app.pyc b/server/app.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4c6e7a7853b7db2d51df79a69098b6a18883eb35 GIT binary patch literal 182817 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 literal 0 HcmV?d00001 diff --git a/server/data.db b/server/data.db index f63767c5a327645895adfab2b440165725c7c76d..237d9dcbc15ab2db2ab2a7158d269100bff8dcf4 100644 GIT binary patch delta 15635 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 X{F9AOW2D;$xODh4vj0RelUn~j>`b1i delta 2781 zcmY+`cTkgO90&0CO!1!X+~^$BjB*H;>!yic`Zgq$cdHDYz<^x z_M789Kl~-PKh;tG-Q)_?DbjC7MGn*jOTYT3S-R(+0n%OnRHR?1ze9aB^|z_NMg2|c zZ%}`o`fJo*rT%B?e=;gAJg_4DNE?2j4d2s-EB>iSm#M!*{YC11)L)?fJoV?OKTG`? z>Z_=U-D1%#@(*R92p5QOzBbqkT;Re58KQHFF5N$rc_N%E!Z{+GEy7tM zoGHQ?B1{wEbP-MytKnibLac_0F;WbNHdu~Le$W-a#AFdp@(*RASWOVC@nSVjtj3Df z7;U%<4+;c;0gRyab-)BcV1{4_fl#OmVNegkp*}Q#hR_Ha!)MS0nnE*Z4lST1 zL_jNugeYEU|Ges@_C%PSkvt>L@=T@$tB$w0_}c`_(%R%nqGdggO0sODB!Ue}vJ~^h zT`a9@67K72sj6A9)NYn#yneDJy*9BYTih(hX7PweX~G8EEa`5C-2$zl4Mam*h~W-< z>Q+dUr2#3;7jNS{b2wMgs&hK z2Ekx(zz`S;!(cd!fRQi?M#I-I2FAiT7!MO*B20qGFa@T*U@pw# zX-Vl%ui{X$jLufb>1i0;PQFy*-!4;oL99s{`@&Rvp^8 zV^OM|J7z4K)Jbj0(z8yP*q}t!%&#P>eLn3H`1B+-jh>}Q{=BpLL|fbmIUB`_yQs@~ zdN(z-wtm!I9Yj~hu;rI%DJ3$>|@*#et-05_<4;aS|%>?-VqeXt+O-~b$i zLvWZ+vmYs`);E&u%vjgkh5ymoyH95I+j{?GMKRuo>|I;$cAgRI9VheR2Htjo;SE1I zYWk6_jrMNfGh29zWyN5=A@L>=-fIT&L5(>s>TK>CRxccdaySMRa2zV(1e}CZ{Dze` zn~pz0` - - - - 美团基站测试 - API调试 - - - -

美团基站测试 - API调试

- -
-

服务器状态

- -
点击按钮检查
-

服务器日志:

-

-    
- -
-

基站列表

- -
点击按钮加载
-
- -
-

发送命令

- - - -

-    
- - - - diff --git a/test-xlsx.html b/test-xlsx.html deleted file mode 100755 index dbbc0a1..0000000 --- a/test-xlsx.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - 测试XLSX库 - - -

XLSX库测试

- -
- - - - - diff --git a/test_fix_total_amount.py b/test_fix_total_amount.py deleted file mode 100755 index c64c2b4..0000000 --- a/test_fix_total_amount.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -测试修复含税金额功能 -""" - -import requests -import json - -def test_fix_total_amount(): - """测试修复含税金额API""" - - # API地址 - url = "http://localhost:5000/api/reconciliations/fix-total-amount" - - # 模拟登录(需要先获取session) - login_url = "http://localhost:5000/api/login" - - try: - # 创建会话 - session = requests.Session() - - # 登录 - login_data = { - "username": "admin", - "password": "admin" - } - - print("正在登录...") - login_response = session.post(login_url, json=login_data) - - if login_response.status_code == 200: - print("登录成功!") - - # 调用修复含税金额API - print("\n正在调用修复含税金额API...") - response = session.post(url) - - if response.status_code == 200: - result = response.json() - print(f"\n修复结果:") - print(f"- 状态: {'成功' if result.get('ok') else '失败'}") - print(f"- 修复记录数: {result.get('fixed_count', 0)}") - print(f"- 消息: {result.get('message', '')}") - else: - print(f"API调用失败,状态码: {response.status_code}") - print(f"错误信息: {response.text}") - else: - print(f"登录失败,状态码: {login_response.status_code}") - print(f"错误信息: {login_response.text}") - - except requests.exceptions.ConnectionError: - print("\n错误:无法连接到服务器") - print("请确保生产管理系统正在运行(systemctl start prod-mgmt)") - except Exception as e: - print(f"\n发生错误: {str(e)}") - -if __name__ == '__main__': - print("=== 测试修复含税金额功能 ===\n") - test_fix_total_amount() diff --git a/test_outsourcing_system.py b/test_outsourcing_system.py deleted file mode 100755 index eccfbf5..0000000 --- a/test_outsourcing_system.py +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -委外管理系统测试脚本 -用于验证委外工单、发料、入库等功能是否正常工作 -""" - -import sys -import os - -# 添加server目录到路径 -sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'server')) - -from app import init_db, get_db - -def test_database_tables(): - """测试数据库表是否正确创建""" - print("=" * 60) - print("测试1: 检查数据库表结构") - print("=" * 60) - - # 初始化数据库 - init_db() - - conn = get_db() - c = conn.cursor() - - # 检查委外工单表 - c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='outsourcing_orders'") - if c.fetchone(): - print("✓ 委外工单表 (outsourcing_orders) 创建成功") - else: - print("✗ 委外工单表创建失败") - return False - - # 检查委外发料表 - c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='outsourcing_material_issue'") - if c.fetchone(): - print("✓ 委外发料表 (outsourcing_material_issue) 创建成功") - else: - print("✗ 委外发料表创建失败") - return False - - # 检查委外在制库存表 - c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='outsourcing_wip_stock'") - if c.fetchone(): - print("✓ 委外在制库存表 (outsourcing_wip_stock) 创建成功") - else: - print("✗ 委外在制库存表创建失败") - return False - - # 检查成品入库表 - c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='finished_goods_receipt'") - if c.fetchone(): - print("✓ 成品入库表 (finished_goods_receipt) 创建成功") - else: - print("✗ 成品入库表创建失败") - return False - - conn.close() - print("\n所有数据库表创建成功!\n") - return True - -def test_table_structure(): - """测试表结构是否正确""" - print("=" * 60) - print("测试2: 检查表结构字段") - print("=" * 60) - - conn = get_db() - c = conn.cursor() - - # 检查委外工单表字段 - c.execute("PRAGMA table_info(outsourcing_orders)") - columns = [row[1] for row in c.fetchall()] - required_columns = ['id', 'order_no', 'customer_order_no', 'product_code', - 'product_name', 'production_qty', 'outsourcing_factory', - 'delivery_date', 'status', 'created_by', 'created_at', 'updated_at'] - - print("\n委外工单表字段:") - for col in required_columns: - if col in columns: - print(f" ✓ {col}") - else: - print(f" ✗ {col} (缺失)") - - # 检查委外发料表字段 - c.execute("PRAGMA table_info(outsourcing_material_issue)") - columns = [row[1] for row in c.fetchall()] - required_columns = ['id', 'issue_no', 'outsourcing_order_no', 'material_code', - 'material_name', 'issue_qty', 'unit', 'issue_date', - 'created_by', 'created_at', 'updated_at'] - - print("\n委外发料表字段:") - for col in required_columns: - if col in columns: - print(f" ✓ {col}") - else: - print(f" ✗ {col} (缺失)") - - # 检查成品入库表字段 - c.execute("PRAGMA table_info(finished_goods_receipt)") - columns = [row[1] for row in c.fetchall()] - required_columns = ['id', 'receipt_no', 'outsourcing_order_no', 'product_code', - 'product_name', 'receipt_qty', 'receipt_date', - 'created_by', 'created_at', 'updated_at'] - - print("\n成品入库表字段:") - for col in required_columns: - if col in columns: - print(f" ✓ {col}") - else: - print(f" ✗ {col} (缺失)") - - # 检查委外在制库存表字段 - c.execute("PRAGMA table_info(outsourcing_wip_stock)") - columns = [row[1] for row in c.fetchall()] - required_columns = ['id', 'outsourcing_order_no', 'material_code', - 'material_name', 'wip_qty', 'unit', 'updated_at'] - - print("\n委外在制库存表字段:") - for col in required_columns: - if col in columns: - print(f" ✓ {col}") - else: - print(f" ✗ {col} (缺失)") - - conn.close() - print("\n表结构检查完成!\n") - return True - -def create_test_data(): - """创建测试数据""" - print("=" * 60) - print("测试3: 创建测试数据") - print("=" * 60) - - conn = get_db() - c = conn.cursor() - - try: - # 创建测试BOM数据 - print("\n创建测试BOM数据...") - test_bom = [ - ('AP05', 'AP05物流版', 'R001', '电阻-10K', 1, 'pcs', 100, '供应商A', None, 'system', '2026-03-13', '2026-03-13'), - ('AP05', 'AP05物流版', 'C001', '电容-100uF', 2, 'pcs', 50, '供应商B', None, 'system', '2026-03-13', '2026-03-13'), - ('AP05', 'AP05物流版', 'IC001', '芯片-主控', 1, 'pcs', 1, '供应商C', None, 'system', '2026-03-13', '2026-03-13'), - ] - - for bom in test_bom: - c.execute('''INSERT OR IGNORE INTO bom ( - product_code, product_name, material_code, material_name, - unit_qty, unit, min_package, supplier, remark, - created_by, created_at, updated_at - ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)''', bom) - - print("✓ BOM测试数据创建成功") - - # 创建测试期初库存数据 - print("\n创建测试期初库存数据...") - test_stock = [ - ('R001', '电阻-10K', 500, 'pcs', 100, '供应商A', None, 'system', '2026-03-13', '2026-03-13'), - ('C001', '电容-100uF', 1000, 'pcs', 50, '供应商B', None, 'system', '2026-03-13', '2026-03-13'), - ('IC001', '芯片-主控', 200, 'pcs', 1, '供应商C', None, 'system', '2026-03-13', '2026-03-13'), - ] - - for stock in test_stock: - c.execute('''INSERT OR IGNORE INTO initial_stock ( - material_code, material_name, stock_qty, unit, min_package, - supplier, remark, created_by, created_at, updated_at - ) VALUES (?,?,?,?,?,?,?,?,?,?)''', stock) - - print("✓ 期初库存测试数据创建成功") - - # 创建测试客户订单数据 - print("\n创建测试客户订单数据...") - c.execute('''INSERT OR IGNORE INTO customer_orders ( - order_date, order_no, customer_name, material, quantity, unit_price, - created_by, created_at, updated_at - ) VALUES (?,?,?,?,?,?,?,?,?)''', - ('2026-03-13', 'CO20260313001', '测试客户', 'AP05物流版', 100, 1000.00, - 'system', '2026-03-13', '2026-03-13')) - - print("✓ 客户订单测试数据创建成功") - - conn.commit() - print("\n所有测试数据创建成功!\n") - - except Exception as e: - print(f"\n✗ 创建测试数据失败: {str(e)}\n") - conn.rollback() - return False - finally: - conn.close() - - return True - -def main(): - """主测试函数""" - print("\n") - print("╔" + "=" * 58 + "╗") - print("║" + " " * 15 + "委外管理系统测试脚本" + " " * 15 + "║") - print("╚" + "=" * 58 + "╝") - print("\n") - - # 运行测试 - success = True - - if not test_database_tables(): - success = False - - if not test_table_structure(): - success = False - - if not create_test_data(): - success = False - - # 输出测试结果 - print("=" * 60) - if success: - print("✓ 所有测试通过!委外管理系统已准备就绪。") - print("\n下一步操作:") - print("1. 启动服务器: cd server && python app.py") - print("2. 访问系统: http://localhost:5000") - print("3. 进入\"委外管理\"菜单开始使用") - else: - print("✗ 部分测试失败,请检查错误信息。") - print("=" * 60) - print("\n") - -if __name__ == '__main__': - main() diff --git a/test_price_matching.py b/test_price_matching.py deleted file mode 100755 index a2e0f19..0000000 --- a/test_price_matching.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -测试对账单单价匹配功能 - 详细版本 -""" - -import sqlite3 -import sys -import os - -def test_price_matching(): - """测试价格匹配逻辑""" - - # 连接数据库 - conn = sqlite3.connect('server/data.db') - c = conn.cursor() - - print("=== 对账单单价匹配测试 ===\n") - - # 获取所有客户订单 - print("1. 获取所有客户订单数据...") - c.execute('SELECT order_no, material, unit_price FROM customer_orders') - customer_orders = c.fetchall() - - # 构建订单单价字典 - order_prices = {} - for order in customer_orders: - order_no = order[0] - if order_no not in order_prices: - order_prices[order_no] = {} - # 处理物料名称(支持换行符分割的多个物料) - materials = str(order[1]).split('\n') - for material in materials: - material = material.strip() - if material: - order_prices[order_no][material] = order[2] - - print(f" 共找到 {len(order_prices)} 个不同的合同号") - - # 显示每个合同的物料列表 - print("\n2. 客户订单中的合同号及物料:") - for order_no, materials in sorted(order_prices.items()): - print(f"\n 合同号: {order_no}") - for material, price in sorted(materials.items()): - print(f" - 物料: {material[:50]}... , 单价: {price}") - - # 获取所有对账单 - print("\n\n3. 检查对账单匹配情况...") - c.execute('SELECT id, contract_no, material_name, unit_price FROM reconciliations ORDER BY contract_no') - reconciliations = c.fetchall() - - # 统计匹配情况 - matched = 0 - not_matched = [] - - for recon in reconciliations: - recon_id, contract_no, material_name, current_price = recon - new_price = None - match_type = "" - - # 精确匹配合同号 - if contract_no in order_prices: - # 尝试精确匹配物料名 - if material_name in order_prices[contract_no]: - new_price = order_prices[contract_no][material_name] - match_type = "精确匹配" - else: - # 尝试部分匹配(物料名包含关系) - for order_material, price in order_prices[contract_no].items(): - if material_name in order_material or order_material in material_name: - new_price = price - match_type = f"部分匹配(订单物料: {order_material[:30]}...)" - break - - # 如果精确匹配没找到,尝试模糊匹配合同号 - if new_price is None: - for order_no, materials in order_prices.items(): - if contract_no in order_no or order_no in contract_no: - if material_name in materials: - new_price = materials[material_name] - match_type = f"模糊匹配合同号({order_no})" - break - else: - # 尝试部分匹配物料名 - for order_material, price in materials.items(): - if material_name in order_material or order_material in material_name: - new_price = price - match_type = f"模糊匹配(订单: {order_no}, 物料: {order_material[:30]}...)" - break - if new_price is not None: - break - - if new_price is not None: - matched += 1 - print(f" ✓ ID={recon_id}, 合同={contract_no}, 匹配类型: {match_type}") - else: - not_matched.append((recon_id, contract_no, material_name)) - - print(f"\n\n4. 匹配结果统计:") - print(f" 总对账单记录数: {len(reconciliations)}") - print(f" 成功匹配: {matched}") - print(f" 未匹配: {len(not_matched)}") - - if not_matched: - print(f"\n5. 未匹配的记录(前10条):") - for recon_id, contract_no, material_name in not_matched[:10]: - print(f" ✗ ID={recon_id}, 合同号={contract_no}, 物料={material_name[:50]}...") - - # 检查是否有相似的合同号 - similar_orders = [o for o in order_prices.keys() if contract_no[:10] in o or o[:10] in contract_no] - if similar_orders: - print(f" → 相似合同号: {', '.join(similar_orders)}") - - # 测试特定匹配案例 - print(f"\n6. 测试特定匹配案例:") - test_cases = [ - ("CGDD002878", "AP-DZ006灯条基站"), - ("CGDD002878", "WD1MK0SMD0551"), - ("CGDD001850", "AP-DZ009灯条基站"), - ] - - for contract_no, material_name in test_cases: - print(f"\n 测试: 合同号={contract_no}, 物料={material_name}") - if contract_no in order_prices: - print(f" 找到合同号,包含 {len(order_prices[contract_no])} 个物料") - for mat, price in order_prices[contract_no].items(): - if material_name in mat or mat in material_name: - print(f" ✓ 匹配成功: {mat[:50]}... -> {price}") - break - else: - print(f" ✗ 未找到匹配的物料") - else: - print(f" ✗ 未找到合同号") - # 查找相似合同号 - similar = [o for o in order_prices.keys() if contract_no in o or o in contract_no] - if similar: - print(f" → 相似合同号: {similar}") - - conn.close() - - print("\n=== 优化建议 ===") - print("1. 确保对账单的合同号与客户订单的订单号完全一致") - print("2. 物料名称应该标准化,避免使用简写或别名") - print("3. 可以在上传发货单时自动匹配客户订单单价") - print("4. 对于无法匹配的记录,可以手动设置默认单价") - -if __name__ == '__main__': - test_price_matching() diff --git a/test_purchase_demand_ordered.py b/test_purchase_demand_ordered.py deleted file mode 100755 index 4b1690e..0000000 --- a/test_purchase_demand_ordered.py +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python3 -""" -测试采购需求状态更新为"已下单"后期初库存的更新功能 -""" - -import sqlite3 -import sys -import os - -# 添加项目路径 -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - -DB_PATH = 'server/data.db' - -def test_purchase_demand_ordered_update(): - """测试采购需求状态更新为已下单后期初库存自动更新""" - - # 连接数据库 - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - try: - # 1. 创建测试物料 - material_code = 'TEST001' - material_name = '测试物料' - - # 插入期初库存记录 - c.execute('''INSERT OR REPLACE INTO initial_stock - (material_code, material_name, stock_qty, created_at, updated_at) - VALUES (?, ?, ?, datetime('now', 'localtime'), datetime('now', 'localtime'))''', - (material_code, material_name, 100)) - - # 2. 创建采购需求记录 - c.execute('''INSERT INTO purchase_demand - (demand_no, material_code, material_name, order_qty, bom_unit_qty, - total_demand, initial_stock, net_demand, min_package, actual_purchase_qty, - status, created_at, updated_at) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now', 'localtime'), datetime('now', 'localtime'))''', - ('TEST001', material_code, material_name, 10, 5, 50, 100, 0, 10, 50, 'pending')) - - demand_id = c.lastrowid - - # 3. 更新状态为已下单 - c.execute('''UPDATE purchase_demand - SET status = 'ordered', updated_at = datetime('now', 'localtime') - WHERE id = ?''', (demand_id,)) - - # 4. 模拟计算新的期初库存:实际采购 - 总需求 - actual_purchase_qty = 50 - total_demand = 50 - expected_stock = actual_purchase_qty - total_demand - - # 更新期初库存 - c.execute('''INSERT OR REPLACE INTO initial_stock - (material_code, material_name, stock_qty, updated_at) - VALUES (?, ?, ?, datetime('now', 'localtime'))''', - (material_code, material_name, expected_stock)) - - conn.commit() - - # 5. 验证结果 - c.execute('SELECT stock_qty FROM initial_stock WHERE material_code = ?', (material_code,)) - result = c.fetchone() - - if result: - actual_stock = result[0] - print(f"✅ 测试通过!") - print(f" - 物料编码: {material_code}") - print(f" - 实际采购数量: {actual_purchase_qty}") - print(f" - 总需求: {total_demand}") - print(f" - 期望期初库存: {expected_stock}") - print(f" - 实际期初库存: {actual_stock}") - - if actual_stock == expected_stock: - print(f" - 期初库存更新正确!") - else: - print(f" - ❌ 期初库存更新错误!") - else: - print("❌ 测试失败:未找到期初库存记录") - - # 6. 清理测试数据 - c.execute('DELETE FROM purchase_demand WHERE id = ?', (demand_id,)) - c.execute('DELETE FROM initial_stock WHERE material_code = ?', (material_code,)) - conn.commit() - - except Exception as e: - print(f"❌ 测试出错: {e}") - conn.rollback() - finally: - conn.close() - -if __name__ == '__main__': - print("开始测试采购需求状态更新功能...") - print("=" * 50) - test_purchase_demand_ordered_update() - print("=" * 50) - print("测试完成!") diff --git a/test_py/check_login.py b/test_py/check_login.py deleted file mode 100755 index 4632d61..0000000 --- a/test_py/check_login.py +++ /dev/null @@ -1,222 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -登录问题诊断脚本 -""" -import sqlite3 -import os - -DB_PATH = 'server/data.db' - -def check_database(): - """检查数据库和用户""" - print("=" * 60) - print("🔍 检查数据库...") - print("=" * 60) - - if not os.path.exists(DB_PATH): - print("❌ 数据库文件不存在:", DB_PATH) - return False - - print("✅ 数据库文件存在") - - try: - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - # 检查用户表 - users = c.execute('SELECT username, role FROM users').fetchall() - - if not users: - print("❌ 没有找到任何用户") - return False - - print(f"\n✅ 找到 {len(users)} 个用户:") - print("-" * 60) - for username, role in users: - print(f" 👤 用户名: {username:15s} | 角色: {role}") - - conn.close() - return True - - except Exception as e: - print(f"❌ 数据库错误: {e}") - return False - -def check_server(): - """检查服务器状态""" - print("\n" + "=" * 60) - print("🔍 检查服务器...") - print("=" * 60) - - import subprocess - - # 检查进程 - try: - result = subprocess.run( - ['ps', 'aux'], - capture_output=True, - text=True - ) - - if 'python' in result.stdout and 'app.py' in result.stdout: - print("✅ 服务器正在运行") - - # 提取进程信息 - for line in result.stdout.split('\n'): - if 'app.py' in line: - print(f" 📋 进程: {' '.join(line.split()[10:])}") - return True - else: - print("❌ 服务器未运行") - print("\n💡 启动服务器:") - print(" cd server && python3 app.py") - return False - - except Exception as e: - print(f"⚠️ 无法检查进程: {e}") - return None - -def check_files(): - """检查关键文件""" - print("\n" + "=" * 60) - print("🔍 检查关键文件...") - print("=" * 60) - - files = { - 'frontend/login.html': '登录页面', - 'frontend/assets/login.css': '登录样式', - 'frontend/js/api.js': 'API 接口', - 'server/app.py': '后端服务', - } - - all_exist = True - for path, desc in files.items(): - if os.path.exists(path): - size = os.path.getsize(path) - print(f"✅ {desc:20s} - {path} ({size} bytes)") - else: - print(f"❌ {desc:20s} - {path} (不存在)") - all_exist = False - - return all_exist - -def show_instructions(): - """显示使用说明""" - print("\n" + "=" * 60) - print("📖 使用说明") - print("=" * 60) - - print("\n1️⃣ 启动后端服务:") - print(" cd server") - print(" python3 app.py") - - print("\n2️⃣ 访问登录页面:") - print(" http://localhost:5000/login.html") - print(" ⚠️ 注意:不是 login-preview.html") - - print("\n3️⃣ 使用以下账号登录:") - print(" - tz (超级管理员)") - print(" - 张正浩 (超级管理员)") - print(" - admin (管理员)") - print(" - 黄有想 (管理员)") - - print("\n4️⃣ 如果忘记密码,重置密码:") - print(" python3 reset_password.py <用户名> <新密码>") - - print("\n5️⃣ 清除浏览器缓存:") - print(" Chrome/Edge: Ctrl+Shift+Delete") - print(" 或者使用无痕模式: Ctrl+Shift+N") - -def create_reset_script(): - """创建密码重置脚本""" - script = '''#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -密码重置脚本 -用法: python3 reset_password.py <用户名> <新密码> -""" -import sys -import sqlite3 -from werkzeug.security import generate_password_hash - -if len(sys.argv) != 3: - print("用法: python3 reset_password.py <用户名> <新密码>") - sys.exit(1) - -username = sys.argv[1] -new_password = sys.argv[2] - -DB_PATH = 'server/data.db' - -try: - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - # 检查用户是否存在 - user = c.execute('SELECT id FROM users WHERE username = ?', (username,)).fetchone() - - if not user: - print(f"❌ 用户 '{username}' 不存在") - print("\\n现有用户:") - users = c.execute('SELECT username FROM users').fetchall() - for u in users: - print(f" - {u[0]}") - sys.exit(1) - - # 更新密码 - password_hash = generate_password_hash(new_password) - c.execute('UPDATE users SET password_hash = ? WHERE username = ?', (password_hash, username)) - conn.commit() - - print(f"✅ 用户 '{username}' 的密码已重置") - print(f" 新密码: {new_password}") - - conn.close() - -except Exception as e: - print(f"❌ 错误: {e}") - sys.exit(1) -''' - - with open('reset_password.py', 'w', encoding='utf-8') as f: - f.write(script) - - os.chmod('reset_password.py', 0o755) - print("\n✅ 已创建密码重置脚本: reset_password.py") - -def main(): - print("\n" + "🔐 登录问题诊断工具".center(60, "=")) - print() - - db_ok = check_database() - files_ok = check_files() - server_ok = check_server() - - print("\n" + "=" * 60) - print("📊 诊断结果") - print("=" * 60) - - if db_ok and files_ok: - print("✅ 数据库和文件都正常") - - if server_ok: - print("✅ 服务器正在运行") - print("\n💡 如果仍然无法登录,请尝试:") - print(" 1. 清除浏览器缓存") - print(" 2. 使用无痕模式") - print(" 3. 检查浏览器控制台的错误信息") - print(" 4. 确认访问的是 login.html 而不是 login-preview.html") - else: - print("❌ 服务器未运行,请先启动服务器") - else: - print("❌ 发现问题,请检查上述错误信息") - - show_instructions() - create_reset_script() - - print("\n" + "=" * 60) - print() - -if __name__ == '__main__': - main() diff --git a/test_py/test-theme.html b/test_py/test-theme.html deleted file mode 100755 index a31c76b..0000000 --- a/test_py/test-theme.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - -主题测试 - - - - -
- - -
- -
-

上传日志测试

-
-
上传日志
-
-[2024-01-01 10:00:00] 开始上传文件...
-[2024-01-01 10:00:01] 验证文件格式...
-[2024-01-01 10:00:02] 处理数据中...
-[2024-01-01 10:00:03] 成功上传 100 条记录
-[2024-01-01 10:00:04] 完成!
-    
-
-
- -
-

日期选择器测试

- -
- -
-

卡片测试

-
-
测试卡片
-

这是一个测试卡片,用于验证主题颜色是否正确。

-
    -
  • 项目1标签
  • -
  • 项目2标签
  • -
-
-
- - - - diff --git a/test_py/test_captcha.png b/test_py/test_captcha.png deleted file mode 100755 index 9dc10b0a6640241cbca003d3307f2beb6f8e711a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2132 zcmV-a2&?yrP)cp=pLpS|CYbN)wupNizdY zN;3>~%0MU0qcd^q20{&W69x)IyquUCYz%%hvTC=}8sfgE@yxDxxAecw5U!{rog!%ABsGWw-!ja^Y{}~@Eb0QFlb?V_{8*aaeZ(G3O z0=Wb-lVO1hRnA5-iGNiQHuU~y2xVHtw4J-=dgri1Z)EKlgBcslR7W3m^eghw1)`ll z2{1D@PB(Pd9d8eH0OPG}bwKqAob5Vutf#_VX|#gT3RnB_q5t5GOVQFoKWiU>TgN)p zS)P(1@kXuIx$XTCA1gE1qPfI(Z~y>s$7FkR@9B`5_=Up-uYF2i(BWDyD|^FYhdsye zXIJp}KSjW!y?fnvlGYEw@Cd|-AUPiL6=-ojs8tB@-QS})-{#tT#DV<`7yzJJTN;wK zH};$~4~+modTK(JBB}Y>teD+Nz$#B)?cs+_PpvB8Xc2I=4EJ_9Hb(cJp*m6WLdJY8=Gyc z<}tc;7_D%)C9$lKLyS3mPFyD4HDVELS|R@E-_9?(7QXkg1p}nZ(Y##2n#H1`Y(a2s z6h*)KyW@6;3jk&pOn>30i^7?L-pnc%WwPk7KmkGmTw@0cMMK+7T%P9<3D?jF!Hg78 z=b)lYP$Z$0L=XwUa2L-07azHdN1PtXHobUY2&N}-C?qMUm~pYWdz6I}CFuET+qXj= z2fuL}-?&ZJHBFY1Hl3T_b-3BPn^Aso8 zw>tz93E)r95*sSeqFkg*1DOOQBFIjK^*=E?w2Bkg_G8HcgAmA!H3 z9J%{Yz-X(bUH`$~o0#X>USwJ>YR?1|}=3=-<$s zAt|3Ixj+FqQ&}~4ES!yC$i}@GZqzl9&E3@adfN#3+U^rHjR9cgj|!JRJkv+u_Xk?} z_rjncgXK2e2CyV8G28_^3D^2z?{VL2sLjbL`lpU4<#c>K+#j6db|^xyxhihOLXlJq zOfyS9Rg)&;ZZ$rnet53%*=1tpSutT#5J$^j;dY_Sb=(}ZJ^w@zQ z-EG=&lzFJ#x3)NcY7j{T@ZvJ!*9U3RPltZs6N`s?z1x0}-t|v>2$u zVF`rm(Pk@L>&IVq0RYE@A1OvD3ET?PlTeBbd6PqMNJo7=Mp^6G1p#zG3)$Hs|_~Lo2(Ol{Pws zNLiV4ril`GstoN}M|`rGIJ%Yi_-DlS6=;OSr#n2(@x3%qrm|Xvn~(naM|8i5L#8y_ z@p6?kQ2uZ{zUp+nbYR3?L8LH5OV!#^jA38BV_&^v zyrfKuo_vVk`>{xX#?YyUPCaJxWQ7lHmgV@#l=3ok5c-o#L7jutIZVk9IZWV{3PSM4 z(~{@@U<;n5BM8{}j6@zEVq!4LD9nIgK048SbnIW1DpH6Kw#FAL17=jw((sDDF@`f&U8h=HSHGc*!#dIDDdE`DpkXUzAVp(iUI ze5n*8#OSkKUGJdJ56_0t!{qsFH#l$b`9yj$(N3)YwZeUF@G;_KT8yZ8G-FN1qa%BZ z7_Th`ixH72+%xKkCGLlvF>2_D-(J6S*J1C)XuRA}Hoq{krvD$a-fWJtXYg|X0000< KMNUMnLSTXwT@;-F diff --git a/test_py/test_captcha.py b/test_py/test_captcha.py deleted file mode 100755 index 19efc98..0000000 --- a/test_py/test_captcha.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""测试验证码生成功能""" - -try: - from PIL import Image, ImageDraw, ImageFont - import random - import io - import base64 - - print("✓ Pillow 库已安装") - - # 生成4位随机数字 - code = ''.join([str(random.randint(0, 9)) for _ in range(4)]) - print(f"✓ 生成验证码: {code}") - - # 创建图片 - width, height = 120, 40 - image = Image.new('RGB', (width, height), color='#f0f4f8') - draw = ImageDraw.Draw(image) - print("✓ 创建图片成功") - - # 尝试使用系统字体 - font = None - font_paths = [ - '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', - '/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf', - '/System/Library/Fonts/Helvetica.ttc', - 'C:\\Windows\\Fonts\\arial.ttf' - ] - - for font_path in font_paths: - try: - font = ImageFont.truetype(font_path, 28) - print(f"✓ 使用字体: {font_path}") - break - except: - continue - - if not font: - font = ImageFont.load_default() - print("⚠ 使用默认字体") - - # 绘制干扰线 - for _ in range(3): - x1 = random.randint(0, width) - y1 = random.randint(0, height) - x2 = random.randint(0, width) - y2 = random.randint(0, height) - draw.line([(x1, y1), (x2, y2)], fill='#cbd5e1', width=1) - - # 绘制验证码文字 - colors = ['#3b82f6', '#2563eb', '#1e40af', '#1e3a8a'] - for i, char in enumerate(code): - x = 20 + i * 25 + random.randint(-3, 3) - y = 5 + random.randint(-3, 3) - color = random.choice(colors) - draw.text((x, y), char, font=font, fill=color) - - # 绘制干扰点 - for _ in range(50): - x = random.randint(0, width) - y = random.randint(0, height) - draw.point((x, y), fill='#94a3b8') - - print("✓ 绘制验证码成功") - - # 转换为base64 - buffer = io.BytesIO() - image.save(buffer, format='PNG') - buffer.seek(0) - img_base64 = base64.b64encode(buffer.getvalue()).decode() - - print(f"✓ 转换为base64成功 (长度: {len(img_base64)})") - print("\n验证码功能测试通过!") - - # 保存测试图片 - image.save('test_captcha.png') - print("✓ 测试图片已保存为 test_captcha.png") - -except ImportError as e: - print(f"✗ 缺少依赖库: {e}") - print("\n请安装 Pillow 库:") - print(" pip install Pillow") -except Exception as e: - print(f"✗ 测试失败: {e}") - import traceback - traceback.print_exc() diff --git a/test_py/test_import.py b/test_py/test_import.py deleted file mode 100755 index 8cd0c8e..0000000 --- a/test_py/test_import.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -import sys -sys.path.insert(0, 'server') - -# 测试导入函数的逻辑 -def test_parse(): - # 模拟辅助函数 - def parse_percentage(value): - if value is None: - return 0 - if isinstance(value, (int, float)): - return float(value) - value_str = str(value).strip() - if value_str.endswith('%'): - value_str = value_str[:-1] - try: - return float(value_str) - except: - return 0 - - def safe_int(value, default=0): - if value is None: - return default - try: - return int(float(value)) - except: - return default - - # 测试数据 - test_cases = [ - ('62.28%', 62.28), - ('62.28', 62.28), - (62.28, 62.28), - ('', 0), - (None, 0), - ] - - print("测试 parse_percentage:") - for input_val, expected in test_cases: - result = parse_percentage(input_val) - status = "✓" if result == expected else "✗" - print(f" {status} parse_percentage({repr(input_val)}) = {result} (期望: {expected})") - - print("\n测试 safe_int:") - test_int_cases = [ - (100, 100), - (100.5, 100), - ('100', 100), - ('', 0), - (None, 0), - ] - for input_val, expected in test_int_cases: - result = safe_int(input_val) - status = "✓" if result == expected else "✗" - print(f" {status} safe_int({repr(input_val)}) = {result} (期望: {expected})") - -if __name__ == '__main__': - test_parse() diff --git a/test_py/test_sop_feature.py b/test_py/test_sop_feature.py deleted file mode 100755 index 0e24d0d..0000000 --- a/test_py/test_sop_feature.py +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -SOP 功能测试脚本 -用于验证 SOP 文件管理功能是否正常工作 -""" - -import os -import sys -import sqlite3 - -# 添加 server 目录到路径 -sys.path.insert(0, 'server') - -def test_database_table(): - """测试数据库表是否创建成功""" - print("测试 1: 检查数据库表...") - - db_path = 'server/data.db' - if not os.path.exists(db_path): - print(" ❌ 数据库文件不存在") - return False - - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - - # 检查 sop_files 表是否存在 - cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='sop_files'") - result = cursor.fetchone() - - if result: - print(" ✅ sop_files 表已创建") - - # 检查表结构 - cursor.execute("PRAGMA table_info(sop_files)") - columns = cursor.fetchall() - print(f" ✅ 表结构包含 {len(columns)} 列:") - for col in columns: - print(f" - {col[1]} ({col[2]})") - - conn.close() - return True - else: - print(" ❌ sop_files 表不存在") - conn.close() - return False - -def test_sop_directory(): - """测试 SOP 文件存储目录""" - print("\n测试 2: 检查 SOP 文件目录...") - - sop_dir = 'frontend/sop_files' - - if os.path.exists(sop_dir): - print(f" ✅ 目录已存在: {sop_dir}") - - # 检查目录权限 - if os.access(sop_dir, os.W_OK): - print(" ✅ 目录可写") - else: - print(" ⚠️ 目录不可写,可能需要调整权限") - - # 列出现有文件 - files = os.listdir(sop_dir) - if files: - print(f" 📁 目录中已有 {len(files)} 个文件:") - for f in files[:5]: # 只显示前5个 - print(f" - {f}") - else: - print(" 📁 目录为空") - - return True - else: - print(f" ⚠️ 目录不存在: {sop_dir}") - print(" 💡 系统会在首次上传时自动创建") - return True - -def test_api_routes(): - """测试 API 路由是否注册""" - print("\n测试 3: 检查 API 路由...") - - try: - from app import app - - # 获取所有路由 - routes = [] - for rule in app.url_map.iter_rules(): - if 'sop' in rule.rule: - routes.append(f"{rule.rule} [{', '.join(rule.methods - {'HEAD', 'OPTIONS'})}]") - - if routes: - print(" ✅ SOP API 路由已注册:") - for route in routes: - print(f" - {route}") - return True - else: - print(" ❌ 未找到 SOP API 路由") - return False - except Exception as e: - print(f" ❌ 导入失败: {e}") - return False - -def test_frontend_files(): - """测试前端文件是否更新""" - print("\n测试 4: 检查前端文件...") - - files_to_check = { - 'frontend/js/api.js': ['listSopFiles', 'uploadSopFile', 'deleteSopFile'], - 'frontend/js/components/upload.js': ['renderSop', 'bindSopEvents', 'loadSopList'], - 'frontend/js/router.js': ['sop'], - 'frontend/index.html': ['upload/sop'] - } - - all_ok = True - for filepath, keywords in files_to_check.items(): - if not os.path.exists(filepath): - print(f" ❌ 文件不存在: {filepath}") - all_ok = False - continue - - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - missing = [kw for kw in keywords if kw not in content] - if missing: - print(f" ⚠️ {filepath} 缺少关键字: {', '.join(missing)}") - all_ok = False - else: - print(f" ✅ {filepath} 已更新") - - return all_ok - -def main(): - """运行所有测试""" - print("=" * 60) - print("SOP 功能测试") - print("=" * 60) - - results = [] - - # 运行测试 - results.append(("数据库表", test_database_table())) - results.append(("文件目录", test_sop_directory())) - results.append(("API 路由", test_api_routes())) - results.append(("前端文件", test_frontend_files())) - - # 汇总结果 - print("\n" + "=" * 60) - print("测试结果汇总") - print("=" * 60) - - for name, result in results: - status = "✅ 通过" if result else "❌ 失败" - print(f"{name}: {status}") - - all_passed = all(r[1] for r in results) - - print("\n" + "=" * 60) - if all_passed: - print("🎉 所有测试通过!SOP 功能已准备就绪。") - print("\n下一步:") - print("1. 重启服务器") - print("2. 登录系统(使用管理员账号)") - print("3. 进入 '上传' → 'SOP' 菜单") - print("4. 尝试上传测试文件: sop_template_example.csv") - else: - print("⚠️ 部分测试未通过,请检查上述错误信息。") - print("=" * 60) - - return 0 if all_passed else 1 - -if __name__ == '__main__': - sys.exit(main()) diff --git a/test_shipment_upload.py b/test_shipment_upload.py deleted file mode 100755 index 3e26f43..0000000 --- a/test_shipment_upload.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -测试发货单上传解析功能 -""" -import pandas as pd -import numpy as np - -def test_parse_shipment(): - """测试解析发货单""" - file_path = '/home/hyx/work/生产管理系统/发货单-20251121.xls' - - # 读取Excel文件 - df = pd.read_excel(file_path, header=None) - - print("=== 解析发货单头部信息 ===") - - # 提取头部信息 - shipment_date = None - transport_method = None - - # 解析发货日期(第1行,索引2) - if len(df) > 1 and len(df.columns) > 2: - shipment_date_raw = df.iloc[1, 2] - if pd.notna(shipment_date_raw): - if isinstance(shipment_date_raw, pd.Timestamp): - shipment_date = shipment_date_raw.strftime('%Y-%m-%d') - else: - shipment_date = str(shipment_date_raw) - - print(f"发货日期: {shipment_date}") - - # 解析供货方式(第2行,索引2) - if len(df) > 2 and len(df.columns) > 2: - transport_method_raw = df.iloc[2, 2] - if pd.notna(transport_method_raw): - transport_method = str(transport_method_raw) - - print(f"供货方式(运输单号): {transport_method}") - - # 找到表格数据的起始行(序号、采购单号、物料编码...) - header_row = None - for i in range(len(df)): - if df.iloc[i, 0] == '序号': - header_row = i - break - - if header_row is None: - print("错误:无法识别发货单格式,未找到表格头部") - return - - print(f"\n表格起始行: {header_row}") - - # 从表格起始行读取数据 - data_df = pd.read_excel(file_path, header=header_row) - - print(f"表格列名: {data_df.columns.tolist()}") - - # 过滤掉合计行和备注行(只保留序号为数字的行) - valid_data = data_df[data_df['序号'].apply(lambda x: isinstance(x, (int, float)) and not pd.isna(x))] - - print(f"\n有效数据行数: {len(valid_data)}") - - # 模拟客户订单数据 - customer_orders = { - 'CGDD002878': { - 'order_date': '2025-11-15', - 'material': 'AP-DZ006 灯条基站', - 'unit_price': 150.5 - }, - 'CGDD003082': { - 'order_date': '2025-11-18', - 'material': '飞机盒', - 'unit_price': 5.0 - } - } - - print("\n=== 解析数据行 ===") - last_contract_no = None - - for idx, row in valid_data.iterrows(): - print(f"\n序号: {int(row['序号'])}") - - # 提取数据 - contract_no = row.get('采购单号') - if pd.isna(contract_no): - if last_contract_no: - contract_no = last_contract_no - print(f" 采购单号: {contract_no} (继承上一行)") - else: - print(f" 采购单号: 空 (错误)") - continue - else: - contract_no = str(contract_no).strip() - last_contract_no = contract_no - print(f" 采购单号(合同编号): {contract_no}") - - material_code = row.get('物料编码') - if pd.isna(material_code): - print(f" 物料编码: 空 (错误)") - continue - material_code = str(material_code).strip().replace('\n', ' ') - print(f" 物料编码(物料名称): {material_code}") - - spec_model = row.get('规格型号') - if pd.isna(spec_model): - spec_model = '' - else: - spec_model = str(spec_model).strip() - print(f" 规格型号: {spec_model}") - - quantity = row.get('实送数量') - if pd.isna(quantity): - print(f" 实送数量: 空 (错误)") - continue - quantity = int(float(quantity)) - print(f" 实送数量(数量): {quantity}") - - unit = row.get('单位') - if pd.isna(unit): - unit = 'pcs' - else: - unit = str(unit).strip() - print(f" 单位: {unit}") - - # 从备注中提取运输单号(如果有) - remark = row.get('备注') - transport_no = transport_method or '' - if pd.notna(remark): - remark_str = str(remark).strip() - if remark_str: - transport_no = remark_str - print(f" 运输单号: {transport_no}") - - # 从客户订单中查找单价和下单时间 - unit_price = 0 - order_date = shipment_date or '' - - if contract_no in customer_orders: - order_info = customer_orders[contract_no] - # 匹配物料名称 - if material_code in order_info['material']: - unit_price = order_info['unit_price'] - order_date = order_info['order_date'] - print(f" 含税单价: {unit_price} (从客户订单查找)") - print(f" 下单时间: {order_date} (从客户订单查找)") - else: - print(f" 含税单价: {unit_price} (未找到匹配的客户订单)") - print(f" 下单时间: {order_date} (使用发货日期)") - else: - print(f" 含税单价: {unit_price} (未找到对应的采购单号)") - print(f" 下单时间: {order_date} (使用发货日期)") - - # 计算含税金额 - total_amount = quantity * unit_price - print(f" 含税金额: {total_amount}") - - print(f" 交货日期: {shipment_date}") - print(f" 出货日期: {shipment_date}") - -if __name__ == '__main__': - test_parse_shipment() diff --git a/test_toast.html b/test_toast.html deleted file mode 100755 index 282a677..0000000 --- a/test_toast.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - Toast 测试 - - - -

Toast 测试页面

- - - - - - - -
- - - - diff --git a/update_factory.py b/update_factory.py deleted file mode 100755 index 1d828d7..0000000 --- a/update_factory.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -""" -将现有期初库存和采购需求数据的工厂字段更新为"友辉" -""" - -import sqlite3 - -DB_PATH = 'server/data.db' - -def update_factory(): - """更新现有数据的工厂字段为友辉""" - conn = sqlite3.connect(DB_PATH) - c = conn.cursor() - - try: - # 更新期初库存表 - c.execute("UPDATE initial_stock SET factory='友辉' WHERE factory IS NULL OR factory=''") - initial_stock_rows = c.rowcount - - # 更新采购需求表 - c.execute("UPDATE purchase_demand SET factory='友辉' WHERE factory IS NULL OR factory=''") - purchase_demand_rows = c.rowcount - - conn.commit() - - print(f"✅ 期初库存表:成功更新 {initial_stock_rows} 条记录的工厂字段为'友辉'") - print(f"✅ 采购需求表:成功更新 {purchase_demand_rows} 条记录的工厂字段为'友辉'") - - # 查询验证 - c.execute("SELECT COUNT(*) FROM initial_stock WHERE factory='友辉'") - initial_count = c.fetchone()[0] - c.execute("SELECT COUNT(*) FROM purchase_demand WHERE factory='友辉'") - demand_count = c.fetchone()[0] - - print(f"📊 当前友辉工厂的期初库存记录数: {initial_count}") - print(f"📊 当前友辉工厂的采购需求记录数: {demand_count}") - - except Exception as e: - print(f"❌ 更新失败: {e}") - conn.rollback() - finally: - conn.close() - -if __name__ == '__main__': - print("开始更新数据的工厂字段...") - print("=" * 50) - update_factory() - print("=" * 50) - print("更新完成!") diff --git a/发货单-20251121.xls b/发货单-20251121.xls deleted file mode 100755 index 57011997b6b75140cc2decce6cdfa46e03c1e854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31744 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