chore: snapshot production code before Apple Design UI refinement

This commit is contained in:
lingniu
2026-09-17 18:05:57 +08:00
parent 9f0a87f49e
commit f7e7176f88
90 changed files with 8990 additions and 328 deletions
+17
View File
@@ -0,0 +1,17 @@
import pymysql, pathlib, re, json
def connect():
env={}
for name in ['base.env','stat-writer.env']:
for line in pathlib.Path('/opt/lingniu-go-native/env/'+name).read_text().splitlines():
if '=' in line and not line.startswith('#'):
k,v=line.split('=',1);env[k]=v.strip().strip('\"').strip("'")
m=re.fullmatch(r'([^:]+):(.*?)@tcp\(([^:]+):(\d+)\)/([^?]+).*',env['MYSQL_DSN'])
assert m, 'Unexpected DSN format'
return pymysql.connect(user=m[1],password=m[2],host=m[3],port=int(m[4]),database=m[5],charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor,autocommit=False)
if __name__=='__main__':
c=connect()
with c.cursor() as q:
for table in ['vehicle_daily_mileage_source','vehicle_daily_mileage','vehicle_data_source','vehicle_identifier','vehicle']:
q.execute('SHOW COLUMNS FROM '+table); print(table,json.dumps(q.fetchall(),default=str,ensure_ascii=False))
q.execute("SELECT * FROM vehicle_data_source WHERE platform_name LIKE '%赛格%' OR source_code LIKE '%seg%' OR source_ip LIKE '%seg%'"); print('SEG_SOURCES',json.dumps(q.fetchall(),default=str,ensure_ascii=False))
c.close()
+80
View File
@@ -0,0 +1,80 @@
from db import connect
import json, pathlib, collections, sys, decimal
root=pathlib.Path(__file__).parent
rows=json.loads((root/'rows.json').read_text())
c=connect(); q=c.cursor()
def query(sql,args=()):
q.execute(sql,args);return q.fetchall()
maps=collections.defaultdict(set)
for r in query("SELECT vin,plate FROM vehicle UNION SELECT vin,plate FROM vehicle_identifier WHERE enabled=1 UNION SELECT vin,plate FROM vehicle_identity_binding"):
if r['plate'] and r['vin']:maps[r['plate'].strip()].add(r['vin'])
unmapped=[]; mapped=[]
for r in rows:
vins=maps[r['plate']]
if len(vins)!=1:unmapped.append(dict(r,matching_vins=sorted(vins)));continue
mapped.append(dict(r,vin=next(iter(vins))))
assert len({(r['vin'],r['date']) for r in mapped})==len(mapped),'VIN/date collision'
source_ids=[r['id'] for r in query("SELECT id FROM vehicle_data_source WHERE protocol='JT808' AND (source_code='saige' OR platform_name LIKE '%%赛格%%')")]
existing=query("SELECT s.* FROM vehicle_daily_mileage_source s LEFT JOIN vehicle_data_source d ON d.protocol=s.protocol AND d.source_ip=s.source_ip WHERE s.protocol='JT808' AND s.stat_date BETWEEN '2026-07-01' AND '2026-08-31' AND (d.source_code='saige' OR d.platform_name LIKE '%%赛格%%' OR s.platform_name LIKE '%%赛格%%' OR s.source_key LIKE '%%saige%%')")
finals=query("SELECT * FROM vehicle_daily_mileage WHERE protocol='JT808' AND stat_date BETWEEN '2026-07-01' AND '2026-08-31'")
keys={(r['vin'],str(r['stat_date'])) for r in existing}
keys.update((r['vin'],str(r['stat_date'])) for r in finals if r['source_id'] in source_ids)
pending=[r for r in mapped if (r['vin'],r['date']) not in keys]
summary=dict(input_rows=len(rows),mapped_rows=len(mapped),unmapped_rows=len(unmapped),unmapped_plates=sorted({r['plate'] for r in unmapped}),existing_saige_skipped=len(mapped)-len(pending),insert_candidates=len(pending),insert_vehicles=len({r['vin'] for r in pending}),insert_total_km=str(sum((decimal.Decimal(r['km']) for r in pending),decimal.Decimal(0))))
(root/'preflight.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2))
(root/'unmapped.json').write_text(json.dumps(unmapped,ensure_ascii=False,indent=2))
(root/'pending.json').write_text(json.dumps(pending,ensure_ascii=False,indent=2))
print(json.dumps(summary,ensure_ascii=False))
if '--apply' not in sys.argv:
c.rollback(); c.close(); sys.exit(0)
# Historical dates only. Lock every affected vehicle/day source range and result
# in deterministic order before rechecking existence. No UPDATE statements.
c.rollback()
pending.sort(key=lambda r:(r['vin'],r['date']))
before=[]; locked=[]; skipped_race=0
for r in pending:
args=(r['vin'],r['date'])
ss=query("SELECT * FROM vehicle_daily_mileage_source WHERE vin=%s AND stat_date=%s AND protocol='JT808' FOR UPDATE",args)
ff=query("SELECT * FROM vehicle_daily_mileage WHERE vin=%s AND stat_date=%s AND protocol='JT808' FOR UPDATE",args)
before.append(dict(vin=r['vin'],date=r['date'],sources=ss,final=ff))
has=any(s['source_ip'] in ('222.66.200.68','58.33.87.196','manual-saige-excel') or 'saige' in s['source_key'].lower() or '赛格' in (s['platform_name'] or '') for s in ss) or any(f['source_id'] in source_ids for f in ff)
if has:skipped_race+=1;continue
locked.append((r,ff))
(root/'backup-before.json').write_text(json.dumps(before,default=str,ensure_ascii=False))
ds=query("SELECT * FROM vehicle_data_source WHERE protocol='JT808' AND source_ip='manual-saige-excel'")
if ds:
assert ds[0]['source_code']=='saige' and ds[0]['platform_name']=='赛格'
sid=ds[0]['id']
else:
q.execute("INSERT INTO vehicle_data_source (protocol,source_ip,platform_name,source_code,source_kind,trust_priority,enabled,remark) VALUES ('JT808','manual-saige-excel','赛格','saige','PLATFORM',100,1,%s)",('赛格Excel每日里程导入;仅补缺,不覆盖已有记录;报表未提供累计总里程',))
sid=q.lastrowid
inserted=[]; final_inserted=0
for r,ff in locked:
key='JT808:'+r['phone']+'@PLATFORM:saige_excel'
reason='manual_saige_excel_import_20260907;file='+r['file']+';row='+str(r['row'])
q.execute("""INSERT INTO vehicle_daily_mileage_source
(vin,stat_date,protocol,source_key,source_ip,source_endpoint,phone,platform_name,daily_mileage_km,sample_count,quality_status,quality_reason,is_selected)
VALUES (%s,%s,'JT808',%s,'manual-saige-excel','manual-excel-import',%s,'赛格',%s,1,'OK',%s,%s)""",(r['vin'],r['date'],key,r['phone'],r['km'],reason,int(not ff)))
assert q.rowcount==1
if not ff:
q.execute("INSERT INTO vehicle_daily_mileage (vin,stat_date,protocol,source_id,daily_mileage_km) VALUES (%s,%s,'JT808',%s,%s)",(r['vin'],r['date'],sid,r['km']))
assert q.rowcount==1;final_inserted+=1
inserted.append(dict(r,source_key=key))
# Verify every old row is byte-for-byte equivalent as typed query results.
for b in before:
args=(b['vin'],b['date'])
now=query("SELECT * FROM vehicle_daily_mileage_source WHERE vin=%s AND stat_date=%s AND protocol='JT808'",args)
lookup={s['source_key']:s for s in now}
assert all(lookup[s['source_key']]==s for s in b['sources']), 'Existing source changed'
if b['final']:
assert query("SELECT * FROM vehicle_daily_mileage WHERE vin=%s AND stat_date=%s AND protocol='JT808'",args)==b['final'],'Existing final changed'
for r in inserted:
v=query("SELECT daily_mileage_km,latest_total_mileage_km,first_total_mileage_km FROM vehicle_daily_mileage_source WHERE vin=%s AND stat_date=%s AND protocol='JT808' AND source_key=%s",(r['vin'],r['date'],r['source_key']))
assert len(v)==1 and v[0]['daily_mileage_km']==decimal.Decimal(r['km']) and v[0]['latest_total_mileage_km'] is None and v[0]['first_total_mileage_km'] is None
result=dict(summary,inserted_sources=len(inserted),inserted_final_rows=final_inserted,preserved_existing_final_rows=len(locked)-final_inserted,concurrent_skipped=skipped_race,source_id=sid,existing_rows_verified_unchanged=True)
(root/'inserted.json').write_text(json.dumps(inserted,ensure_ascii=False))
c.commit()
result['committed']=True
(root/'result.json').write_text(json.dumps(result,ensure_ascii=False,indent=2))
print(json.dumps(result,ensure_ascii=False))
c.close()
@@ -0,0 +1,25 @@
import xlrd, json, pathlib, decimal, hashlib, re
out=pathlib.Path(__file__).parent
rows=[]; summary=[]; seen={}
for p in sorted(pathlib.Path('/Users/lingniu/Documents').glob('里程统计报表*.xls')):
s=xlrd.open_workbook(str(p)).sheet_by_index(0)
meta={'file':p.name,'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'rows':s.nrows-1}
if s.cell_value(0,2)!='日期':
meta.update(excluded='No daily date column',nonzero=sum(decimal.Decimal(str(s.cell_value(i,3)))!=0 for i in range(1,s.nrows)))
summary.append(meta); continue
dates=[]
for i in range(1,s.nrows):
plate,phone,day,km=map(lambda x:str(x).strip(),s.row_values(i))
import datetime
datetime.date.fromisoformat(day)
assert re.fullmatch(r'(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?',km), km
amount=decimal.Decimal(km.replace(',','')); assert amount.is_finite() and amount>=0
key=(plate,day)
assert key not in seen, ('duplicate',key)
seen[key]=amount; dates.append(day)
rows.append(dict(plate=plate,phone=phone,date=day,km=str(amount),file=p.name,row=i+1))
meta.update(date_min=min(dates),date_max=max(dates),vehicles=len({r['plate'] for r in rows if r['file']==p.name}))
summary.append(meta)
(out/'rows.json').write_text(json.dumps(rows,ensure_ascii=False))
(out/'input-summary.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2))
print(json.dumps(summary,ensure_ascii=False,indent=2))
+15
View File
@@ -0,0 +1,15 @@
from db import connect
import pathlib,json,decimal,collections
p=pathlib.Path(__file__).parent
inserted=json.loads((p/'inserted.json').read_text())
c=connect();q=c.cursor()
q.execute("SELECT vin,stat_date,source_key,daily_mileage_km,latest_total_mileage_km FROM vehicle_daily_mileage_source WHERE source_ip='manual-saige-excel' AND stat_date BETWEEN '2026-07-01' AND '2026-08-31'")
actual={(r['vin'],str(r['stat_date']),r['source_key']):r for r in q.fetchall()}
months=collections.defaultdict(lambda:dict(rows=0,total_km=decimal.Decimal(0)))
for r in inserted:
a=actual[(r['vin'],r['date'],r['source_key'])]
assert a['daily_mileage_km']==decimal.Decimal(r['km']) and a['latest_total_mileage_km'] is None
m=months[r['date'][:7]];m['rows']+=1;m['total_km']+=a['daily_mileage_km']
v=dict(verified_rows=len(inserted),months=dict(months),verified_total_km=sum((m['total_km'] for m in months.values()),decimal.Decimal(0)))
(p/'verification.json').write_text(json.dumps(v,default=str,ensure_ascii=False,indent=2))
print(json.dumps(v,default=str,ensure_ascii=False));c.close()