Files
jupyter/体测单位/镇海.ipynb
T
2025-11-26 15:29:09 +08:00

2767 lines
86 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"id": "92891af2-e909-4b8e-a08a-b5b5e4a1c732",
"metadata": {
"jp-MarkdownHeadingCollapsed": true
},
"source": [
"# 体质测试2024年"
]
},
{
"cell_type": "markdown",
"id": "338fb8da-815a-4536-ae91-4f461ba9401f",
"metadata": {},
"source": [
"## 体测人员导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ba24132c-133f-4508-8fe7-e68d1908b6e9",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"wb = openpyxl.load_workbook('data/镇海参加测试人员名单(合并).xlsx')\n",
"sheet = wb.active\n",
"# sheets = wb.sheetnames\n",
"person = {}\n",
"\n",
"for n in range(2, sheet.max_row+1):\n",
" code = int(sheet.cell(n, 1).value)\n",
" person.setdefault(code, {})\n",
" dict1 = {}\n",
" dict1['name'] = sheet.cell(n, 2).value\n",
" dict1['sex'] = sheet.cell(n, 3).value\n",
" dict1['unit'] = sheet.cell(n, 5).value\n",
" if sheet.cell(n, 6).value is not None:\n",
" dict1['gh'] = sheet.cell(n, 6).value\n",
" dict1['birth'] = str(sheet.cell(n, 4).value).replace('/','-').split(' ')[0] \n",
" if sheet.cell(n, 7).value is not None:\n",
" dict1['phone'] = str(sheet.cell(n,7).value)\n",
" person[code] = dict1\n",
"filename = 'data/镇海(合并).json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(person, fl, ensure_ascii=False)\n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"id": "10ddfd3b-697c-4459-8bed-147b22f88239",
"metadata": {},
"source": [
"## 生成读卡系统文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "63ab2d5b-3a0a-4ac7-a3e7-b3a34e621e98",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"filename = 'data/镇海.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"list1 = []\n",
"for k, v in dict1.items():\n",
" dict2 = {}\n",
" #if dict1['sex'] =='男':\n",
" # sex = 1\n",
" \n",
" dict2 = {'id':k,'name':v['name'],'gender':v['sex'],'birth':v['birth'],'unit':v['unit']}\n",
" list1.append(dict2)\n",
"json_data = json.dumps(list1,ensure_ascii=False, indent=4) \n",
"\n",
"# 将 json 数据写入文件\n",
"with open(\"data/card_镇海.json\", \"w\",encoding = 'utf-8') as file:\n",
" file.write(json_data) \n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"id": "b6dd08b0-f58c-4dc1-86a9-e7b2b84478c3",
"metadata": {},
"source": [
"## 获取人员测试成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5d864909-d10f-461d-8e6e-dc5c43613576",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"import csv\n",
"\n",
"filename = '../item.json'\n",
"item = {}\n",
"unit = {}\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for k,v in dict1.items():\n",
" item[k] = v\n",
"re_ta = {}\n",
"dict1 = {}\n",
"list1 = []\n",
"filename = 'data/镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"\n",
"filename = 'data/places_result_20240922.csv'\n",
"with open(filename,'r',newline='') as csv_file:\n",
" fl = csv.reader(csv_file,delimiter=',')\n",
" header = next(fl) \n",
" for line in fl:\n",
" #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n",
" list1.append(line)\n",
"#print(list1)\n",
"for result in list1:\n",
" user = str(result[2])\n",
" if user in dict1.keys(): \n",
" m_item = str(result[3]) \n",
" re_ta.setdefault(user,{}) \n",
" re_ta[user]['name'] = dict1[user]['name']\n",
" re_ta[user]['sex'] = dict1[user]['sex'] \n",
" re_ta[user]['unit'] = dict1[user]['unit']\n",
" #re_ta[user]['sub_unit'] = dict1[user]['sub_unit']\n",
" item_name = item[m_item]['name']\n",
" re_ta[user].setdefault(item_name,{}) \n",
" score = int(result[4])/item[m_item]['divisor'] \n",
" re_ta[user][item_name]['成绩'] = f'{score} {item[m_item][\"unit\"]}'\n",
"print(len(re_ta))\n",
"filename = 'data/result_镇海(合并).json'\n",
"\n",
"with open(filename,'w') as fl:\n",
" json.dump(re_ta, fl, ensure_ascii=False) \n",
"print(len(re_ta))"
]
},
{
"cell_type": "markdown",
"id": "a08c6b65-a390-451b-b1a5-fc474db40035",
"metadata": {},
"source": [
"## 导出测试人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bc79f0d2-62a2-40c8-bd74-9c7ff17bec8e",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"title = ['编号','姓名','性别','单位','部门','身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"\n",
"filename = 'data/result_镇海.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/镇海体测人员.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
" \n",
"list1 = []\n",
"for k, v in dict1.items():\n",
" list2 = []\n",
" list2.append(str(k).rjust(5,'0'))\n",
" list2.append(v['name']) \n",
" list2.append(dict2[k]['sex'])\n",
" list2.append(dict2[k]['unit']) \n",
" for item in items:\n",
" if item in v.keys():\n",
" list2.append(v[item]['成绩']) \n",
" elif item =='name':\n",
" list2.append(v[item])\n",
" else:\n",
" list2.append('')\n",
" list2.append(dict2[k]['gwxl'])\n",
" list2.append(dict2[k]['gzz'])\n",
" list1.append(list2)\n",
"filename = 'data/镇海体测情况表.xlsx'\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row)\n",
" \n",
"wb.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "0c2dfa71-8680-4ec6-938d-d37eeba4d4f9",
"metadata": {},
"source": [
"## 统计未体测人员明细表"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cf22739a-5cf3-47fd-b87a-158a2e2d5a95",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"filename = 'data/result_镇海.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/镇海1.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"\n",
"list1 = []\n",
"\n",
"i = 1\n",
"for k, v in dict2.items(): \n",
" if k not in dict1.keys():\n",
" list2 = [i,k,v['name'],v['unit']]\n",
" i+=1\n",
" list1.append(list2)\n",
"#print(list1)\n",
"filename = f'data/镇海未测试人员名单(截至20240922).xlsx'\n",
"title = ['序号','员工编号','姓名','部门']\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row) \n",
"wb.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "286a65eb-995f-4183-a4e5-6d907ba21151",
"metadata": {},
"source": [
"## 清理重复人员"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f4dade65-f760-4220-8a65-39843688a60a",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"filename = 'data/镇海.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"print(len(dict1))\n",
"dict2 = {}\n",
"for k, v in dict1.items():\n",
" if 'phone' in v.keys():\n",
" dict2.setdefault(k,{})\n",
" dict2[k]['name'] = v['name']\n",
" dict2[k]['phone'] = v['phone']\n",
"\n",
"list1 = []\n",
"for k, v in dict2.items():\n",
" i = 0\n",
" for k1, v1 in dict1.items():\n",
" if v['name']== v1['name'] and v['phone'] == v1['phone'] and k1 != k:\n",
" list1.append(max(int(k),int(k1)))\n",
"for item in set(list1):\n",
" del dict1[str(item)]\n",
"print(len(dict1))\n",
"filename = 'data/镇海1.json'\n",
"\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False) \n"
]
},
{
"cell_type": "markdown",
"id": "e513b5bb-8a4e-412a-880b-1ae36e059bfd",
"metadata": {},
"source": [
"## 转换报告格式"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7f038e8d-dd57-4880-8726-6dfa86fbc4a2",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import datetime\n",
"import csv\n",
"from datetime import date\n",
"\n",
"filename = '../item.json'\n",
"item = {}\n",
"unit = {}\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for k,v in dict1.items():\n",
" item[k] = v\n",
"item['1']['en'] = 'lung'\n",
"item['2']['en'] = 'grip'\n",
"item['3']['en'] = 'flexion'\n",
"item['4']['en'] = 'jump'\n",
"item['5']['en'] = 'pushup'\n",
"item['6']['en'] = 'balance'\n",
"item['7']['en'] = 'reaction'\n",
"item['8']['en'] = 'step'\n",
"item['9']['en'] = 'situp'\n",
"item['10']['en'] = 'height'\n",
"item['11']['en'] = 'weight'\n",
"\n",
"\n",
"re_ta = {}\n",
"dict1 = {}\n",
"list1 = []\n",
"filename = 'data/镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"\n",
"filename = 'data/places_result_20240922.csv'\n",
"with open(filename,'r',newline='') as csv_file:\n",
" fl = csv.reader(csv_file,delimiter=',')\n",
" header = next(fl) \n",
" for line in fl:\n",
" #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n",
" list1.append(line)\n",
"#f_item = ['lung','grip','flexion','jump','balance','reaction','step','situp']\n",
"#m_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step']\n",
"for result in list1:\n",
" user = str(result[2])\n",
" rq = date.fromisoformat(result[6].replace('/','-'))\n",
" if user in dict1.keys():\n",
" l_xm = []\n",
" m_item = str(result[3]) \n",
" re_ta.setdefault(user,{}) \n",
" re_ta[user]['name'] = dict1[user]['name']\n",
" re_ta[user]['sex'] = dict1[user]['sex']\n",
" if dict1[user]['sex'] == '男':\n",
" l_xm = ['weight','height','lung','grip','flexion','jump','pushup','balance','reaction','step']\n",
" else:\n",
" l_xm = ['weight','height','lung','grip','flexion','jump','balance','reaction','step','situp']\n",
" re_ta[user]['unit'] = dict1[user]['unit']\n",
" #birth = date.fromisoformat(dict1[user]['birth'].replace('/','-'))\n",
" birth = date.fromisoformat(dict1[user]['birth'])\n",
" #nian = int(birth[0].strip())\n",
" #yue = int(birth[1].strip())\n",
" #ri = int(birth[2].strip())\n",
" #print(k,nian,yue,ri)\n",
" item_name = item[m_item]['en'] \n",
" if item_name in l_xm: \n",
" days = (rq-birth).days \n",
" re_ta[user]['age'] = int(days/365)\n",
" re_ta[user]['month'] = int(days/365*12)\n",
" re_ta[user]['rq'] = result[6]\n",
"\n",
"\n",
" re_ta[user].setdefault(item_name,{}) \n",
" score = int(result[4])/item[m_item]['divisor'] \n",
" re_ta[user][item_name]['成绩'] = f'{score} {item[m_item][\"unit\"]}'\n",
"print(len(re_ta))\n",
"filename = 'data/result_镇海(合并).json'\n",
"\n",
"with open(filename,'w') as fl:\n",
" json.dump(re_ta, fl, ensure_ascii=False) \n",
"print(len(re_ta))"
]
},
{
"cell_type": "markdown",
"id": "de2eec6d-a74e-47e1-ab7a-c7f6eda80a20",
"metadata": {},
"source": [
"## 生成完善得分"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "763aa68a-da54-4745-a759-4399aba10f7e",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"\n",
"filename = '../item.json'\n",
"item = {}\n",
"unit = {}\n",
"with open(filename,'r') as fl:\n",
" dict3 = json.load(fl) \n",
"for k,v in dict3.items():\n",
" item[k] = v\n",
"item['1']['en'] = 'lung'\n",
"item['2']['en'] = 'grip'\n",
"item['3']['en'] = 'flexion'\n",
"item['4']['en'] = 'jump'\n",
"item['5']['en'] = 'pushup'\n",
"item['6']['en'] = 'balance'\n",
"item['7']['en'] = 'reaction'\n",
"item['8']['en'] = 'step'\n",
"item['9']['en'] = 'situp'\n",
"item['10']['en'] = 'height'\n",
"item['11']['en'] = 'weight'\n",
"\n",
"filename = 'data/体质检测标准 (1).json' \n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"\n",
"\n",
"def cal_score(data1):\n",
" #data = {'name':'张三','sex':'M','age':37,'item':'StepExperiment','result':46} \n",
" person = dict1['person']\n",
" criteria = dict1['criteria']\n",
" if data1['age'] >59:\n",
" data1['age'] = 59\n",
" if data1['age'] <20:\n",
" data1['age'] = 20\n",
" info = data1['sex']+str(data1['age'])\n",
" bz = person[info]\n",
" mx = criteria[bz][data1['item']]\n",
" result = data1['result'] \n",
" if data1['item'] == 'reaction':\n",
" for bz1 in mx:\n",
" if result > bz1:\n",
" #print(bz1)\n",
" score = mx.index(bz1,0)\n",
" break\n",
" else:\n",
" score = 5\n",
" else:\n",
" for bz1 in mx:\n",
" if result < bz1:\n",
" #print(bz1)\n",
" score = mx.index(bz1,0)\n",
" break\n",
" else:\n",
" score = 5\n",
" return(score)\n",
"filename = 'data/体质检测标准_BMI.json'\n",
"with open(filename,'r') as fl:\n",
" dict4 = json.load(fl) \n",
" \n",
"def cal_bmi(data1):\n",
" # data = {'name':'张三','sex':'M','age':37,'item':'HeightWeight','result':'177.7,97.0'}\n",
" person = dict4['person']\n",
" criteria = dict4['criteria']\n",
" if data1['age'] > 59:\n",
" data1['age'] = 59\n",
" if data1['age'] <20:\n",
" data1['age'] = 20\n",
" info = data1['sex']+str(data1['age'])\n",
" bz = person[info]\n",
" #print(bz)\n",
" result = data1['result']\n",
" #print(data1['code'],result)\n",
" height = int(float(result.split(',')[0]))\n",
" weight = float(result.split(',')[1])\n",
" if str(height) not in criteria[bz]:\n",
" score = 1\n",
" else: \n",
" mx = criteria[bz][str(height)]\n",
" if weight < mx[0]:\n",
" score = 1\n",
" elif weight < mx[1]:\n",
" score = 3\n",
" elif weight < mx[2]:\n",
" score = 5 \n",
" elif weight <= mx[3]:\n",
" score = 3 \n",
" elif weight > mx[3]:\n",
" score = 1\n",
" return score\n",
" \n",
" \n",
"\n",
"#list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','height','weight']\n",
"list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp']\n",
"filename = 'data/result_镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl) \n",
"for k, v in dict2.items():\n",
" #print(k)\n",
" if v['sex'] == '男':\n",
" sex = 'M'\n",
" else:\n",
" sex = 'F' \n",
" if 'height' in v.keys() and 'weight' in v.keys():\n",
" bmi_data = v['height']['成绩'].split()[0]+','+ v['weight']['成绩'].split()[0]\n",
" data1 = {'code':k,'sex':sex,'age':v['age'],'item':'HeightWeight','result':bmi_data}\n",
" dict2[k]['bmi'] = {}\n",
" dict2[k]['bmi']['成绩'] = bmi_data\n",
" dict2[k]['bmi']['score'] = cal_bmi(data1)\n",
" for item_en in list_item:\n",
" if item_en in v.keys(): \n",
" data1 = {'code':k,'sex':sex,'age':v['age'],'item':item_en,'result':float(v[item_en]['成绩'].split()[0])}\n",
" dict2[k][item_en]['score'] = cal_score(data1)\n",
" #print(k,v[item_en]['成绩'],cal_score(data1))\n",
"\n",
"filename = f'data/result_镇海(合并).json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print('ok!') "
]
},
{
"cell_type": "markdown",
"id": "bb0f8c6f-5088-4c4d-a253-9c207745ef25",
"metadata": {},
"source": [
"## 生成体测成绩明细表"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5cff3c83-b3cb-4c69-97a9-82e523374f6b",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"items = ['lung','grip','flexion','jump','pushup','situp','balance','reaction','step']\n",
"bmi = ['height','weight']\n",
"title = ['编号','姓名','性别','单位/部门','身高','体重','bmi','肺活量','','握力','','坐位体前屈','','纵跳','','俯卧撑','','一分钟仰卧起坐','','单脚站立','','选择反应时','','台阶指数']\n",
"\n",
"filename = 'data/result_镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"list1 = []\n",
"for k, v in dict1.items(): #print(k,dict2[str(k)]['name'])\n",
" list2 = []\n",
" list2.append(str(k).rjust(5,'0'))\n",
" list2.append(dict1[k]['name']) \n",
" list2.append(dict1[k]['sex'])\n",
" list2.append(dict1[k]['unit'])\n",
" i = 0\n",
" if 'bmi' in dict1[k].keys():\n",
" list2.append(dict1[k]['height']['成绩'])\n",
" list2.append(dict1[k]['weight']['成绩'])\n",
" list2.append(dict1[k]['bmi']['score'])\n",
" i+=1\n",
" else:\n",
" list2.append('') \n",
" list2.append('') \n",
" list2.append('') \n",
" \n",
" \n",
" for item in items:\n",
" if item in dict1[k].keys():\n",
" list2.append(dict1[k][item]['成绩'])\n",
" list2.append(dict1[k][item]['score']) \n",
" i+=1\n",
" elif item =='name':\n",
" list2.append(dict1[k][item])\n",
" else:\n",
" list2.append('') \n",
" list2.append('') \n",
" if i>2:\n",
" list1.append(list2)\n",
"filename = 'data/镇海体测情况明细表.xlsx'\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row)\n",
" \n",
"wb.save(filename)\n",
"print('ok') "
]
},
{
"cell_type": "markdown",
"id": "723ae3d7-ec16-4dc6-91e2-eeeea6ffe081",
"metadata": {},
"source": [
"## 生成报告"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "90faac13-492d-4b3d-bb21-c228af6d9864",
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import json\n",
"import openpyxl\n",
"\n",
"\n",
"headers = {\n",
" \"Content-Type\": \"application/json; charset=UTF-8\"\n",
" }\n",
"filename = 'data/result_镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"list1 = []\n",
"file_path ='./镇海石化/'\n",
"list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']\n",
"i=0\n",
"list2 = []\n",
"for k, v in dict1.items():\n",
" list1 = []\n",
" mydata = {}\n",
" \n",
" id = str(k).rjust(4,\"0\")\n",
" mydata['path'] = file_path+id+'-'+ v['name']+'.pdf'\n",
" mydata['title'] = '中国石化镇海炼化公司'\n",
" mydata['subtitle'] = v['unit']\n",
" mydata['id'] = id\n",
" mydata['name'] = v['name']\n",
" if v['sex'] == '男':\n",
" mydata['gender'] = 'male'\n",
" else:\n",
" mydata['gender'] = 'female'\n",
" \n",
" mydata['month'] = v['month']\n",
" mydata['fits'] = {}\n",
" survey_list = ['tcm','psy','spine']\n",
" for item in survey_list:\n",
" if item in v.keys():\n",
" mydata.setdefault('surveys',{})\n",
" mydata['surveys'][item] = v[item]\n",
" \n",
" \n",
" #mydata['fits'] = {}\n",
" for item in list_item:\n",
" if item in v.keys():\n",
" mydata.setdefault('fits',{})\n",
" if item in ['lung','pushup','step','situp']:\n",
" mark = v[item]['成绩'].split()[0].split('.')[0]\n",
" else:\n",
" mark = v[item]['成绩'].split()[0]\n",
" mydata['fits'][item] = {'mark':mark,'score':v[item]['score']}\n",
" #if len(mydata['fits']) >2 or len(mydata['surveys']) >0:\n",
" if len(mydata['fits']) >2 : \n",
" list1.append(mydata)\n",
" list2.append([k,v['name']])\n",
" i+=1\n",
" x = requests.post('http://localhost:3003', data = json.dumps(list1), headers=headers)\n",
" #print(id,v['name'],x.text)\n",
" #print(mydata)\n",
" #x.close()\n",
"print(i)"
]
},
{
"cell_type": "markdown",
"id": "82c1eaea-89ad-444a-8dad-07f438c739cc",
"metadata": {},
"source": [
"## 统计报告人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "61c731bc-6117-4a9f-8bfa-66f820e49fc4",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import glob\n",
"from pathlib import Path\n",
"import openpyxl\n",
"\n",
"filename = 'data/镇海.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"fi_path = '/home/songyi/python/mycrm/flask/pdf/files/345321'\n",
"fls = glob.glob(f'{fi_path}/*.pdf')\n",
"dict2 = {}\n",
"for fn in fls:\n",
" \n",
" fi_name =Path(fn).stem.split('-')[0]\n",
" #fi_name =Path(fn).stem\n",
" code = int(fi_name)\n",
" dict2[str(code)] = dict1[str(code)]\n",
"filename = 'data/镇海体测人员.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print(len(dict2)) \n",
"list1 = []\n",
"for k, v in dict2.items(): \n",
" list2 = []\n",
" if 'gh' in v.keys():\n",
" gh = v['gh']\n",
" else:\n",
" gh = ''\n",
" if 'phone' in v.keys():\n",
" phone = v['phone']\n",
" else:\n",
" phone = ''\n",
" list2 = [k,v['name'],v['sex'],v['birth'],v['unit'],gh,phone]\n",
" list1.append(list2)\n",
"#print(list1)\n",
"filename = 'data/镇海参加测试人员名单.xlsx'\n",
"title = ['序号','员工编号','姓名','部门']\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row) \n",
"wb.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "fc0f353c-1021-4c8c-bb7c-7a4abb609836",
"metadata": {},
"source": [
"## 补充报告人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fa963fb6-b47d-4b75-9109-6cda89218182",
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"import json\n",
"import glob\n",
"from pathlib import Path\n",
"import openpyxl\n",
"\n",
"\n",
"filename = 'data/镇海体测人员.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"wb = openpyxl.load_workbook('data/镇海炼化参加测试人员名单(分析用).xlsx')\n",
"sheet = wb.active\n",
"for n in range(2, sheet.max_row+1):\n",
" if sheet.cell(n, 12).value is not None:\n",
" code = int(sheet.cell(n, 1).value)\n",
" if sheet.cell(n, 12).value is not None:\n",
" dict1[str(code)]['gwlb'] = sheet.cell(n, 12).value\n",
" dict1[str(code)]['gwxl'] = sheet.cell(n, 9).value\n",
" dict1[str(code)]['gzz'] = sheet.cell(n, 11).value\n",
"\n",
"with open(filename, 'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False) \n",
"print('ok!') \n"
]
},
{
"cell_type": "markdown",
"id": "385285b8-fdb3-421d-afbf-c13e4f55bb46",
"metadata": {},
"source": [
"## 核验报告人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c6195bc3-64bc-4f52-8ebc-ba16fd222f85",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"wb = openpyxl.load_workbook('data/镇海炼化参加测试人员名单.xlsx')\n",
"sheet = wb.active\n",
"# sheets = wb.sheetnames\n",
"person = {}\n",
"\n",
"for n in range(2, sheet.max_row+1):\n",
" code = int(sheet.cell(n, 1).value)\n",
" person.setdefault(code, {})\n",
" dict1 = {}\n",
" dict1['name'] = sheet.cell(n, 2).value\n",
" dict1['sex'] = sheet.cell(n, 3).value\n",
" dict1['unit'] = sheet.cell(n, 5).value\n",
" if sheet.cell(n, 6).value is not None:\n",
" dict1['gh'] = sheet.cell(n, 6).value\n",
" dict1['birth'] = str(sheet.cell(n, 4).value).replace('/','-').split(' ')[0] \n",
" if sheet.cell(n, 7).value is not None:\n",
" dict1['phone'] = str(sheet.cell(n,7).value)\n",
" if len(str(sheet.cell(n,7).value))<11:\n",
" print(code,sheet.cell(n, 2).value)\n",
" person[code] = dict1\n",
"filename = 'data/镇海炼化参加测试人员.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(person, fl, ensure_ascii=False)\n",
"print(len(person))"
]
},
{
"cell_type": "markdown",
"id": "7e551660-e85f-4da2-8224-042784033ed5",
"metadata": {},
"source": [
"## 生成查询信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "299c1d41-7634-4703-8411-08f175df4e16",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import os,sys,shutil\n",
"import json\n",
"import math\n",
"import glob\n",
"import random\n",
"from pathlib import Path\n",
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"mycol = mydb[\"pdf\"]\n",
"\n",
"place_id = 345321\n",
"\n",
"fi_path = '/home/songyi/python/mycrm/flask/pdf/files'\n",
"fls = glob.glob(f'{fi_path}/{str(place_id)}/*.pdf')\n",
"\n",
"filename = 'data/镇海炼化参加测试人员.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"for fn in fls:\n",
" dict2 = {}\n",
" fi_name =Path(fn).stem.split('-')[0]\n",
" #fi_name =Path(fn).stem\n",
" code = int(fi_name)\n",
" dxm = dict1[str(code)]['gh']\n",
" dict2 = {'place_id':place_id,'code':dxm,'fn':Path(fn).name}\n",
" list2.append(dict2)\n",
" i +=1\n",
"x = mycol.insert_many(list2)\n",
"print('ok') "
]
},
{
"cell_type": "markdown",
"id": "e923022e-aef7-4c8e-84f9-b853e53ff820",
"metadata": {},
"source": [
"## 根据工号生成查询信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f709fd4a-d0b0-44a9-a782-0c1ffd43f6b8",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"filename = 'data/镇海炼化参加测试人员.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"list1 = []\n",
"list2 = []\n",
"set1 = set()\n",
"for k, v in dict1.items():\n",
" if 'gh' in v.keys():\n",
" gh = v['gh']\n",
" if gh not in list1:\n",
" list1.append(v['gh'])\n",
" else:\n",
" list2.append(gh)\n",
"print(list2)"
]
},
{
"cell_type": "markdown",
"id": "d9464f81-9228-403a-9d78-090fb4ce0faa",
"metadata": {},
"source": [
"## 体测报告按部门分类"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7eac364f-0fde-4853-9d2b-8c4c0c59a341",
"metadata": {},
"outputs": [],
"source": [
"import os,sys,shutil\n",
"import json\n",
"import glob\n",
"from pathlib import Path\n",
"\n",
"fi_path = '/home/songyi/pdf-typescript/镇海石化'\n",
"new_path = 'file/镇海石化'\n",
"old = []\n",
"dict2 = {}\n",
"\n",
"filename = 'data/镇海炼化参加测试人员.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"fls = glob.glob(f'{fi_path}/*.pdf')\n",
"for fn in fls:\n",
" fi_name =Path(fn).stem.split('-')[0]\n",
" code = int(fi_name)\n",
" unit_path = Path(new_path,dict1[str(code)]['unit'])\n",
" unit_path.mkdir(parents = True, exist_ok = True)\n",
" n_name = Path(unit_path,Path(fn).stem+'.pdf')\n",
" if not os.path.exists(n_name):\n",
" shutil.copyfile(fn,n_name)"
]
},
{
"cell_type": "markdown",
"id": "d7bb270c-cc9e-413b-af36-17c33692e289",
"metadata": {},
"source": [
"## 生成体测报告打印明细表"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d88bd5c4-1df3-457b-b65d-61692c45e7bd",
"metadata": {},
"outputs": [],
"source": [
"import os,sys,shutil\n",
"import json\n",
"import glob\n",
"from pathlib import Path\n",
"import openpyxl\n",
"\n",
"fi_path = '/home/songyi/pdf-typescript/镇海石化'\n",
"\n",
"filename = 'data/镇海炼化参加测试人员.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"fls = glob.glob(f'{fi_path}/*.pdf')\n",
"list1 = []\n",
"title = ['测试编号','姓名','性别','部门']\n",
"for fn in fls:\n",
" list2 = []\n",
" fi_name =Path(fn).stem.split('-')[0] \n",
" code = int(fi_name)\n",
" sex = dict1[str(code)]['sex']\n",
" unit = dict1[str(code)]['unit']\n",
" list2 = [fi_name,Path(fn).stem.split('-')[1],sex,unit]\n",
" \n",
" list1.append(list2)\n",
"\n",
"filename = 'data/镇海石化体测报告明细表.xlsx'\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row)\n",
" \n",
"wb.save(filename) \n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"id": "6b521daf-f9dc-4579-9400-d8ab857bb166",
"metadata": {
"jp-MarkdownHeadingCollapsed": true
},
"source": [
"# 体质测试综合报告数据分析"
]
},
{
"cell_type": "markdown",
"id": "83203d08-46ca-45f6-8204-0c8e35f754b6",
"metadata": {},
"source": [
"## 清理报告数据"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cccc2e43-7a73-48ec-8540-06b4d59f8ceb",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"\n",
"filename = 'data/result_镇海(合并).json'\n",
"with open(filename,'r',encoding = 'utf-8') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
" \n",
"#items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"items = {}\n",
"items['lung'] = '肺活量'\n",
"items['grip'] ='握力'\n",
"items['flexion'] ='坐位体前屈'\n",
"items['jump'] ='纵跳'\n",
"items['pushup'] ='俯卧撑'\n",
"items['balance'] ='单脚站立'\n",
"items['reaction'] ='选择反应时'\n",
"items['step'] ='台阶指数'\n",
"items['situp'] ='一分钟仰卧起坐'\n",
"items['bmi'] ='BMI'\n",
"\n",
"\n",
"list1 = []\n",
"#fiie_path ='./138/'\n",
"list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']\n",
"i=1\n",
"list2 = []\n",
"dict2 = {}\n",
"for k, v in dict1.items():\n",
" list1 = []\n",
" mydata = {}\n",
" \n",
" id = str(k).rjust(8,\"0\")\n",
" mydata['unit'] = v['unit']\n",
" mydata['name'] = v['name']\n",
" mydata['sex'] = v['sex']\n",
" mydata['month'] = v['month']\n",
" age = int(v['month']/12)\n",
" if age <20:\n",
" mydata['age'] = 20\n",
" else:\n",
" mydata['age'] = int(v['month']/12)\n",
" \n",
" mydata['fits'] = {}\n",
" score = 0\n",
" for item in list_item:\n",
" if item in v.keys():\n",
" if item in ['lung','pushup','step','situp']:\n",
" mark = v[item]['成绩'].split()[0].split('.')[0]\n",
" else:\n",
" mark = v[item]['成绩'].split()[0]\n",
" mydata['fits'][items[item]] = {'mark':mark,'score':v[item]['score']}\n",
" score = score + v[item]['score']\n",
" mydata['score'] = round(score/len(mydata['fits']),2)\n",
" if len(mydata['fits']) >2:\n",
" dict2[str(k)] = mydata\n",
"filename = f'data/data_镇海(合并).json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print('ok!') "
]
},
{
"cell_type": "markdown",
"id": "1c0bca93-d8a7-42ba-9a2c-50d3493c802f",
"metadata": {},
"source": [
"## 报告按照工作制分类"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a550ecd7-da8e-41b6-8b8f-8bc144d48bfe",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"\n",
"filename = 'data/result_镇海2.json'\n",
"with open(filename,'r',encoding = 'utf-8') as fl:\n",
" dict1 = json.load(fl)\n",
"filename = 'data/镇海体测人员.json'\n",
"with open(filename,'r',encoding = 'utf-8') as fl:\n",
" dict3 = json.load(fl)\n",
"\n",
"\n",
"#items = ['身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"items = {}\n",
"items['lung'] = '肺活量'\n",
"items['grip'] ='握力'\n",
"items['flexion'] ='坐位体前屈'\n",
"items['jump'] ='纵跳'\n",
"items['pushup'] ='俯卧撑'\n",
"items['balance'] ='单脚站立'\n",
"items['reaction'] ='选择反应时'\n",
"items['step'] ='台阶指数'\n",
"items['situp'] ='一分钟仰卧起坐'\n",
"items['bmi'] ='BMI'\n",
"\n",
"\n",
"list1 = []\n",
"#fiie_path ='./138/'\n",
"list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','bmi']\n",
"i=1\n",
"list2 = []\n",
"dict2 = {}\n",
"for k, v in dict1.items():\n",
" if dict3[k]['gzz'] == '倒班':\n",
" list1 = []\n",
" mydata = {}\n",
" \n",
" id = str(k).rjust(8,\"0\")\n",
" mydata['unit'] = v['unit']\n",
" mydata['name'] = v['name']\n",
" mydata['sex'] = v['sex']\n",
" mydata['month'] = v['month']\n",
" age = int(v['month']/12)\n",
" if age <20:\n",
" mydata['age'] = 20\n",
" else:\n",
" mydata['age'] = int(v['month']/12)\n",
" \n",
" mydata['fits'] = {}\n",
" score = 0\n",
" for item in list_item:\n",
" if item in v.keys():\n",
" if item in ['lung','pushup','step','situp']:\n",
" mark = v[item]['成绩'].split()[0].split('.')[0]\n",
" else:\n",
" mark = v[item]['成绩'].split()[0]\n",
" mydata['fits'][items[item]] = {'mark':mark,'score':v[item]['score']}\n",
" score = score + v[item]['score']\n",
" mydata['score'] = round(score/len(mydata['fits']),2)\n",
" if len(mydata['fits']) >2:\n",
" dict2[str(k)] = mydata\n",
"filename = f'data/data_镇海_倒班.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print(len(dict2)) "
]
},
{
"cell_type": "markdown",
"id": "c3bcd7ec-1d66-40c6-a27d-1c73e6eef695",
"metadata": {},
"source": [
"## 计算平均成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d5721244-b5f5-4577-bae8-2e6c5bd8e4da",
"metadata": {},
"outputs": [],
"source": [
"nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n",
"filename = 'data/data_镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"i = 1\n",
"m = 0\n",
"f = 0\n",
"score = 0\n",
"t_score = 0\n",
"for k,v in dict1.items():\n",
" if v['sex'] == '男':\n",
" m = m +1\n",
" score = score+v['score']\n",
"print(f'平均成绩:{round(score/m,4)}分,男性:{m}人')\n",
"t_score = t_score + score\n",
"score = 0\n",
"for k,v in dict1.items():\n",
" if v['sex'] == '女':\n",
" f = f +1\n",
" score = score+v['score']\n",
"print(f'平均成绩:{round(score/f,4)}分,女性:{f}人')\n",
"t_score = t_score + score\n",
"print(f'平均成绩:{round(t_score/(f+m),4)}分,总体:{(f+m)}人')"
]
},
{
"cell_type": "markdown",
"id": "a7ba7d25-b7a0-4641-a218-b4569d31acb1",
"metadata": {},
"source": [
"## 计算测试等级"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cff50f06-3221-4340-950f-3a24073b8565",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"items = ['体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"\n",
"#filename = 'data/data_长炼医院.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"dict2['不合格'] = [0,255]\n",
"dict2['合格'] = [256,332]\n",
"dict2['良好'] = [333,367]\n",
"dict2['优秀'] = [368,500]\n",
"\n",
"for k1, v1 in dict2.items():\n",
" di = v1[0]\n",
" gao = v1[1]\n",
" i = 0 \n",
" m = 0\n",
" f = 0\n",
" for k,v in dict1.items():\n",
" if int(v['score']*100) in range(di,gao+1):\n",
" dict1[k]['level'] = k1\n",
" i+=1\n",
" if v['sex'] == '男':\n",
" m = m +1\n",
" else:\n",
" f = f+1\n",
" print(f'{di}~{gao}分人数:{i}人,男性:{m}人,女性:{f}人')\n",
"print(len(dict1))\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict1, fl) \n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"id": "16a0d09b-2128-4df4-9745-954f48384244",
"metadata": {},
"source": [
"### 计算各年龄段测试等级(女)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6baf0ff2-cdfa-4396-bcf8-3e23a18670dc",
"metadata": {},
"outputs": [],
"source": [
"nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n",
"\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"dict2['不合格'] = [0,255]\n",
"dict2['合格'] = [256,332]\n",
"dict2['良好'] = [333,367]\n",
"dict2['优秀'] = [368,500]\n",
"dict3 = {}\n",
"for item in nld:\n",
" di = item[0]\n",
" gao = item[1]\n",
" age = f'{di}-{gao}'\n",
" dict3.setdefault(age,{})\n",
" i = 0 \n",
" m = 0\n",
" f = 0\n",
" for k,v in dict1.items():\n",
" if v['age'] in range(di,gao+1): \n",
" dict3[age].setdefault(v['level'],0)\n",
" if v['sex'] == '女':\n",
" dict3[age][v['level']] = dict3[age][v['level']]+1\n",
" \n",
"for k, v in dict3.items():\n",
" print(k,v)"
]
},
{
"cell_type": "markdown",
"id": "79fb3eab-e8d4-42bb-9ba4-8402f3b82b54",
"metadata": {},
"source": [
"### 计算各年龄段测试等级(男)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2979cf80-5268-4754-ab8a-11a539315e92",
"metadata": {},
"outputs": [],
"source": [
"nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n",
"\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"dict2 = {}\n",
"dict2['不合格'] = [0,255]\n",
"dict2['合格'] = [256,332]\n",
"dict2['良好'] = [333,367]\n",
"dict2['优秀'] = [368,500]\n",
"dict3 = {}\n",
"for item in nld:\n",
" di = item[0]\n",
" gao = item[1]\n",
" age = f'{di}-{gao}'\n",
" dict3.setdefault(age,{})\n",
" i = 0 \n",
" m = 0\n",
" f = 0\n",
" for k,v in dict1.items():\n",
" if v['age'] in range(di,gao+1): \n",
" dict3[age].setdefault(v['level'],0)\n",
" if v['sex'] == '男':\n",
" dict3[age][v['level']] = dict3[age][v['level']]+1\n",
" \n",
"for k, v in dict3.items():\n",
" print(k,v)"
]
},
{
"cell_type": "markdown",
"id": "9a38fc15-579c-42e9-a23c-1050a96e0cf8",
"metadata": {},
"source": [
"## 根据年龄汇总人员信息及成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8a7cb3b0-d7be-44ac-a1ec-40bdcf29e83b",
"metadata": {},
"outputs": [],
"source": [
"nld = [[16,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,69]]\n",
"\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for item in nld:\n",
" di = item[0]\n",
" gao = item[1]\n",
" i = 0\n",
" score = 0\n",
" m = 0\n",
" f = 0\n",
" for k,v in dict1.items():\n",
" if v['age'] in range(di,gao+1):\n",
" score = score+v['score']\n",
" i+=1\n",
" if v['sex'] == '男':\n",
" m = m +1\n",
" if i ==0:\n",
" print(f'{di}~{gao}岁平均成绩:0分,人数:0人,男性:{m}人')\n",
" else:\n",
" print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人,男性:{m}人')"
]
},
{
"cell_type": "markdown",
"id": "48debe3b-d0ec-41e8-93ef-921b8e013aa7",
"metadata": {},
"source": [
"### 根据年龄汇总人员信息及成绩(男)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c5bb03ca-b7ee-4564-b425-8513e1bff081",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n",
"\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for item in nld:\n",
" di = item[0]\n",
" gao = item[1]\n",
" i = 0\n",
" score = 0\n",
" m = 0\n",
" f = 0\n",
" for k,v in dict1.items():\n",
" if v['age'] in range(di,gao+1) and v['sex'] == '男':\n",
" score = score+v['score']\n",
" i+=1\n",
" if i ==0:\n",
" print(f'{di}~{gao}岁平均成绩:0分,人数:{i}人') \n",
" else:\n",
" print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人')"
]
},
{
"cell_type": "markdown",
"id": "92bb0683-81ea-4b90-8b74-4a2f43b4835c",
"metadata": {},
"source": [
"### 根据年龄汇总人员信息及成绩(女)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "bf333998-230c-4365-aadc-b0d1be073b39",
"metadata": {},
"outputs": [],
"source": [
"nld = [[20,24],[25,29],[30,34],[35,39],[40,44],[45,49],[50,54],[55,80]]\n",
"\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"for item in nld:\n",
" di = item[0]\n",
" gao = item[1]\n",
" i = 0\n",
" score = 0\n",
" m = 0\n",
" f = 0\n",
" for k,v in dict1.items():\n",
" if v['age'] in range(di,gao+1) and v['sex'] == '女':\n",
" score = score+v['score']\n",
" i+=1\n",
" if i ==0:\n",
" print(f'{di}~{gao}岁平均成绩:0分,人数:{i}人') \n",
" else:\n",
" print(f'{di}~{gao}岁平均成绩:{round(score/i,2)}分,人数:{i}人')"
]
},
{
"cell_type": "markdown",
"id": "026d11e4-7f3d-4be5-9fa0-fa3699969c6b",
"metadata": {},
"source": [
"## 计算各项目成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "352c6c29-8929-4210-84c5-8dbc3d5ffeee",
"metadata": {},
"outputs": [],
"source": [
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"items = ['BMI','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"for item in items:\n",
" score = 0\n",
" n = 0\n",
" for k, v in dict1.items(): \n",
" if item in v['fits'].keys():\n",
" n = n + 1\n",
" score =score + int(v['fits'][item]['score'])\n",
" print(item,round(score/n,2),n)"
]
},
{
"cell_type": "markdown",
"id": "a13d5644-7cd1-4943-bce9-c6863f75b986",
"metadata": {},
"source": [
"## 按照部门计算平均成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "97f5a1cf-341e-4b99-9549-b6a3fb165849",
"metadata": {},
"outputs": [],
"source": [
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"depart = []\n",
"for k, v in dict1.items():\n",
" if v['unit'] not in depart:\n",
" depart.append(v['unit'])\n",
"\n",
"for item in depart:\n",
" score = 0\n",
" n = 0\n",
" for k, v in dict1.items():\n",
" if item == v['unit']:\n",
" score = score + v['score']\n",
" n = n +1\n",
" if n>0:\n",
" print(item,round(score/n,2),n)\n",
" else:\n",
" print(item,0,n)"
]
},
{
"cell_type": "markdown",
"id": "85b3a695-86db-4aec-95f4-33f3b628e548",
"metadata": {},
"source": [
"### 按照部门计算平均成绩(男性)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3beaab27-ca90-4e09-b2d2-590fd7bac51d",
"metadata": {},
"outputs": [],
"source": [
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"depart = []\n",
"for k, v in dict1.items():\n",
" if v['unit'] not in depart:\n",
" depart.append(v['unit'])\n",
"\n",
"for item in depart:\n",
" score = 0\n",
" n = 0\n",
" for k, v in dict1.items():\n",
" if item == v['unit'] and v['sex'] == '男':\n",
" score = score + v['score']\n",
" n = n +1 \n",
" if n>0:\n",
" print(item,round(score/n,2),n)\n",
" else:\n",
" print(item,0,n)"
]
},
{
"cell_type": "markdown",
"id": "d8e995d6-3ddb-4b92-8255-530e8a3da179",
"metadata": {},
"source": [
"## 计算部门成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a959c1b8-86fc-4fca-8595-4278135e95b8",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"items = ['BMI','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数'] \n",
"filename = 'data/data_镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"dict3 = {}\n",
"\n",
"for k, v in dict1.items():\n",
" unit = v['unit']\n",
" dict3.setdefault(unit,{})\n",
" for item in items:\n",
" dict3[unit].setdefault(item,{})\n",
" dict3[unit][item].setdefault('score',0)\n",
" dict3[unit][item].setdefault('count',0)\n",
" for k1,v1 in v['fits'].items():\n",
" if k1 in items:\n",
" dict3[unit][k1]['score']+=v1['score']\n",
" dict3[unit][k1]['count']+=1\n",
"\n",
"for k, v in dict3.items():\n",
" print(k)\n",
" for k1, v1 in v.items():\n",
" print(k1,v1['score'],v1['count'])"
]
},
{
"cell_type": "markdown",
"id": "7092779e-ce30-4d1c-8e7b-a14011daee93",
"metadata": {},
"source": [
"## 计算部门等级"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "81195537-5a43-4822-a1b9-a08b7baee05e",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"items = ['优秀','良好','合格','不合格'] \n",
"filename = 'data/data_镇海(合并).json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"\n",
"dict3 = {}\n",
"for k, v in dict1.items():\n",
" unit = v['unit']\n",
" dict3.setdefault(unit,{})\n",
" for item in items:\n",
" dict3[unit].setdefault(item,0)\n",
"\n",
"for k, v in dict1.items():\n",
" unit = v['unit']\n",
" #dict3.setdefault(unit,{})\n",
" #for item in items:\n",
" #dict3[unit].setdefault(v['level'],0)\n",
" dict3[unit][v['level']] +=1\n",
"for k, v in dict3.items():\n",
" print(k,v['优秀'],v['良好'],v['合格'],v['不合格'])"
]
},
{
"cell_type": "markdown",
"id": "4df1e70c-e359-4b4a-b2ae-2900ae25ded2",
"metadata": {
"execution": {
"iopub.execute_input": "2025-10-25T08:36:22.140778Z",
"iopub.status.busy": "2025-10-25T08:36:22.140431Z",
"iopub.status.idle": "2025-10-25T08:36:22.145537Z",
"shell.execute_reply": "2025-10-25T08:36:22.144522Z",
"shell.execute_reply.started": "2025-10-25T08:36:22.140742Z"
}
},
"source": [
"# 体质测试2025年"
]
},
{
"cell_type": "markdown",
"id": "0dbcde66-5a57-4b6d-97d3-30159b606807",
"metadata": {},
"source": [
"## 体测人员导入"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0a6a661d-3780-4ae4-a975-821eae376f7a",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"wb = openpyxl.load_workbook('data/镇海人员2025.xlsx')\n",
"sheet = wb.active\n",
"# sheets = wb.sheetnames\n",
"person = {}\n",
"\n",
"for n in range(2, sheet.max_row+1):\n",
" code = sheet.cell(n, 5).value\n",
" person.setdefault(code, {})\n",
" dict1 = {}\n",
" dict1['name'] = sheet.cell(n, 2).value\n",
" dict1['sex'] = sheet.cell(n, 3).value\n",
" dict1['birth'] = str(sheet.cell(n, 6).value).replace('/','-').split(' ')[0] \n",
" dict1['unit'] = sheet.cell(n, 7).value\n",
" dict1['phone'] = sheet.cell(n, 4).value\n",
" person[code] = dict1\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(person, fl, ensure_ascii=False)\n",
"print(len(person),'ok')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2af3b485-743e-40ca-8caa-5eecd572c2a5",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"wb = openpyxl.load_workbook('data/镇海人员信息确认表.xlsx')\n",
"sheet = wb.active\n",
"# sheets = wb.sheetnames\n",
"person = {}\n",
"\n",
"for n in range(2, sheet.max_row+1):\n",
" code = sheet.cell(n, 1).value.lower()\n",
" person.setdefault(code, {})\n",
" dict1 = {}\n",
" dict1['name'] = sheet.cell(n, 2).value\n",
" dict1['sex'] = sheet.cell(n, 3).value\n",
" dict1['birth'] = str(sheet.cell(n, 5).value).replace('/','-').split(' ')[0] \n",
" dict1['unit'] = sheet.cell(n, 4).value\n",
" if sheet.cell(n,6).value is not None:\n",
" dict1['phone'] = sheet.cell(n, 6).value\n",
" person[code] = dict1\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(person, fl, ensure_ascii=False)\n",
"print(len(person),'ok')"
]
},
{
"cell_type": "markdown",
"id": "c938346f-711c-4cd7-b2f1-3776df5a00b8",
"metadata": {},
"source": [
"## 生成读卡系统文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "da037e81-96a8-475e-9ad7-21ab92285b85",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"list1 = []\n",
"for k, v in dict1.items():\n",
" dict2 = {}\n",
" #if dict1['sex'] =='男':\n",
" # sex = 1\n",
" \n",
" dict2 = {'id':k,'name':v['name'],'gender':v['sex'],'birth':v['birth'],'unit':v['unit']}\n",
" list1.append(dict2)\n",
"json_data = json.dumps(list1,ensure_ascii=False, indent=4) \n",
"\n",
"# 将 json 数据写入文件\n",
"with open(\"data/card_镇海2025.json\", \"w\",encoding = 'utf-8') as file:\n",
" file.write(json_data) \n",
"print(len(list1),'ok')"
]
},
{
"cell_type": "markdown",
"id": "165f14d8-a973-463c-87cd-8c0c0de6a177",
"metadata": {},
"source": [
"## 合并读卡系统文件"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "505fce63-ed92-4f63-82da-7207b015dab4",
"metadata": {
"execution": {
"iopub.execute_input": "2025-11-24T10:09:42.882767Z",
"iopub.status.busy": "2025-11-24T10:09:42.882236Z",
"iopub.status.idle": "2025-11-24T10:09:42.907880Z",
"shell.execute_reply": "2025-11-24T10:09:42.907306Z",
"shell.execute_reply.started": "2025-11-24T10:09:42.882717Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1595 ok\n"
]
}
],
"source": [
"import json\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/data_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" list1 = json.load(fl)\n",
"for item in list1:\n",
" code = item['id'].lower()\n",
" if code not in dict1.keys():\n",
" print(code,item['name'],item['unit'])\n",
" code = code.lower()\n",
" dict1.setdefault(code,{})\n",
" dict1[code]['name'] = item['name']\n",
" dict1[code]['sex'] = item['gender']\n",
" dict1[code]['unit'] = item['unit']\n",
" dict1[code]['birth'] = item['birth']\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False)\n",
"print(len(dict1),'ok')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f1aefe1c-150d-4a55-98b5-3a72e9510e5d",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/data_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" list1 = json.load(fl)\n",
"for item in list1:\n",
" code = item['id'].lower()\n",
" dict1[code]['name'] = item['name']\n",
" dict1[code]['sex'] = item['gender']\n",
" dict1[code]['unit'] = item['unit']\n",
" dict1[code]['birth'] = item['birth']\n",
"filename = 'data/镇海人员2025-1.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False)\n",
"print(len(dict1),'ok')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "4fb7dc45-b509-4be7-a173-cce2cad4c67c",
"metadata": {
"execution": {
"iopub.execute_input": "2025-11-24T10:10:58.479565Z",
"iopub.status.busy": "2025-11-24T10:10:58.479001Z",
"iopub.status.idle": "2025-11-24T10:10:58.489706Z",
"shell.execute_reply": "2025-11-24T10:10:58.488704Z",
"shell.execute_reply.started": "2025-11-24T10:10:58.479512Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1606\n"
]
}
],
"source": [
"filename = 'data/data_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" list1 = json.load(fl)\n",
"print(len(list1))"
]
},
{
"cell_type": "markdown",
"id": "a5965545-1f5b-4ba2-b1b2-81a56572af74",
"metadata": {},
"source": [
"## 核对人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a8438d1b-ec3d-41e3-9c28-d44e88378c75",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"wb = openpyxl.load_workbook('data/镇海人员信息确认表.xlsx')\n",
"sheet = wb.active\n",
"person = {}\n",
"\n",
"for n in range(2, sheet.max_row+1):\n",
" code = sheet.cell(n, 1).value\n",
" person.setdefault(code, {})\n",
" dict1 = {}\n",
" dict1['name'] = sheet.cell(n, 2).value\n",
" dict1['sex'] = sheet.cell(n, 3).value\n",
" dict1['birth'] = str(sheet.cell(n, 5).value).replace('/','-').split(' ')[0] \n",
" dict1['unit'] = sheet.cell(n, 4).value\n",
" if sheet.cell(n, 6).value is not None:\n",
" dict1['phone'] = sheet.cell(n, 6).value\n",
" person[code] = dict1\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(person, fl, ensure_ascii=False)\n",
"print(len(person),'ok')"
]
},
{
"cell_type": "markdown",
"id": "74f568d1-0bd9-4028-8e6a-e0c25ead7958",
"metadata": {},
"source": [
"## 导入手工数据"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "772330af-6224-43ad-9727-79854c33231c",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"wb = openpyxl.load_workbook('data/镇海项目手工成绩.xlsx')\n",
"sheet = wb.active\n",
"filename = 'data/result_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl) \n",
"\n",
"for n in range(2, sheet.max_row+1):\n",
" code = str(sheet.cell(n, 1).value)\n",
" item = str(sheet.cell(n, 2).value)\n",
" mark = str(sheet.cell(n, 3).value)\n",
" dict2[code].setdefault(item,{})\n",
" dict2[code][item]['成绩'] = mark\n",
" \n",
"filename = 'data/result_镇海2025-1.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2, fl, ensure_ascii=False) \n",
"print(len(re_ta)) "
]
},
{
"cell_type": "markdown",
"id": "065cb133-3c61-46bd-bf81-7afa2c9be9e0",
"metadata": {},
"source": [
"## 获取人员测试成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "289e4e1d-c80d-46f9-9015-fc4c139bc99d",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import datetime\n",
"import csv\n",
"from datetime import date\n",
"import my_module1 as My\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"filename = 'data/marks_20251031.csv'\n",
"re_ta = My.get_result(filename,dict1)\n",
"\n",
"\n",
"filename = 'data/result_镇海2025.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(re_ta, fl, ensure_ascii=False) \n",
"print(len(re_ta))"
]
},
{
"cell_type": "markdown",
"id": "f9df8146-0430-42b5-b6d0-992c71ee645b",
"metadata": {},
"source": [
"## 修正测试成绩"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9caa8291-7d48-483b-992a-45f244567600",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"\n",
"filename = 'data/result_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl) \n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict3 = json.load(fl) \n",
"dict1 = {}\n",
"for k, v in dict2.items():\n",
" code = k.upper()\n",
" dict1[code] = v\n",
" dict1[code]['unit'] = dict3[code]['unit']\n",
"filename = 'data/result_镇海2025-1.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict1, fl, ensure_ascii=False) \n",
"print(len(re_ta))\n",
" "
]
},
{
"cell_type": "markdown",
"id": "15d7fae0-76a3-4443-8c2c-94ec7b8f052c",
"metadata": {},
"source": [
"## 生成测试得分"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "49d15e27-6029-4557-a17a-7e7a426f7e5f",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import time\n",
"import my_module as My\n",
"\n",
"#list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp','height','weight']\n",
"list_item = ['lung','grip','flexion','jump','pushup','balance','reaction','step','situp']\n",
"filename = 'data/result_镇海2025-1.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl) \n",
"for k, v in dict2.items():\n",
" #print(k)\n",
" if v['sex'] == '男':\n",
" sex = 'M'\n",
" else:\n",
" sex = 'F' \n",
" if 'bmi' in v.keys():\n",
" #bmi_data = v['height']['成绩'].split()[0]+','+ v['weight']['成绩'].split()[0]\n",
" bmi_data = v['bmi']['成绩']\n",
" data1 = {'code':k,'sex':sex,'age':v['age'],'item':'HeightWeight','result':bmi_data}\n",
" dict2[k]['bmi'] = {}\n",
" dict2[k]['bmi']['成绩'] = bmi_data\n",
" dict2[k]['bmi']['score'] = My.cal_bmi(data1)\n",
" for item_en in list_item:\n",
" if item_en in v.keys(): \n",
" data1 = {'code':k,'sex':sex,'age':v['age'],'item':item_en,'result':float(v[item_en]['成绩'].split()[0])}\n",
" #print(k,v['name'])\n",
" dict2[k][item_en]['score'] = My.cal_score(data1)\n",
" #print(k,v[item_en]['成绩'],cal_score(data1))\n",
"\n",
"filename = f'data/result_镇海2025.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print('ok!') "
]
},
{
"cell_type": "markdown",
"id": "c1ef03ac-6970-4d33-9d30-fc2ffe4e7c52",
"metadata": {},
"source": [
"## 导出测试人员信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8ed6705e-b4f6-419e-b94b-4c391fed4551",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"items = ['lung','grip','flexion','jump','pushup','situp','balance','reaction','step']\n",
"title = ['编号','姓名','性别','单位','部门','身高','体重','肺活量','握力','坐位体前屈','纵跳','俯卧撑','一分钟仰卧起坐','单脚站立','选择反应时','台阶指数']\n",
"\n",
"filename = 'data/result_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
" \n",
"list1 = []\n",
"for k, v in dict1.items():\n",
" list2 = []\n",
" list2.append(str(k).rjust(5,'0'))\n",
" list2.append(v['name']) \n",
" list2.append(dict2[k]['sex'])\n",
" list2.append(dict2[k]['unit'])\n",
" list2.append(dict2[k]['birth'])\n",
" if 'phone' in v.keys():\n",
" list2.append(dict2[k]['phone'])\n",
" else:\n",
" list2.append('')\n",
" \n",
" if 'bmi' in v.keys():\n",
" height = v['bmi']['成绩'].split(',')[0]\n",
" weight = v['bmi']['成绩'].split(',')[1]\n",
" list2.append(height)\n",
" list2.append(weight)\n",
" else:\n",
" list2.append('')\n",
" list2.append('')\n",
" for item in items:\n",
" if item in v.keys():\n",
" list2.append(v[item]['成绩']) \n",
" elif item =='name':\n",
" list2.append(v[item])\n",
" else:\n",
" list2.append('')\n",
" \n",
" list1.append(list2)\n",
"filename = 'data/镇海体测情况表(2025年).xlsx'\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row)\n",
" \n",
"wb.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "d6d6b47e-386c-4cee-a4d6-6dbe4f415490",
"metadata": {},
"source": [
"## 统计各部门测试情况"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a0c85107-7c75-462c-8f77-aea787d2100f",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"filename = 'data/result_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"\n",
"dict3 = {}\n",
"for k, v in dict2.items():\n",
" unit = v['unit']\n",
" #sub_unit = v['sub_unit']\n",
" dict3.setdefault(unit,{})\n",
" dict3[unit].setdefault('人数',0)\n",
" dict3[unit].setdefault('体测人数',0)\n",
" #dict3[unit].setdefault(sub_unit,0)\n",
" #dict3[unit][sub_unit] = dict3[unit][sub_unit] + 1\n",
" dict3[unit]['人数'] = dict3[unit]['人数'] + 1\n",
"\n",
"title =['单位','体测人数']\n",
"list1 = []\n",
"for k,v in dict1.items(): \n",
" unit = v['unit']\n",
" #sub_unit = v['sub_unit']\n",
" #dict3[unit][sub_unit] = dict3[unit][sub_unit] - 1\n",
" dict3[unit].setdefault('体测人数',0)\n",
" dict3[unit]['体测人数'] = dict3[unit]['体测人数'] + 1\n",
"for k, v in dict3.items():\n",
" list2 = [k,v['人数'],v['体测人数']]\n",
" list1.append(list2)\n",
"\n",
"filename = 'data/镇海部门测试情况(截至20251031).xlsx'\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row)\n",
" \n",
"wb.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "ab2ff226-2c58-495c-ad52-7cb3dc8a1dfd",
"metadata": {},
"source": [
"## 添加班次信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "557508ff-842c-4e15-93fa-457b571223a8",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"from datetime import date\n",
"\n",
"wb = openpyxl.load_workbook('data/镇海体质监测人员名单(已标注班次).xlsx')\n",
"sheet = wb.active\n",
"filename = 'data/data_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl) \n",
"\n",
"for n in range(2, sheet.max_row+1):\n",
" code = str(sheet.cell(n, 1).value).lower()\n",
" if code in dict2.keys():\n",
" banci = sheet.cell(n, 6).value\n",
" dict2[code]['banci'] = banci\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict2,fl , ensure_ascii=False) \n",
"print('ok!') \n"
]
},
{
"cell_type": "markdown",
"id": "0d7d8dd1-45f7-455d-8db3-38febc2a2395",
"metadata": {},
"source": [
"## 统计未体测人员明细表"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cc39720e-3be5-482f-a8d1-4495cf103b4f",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"filename = 'data/result_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"\n",
"list1 = []\n",
"\n",
"i = 1\n",
"for k, v in dict2.items(): \n",
" if k not in dict1.keys():\n",
" list2 = [i,k,v['name'],v['unit']]\n",
" i+=1\n",
" list1.append(list2)\n",
"#print(list1)\n",
"filename = f'data/镇海未测试人员名单(截至20251031).xlsx'\n",
"title = ['序号','员工编号','姓名','部门']\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row) \n",
"wb.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "e4c15761-e461-447a-bc60-5e5c29ba8cb3",
"metadata": {},
"source": [
"## 统计未提供手机号码人员明细表"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "80c2b300-6a4f-4223-9b7a-9b8978ad4609",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import openpyxl\n",
"\n",
"filename = 'data/result_镇海2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"\n",
"list1 = []\n",
"\n",
"i = 1\n",
"for k, v in dict2.items(): \n",
" if 'phone' not in v.keys() and k in dict1.keys():\n",
" list2 = [i,k,v['name'],v['unit']]\n",
" i+=1\n",
" list1.append(list2)\n",
"#print(list1)\n",
"filename = f'data/镇海未提供手机号码人员名单.xlsx'\n",
"title = ['序号','员工编号','姓名','部门']\n",
"wb = openpyxl.Workbook()\n",
"sheet = wb.active\n",
"sheet.append(title)\n",
"for row in list1:\n",
" sheet.append(row) \n",
"wb.save(filename)"
]
},
{
"cell_type": "markdown",
"id": "3e0e3b48-12f1-42f0-ba3c-f949857d29f7",
"metadata": {},
"source": [
"## 体测报告导入数据库"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8c929073-2c32-4ecf-93fa-f3bf224bcb31",
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"import os,sys,shutil\n",
"import json\n",
"import math\n",
"import glob\n",
"import random\n",
"from pathlib import Path\n",
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"mycol = mydb[\"pdf1\"]\n",
"\n",
"filename = 'data/镇海短信码2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"list1 = []\n",
"for k, v in dict1.items():\n",
" list1.append({'bh':k,'phone':v['phone'],'place_id':1,'code':v['code'],'fn':v['fn']})\n",
"\n",
"x = mycol.insert_many(list1)\n",
"print(len(list1),'ok') "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3b73e071-62ad-41fb-8b9d-57893dbf8a6f",
"metadata": {},
"outputs": [],
"source": [
"\n",
"import os,sys,shutil\n",
"import json\n",
"import math\n",
"import glob\n",
"import random\n",
"from pathlib import Path\n",
"import pymongo\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"\n",
"place_id = 1\n",
"place_code = \"20\"\n",
"\n",
"#fi_path = '/root/data/flask/pdf/files'\n",
"#fi_path = '/home/songyi/python/mycrm/flask/pdf/files'\n",
"fls = glob.glob(f'{fi_path}/{str(place_id)}/*.pdf')\n",
"\n",
"list2 = []\n",
"for fn in fls:\n",
" dict2 = {}\n",
" fi_name =Path(fn).stem.split('-')[0]\n",
" #fi_name =Path(fn).stem\n",
" code = fi_name\n",
" dict2 = {'place_id':place_id,'code':code,'fn':Path(fn).name}\n",
" list2.append(dict2)\n",
" i +=1\n",
"x = mycol.insert_many(list2)\n",
"print(len(list2),'ok') "
]
},
{
"cell_type": "markdown",
"id": "9e271c11-dc3f-4746-82c8-380a2ae685d8",
"metadata": {},
"source": [
"## 生成有电话人员验证码"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fe8d4bbf-f293-42e5-8e13-172083431fdd",
"metadata": {},
"outputs": [],
"source": [
"import os,sys,shutil\n",
"import json\n",
"import math\n",
"import glob\n",
"import random\n",
"from pathlib import Path\n",
"import pymongo\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"\n",
"dict3 = {}\n",
"for k, v in dict2.items():\n",
" if 'phone' in v.keys():\n",
" dict3[k] = v\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"\n",
"place_id = 1\n",
"place_code = \"01\"\n",
"dw_name = \"中国石化镇海炼化公司\"\n",
"dw_jc = \"中国石化镇海炼化公司\"\n",
"fi_path = '/home/songyi/pdf-typescript-old2/镇海石化2025'\n",
"fls = glob.glob(f'{fi_path}/*.pdf')\n",
"\n",
"code_list = []\n",
"for i in range(10): # 0~9\n",
" code_list.append(str(i))\n",
"list1 = []\n",
"mycol = mydb[\"pdf\"]\n",
"\n",
"i = 0\n",
"while i < len(fls):\n",
" code = random.sample(code_list,5) #随机取4位数\n",
" code_num = ''.join(code) \n",
" if place_code+code_num not in list1:\n",
" list1.append(place_code+code_num)\n",
" i +=1\n",
"i = 0\n",
"list2= []\n",
"\n",
"for fn in fls:\n",
" dict2 = {}\n",
" fi_name =Path(fn).stem.split('-')[0]\n",
" #fi_name =Path(fn).stem\n",
" code = fi_name\n",
" dxm = list1[i]\n",
" dict2 = {'place_id':place_id,'code':dxm,'fn':Path(fn).name}\n",
" list2.append(dict2)\n",
" i +=1\n",
"x = mycol.insert_many(list2)\n",
"print(len(list2),'ok') \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2f9d6915-9933-48e1-94a7-9ae8fa4c8844",
"metadata": {},
"outputs": [],
"source": [
"import os,sys,shutil\n",
"import json\n",
"import math\n",
"import glob\n",
"import random\n",
"from pathlib import Path\n",
"import pymongo\n",
"\n",
"filename = 'data/镇海人员2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict2 = json.load(fl)\n",
"\n",
"dict3 = {}\n",
"for k, v in dict2.items():\n",
" if 'phone' in v.keys():\n",
" dict3[k] = v\n",
"print(len(dict3))\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"baogao\"]\n",
"\n",
"place_id = 1\n",
"place_code = \"01\"\n",
"dw_name = \"中国石化镇海炼化公司\"\n",
"dw_jc = \"中国石化镇海炼化公司\"\n",
"fi_path = '/home/songyi/pdf-typescript-old2/镇海石化2025'\n",
"fls = glob.glob(f'{fi_path}/*.pdf')\n",
"\n",
"code_list = []\n",
"for i in range(10): # 0~9\n",
" code_list.append(str(i))\n",
"list1 = []\n",
"mycol = mydb[\"pdf\"]\n",
"\n",
"i = 0\n",
"while i < len(fls):\n",
" code = random.sample(code_list,4) #随机取4位数\n",
" code_num = ''.join(code) \n",
" if place_code+code_num not in list1:\n",
" list1.append(place_code+code_num)\n",
" i +=1\n",
"i = 0\n",
"list2= []\n",
"dict4 = {}\n",
"for fn in fls:\n",
" dict2 = {}\n",
" fi_name =Path(fn).stem.split('-')[0]\n",
" #fi_name =Path(fn).stem\n",
" code = fi_name\n",
" if code in dict3.keys():\n",
" \n",
" dxm = list1[i]\n",
" \n",
" dict2 = {'bh':code,'phone':dict3[code]['phone'],'place_id':place_id,'code':dxm,'fn':Path(fn).name}\n",
" dict4[code] = {'phone':dict3[code]['phone'],'place_id':place_id,'code':dxm,'fn':Path(fn).name}\n",
" list2.append(dict2)\n",
" i +=1\n",
"x = mycol.insert_many(list2)\n",
"filename = f'data/镇海短信码2025.json'\n",
"with open(filename,'w') as fl:\n",
" json.dump(dict4,fl , ensure_ascii=False) \n",
"print('ok!') "
]
},
{
"cell_type": "markdown",
"id": "d7c31e0f-b2c9-4fb3-a265-9032114954ca",
"metadata": {},
"source": [
"## 批量发送短信(测试)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9879c239-37c8-4054-8b39-99643d6f8792",
"metadata": {},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"import time\n",
"\n",
"\n",
"\n",
"dw_jc = \"镇海炼化公司\"\n",
"filename = 'data/镇海短信码2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"\n",
"place_id = 1\n",
"\n",
"i=1\n",
"#dict2 = {375: {'phone': '13793180751', 'code': '0379208'}}\n",
"for k, v in dict1.items():\n",
" phone = '+86'+v['phone']\n",
" yzm = v['code']\n",
" try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.SendSmsRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" req.SignName = \"坤铭教育\"\n",
" req.TemplateId = \"1875765\" \n",
" req.TemplateParamSet = [dw_jc,yzm]\n",
" req.PhoneNumberSet = [phone]\n",
" req.SessionContext = \"\"\n",
" req.ExtendCode = \"\"\n",
" req.SenderId = \"\"\n",
" #resp = client.SendSms(req)\n",
" #dict3 = json.loads(resp.to_json_string(indent=2))\n",
"\n",
" #print(v['phone'],dict3['SendStatusSet'][0][\"Message\"])\n",
" print(i,v['phone'],v['fn'], v['code'])\n",
" i+=1\n",
" except TencentCloudSDKException as err:\n",
" print(v['phone'],err)"
]
},
{
"cell_type": "markdown",
"id": "8f68da91-de56-4cc5-abe6-2b275133e558",
"metadata": {},
"source": [
"## 单个发送短信"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9663b933-57f4-486c-80e6-f9d513bbe6a8",
"metadata": {},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"import time\n",
"\n",
"\n",
"\n",
"dw_jc = \"镇海炼化体测用户\"\n",
"filename = 'data/镇海短信码2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"\n",
"phone = '+86'+'13793180751'\n",
"yzm = '019031'\n",
"try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.SendSmsRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" req.SignName = \"北京坤铭教育\"\n",
" req.TemplateId = \"1875765\" \n",
" req.TemplateParamSet = [dw_jc,yzm]\n",
" req.PhoneNumberSet = [phone]\n",
" req.SessionContext = \"\"\n",
" req.ExtendCode = \"\"\n",
" req.SenderId = \"\"\n",
" resp = client.SendSms(req)\n",
" dict3 = json.loads(resp.to_json_string(indent=2))\n",
"\n",
" print(phone,dict3['SendStatusSet'][0][\"Message\"])\n",
"except TencentCloudSDKException as err:\n",
" print(v['phone'],err)"
]
},
{
"cell_type": "markdown",
"id": "ab5f292c-1b1e-46a0-9b5b-f7be1573d438",
"metadata": {},
"source": [
"## 批量发送短信"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4426aa59-2754-4571-9270-dcb7b66bc941",
"metadata": {},
"outputs": [],
"source": [
"from tencentcloud.common import credential\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.sms.v20210111 import sms_client, models\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"import json\n",
"import pymongo\n",
"import time\n",
"\n",
"\n",
"\n",
"dw_jc = \"镇海炼化公司\"\n",
"filename = 'data/镇海短信码2025.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl) \n",
"\n",
"place_id = 1\n",
"\n",
"i=1\n",
"#dict2 = {375: {'phone': '13793180751', 'code': '0379208'}}\n",
"for k, v in dict1.items():\n",
" phone = '+86'+v['phone']\n",
" yzm = v['code']\n",
" try: \n",
" secretId = \"AKID22rVyvSqbikXFFvav31ykc9YmqjN6KYc\"\n",
" secretKey = \"51XVL1YxDKI6mJh8au6DDuTskS1RhwJX\"\n",
" cred = credential.Credential(secretId, secretKey) \n",
" httpProfile = HttpProfile()\n",
" httpProfile.reqMethod = \"POST\" # post请求(默认为post请求)\n",
" httpProfile.reqTimeout = 60 # 请求超时时间,单位为秒(默认60秒)\n",
" httpProfile.endpoint = \"sms.tencentcloudapi.com\" # 指定接入地域域名(默认就近接入)\n",
" clientProfile = ClientProfile()\n",
" clientProfile.signMethod = \"TC3-HMAC-SHA256\" # 指定签名算法\n",
" clientProfile.language = \"en-US\"\n",
" clientProfile.httpProfile = httpProfile\n",
" client = sms_client.SmsClient(cred, \"ap-guangzhou\", clientProfile)\n",
" req = models.SendSmsRequest()\n",
" req.SmsSdkAppId = \"1400140089\"\n",
" req.SignName = \"坤铭教育\"\n",
" req.TemplateId = \"1875765\" \n",
" req.TemplateParamSet = [dw_jc,yzm]\n",
" req.PhoneNumberSet = [phone]\n",
" req.SessionContext = \"\"\n",
" req.ExtendCode = \"\"\n",
" req.SenderId = \"\"\n",
" resp = client.SendSms(req)\n",
" #dict3 = json.loads(resp.to_json_string(indent=2))\n",
" time.sleep(3)\n",
"\n",
" #print(v['phone'],dict3['SendStatusSet'][0][\"Message\"])\n",
" print(i,v['phone'],v['fn'], v['code'])\n",
" i+=1\n",
" except TencentCloudSDKException as err:\n",
" print(v['phone'],err)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}