|
@@ -53,6 +53,20 @@ def user_id_get_info(db,user_id):
|
|
|
data = query.first()
|
|
|
return data
|
|
|
|
|
|
+def position_id_get_info(db,position_id):
|
|
|
+ query = db.query(DutyPosition)
|
|
|
+ query = query.filter(DutyPosition.del_flag != '2')
|
|
|
+ query = query.filter(DutyPosition.id==position_id)
|
|
|
+ data = query.first()
|
|
|
+ return data
|
|
|
+
|
|
|
+def dept_id_get_info(db,dept_id):
|
|
|
+ query = db.query(EmergencyContactDepartment)
|
|
|
+ query = query.filter(EmergencyContactDepartment.del_flag != '2')
|
|
|
+ query = query.filter(EmergencyContactDepartment.id==dept_id)
|
|
|
+ data = query.first()
|
|
|
+ return data
|
|
|
+
|
|
|
def get_duty_unit_id_list(db):
|
|
|
query = db.query(SysDictData)
|
|
|
query = query.filter(SysDictData.del_flag != '2')
|
|
@@ -715,35 +729,48 @@ async def download_file(keywords:str =Query(None),
|
|
|
if duty_unit:
|
|
|
query = query.filter(DutySchedule.duty_unit == duty_unit)
|
|
|
|
|
|
- query = query.order_by(DutySchedule.update_time.desc())
|
|
|
+ subquery = db.query(
|
|
|
+ DutySchedule.duty_date,
|
|
|
+ DutySchedule.shift_type,
|
|
|
+ func.max(DutySchedule.update_time).label("latest_create_time")
|
|
|
+ ).filter(DutySchedule.del_flag != '2').group_by(
|
|
|
+ DutySchedule.duty_date,
|
|
|
+ DutySchedule.shift_type
|
|
|
+ ).subquery()
|
|
|
+
|
|
|
+ query = query.join(
|
|
|
+ subquery,
|
|
|
+ and_(
|
|
|
+ DutySchedule.duty_date == subquery.c.duty_date,
|
|
|
+ DutySchedule.shift_type == subquery.c.shift_type,
|
|
|
+ DutySchedule.update_time == subquery.c.latest_create_time
|
|
|
+ )
|
|
|
+ )
|
|
|
+ query = query.order_by(DutySchedule.duty_date)
|
|
|
duty_data = query.all()
|
|
|
|
|
|
# 转换为字典
|
|
|
data_list = []
|
|
|
for d in duty_data:
|
|
|
- user_data = []
|
|
|
+ data = {
|
|
|
+ "值班开始日期": d.start_time.strftime('%Y-%m-%d') if d.start_time else '',
|
|
|
+ "值班开始时间": d.start_time.strftime('%H:%M') if d.start_time else '',
|
|
|
+ "值班结束日期": d.end_time.strftime('%Y-%m-%d') if d.end_time else '',
|
|
|
+ "值班结束时间": d.end_time.strftime('%H:%M') if d.end_time else '',
|
|
|
+ "带班领导": ""
|
|
|
+ }
|
|
|
+ user_data = {}
|
|
|
user_list = duty_id_get_user_id(db, d.id)
|
|
|
for user_info in user_list:
|
|
|
contact_info = user_id_get_info(db, user_info.personnel_id)
|
|
|
- user_data.append({"position_id": user_info.position_id,
|
|
|
- "personnel_id": user_info.personnel_id,
|
|
|
- "name": contact_info.name,
|
|
|
- "position": contact_info.position,
|
|
|
- "mobile_phone": contact_info.mobile_phone,
|
|
|
- "office_phone": contact_info.office_phone,
|
|
|
- "department_id": contact_info.department_id,
|
|
|
- "yzy_userid": contact_info.userid})
|
|
|
- data_list.append({
|
|
|
- "id": d.id,
|
|
|
- "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
|
|
|
- "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
|
|
|
- "duty_date": d.duty_date,
|
|
|
- "shift_type": d.shift_type,
|
|
|
- "duty_unit": d.duty_unit,
|
|
|
- "duty_type": d.duty_type,
|
|
|
- "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
|
|
|
- "user_data": user_data
|
|
|
- })
|
|
|
+ position= position_id_get_info(db,user_info.position_id)
|
|
|
+ if position.position_name in user_data:
|
|
|
+ user_data[position.position_name].append(contact_info.name)
|
|
|
+ else:
|
|
|
+ user_data[position.position_name]=[contact_info.name]
|
|
|
+ for position_name in user_data:
|
|
|
+ data[position_name] = ",".join(user_data[position_name])
|
|
|
+ data_list.append(data)
|
|
|
# 构造文件的完整路径
|
|
|
import pandas as pd
|
|
|
from io import BytesIO
|
|
@@ -839,127 +866,6 @@ async def create_contact(
|
|
|
|
|
|
# 本单位值班 导出
|
|
|
@router.get("/bdwzb/export")
|
|
|
-async def download_file(keywords:str =Query(None),
|
|
|
- start_time:str =Query(None),
|
|
|
- end_time:str =Query(None),
|
|
|
- duty_unit:int =Query(None),
|
|
|
- db: Session = Depends(get_db),
|
|
|
- body = Depends(remove_xss_json),
|
|
|
- user_id = Depends(valid_access_token)):
|
|
|
- """
|
|
|
- 根据提供的文件名下载文件。
|
|
|
- :param filename: 要下载的文件的名称。
|
|
|
- """
|
|
|
- try:
|
|
|
- query = db.query(DutySchedule)
|
|
|
-
|
|
|
- query = query.filter(DutySchedule.del_flag != '2')
|
|
|
- # 添加查询条件
|
|
|
- if keywords:
|
|
|
- user_list = name_get_user_id(db, keywords)
|
|
|
- duty_list = user_id_get_duty_id(db, user_list)
|
|
|
- query = query.filter(DutySchedule.id.in_(duty_list))
|
|
|
- if start_time:
|
|
|
- start_time = datetime.strptime(start_time, "%Y-%m-%d").date()
|
|
|
- query = query.filter(DutySchedule.duty_date >= start_time)
|
|
|
- if end_time:
|
|
|
- end_time = datetime.strptime(end_time, "%Y-%m-%d").date()
|
|
|
- query = query.filter(DutySchedule.duty_date <= end_time)
|
|
|
- if duty_unit:
|
|
|
- query = query.filter(DutySchedule.duty_unit == duty_unit)
|
|
|
- else:
|
|
|
- now_user_info = user_id_get_user_info(db, user_id)
|
|
|
- print(user_id, now_user_info.phonenumber, get_duty_unit_id_list(db))
|
|
|
- if now_user_info:
|
|
|
- query = query.filter(
|
|
|
- DutySchedule.duty_unit == mobile_phone_get_dept_id(db, mpfun.dec_data(now_user_info.phonenumber),
|
|
|
- get_duty_unit_id_list(db)))
|
|
|
- else:
|
|
|
- return {
|
|
|
- "data": [],
|
|
|
- "code": 200,
|
|
|
- "msg": "查询成功"
|
|
|
- }
|
|
|
- subquery = db.query(
|
|
|
- DutySchedule.duty_date,
|
|
|
- DutySchedule.shift_type,
|
|
|
- func.max(DutySchedule.update_time).label("latest_create_time")
|
|
|
- ).filter(DutySchedule.del_flag != '2').group_by(
|
|
|
- DutySchedule.duty_date,
|
|
|
- DutySchedule.shift_type
|
|
|
- ).subquery()
|
|
|
-
|
|
|
- query = query.join(
|
|
|
- subquery,
|
|
|
- and_(
|
|
|
- DutySchedule.duty_date == subquery.c.duty_date,
|
|
|
- DutySchedule.shift_type == subquery.c.shift_type,
|
|
|
- DutySchedule.update_time == subquery.c.latest_create_time
|
|
|
- )
|
|
|
- )
|
|
|
- query = query.order_by(DutySchedule.update_time.desc())
|
|
|
- duty_data = query.all()
|
|
|
-
|
|
|
- # 转换为字典
|
|
|
- data_list = []
|
|
|
- for d in duty_data:
|
|
|
- user_data = []
|
|
|
- user_list = duty_id_get_user_id(db, d.id)
|
|
|
- for user_info in user_list:
|
|
|
- contact_info = user_id_get_info(db, user_info.personnel_id)
|
|
|
- user_data.append({"position_id": user_info.position_id,
|
|
|
- "personnel_id": user_info.personnel_id,
|
|
|
- "name": contact_info.name,
|
|
|
- "position": contact_info.position,
|
|
|
- "mobile_phone": contact_info.mobile_phone,
|
|
|
- "office_phone": contact_info.office_phone,
|
|
|
- "department_id": contact_info.department_id,
|
|
|
- "yzy_userid": contact_info.userid})
|
|
|
- data_list.append({
|
|
|
- "id": d.id,
|
|
|
- "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
|
|
|
- "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
|
|
|
- "duty_date": d.duty_date,
|
|
|
- "shift_type": d.shift_type,
|
|
|
- "duty_unit": d.duty_unit,
|
|
|
- "duty_type": d.duty_type,
|
|
|
- "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
|
|
|
- "user_data": user_data
|
|
|
- })
|
|
|
-
|
|
|
- # 构造文件的完整路径
|
|
|
- import pandas as pd
|
|
|
- from io import BytesIO
|
|
|
- # 将查询结果转换为 DataFrame
|
|
|
- df = pd.DataFrame(data_list)
|
|
|
-
|
|
|
- # 将 DataFrame 导出为 Excel 文件
|
|
|
- output = BytesIO()
|
|
|
- with pd.ExcelWriter(output, engine='openpyxl') as writer:
|
|
|
- df.to_excel(writer, index=False)
|
|
|
-
|
|
|
- # 设置响应头
|
|
|
- output.seek(0)
|
|
|
- from urllib.parse import quote
|
|
|
- encoded_filename = f'值班排班{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
|
|
|
- encoded_filename = quote(encoded_filename, encoding='utf-8')
|
|
|
- headers = {
|
|
|
- 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
|
|
|
- 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- # 返回文件流
|
|
|
- return StreamingResponse(output, headers=headers)
|
|
|
-
|
|
|
-
|
|
|
- except HTTPException as e:
|
|
|
- raise e
|
|
|
- except Exception as e:
|
|
|
- # 处理其他异常情况
|
|
|
- raise HTTPException(status_code=500, detail=str(e))
|
|
|
-
|
|
|
-
|
|
|
# 各级单位值班表 导出
|
|
|
@router.get("/gjdwzbb/export")
|
|
|
async def download_file(keywords:str =Query(None),
|
|
@@ -1027,27 +933,20 @@ async def download_file(keywords:str =Query(None),
|
|
|
data_list = []
|
|
|
for d in duty_data:
|
|
|
user_data = []
|
|
|
+ leaders = []
|
|
|
user_list = duty_id_get_user_id(db, d.id)
|
|
|
for user_info in user_list:
|
|
|
contact_info = user_id_get_info(db, user_info.personnel_id)
|
|
|
- user_data.append({"position_id": user_info.position_id,
|
|
|
- "personnel_id": user_info.personnel_id,
|
|
|
- "name": contact_info.name,
|
|
|
- "position": contact_info.position,
|
|
|
- "mobile_phone": contact_info.mobile_phone,
|
|
|
- "office_phone": contact_info.office_phone,
|
|
|
- "department_id": contact_info.department_id,
|
|
|
- "yzy_userid": contact_info.userid})
|
|
|
+ position= position_id_get_info(db,user_info.position_id)
|
|
|
+ if position.position_name=='带班领导':
|
|
|
+ leaders.append(contact_info.name)
|
|
|
+ user_data.append(contact_info.name)
|
|
|
data_list.append({
|
|
|
- "id": d.id,
|
|
|
- "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
|
|
|
- "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
|
|
|
- "duty_date": d.duty_date,
|
|
|
- "shift_type": d.shift_type,
|
|
|
- "duty_unit": d.duty_unit,
|
|
|
- "duty_type": d.duty_type,
|
|
|
- "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
|
|
|
- "user_data": user_data
|
|
|
+ "单位名称": d.duty_unit,
|
|
|
+ "开始时间": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
|
|
|
+ "结束时间": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
|
|
|
+ "带班领导": "、".join(leaders),
|
|
|
+ "值班人员": "、".join(user_data)
|
|
|
})
|
|
|
|
|
|
# 构造文件的完整路径
|
|
@@ -1064,7 +963,7 @@ async def download_file(keywords:str =Query(None),
|
|
|
# 设置响应头
|
|
|
output.seek(0)
|
|
|
from urllib.parse import quote
|
|
|
- encoded_filename = f'值班排班{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
|
|
|
+ encoded_filename = f'值班表{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
|
|
|
encoded_filename = quote(encoded_filename, encoding='utf-8')
|
|
|
headers = {
|
|
|
'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
|
|
@@ -1148,30 +1047,25 @@ async def download_file(keywords:str =Query(None),
|
|
|
|
|
|
# 转换为字典
|
|
|
data_list = []
|
|
|
+ yz_list = []
|
|
|
for d in duty_data:
|
|
|
- user_data = []
|
|
|
user_list = duty_id_get_user_id(db, d.id)
|
|
|
for user_info in user_list:
|
|
|
contact_info = user_id_get_info(db, user_info.personnel_id)
|
|
|
- user_data.append({"position_id": user_info.position_id,
|
|
|
- "personnel_id": user_info.personnel_id,
|
|
|
- "name": contact_info.name,
|
|
|
- "position": contact_info.position,
|
|
|
- "mobile_phone": contact_info.mobile_phone,
|
|
|
- "office_phone": contact_info.office_phone,
|
|
|
- "department_id": contact_info.department_id,
|
|
|
- "yzy_userid": contact_info.userid})
|
|
|
- data_list.append({
|
|
|
- "id": d.id,
|
|
|
- "start_time": d.start_time.strftime('%Y-%m-%d %H:%M:%S') if d.start_time else '',
|
|
|
- "end_time": d.end_time.strftime('%Y-%m-%d %H:%M:%S') if d.end_time else '',
|
|
|
- "duty_date": d.duty_date,
|
|
|
- "shift_type": d.shift_type,
|
|
|
- "duty_unit": d.duty_unit,
|
|
|
- "duty_type": d.duty_type,
|
|
|
- "createTime": d.create_time.strftime('%Y-%m-%d %H:%M:%S') if d.create_time else '',
|
|
|
- "user_data": user_data
|
|
|
- })
|
|
|
+ position = position_id_get_info(db, user_info.position_id)
|
|
|
+ department = dept_id_get_info(db,contact_info.department_id)
|
|
|
+ yz = d.duty_date.strftime('%Y-%m-%d')+str(contact_info.id)
|
|
|
+ if yz not in yz_list:
|
|
|
+ yz_list.append(yz)
|
|
|
+ data_list.append({"值班日期":d.duty_date,
|
|
|
+ "值班机构": dept_id_get_info(db,d.duty_unit).department_name,
|
|
|
+ "组织机构": department.department_name,
|
|
|
+ "值班岗位": position.position_name,
|
|
|
+ "值班人员": contact_info.name,
|
|
|
+ "职务": contact_info.position,
|
|
|
+ "联系电话": contact_info.mobile_phone,
|
|
|
+ "办公电话": contact_info.office_phone})
|
|
|
+
|
|
|
|
|
|
# 构造文件的完整路径
|
|
|
import pandas as pd
|
|
@@ -1187,7 +1081,7 @@ async def download_file(keywords:str =Query(None),
|
|
|
# 设置响应头
|
|
|
output.seek(0)
|
|
|
from urllib.parse import quote
|
|
|
- encoded_filename = f'值班排班{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
|
|
|
+ encoded_filename = f'值班人员{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
|
|
|
encoded_filename = quote(encoded_filename, encoding='utf-8')
|
|
|
headers = {
|
|
|
'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
|