From fec659bdf4512cf3c06c4aacc09077265bfdc0ce Mon Sep 17 00:00:00 2001 From: wcq <744800102@qq.com> Date: Tue, 4 Apr 2023 17:08:38 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Crud/FileCrud.py | 1 + Utils/DataToDbUtils.py | 86 +++++++++++++++++++++++++++++++-------- Utils/RedisUtils.py | 1 - Utils/SqlAlchemyUtils.py | 2 +- 远东员工花名册(1).xlsx | Bin 0 -> 22303 bytes 5 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 远东员工花名册(1).xlsx diff --git a/Crud/FileCrud.py b/Crud/FileCrud.py index d1ab39d..7763d1c 100644 --- a/Crud/FileCrud.py +++ b/Crud/FileCrud.py @@ -16,6 +16,7 @@ def add_file(db: Session, data: FileSechemas.UserFileCreate): db.refresh(new_file) return new_file + def file_query(db: Session, params: FileSechemas.UserFileQuery) -> (int, List[UserFile]): query = db.query(UserFile) if params.md: diff --git a/Utils/DataToDbUtils.py b/Utils/DataToDbUtils.py index a70684d..95414ac 100644 --- a/Utils/DataToDbUtils.py +++ b/Utils/DataToDbUtils.py @@ -1,8 +1,10 @@ import pandas as pd +from sqlalchemy.orm import Session + from Utils.SqlAlchemyUtils import get_db_i from Models.PostModel import Post from Models.DepartmentModel import Department -from Models.UserModel import UserInfo,User +from Models.UserModel import UserInfo, User from Models.DailyModel import Daily import json @@ -81,9 +83,9 @@ def user_table_to_db(): def load_daily(): - db=get_db_i() - data=pd.read_excel('动态类数据.xlsx') - length=data.shape[0] + db = get_db_i() + data = pd.read_excel('动态类数据.xlsx') + length = data.shape[0] d_name_dic = {item.name: item.id for item in db.query(Department).all()} post_dic = {} for item in db.query(Post).all(): @@ -92,17 +94,65 @@ def load_daily(): if item.name not in post_dic[item.belong]: post_dic[item.belong][item.name] = item.id for i in range(length): - row=data.loc[i].to_dict() - 报送类型=row['报送类型'] - 报送人=row['报送人'] - 报送时间=row['报送时间'] - 标题=row['标题'] - 标题="" if pd.isna(标题) else 标题 - 正文=row['正文'] - 部门=row['部门'] - 职务=row['职务'] - email=db.query(User).filter_by(name=报送人).first().email - department_id=d_name_dic[部门] - post_id=post_dic[department_id][职务] - db.add(Daily(type=报送类型,fill_user=email,title=标题,content=正文,post=post_id,department=department_id,daily_time=报送时间)) - db.commit() \ No newline at end of file + row = data.loc[i].to_dict() + 报送类型 = row['报送类型'] + 报送人 = row['报送人'] + 报送时间 = row['报送时间'] + 标题 = row['标题'] + 标题 = "" if pd.isna(标题) else 标题 + 正文 = row['正文'] + 部门 = row['部门'] + 职务 = row['职务'] + email = db.query(User).filter_by(name=报送人).first().email + department_id = d_name_dic[部门] + post_id = post_dic[department_id][职务] + db.add(Daily(type=报送类型, fill_user=email, title=标题, content=正文, post=post_id, department=department_id, + daily_time=报送时间)) + db.commit() + + +def load_user_data(db: Session): + dt = pd.read_excel("远东员工花名册(1).xlsx") + line_count = dt.shape[0] + user_list = [] + post_list = [] + dp_id_dic = {item.name: item.id for item in db.query(Department).all()} + dt = dt.fillna(value="") + for i in range(line_count): + row = dt.loc[i] + 部门1 = row["部门"] + 部门2 = row["部门2"] + 职务1 = row["职务"] + 职务2 = row["职务2"] + user_info = { + "email": row["邮箱"], + "name": row["姓名"], + "manage_departments": row["所看部门"].split(',') if row["所看部门"] else [], + "phone": row["移动电话"], + "department": [item for item in [部门1, 部门2] if item], + "post": [item for item in [[部门1, 职务1], [部门2, 职务2]] if item[0]] + } + post_list.extend(user_info["post"]) + user_list.append(user_info) + # post_list.sort(key=lambda x: dp_id_dic[x[0]]) + # db.query(Post).delete() + # for post in post_list: + # new_post = Post(name=post[1], belong=dp_id_dic[post[0]]) + # db.add(new_post) + # db.commit() + dp_post_dic = {} + for item in db.query(Post).all(): + if not dp_post_dic.get(item.belong): + dp_post_dic[item.belong] = {} + dp_post_dic[item.belong][item.name] = item.id + db.query(User).delete() + for user_info in user_list: + new_user = User() + new_user.email = user_info['email'] + new_user.name = user_info['name'] + new_user.manage_departments = ",".join([str(dp_id_dic[item]) for item in user_info['manage_departments']]) + new_user.post = ",".join([str(dp_post_dic[dp_id_dic[item[0]]][item[1]]) for item in user_info['post']]) + new_user.department = ",".join([str(dp_id_dic[item]) for item in user_info['department']]) + new_user.phone = str(int(user_info['phone'])) if user_info['phone'] else None + db.add(new_user) + db.commit() diff --git a/Utils/RedisUtils.py b/Utils/RedisUtils.py index eb038e5..049ef39 100644 --- a/Utils/RedisUtils.py +++ b/Utils/RedisUtils.py @@ -29,6 +29,5 @@ class RedisPool: return conn - redis_pool = RedisPool(host=REDIS_HOST, port=REDIS_PORT) redis_pool.connect() diff --git a/Utils/SqlAlchemyUtils.py b/Utils/SqlAlchemyUtils.py index 10fed72..55eb790 100644 --- a/Utils/SqlAlchemyUtils.py +++ b/Utils/SqlAlchemyUtils.py @@ -7,7 +7,7 @@ from typing import Literal, List, Any, Optional Base = declarative_base() user = "root" -password = "123456" +password = "12345" host = "127.0.0.1" db = 'daily' diff --git a/远东员工花名册(1).xlsx b/远东员工花名册(1).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cf5d45699ce0c1facd2ba6e565c70f5a620cc1c1 GIT binary patch literal 22303 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 literal 0 HcmV?d00001