Preserve August hydrogen revision and September audit evidence; calculate interrupted vehicle history across all prior months. Record remaining carry-policy and layout-baseline discrepancies.
52 lines
6.5 KiB
Python
52 lines
6.5 KiB
Python
from pathlib import Path
|
|
import shutil
|
|
O=Path(__file__).resolve().parent
|
|
S=Path('/Users/shishengliang/Documents/羚牛/里程考核核算/8月/资料检查/运行支持')
|
|
s=(S/'restyle_august.mjs').read_text()
|
|
s=s.replace("const sup=root+'/资料检查/运行支持', file=root+'/8月核算结果/里程任务考核_8月核算.xlsx';",f"const sup={str(O)!r}, file=sup+'/里程任务考核_8月核算_纯氢修正版.xlsx';")
|
|
s=s.replace("d.ledger.map(()=>[0])","d.ledger.map(l=>[l.withheld])")
|
|
s=s.replace("Math.abs(ii)>1e-6","Math.abs(ii-l.withheld)>1e-6")
|
|
s=s.replace('本次无停发扣减','保留原表扣减9.68元').replace('无停发扣减','保留原表扣减9.68元')
|
|
s=s.replace('本次应发=实发','本次实发')
|
|
s=s.replace('7月复算62,616.73元与历史一致。','1—7月实际已发保留,不追扣、不重复补发。1—6月按纯氢与原考核里程取小值,无纯氢则保留原里程。')
|
|
s=s.replace("const note='';return[l.plate", "const note=l.withhold_reason||'';return[l.plate")
|
|
s=s.replace("modern.getRange('A2:H3').format=", "modern.getRange('A2').values=[['1—6月历史里程已修正,1—7月实际已发保留。修正前后差额见8月调整对照。金额按发放项取分后汇总。']];modern.getRange('A2:H3').format=")
|
|
extra=r'''
|
|
const comparison=JSON.parse(await fs.readFile(sup+'/comparison.json','utf8'));
|
|
const changes=JSON.parse(await fs.readFile(sup+'/bonus_changes.json','utf8'));
|
|
const summary=JSON.parse(await fs.readFile(sup+'/recalculation_summary.json','utf8'));
|
|
const paid=JSON.parse(await fs.readFile(sup+'/historical_paid.json','utf8'));
|
|
const states=JSON.parse(await fs.readFile(sup+'/historical_states.json','utf8'));
|
|
const rev=sheet('历史里程修正',10,comparison.length+1);
|
|
table(rev,['月份','车牌号','业务负责人','原考核里程(km)','纯氢里程(km)','修正里程(km)','减少里程(km)','取数说明','考核区间','历史源表行'],comparison.map(x=>[x.month,x.plate,x.sales,x.original,x.hydrogen,null,null,x.note,x.intervals,x.source_rows]),{A:9,B:17,C:14,D:20,E:20,F:20,G:20,H:36,I:66,J:16},['D','E','F','G']);
|
|
rev.getRange(`F2:G${comparison.length+1}`).formulas=comparison.map((_,i)=>{let r=i+2;return[`=IF(ISNUMBER(E${r}),MIN(D${r},E${r}),D${r})`,`=D${r}-F${r}`];});
|
|
rev.freezePanes.freezeRows(1);rev.freezePanes.freezeColumns(3);rev.tables.add(`A1:J${comparison.length+1}`,true,'HydrogenRevision');
|
|
rev.getRange('L1').values=[['来源及取数口径']];rev.getRange('L2').values=[['纯氢:氢能源行驶里程9.14.rar,1月17日由补充同名文件替换。']];rev.getRange('L3').values=[['原里程:8月原表历史月份数据,已逐车逐人逐月核对历史考核源表。']];rev.getRange('L4').values=[['按原考核区间合计,同车同月同负责人先汇总后取小值。真实0按0。']];rev.getRange('L5').values=[['7—8月里程沿用原表。纯氢源数据变更后需重新运行核算。']];rev.getRange('L1:L5').format.columnWidth=88;
|
|
const delta=sheet('8月调整对照',7,70);widths(delta,{A:19,B:16,C:22,D:18,E:18,F:18,G:65},70);
|
|
write(delta,1,['8月纯氢里程修正结果']);bold(delta,1,7);
|
|
header(delta,3,['项目','原表实发(元)','修正实发(元)','差额(元)']);
|
|
let rr=4;for(const [cat,v] of Object.entries(summary.categories)){write(delta,rr,[cat,v.old,null,null]);delta.getRange(`C${rr}`).formulas=[[`=SUMIFS(${L('J')},${L('E')},A${rr})`]];delta.getRange(`D${rr}`).formulas=[[`=C${rr}-B${rr}`]];rr++;}
|
|
write(delta,14,['合计']);delta.getRange('B14:D14').formulas=[['=SUM(B4:B13)','=SUM(C4:C13)','=C14-B14']];bold(delta,14,4);delta.getRange('B4:D14').setNumberFormat(money);
|
|
write(delta,16,['1—7月已发保留,不追扣;已支付的考核月份不重复补发。']);
|
|
write(delta,17,['保留原表何文斌粤AGP5613当月奖励扣减9.68元。']);
|
|
write(delta,18,['结转取消后,按8月当月达标或累计达标条件重新判定本期奖励类别。']);
|
|
header(delta,20,['车牌号','业务负责人','发放类别','原实发(元)','新实发(元)','差额(元)','变化原因']);
|
|
changes.forEach((x,i)=>{const row=21+i;write(delta,row,[x.plate,x.sales,x.category,x.old,x.new,null,x.category==='结转'?'修正后上期可用结转不足':x.new===0?'修正后累计里程未达标,取消本次补发':'结转取消后,重新判定本期达标奖励']);delta.getRange(`F${row}`).formulas=[[`=E${row}-D${row}`]];});
|
|
delta.getRange(`D21:F${20+changes.length}`).setNumberFormat(money);grid(delta,`A20:G${20+changes.length}`);
|
|
const hist=sheet('历史已发台账',9,paid.length+16);
|
|
table(hist,['发放月','考核月','车牌号','考核负责人','实际接收人','发放类别','已发金额(元)','历史最终表','源表行'],paid.map(x=>[x.payment_month,x.assessment_month,x.plate,x.owner,x.recipient,x.category,x.amount,x.source,x.source_row]),{A:12,B:12,C:18,D:16,E:16,F:21,G:20,H:45,I:12},['G']);hist.freezePanes.freezeRows(1);
|
|
header(hist,paid.length+4,['月份','历史最终合计','逐项金额合计','取分差额']);
|
|
summary.payment_controls.forEach((x,i)=>write(hist,paid.length+5+i,[x.month,x.final_total,x.row_total,x.rounding_difference]));hist.getRange(`B${paid.length+5}:D${paid.length+11}`).setNumberFormat(money);
|
|
write(hist,paid.length+13,['历史最终合计原样保留。逐项取分与总额取分差0.01—0.03元不作追调;不影响已发资格。']);
|
|
const st=sheet('历史结转状态',10,states.length+1);
|
|
table(st,['月份','车牌号','业务负责人','累计应考核(km)','修正累计实际(km)','累计获得期数','实际已用期数','可用结转期数','本考核月已发','历史无考核结转'],states.map(x=>[x.month,x.plate,x.sales,x.cum_target,x.cum_actual,x.earned,x.used,null,x.paid?'是':'否',x.virtual?'是':'否']),{A:10,B:18,C:15,D:23,E:23,F:19,G:19,H:19,I:19,J:23},['D','E']);
|
|
st.getRange(`H2:H${states.length+1}`).formulas=states.map((_,i)=>[`=MAX(0,F${i+2}-G${i+2})`]);st.freezePanes.freezeRows(1);
|
|
previews.push(['历史里程修正','A1:H12'],['8月调整对照','A1:D18'],['8月调整对照','A20:G32'],['历史已发台账','A1:I12'],['历史结转状态','A1:J12']);
|
|
w.recalculate();
|
|
comparison.forEach((x,i)=>{if(Math.abs(rev.getRange(`F${i+2}`).values[0][0]-x.corrected)>1e-6)throw Error('Mileage min mismatch');});
|
|
if(Math.abs(delta.getRange('D14').values[0][0]-summary.difference)>1e-6)throw Error('Revision difference mismatch');
|
|
'''
|
|
s=s.replace('w.recalculate();\nif(Math.abs(modern',extra+'\nw.recalculate();\nif(Math.abs(modern',1)
|
|
(O/'build_revision.mjs').write_text(s)
|
|
shutil.copy2(S/'july_style_metadata.json',O/'july_style_metadata.json')
|