gaoluyang
2 天以前 e40a608ef9bf51db294d8eefada6a8e2e80cebca
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import sys, json
from pathlib import Path
from datetime import datetime
from decimal import Decimal
sys.stdout.reconfigure(encoding='utf-8')
sys.path.insert(0, str(Path(__file__).parent / 'iqc-import-20261012/deps'))
import pymysql
apply = '--apply' in sys.argv
with pymysql.connect(host='36.213.150.237', port=10000, user='root', password=sys.stdin.readline().strip(), database='mom-hm', charset='utf8mb4', connect_timeout=15, cursorclass=pymysql.cursors.DictCursor) as conn:
    with conn.cursor() as q:
        q.execute('SELECT DATABASE() db')
        assert q.fetchone()['db'] == 'mom-hm'
        q.execute('SELECT * FROM crm_receivable_plan WHERE deleted=0 AND id IN (43,44,45,46,47,48,49,50) ORDER BY id' + (' FOR UPDATE' if apply else ''))
        before=q.fetchall()
        assert len(before)==8
        changes=[]
        for row in before:
            q.execute('SELECT COALESCE(SUM(price),0) paid FROM crm_receivable WHERE deleted=0 AND audit_status=20 AND (plan_id=%s OR id=%s)', (row['id'],row['receivable_id']))
            paid=Decimal(q.fetchone()['paid'])
            remain=max(Decimal(row['price'])-paid,Decimal('0'))
            due=row['return_time'].strftime('%Y-%m-%d') if row['return_time'] else None
            date_text=f'计划回款日期{due}' if due else '计划日期待确认'
            remark=f'尚未回款余额{remain:.2f}元;已回款{paid:.2f}元。{date_text};实际到账情况待核对'
            changes.append({'id':row['id'],'before':row['remark'],'after':remark})
        print(json.dumps({'changes':changes},ensure_ascii=False))
        if apply:
            assert all(not (x['remark'] or '').strip() for x in before), '仅填充此前清空的8条备注,避免覆盖新内容'
            out=Path(__file__).parent/'receivable-plan-remark-20261015'
            out.mkdir(exist_ok=True)
            stamp=datetime.now().strftime('%Y%m%d%H%M%S')
            (out/f'fill-before-{stamp}.json').write_text(json.dumps(before,ensure_ascii=False,default=str,indent=2),encoding='utf-8')
            for change in changes:
                q.execute('UPDATE crm_receivable_plan SET remark=%s,update_time=update_time WHERE id=%s AND deleted=0', (change['after'],change['id']))
                assert q.rowcount==1
            q.execute('SELECT * FROM crm_receivable_plan WHERE deleted=0 AND id IN (43,44,45,46,47,48,49,50) ORDER BY id')
            after=q.fetchall()
            assert len(after)==len(before)
            for a,b,change in zip(after,before,changes):
                assert a['remark']==change['after']
                assert {k:v for k,v in a.items() if k!='remark'}=={k:v for k,v in b.items() if k!='remark'}
            conn.commit()
            (out/f'fill-result-{stamp}.json').write_text(json.dumps(changes,ensure_ascii=False,indent=2),encoding='utf-8')
            print(json.dumps({'updated':len(changes),'onlyRemarkChanged':True}))