baoyubo 11 小时之前
父节点
当前提交
70d47b82ef
共有 1 个文件被更改,包括 75 次插入181 次删除
  1. 75 181
      routers/api/dutyManagement/schedule.py

+ 75 - 181
routers/api/dutyManagement/schedule.py

@@ -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}',