Skip to content

Commit 122b75e

Browse files
committed
seperate pyfiles and optimize group cases
1 parent 130f828 commit 122b75e

File tree

11 files changed

+871
-788
lines changed

11 files changed

+871
-788
lines changed

README.md

Lines changed: 16 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,10 @@
33
> * 法院法务自动化批量生成邮寄单据-Legal agency postal notes automatically generate app
44
> * 给予法务邮递人员从法务OA数据表(excel)和公开的判决书(docx)提取当事人地址内容,批量直接生成邮单。 减轻相关员负担,尤其系列案,人员多地址多,手工输入地址重复性劳动太多,信息容易错漏
55
6-
7-
86
[![](https://img.shields.io/github/release/autolordz/docx-content-modify.svg?style=popout&logo=github&colorB=ff69b4)](https://github.com/autolordz/docx-content-modify/releases)
97
[![](https://img.shields.io/badge/github-source-orange.svg?style=popout&logo=github)](https://github.com/autolordz/docx-content-modify)
108
[![](https://img.shields.io/github/license/autolordz/docx-content-modify.svg?style=popout&logo=github)](https://github.com/autolordz/docx-content-modify/blob/master/LICENSE)
119

12-
## 目录
13-
14-
<!-- MarkdownTOC autoanchor="true" autolink="true" uri_encoding="false" -->
15-
16-
- [环境](#环境)
17-
- [更新](#更新)
18-
- [内容](#内容)
19-
- [规则](#规则)
20-
- [详细指南](#详细指南)
21-
- [Licence](#licence)
22-
23-
<!-- /MarkdownTOC -->
24-
25-
<a id="环境"></a>
2610
## 环境
2711

2812
> * conda : 4.6.14
@@ -31,18 +15,17 @@
3115
> * 组件: python-docx,pandas,StyleFrame,configparser
3216
> * 打包程序: pyinstaller
3317
34-
<a id="更新"></a>
3518
## 更新
3619

37-
【2019-6-19】
38-
> * 添加合并系列案功能,节省打印资源
20+
【2019-9-19】
3921

40-
【2019-6-12】
22+
> * 整理合并系列案功能,优化代码
4123
42-
> * 更新判决书过滤词汇
24+
【2019-6-19】
25+
26+
> * 添加合并系列案功能,节省打印资源
4327
4428

45-
<a id="内容"></a>
4629
## 内容
4730

4831
- [x] 按格式重命名判决书
@@ -57,7 +40,6 @@
5740
- [x] 按照Data表输出寄送邮单
5841
- [x] 填充好所有信息,再次运行就能输出Data表指定邮单
5942

60-
<a id="规则"></a>
6143
## 规则
6244

6345
1. 当事人收信规则,没代理律师的每个当事人一份,有委托律师的只要寄给律师一份,多个律师寄给第一个律师,同一律所也是一份
@@ -89,21 +71,17 @@ Data表部分字段演示:
8971

9072
4. 【适用程序】规则(系列案用):
9173

92-
此处在OA表的【适用程序】填写,人为判断几个案是同一系列案的请在该字段中标注len(str)>3的唯一记号,系列案会自动合并
93-
94-
len(str)>3 = 记号多于三个字符
74+
此处在OA表中当事人几个案件中完全相同就合并为一个案件,发一次邮单,假如人员稍有差别,仍然按原来分开处理
9575

9676
例如:
9777

9878
| 【适用程序】 | 【案号】 |
9979
| --- | --- |
100-
| AAA | 2773 |
101-
| 2774-2776 | 2774 |
102-
| 2774-2776 | 2775 |
103-
| 2774-2776 | 2776 |
80+
| 2160、2161_集合 | 2160 |
81+
| 2160、2161_集合 | 2161 |
10482

10583

106-
5. config.txt:
84+
5. conf.txt:
10785
```python
10886
[config]
10987
data_xlsx = data_main.xlsx # 数据模板地址
@@ -114,20 +92,18 @@ flag_append_oa = 1 # 是否导入OA数据
11492
flag_to_postal = 1 # 是否打印邮单
11593
flag_check_jdocs = 0 # 是否检查用户格式,输出提示信息
11694
flag_check_postal = 0 # 是否检查邮单格式,输出提示信息
117-
flag_output_log = 1 # 是否保存打印
118-
data_case_codes = # 指定打印案号,可接多个,示例:AAA,BBB,优先级1
95+
data_case_codes = # 指定打印案号,可接多个,示例:AAA号,BBB号,优先级1
11996
data_date_range = # 指定打印数据日期范围示例:2018-09-01:2018-12-01,优先级2
120-
data_last_lines = 10 # 指定打印最后行数,优先级3
97+
data_last_lines = 3 # 指定打印最后行数,优先级3
12198
```
12299

123-
<a id="详细指南"></a>
124100
## 详细指南
125101

126102
简称:
127-
- [A表: data_oa.xlsx,OA表自己下载,这个只是参考](./demo_docs/data_oa.xlsx)
128-
- [B表: data_main.xlsx,会自动生成,也要修改](./demo_docs/data_main.xlsx)
129-
- [C目录: jdocs/,判决书目录,要放下载的判决书](./demo_docs/jdocs/)
130-
- [D文档: sheet.docx,邮单模板,按照背景生成邮单](./demo_docs/sheet.docx)
103+
- [A表: data_oa.xlsx,OA表自己下载,这个只是参考](./demo_docs/data_oa.xlsx)
104+
- [B表: data_main.xlsx,会自动生成,也要修改](./demo_docs/data_main.xlsx)
105+
- [C目录: jdocs/,判决书目录,要放下载的判决书](./demo_docs/jdocs/)
106+
- [D文档: sheet.docx,邮单模板,按照背景生成邮单](./demo_docs/sheet.docx)
131107
- [E目录: postal/,邮单目录](./demo_docs/postal/)
132108

133109
1. 根据 **A表** 格式,整理自己的OA表(没数据是没用的),先在OA表中修改【适用程序】(系列案),修改conf.txt文件,参考[规则](#规则),如文件丢失再次运行会生成
@@ -147,9 +123,8 @@ data_last_lines = 10 # 指定打印最后行数,优先级3
147123
5. 第二次运行(带【诉讼代理人】)
148124
会重复 3.4. 3.5. 3.6.
149125

150-
6. 小白没有python环境,可以直接下载最新的exe版本,[win7/win10(32/64))](https://github.com/autolordz/docx-content-modify/releases/download/1.0.1/exe-win7win10-8962f68c.zip),仍然需要设置config文件
126+
6. 小白没有python环境,可以直接下载最新的exe版本,使用前先配置conf.txt文件
151127

152-
<a id="licence"></a>
153128
## Licence
154129

155130
[See Licence](https://github.com/autolordz/docx-content-modify/blob/master/LICENSE)

configure.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
Created on Wed Sep 11 11:41:46 2019
4+
5+
@author: autol
6+
"""
7+
8+
import configparser
9+
10+
#%% config and default values
11+
12+
def write_config(cfgfile):
13+
cfg = configparser.ConfigParser(allow_no_value=1,
14+
inline_comment_prefixes=('#', ';'))
15+
16+
cfg['config'] = dict(
17+
data_xlsx = 'data_main.xlsx # 数据模板地址',
18+
data_oa_xlsx = 'data_oa.xlsx # OA数据地址',
19+
sheet_docx = 'sheet.docx # 邮单模板地址',
20+
flag_fill_jdocs_infos = '1 # 是否填充判决书地址',
21+
flag_append_oa = '1 # 是否导入OA数据',
22+
flag_to_postal = '1 # 是否打印邮单',
23+
flag_check_jdocs = '0 # 是否检查用户格式,输出提示信息',
24+
flag_check_postal = '0 # 是否检查邮单格式,输出提示信息',
25+
data_case_codes = ' # 指定打印案号,可接多个,示例:AAA,BBB,优先级1',
26+
data_date_range = ' # 指定打印数据日期范围示例:2018-09-01:2018-12-01,优先级2',
27+
data_last_lines = '3 # 指定打印最后行数,优先级3',
28+
)
29+
30+
with open(cfgfile, 'w',encoding='utf-8-sig') as configfile:
31+
cfg.write(configfile)
32+
print('>>> 重新生成配置 %s ...'%cfgfile)
33+
return cfg['config']
34+
35+
36+
#%%
37+
def read_config(cfgfile):
38+
cfg = configparser.ConfigParser(allow_no_value=True,
39+
inline_comment_prefixes=('#', ';'))
40+
cfg.read(cfgfile,encoding='utf-8-sig')
41+
ret = dict(
42+
data_xlsx = cfg['config']['data_xlsx'],
43+
data_oa_xlsx = cfg['config']['data_oa_xlsx'],
44+
sheet_docx = cfg['config']['sheet_docx'],
45+
data_case_codes = cfg['config']['data_case_codes'],
46+
data_date_range = cfg['config']['data_date_range'],
47+
data_last_lines = cfg['config']['data_last_lines'],
48+
flag_fill_jdocs_infos = int(cfg['config']['flag_fill_jdocs_infos']),
49+
flag_append_oa = int(cfg['config']['flag_append_oa']),
50+
flag_to_postal = int(cfg['config']['flag_to_postal']),
51+
flag_check_jdocs = int(cfg['config']['flag_check_jdocs']),
52+
flag_check_postal = int(cfg['config']['flag_check_postal']),
53+
)
54+
return ret
55+
# return dict(cfg.items('config'))
56+

copyinfos.py

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# -*- coding: utf-8 -*-
2+
"""
3+
Created on Wed Sep 11 12:08:08 2019
4+
5+
@author: autol
6+
"""
7+
8+
9+
#%%
10+
import re
11+
from collections import Counter
12+
from util import split_list,user_to_list,save_adjust_xlsx
13+
from globalvar import *
14+
15+
#%%
16+
17+
def copy_users_compare(jrow,df,errs=list(' ')):
18+
'''copy users and check users completement
19+
errs=['【OA无用户记录】','【用户错别字】','【字段重复】','【系列案】']
20+
如下对比:
21+
不相交,OA无用户记录
22+
判断字段重复,输出重复的内容
23+
比例确定怀疑用户错别字,判别不了直接正常输出
24+
判决书多于当前案件,认为是系列案
25+
判决书少于当前案件,当前案件缺部分地址
26+
'''
27+
28+
code0 = str(df['案号']).strip()
29+
code1 = str(df['原一审案号']).strip()
30+
jcode = str(jrow['判决书源号']).strip()
31+
x = Counter(user_to_list(df['当事人'])) # 当前案件
32+
y = Counter(list(jrow['new_adr'].keys())) # 判决书
33+
rxy = len(list((x&y).elements()))/len(list((x|y).elements()))
34+
rxyx = len(list((x&y).elements()))/len(list(x.elements()))
35+
rxyy = len(list((x&y).elements()))/len(list(y.elements()))
36+
# print('x=',x);print('y=',y);print('rxy=',rxy)
37+
# print('rxyx=',rxyx);print('rxyy=',rxyy)
38+
if rxy == 0: # 不相交,完全无关
39+
return errs[0]
40+
if max(x.values()) > 1 or max(y.values()) > 1: # 有字段重复
41+
xdu = [k for k,v in x.items() if v > 1] # 重复的内容
42+
ydu = [k for k,v in y.items() if v > 1]
43+
print_log('>>> %s 用户有字段重复【%s】-【案件:%s】 vs 【判决书:%s】'
44+
%(code0,'{0:.0%}'.format(rxy),xdu,ydu))
45+
return errs[2]
46+
if rxy == 1: # 完全匹配
47+
return df['当事人']
48+
if 0 < rxy < 1: # 错别字
49+
dx = list((x-y).elements())
50+
dy = list((y-x).elements())
51+
xx = Counter(''.join(dx))
52+
yy = Counter(''.join(dy))
53+
rxxyy = len(list(xx&yy.keys()))/len(list(xx|yy.keys()))
54+
# print('rxxyy=',rxxyy)
55+
if rxxyy >= .6:
56+
print_log('>>> %s 认为【错别字率 %s】->【案件:%s vs 判决书:%s】'
57+
%(code0,'{0:.0%}'.format(1-rxxyy),dx,dy))
58+
return errs[1]
59+
elif rxxyy >= .2:
60+
print_log('>>> %s 认为【不好判断当正常处理【差异率 %s】vs【相同范围:%s】->【差异范围:案件:%s vs 判决书:%s】 '
61+
%(code0,'{0:.0%}'.format(1-rxxyy),
62+
list((x&y).elements()),
63+
dx,dy))
64+
return df['当事人']
65+
if rxyx > .8:
66+
print_log('>>> %s 案件 %s人 < 判决书 %s人'%(code0,len(x),len(y)))
67+
if jcode != code1:# 系列案
68+
print_log('>>> %s 认为【系列案,判决书人员 %s 多出地址】'%(code0,list((y-x).elements())))
69+
return errs[3]
70+
else:
71+
return df['当事人']
72+
elif rxyy > .8:
73+
print_log('>>> %s 案件 %s人 > 判决书 %s人'%(code0,len(x),len(y)))
74+
print_log('>>> %s 认为【当前案件人员 %s 缺地址】'%(code0,list((x-y).elements())))
75+
return df['当事人']
76+
return errs[0]
77+
78+
79+
def copy_rows_adr1(x,n_adr):
80+
''' copy jdocs address to address column
81+
格式:['当事人','诉讼代理人','地址','new_adr','案号']
82+
同时排除已有代理人的信息
83+
'''
84+
user = x['当事人'];agent = x['诉讼代理人'];adr = x['地址']; codes = x['案号']
85+
if not isinstance(n_adr,dict):
86+
return adr
87+
else:
88+
y = split_list(r'[,,]',adr)
89+
adr1 = y.copy()
90+
for i,k in enumerate(n_adr):
91+
by_agent = any([k in ag for ag in re.findall(r'[\w+、]*\/[\w+]*',agent)]) # 找到代理人格式 'XX、XX/XX_123123'
92+
if by_agent and k in adr: # remove user's address when user with agent 用户有代理人就不要地址
93+
y = list(filter(lambda x:not k in x,y))
94+
if type(n_adr) == dict and not k in adr and k in user and not by_agent:
95+
y += [k+adr_tag+n_adr.get(k)] # append address by rules 输出地址格式
96+
adr2 = y.copy()
97+
adr = ','.join(list(filter(None, y)))
98+
if Counter(adr1) != Counter(adr2) and adr and flag_check_jdocs:
99+
print_log('>>> 【%s】成功复制判决书地址=>【%s】'%(codes,adr))
100+
return adr
101+
102+
address_tmp_xlsx = 'address_tmp.xlsx'
103+
104+
def copy_rows_user_func(dfj,dfo):
105+
106+
'''copy users line regard adr user'''
107+
errs = ['【OA无用户记录】','【用户错别字】','【字段重复】','【系列案】']
108+
109+
dfo['判决书源号'] = ''
110+
111+
def find_source():
112+
print_log('\n>>> 判决书信息 | 案号=%s | 源号=%s | 判决书源号=%s'%(code0,code1,jcode))
113+
dfo.loc[i,'地址'] = copy_rows_adr1(dfor,n_adr)
114+
dfo.loc[i,'判决书源号'] = jcode
115+
116+
for (i,dfor) in dfo.iterrows():
117+
for (j,dfjr) in dfj.iterrows():
118+
code0 = str(dfor['案号']).strip()
119+
code1 = str(dfor['原一审案号']).strip()
120+
jcode = str(dfjr['判决书源号']).strip()
121+
n_adr = dfjr['new_adr']
122+
if isinstance(n_adr,dict):
123+
if not n_adr:continue# 提取jdocs字段失败
124+
if code1 == jcode:# 同案号,则找到内容
125+
find_source() ; break
126+
else:#[::-1] # 没案号
127+
tag1 = copy_users_compare(dfjr,dfor,errs)
128+
if tag1 not in errs:
129+
find_source() ; break
130+
else: pass
131+
dfj = dfj.fillna('')
132+
save_adjust_xlsx(dfj,address_tmp_xlsx,textfit=('判决书源号','new_adr')) # 保存临时提取信息
133+
return dfo

demo_docs/conf.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[config]
2+
data_xlsx = data_main.xlsx # 数据模板地址
3+
data_oa_xlsx = data_oa.xlsx # OA数据地址
4+
sheet_docx = sheet.docx # 邮单模板地址
5+
flag_fill_jdocs_infos = 1 # 是否填充判决书地址
6+
flag_append_oa = 1 # 是否导入OA数据
7+
flag_to_postal = 1 # 是否打印邮单
8+
flag_check_jdocs = 0 # 是否检查用户格式,输出提示信息
9+
flag_check_postal = 0 # 是否检查邮单格式,输出提示信息
10+
data_case_codes = # 指定打印案号,可接多个,示例:AAA,BBB,优先级1
11+
data_date_range = # 指定打印数据日期范围示例:2018-09-01:2018-12-01,优先级2
12+
data_last_lines = 3 # 指定打印最后行数,优先级3
13+

0 commit comments

Comments
 (0)