上传历史记录问题修复
This commit is contained in:
parent
76067d3c67
commit
3736a4dc9c
@ -88,8 +88,7 @@ if inserted_count > 0:
|
|||||||
'mac': sn_mac,
|
'mac': sn_mac,
|
||||||
'batch': batch_no
|
'batch': batch_no
|
||||||
})
|
})
|
||||||
if len(success_records) >= 10: # 只显示前10条
|
# 移除数量限制,输出所有成功导入的记录
|
||||||
break
|
|
||||||
|
|
||||||
print(json.dumps(success_records, ensure_ascii=False))
|
print(json.dumps(success_records, ensure_ascii=False))
|
||||||
print("=== 数据输出结束 ===")
|
print("=== 数据输出结束 ===")
|
||||||
|
|||||||
@ -61,7 +61,7 @@ const Upload = (() => {
|
|||||||
function textarea(id,label,placeholder=''){return `<div class="field"><label>${label}</label><textarea id="${id}" class="input" rows="4" placeholder="${placeholder}"></textarea></div>`}
|
function textarea(id,label,placeholder=''){return `<div class="field"><label>${label}</label><textarea id="${id}" class="input" rows="4" placeholder="${placeholder}"></textarea></div>`}
|
||||||
|
|
||||||
async function renderMac(){
|
async function renderMac(){
|
||||||
return section('MAC与批次',`
|
return section('MAC与批次(MAC与批次对应关系表)',`
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label>上传类型</label>
|
<label>上传类型</label>
|
||||||
<select id="mac-type" class="input">
|
<select id="mac-type" class="input">
|
||||||
@ -160,14 +160,18 @@ const Upload = (() => {
|
|||||||
Router.register('/upload/mac', async () => {
|
Router.register('/upload/mac', async () => {
|
||||||
const html = await renderMac();
|
const html = await renderMac();
|
||||||
setTimeout(bindMacEvents,0);
|
setTimeout(bindMacEvents,0);
|
||||||
setTimeout(()=>{
|
setTimeout(async ()=>{
|
||||||
// 显示历史记录中的最新10条
|
// 从服务器获取最新10条记录
|
||||||
const history = getHistory();
|
|
||||||
const listEl=document.getElementById('mac-list');
|
const listEl=document.getElementById('mac-list');
|
||||||
if(listEl && history.length > 0){
|
try {
|
||||||
listEl.innerHTML = history.slice(0, 10).map(r=>`<li><span>${r.mac}</span><span class="badge">${r.batch}</span></li>`).join('');
|
const data = await API.listMac();
|
||||||
} else if(listEl) {
|
if(listEl && data.list && data.list.length > 0){
|
||||||
listEl.innerHTML = '<li>暂无数据</li>';
|
listEl.innerHTML = data.list.slice(0, 10).map(r=>`<li><span>${r.mac}</span><span class="badge">${r.batch}</span></li>`).join('');
|
||||||
|
} else if(listEl) {
|
||||||
|
listEl.innerHTML = '<li>暂无数据</li>';
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
if(listEl) listEl.innerHTML = '<li>加载失败</li>';
|
||||||
}
|
}
|
||||||
},0);
|
},0);
|
||||||
return html;
|
return html;
|
||||||
@ -176,20 +180,16 @@ const Upload = (() => {
|
|||||||
Router.register('/upload/stats', async () => {
|
Router.register('/upload/stats', async () => {
|
||||||
const html = await renderStats();
|
const html = await renderStats();
|
||||||
setTimeout(bindStatsEvents,0);
|
setTimeout(bindStatsEvents,0);
|
||||||
setTimeout(()=>{
|
setTimeout(async ()=>{
|
||||||
// 显示历史记录中的最新10条
|
// 从服务器获取最新10条记录
|
||||||
const STATS_STORAGE_KEY = 'stats_upload_history';
|
const listEl=document.getElementById('stats-list');
|
||||||
try {
|
try {
|
||||||
const history = JSON.parse(localStorage.getItem(STATS_STORAGE_KEY) || '[]');
|
const data = await API.listStats();
|
||||||
const listEl=document.getElementById('stats-list');
|
if(listEl && data.list && data.list.length > 0){
|
||||||
if(listEl && history.length > 0){
|
listEl.innerHTML = data.list.slice(0, 10).map(r=>{
|
||||||
listEl.innerHTML = history.slice(0, 10).map(r=>{
|
|
||||||
const platformName = {pdd: '拼多多', yt: '圆通', tx: '兔喜'}[r.platform] || '';
|
const platformName = {pdd: '拼多多', yt: '圆通', tx: '兔喜'}[r.platform] || '';
|
||||||
const platformText = platformName ? `${platformName} - ` : '';
|
const platformText = platformName ? `${platformName} - ` : '';
|
||||||
let html = `<li><span>${platformText}直通良:${r.fpy_good||0} 良:${r.good} 不良:${r.bad}</span>`;
|
let html = `<li><span>${platformText}直通良:${r.fpy_good||0} 良:${r.good} 不良:${r.bad}</span>`;
|
||||||
if(r.details && r.details.length > 0){
|
|
||||||
html += `<span class="badge">${r.details.length}条明细</span>`;
|
|
||||||
}
|
|
||||||
html += '</li>';
|
html += '</li>';
|
||||||
return html;
|
return html;
|
||||||
}).join('');
|
}).join('');
|
||||||
@ -198,6 +198,7 @@ const Upload = (() => {
|
|||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.error('加载历史记录失败:', e);
|
console.error('加载历史记录失败:', e);
|
||||||
|
if(listEl) listEl.innerHTML = '<li>加载失败</li>';
|
||||||
}
|
}
|
||||||
},0);
|
},0);
|
||||||
return html;
|
return html;
|
||||||
@ -270,17 +271,22 @@ const Upload = (() => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 查看历史按钮
|
// 查看历史按钮 - 从服务器获取所有用户的上传记录
|
||||||
addListener(showHistoryBtn, 'click', ()=>{
|
addListener(showHistoryBtn, 'click', async ()=>{
|
||||||
const history = getHistory();
|
|
||||||
const listEl = document.getElementById('mac-list');
|
const listEl = document.getElementById('mac-list');
|
||||||
if(listEl){
|
try {
|
||||||
if(history.length > 0){
|
const data = await API.listMac();
|
||||||
listEl.innerHTML = history.map(r=>`<li><span>${r.mac}</span><span class="badge">${r.batch}</span><span style="font-size:11px;color:var(--text-2);margin-left:8px">${new Date(r.timestamp).toLocaleString('zh-CN')}</span></li>`).join('');
|
if(listEl){
|
||||||
API.toast(`显示全部 ${history.length} 条历史记录`);
|
if(data.list && data.list.length > 0){
|
||||||
} else {
|
listEl.innerHTML = data.list.map(r=>`<li><span>${r.mac}</span><span class="badge">${r.batch}</span><span style="font-size:11px;color:var(--text-2);margin-left:8px">${new Date(r.ts).toLocaleString('zh-CN')}</span></li>`).join('');
|
||||||
listEl.innerHTML = '<li>暂无历史记录</li>';
|
API.toast(`显示全部 ${data.list.length} 条历史记录`);
|
||||||
|
} else {
|
||||||
|
listEl.innerHTML = '<li>暂无历史记录</li>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} catch(e) {
|
||||||
|
API.toast('加载历史记录失败');
|
||||||
|
if(listEl) listEl.innerHTML = '<li>加载失败</li>';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -391,26 +397,28 @@ const Upload = (() => {
|
|||||||
const showHistoryBtn = document.getElementById('stats-show-history');
|
const showHistoryBtn = document.getElementById('stats-show-history');
|
||||||
const clearDisplayBtn = document.getElementById('stats-clear-display');
|
const clearDisplayBtn = document.getElementById('stats-clear-display');
|
||||||
|
|
||||||
// 查看历史按钮
|
// 查看历史按钮 - 从服务器获取所有用户的上传记录
|
||||||
addListener(showHistoryBtn, 'click', ()=>{
|
addListener(showHistoryBtn, 'click', async ()=>{
|
||||||
const history = getStatsHistory();
|
|
||||||
const listEl = document.getElementById('stats-list');
|
const listEl = document.getElementById('stats-list');
|
||||||
if(listEl){
|
try {
|
||||||
if(history.length > 0){
|
const data = await API.listStats();
|
||||||
listEl.innerHTML = history.map(r=>{
|
if(listEl){
|
||||||
const platformName = {pdd: '拼多多', yt: '圆通', tx: '兔喜'}[r.platform] || '';
|
if(data.list && data.list.length > 0){
|
||||||
const platformText = platformName ? `${platformName} - ` : '';
|
listEl.innerHTML = data.list.map(r=>{
|
||||||
let html = `<li><span>${platformText}直通良:${r.fpy_good||0} 良:${r.good} 不良:${r.bad}</span>`;
|
const platformName = {pdd: '拼多多', yt: '圆通', tx: '兔喜'}[r.platform] || '';
|
||||||
if(r.details && r.details.length > 0){
|
const platformText = platformName ? `${platformName} - ` : '';
|
||||||
html += `<span class="badge">${r.details.length}条明细</span>`;
|
let html = `<li><span>${platformText}直通良:${r.fpy_good||0} 良:${r.good} 不良:${r.bad}</span>`;
|
||||||
}
|
html += `<span style="font-size:11px;color:var(--text-2);margin-left:8px">${new Date(r.ts).toLocaleString('zh-CN')}</span></li>`;
|
||||||
html += `<span style="font-size:11px;color:var(--text-2);margin-left:8px">${new Date(r.timestamp).toLocaleString('zh-CN')}</span></li>`;
|
return html;
|
||||||
return html;
|
}).join('');
|
||||||
}).join('');
|
API.toast(`显示全部 ${data.list.length} 条历史记录`);
|
||||||
API.toast(`显示全部 ${history.length} 条历史记录`);
|
} else {
|
||||||
} else {
|
listEl.innerHTML = '<li>暂无历史记录</li>';
|
||||||
listEl.innerHTML = '<li>暂无历史记录</li>';
|
}
|
||||||
}
|
}
|
||||||
|
} catch(e) {
|
||||||
|
API.toast('加载历史记录失败');
|
||||||
|
if(listEl) listEl.innerHTML = '<li>加载失败</li>';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -156,7 +156,7 @@ def log(action, detail=''):
|
|||||||
conn = get_db()
|
conn = get_db()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute('INSERT INTO operations_log(user_id, action, detail, ts) VALUES(?,?,?,?)', (
|
c.execute('INSERT INTO operations_log(user_id, action, detail, ts) VALUES(?,?,?,?)', (
|
||||||
session.get('user_id'), action, detail, datetime.utcnow().isoformat()
|
session.get('user_id'), action, detail, get_beijing_time()
|
||||||
))
|
))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
@ -219,6 +219,12 @@ def get_redis():
|
|||||||
_redis_client = redis.Redis(host=host, port=port, password=password, db=db, decode_responses=True, socket_timeout=0.5, socket_connect_timeout=0.5)
|
_redis_client = redis.Redis(host=host, port=port, password=password, db=db, decode_responses=True, socket_timeout=0.5, socket_connect_timeout=0.5)
|
||||||
return _redis_client
|
return _redis_client
|
||||||
|
|
||||||
|
def get_beijing_time():
|
||||||
|
"""获取北京时间(UTC+8)的ISO格式字符串"""
|
||||||
|
from datetime import timezone, timedelta
|
||||||
|
beijing_tz = timezone(timedelta(hours=8))
|
||||||
|
return datetime.now(beijing_tz).isoformat()
|
||||||
|
|
||||||
def parse_audit_line(s):
|
def parse_audit_line(s):
|
||||||
if not s:
|
if not s:
|
||||||
return {'ts_cn': None, 'batch': None, 'mac': None, 'note': None}
|
return {'ts_cn': None, 'batch': None, 'mac': None, 'note': None}
|
||||||
@ -854,7 +860,7 @@ def upload_mac():
|
|||||||
return jsonify({'error': 'invalid rows'}), 400
|
return jsonify({'error': 'invalid rows'}), 400
|
||||||
conn = get_db()
|
conn = get_db()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
now = datetime.utcnow().isoformat()
|
now = get_beijing_time()
|
||||||
for r in rows:
|
for r in rows:
|
||||||
mac = (r or {}).get('mac')
|
mac = (r or {}).get('mac')
|
||||||
batch = (r or {}).get('batch')
|
batch = (r or {}).get('batch')
|
||||||
@ -887,7 +893,7 @@ def upload_stats():
|
|||||||
|
|
||||||
conn = get_db()
|
conn = get_db()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
now = datetime.utcnow().isoformat()
|
now = get_beijing_time()
|
||||||
|
|
||||||
# 保存统计数据
|
# 保存统计数据
|
||||||
c.execute('INSERT INTO stats(good,bad,fpy_good,platform,ts) VALUES(?,?,?,?,?)', (good, bad, fpy_good, platform, now))
|
c.execute('INSERT INTO stats(good,bad,fpy_good,platform,ts) VALUES(?,?,?,?,?)', (good, bad, fpy_good, platform, now))
|
||||||
@ -922,7 +928,7 @@ def upload_repairs():
|
|||||||
|
|
||||||
conn = get_db()
|
conn = get_db()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
now = datetime.utcnow().isoformat()
|
now = get_beijing_time()
|
||||||
|
|
||||||
c.execute('INSERT INTO repairs(qty, note, ts) VALUES(?,?,?)', (qty, note, now))
|
c.execute('INSERT INTO repairs(qty, note, ts) VALUES(?,?,?)', (qty, note, now))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
@ -941,7 +947,7 @@ def upload_defects():
|
|||||||
rows = data.get('rows') or []
|
rows = data.get('rows') or []
|
||||||
conn = get_db()
|
conn = get_db()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
now = datetime.utcnow().isoformat()
|
now = get_beijing_time()
|
||||||
for r in rows:
|
for r in rows:
|
||||||
mac = (r or {}).get('mac')
|
mac = (r or {}).get('mac')
|
||||||
batch = (r or {}).get('batch')
|
batch = (r or {}).get('batch')
|
||||||
@ -983,7 +989,7 @@ def upload_shipments():
|
|||||||
|
|
||||||
c.execute(
|
c.execute(
|
||||||
'INSERT INTO shipments(date, qty, receiver, platform, box_no, ts) VALUES(?,?,?,?,?,?)',
|
'INSERT INTO shipments(date, qty, receiver, platform, box_no, ts) VALUES(?,?,?,?,?,?)',
|
||||||
(date, qty, to, platform, box_no, datetime.utcnow().isoformat())
|
(date, qty, to, platform, box_no, get_beijing_time())
|
||||||
)
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
@ -1043,7 +1049,7 @@ def add_personnel():
|
|||||||
return jsonify({'error': 'invalid payload'}), 400
|
return jsonify({'error': 'invalid payload'}), 400
|
||||||
conn = get_db()
|
conn = get_db()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute('INSERT INTO personnel(name, role, ts) VALUES(?,?,?)', (name, role, datetime.utcnow().isoformat()))
|
c.execute('INSERT INTO personnel(name, role, ts) VALUES(?,?,?)', (name, role, get_beijing_time()))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
log('add_personnel', name)
|
log('add_personnel', name)
|
||||||
@ -1779,6 +1785,32 @@ def upload_mac_file():
|
|||||||
output = result.stdout + result.stderr
|
output = result.stdout + result.stderr
|
||||||
success = result.returncode == 0
|
success = result.returncode == 0
|
||||||
|
|
||||||
|
# 解析输出中的成功导入数据,同时保存到SQLite数据库
|
||||||
|
if success:
|
||||||
|
import re
|
||||||
|
json_match = re.search(r'=== 成功导入的数据 ===\n([\s\S]*?)\n=== 数据输出结束 ===', output)
|
||||||
|
if json_match:
|
||||||
|
try:
|
||||||
|
import json as json_lib
|
||||||
|
records = json_lib.loads(json_match.group(1).strip())
|
||||||
|
if records and isinstance(records, list):
|
||||||
|
# 保存到SQLite数据库,使用北京时间(UTC+8)
|
||||||
|
conn = get_db()
|
||||||
|
c = conn.cursor()
|
||||||
|
from datetime import timezone, timedelta
|
||||||
|
beijing_tz = timezone(timedelta(hours=8))
|
||||||
|
now = datetime.now(beijing_tz).isoformat()
|
||||||
|
for record in records:
|
||||||
|
mac = record.get('mac')
|
||||||
|
batch = record.get('batch')
|
||||||
|
if mac and batch:
|
||||||
|
c.execute('INSERT INTO mac_batches(mac, batch, ts) VALUES(?,?,?)', (mac, batch, now))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
log('upload_mac_file_db', f"saved {len(records)} records to database")
|
||||||
|
except Exception as e:
|
||||||
|
log('upload_mac_file_db_error', str(e))
|
||||||
|
|
||||||
log('upload_mac_file', f"type={upload_type}, success={success}")
|
log('upload_mac_file', f"type={upload_type}, success={success}")
|
||||||
if success:
|
if success:
|
||||||
notify_superadmin('批量上传MAC文件', f"类型: {upload_type}")
|
notify_superadmin('批量上传MAC文件', f"类型: {upload_type}")
|
||||||
@ -1823,7 +1855,7 @@ def upload_defects_file():
|
|||||||
return jsonify({'error': 'parse error'}), 400
|
return jsonify({'error': 'parse error'}), 400
|
||||||
conn = get_db()
|
conn = get_db()
|
||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
now = datetime.utcnow().isoformat()
|
now = get_beijing_time()
|
||||||
for r in rows:
|
for r in rows:
|
||||||
c.execute('INSERT INTO defects(mac, batch, ts) VALUES(?,?,?)', (r['mac'], r['batch'], now))
|
c.execute('INSERT INTO defects(mac, batch, ts) VALUES(?,?,?)', (r['mac'], r['batch'], now))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user