Переглянути джерело

风险防控-巡查任务子任务。

baoyubo 6 місяців тому
батько
коміт
bdf75242e5
2 змінених файлів з 287 додано та 3 видалено
  1. 78 1
      models/risk_management.py
  2. 209 2
      routers/api/riskManagement/task.py

+ 78 - 1
models/risk_management.py

@@ -1,4 +1,4 @@
-from sqlalchemy import create_engine, Column, BigInteger, String, Text, DateTime, CHAR,Integer
+from sqlalchemy import create_engine, Column, BigInteger, String, Text, DateTime, CHAR,Integer,Float
 
 from database import Base
 from datetime import datetime
@@ -60,6 +60,83 @@ class RiskManagementInspectionTask(Base):
     remark = Column(String(500), default=None, comment='备注')
 
 
+class RiskManagementInspectionTaskChildrenTask(Base):
+    __tablename__ = 'risk_management_inspection_task_children_task'
+
+    id = Column(String(50), primary_key=True, comment='ID,uuid')
+    task_id = Column(BigInteger, nullable=False, comment='ID,任务基础表id')
+    task_number = Column(String(50), nullable=True, comment='任务编号')
+    type = Column(String(255), nullable=True, comment='巡查业务,城市隐患巡查、森林防火巡查、重点危化企业巡查、重点水库水位巡查')
+    tsak_time = Column(DateTime, nullable=True, comment='要求巡查时间')
+    cycle = Column(String(50), nullable=True, comment='巡查周期,每年、每月、每周、每日、一次')
+    task_range = Column(String(50), nullable=True, comment='巡查范围,市级、区县级、镇街级、村居级')
+    task_num = Column(Integer, nullable=False, comment='任务数')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
+    remark = Column(String(500), default=None, comment='备注')
+
+
+class RiskManagementInspectionTaskChildrenTaskLog(Base):
+    __tablename__ = 'risk_management_inspection_task_children_task_log'
+
+    id = Column(String(50), primary_key=True, comment='ID,uuid')
+    children_task_id = Column(String(50), nullable=False, comment='ID,子任务表id')
+    area_code = Column(String(50), nullable=True, comment='区划编码')
+    area = Column(Text, nullable=True, comment='区划')
+    task_status = Column(String(2), nullable=True, comment='任务进展,已完成、未完成')
+    user_id = Column(String(50), nullable=True, comment='用户id')
+    nick_name = Column(String(50), nullable=True, comment='巡查人员')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
+    remark = Column(String(500), default=None, comment='备注')
+
+
+class RiskManagementInspectionTaskChildrenTaskResult(Base):
+    __tablename__ = 'risk_management_inspection_task_children_task_result'
+
+    id = Column(String(50), primary_key=True, comment='ID,uuid')
+    children_task_id = Column(String(50), nullable=False, comment='ID,子任务表id')
+    longitude = Column(Float, nullable=True, comment='经度')
+    latitude = Column(Float, nullable=True, comment='纬度')
+    inspection_point_name = Column(Text, nullable=True, comment='巡查点')
+    inspection_result = Column(String(2), nullable=True, comment='巡查结果,正常、异常')
+    user_id = Column(String(50), nullable=True, comment='用户id')
+    nick_name = Column(String(50), nullable=True, comment='巡查人员')
+    del_flag = Column(String(1), default='0', comment='删除标志(0代表存在 2代表删除)')
+    create_dept = Column(BigInteger, default=None, comment='创建部门')
+    create_by = Column(BigInteger, default=None, comment='创建者')
+    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
+    update_by = Column(BigInteger, default=None, comment='更新者')
+    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
+    remark = Column(String(500), default=None, comment='备注')
+
+
+class RiskManagementInspectionTaskChildrenTaskResultFile(Base):
+    __tablename__ = 'risk_management_inspection_task_children_task_result_file'
+
+    id = Column(Integer, primary_key=True, autoincrement=True)
+    file_id = Column(String(50), nullable=False, comment='文件id')
+    file_name = Column(String(255), nullable=False, comment='文件名称')
+    file_name_desc = Column(String(255), nullable=False, comment='文件名称原名')
+    file_path = Column(String(255), nullable=True, comment='文件存储路径')
+    file_size = Column(String(50), nullable=True, comment='文件大小')
+    status = Column(String(50), nullable=True, comment='文件状态')
+    foreign_key = Column(String(50), nullable=True, comment='文件外键 --技术字段')
+    from_scenario = Column(String(50), nullable=True, comment='对应标识 --技术字段')
+    create_time = Column(DateTime, nullable=True, comment='数据创建时间')
+    update_time = Column(DateTime, nullable=True, comment='数据更新时间')
+    create_by = Column(BigInteger, nullable=True, comment='创建者')
+    create_dept = Column(BigInteger, nullable=True, comment='创建部门')
+    del_flag = Column(String(1), nullable=True, comment='删除标志(0代表存在 2代表删除)')
+
 class RiskManagementRiskTask(Base):
     __tablename__ = 'risk_management_risk_task'
 

+ 209 - 2
routers/api/riskManagement/task.py

@@ -1,13 +1,14 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
-from fastapi import APIRouter, Request, Depends,Query, HTTPException, status
+from fastapi import APIRouter, Request, Depends,Query, HTTPException, status,BackgroundTasks
 from common.security import valid_access_token
 from fastapi.responses import JSONResponse
 from sqlalchemy.orm import Session
 from sqlalchemy import and_, or_
 from pydantic import BaseModel
-from datetime import datetime
+from datetime import datetime, timedelta
+from dateutil.relativedelta import relativedelta
 from database import get_db
 from typing import List
 from models import *
@@ -18,6 +19,88 @@ import traceback
 
 router = APIRouter()
 
+def get_area_num(db,rang):
+    query = db.query(GovdataArea)
+    if rang=='0':
+        return 1
+    elif rang=='1':
+        query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000')))
+        return query.count()
+    elif rang=='2':
+        query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000')))
+        return query.count()
+    elif rang=='3':
+        query = query.filter(GovdataArea.area_code.notlike('%000'))
+        return query.count()
+    else:
+        return 0
+def get_task_date_list(cycle,start_date,end_date,corn_query):
+    # 生成日期列表
+    date_list = []
+    if cycle=='4': #仅一次,返回当天
+        date_list.append(datetime.today())
+        return date_list
+    elif cycle=='3': #每天
+        current_date = start_date
+        while current_date <= end_date:
+            # 将日期添加到列表中
+            date_list.append(current_date)
+            # 增加一天
+            current_date += timedelta(days=1)
+        return date_list
+    elif cycle=='2': #每周
+        days_ahead = (7+int(corn_query) - start_date.weekday()) % 7
+        current_date = start_date + timedelta(days=days_ahead)
+        while current_date <= end_date:
+            # 将日期添加到列表中
+            date_list.append(current_date)
+            # 增加七天
+            current_date += timedelta(days=7)
+        return date_list
+    elif cycle=='1': #每月
+        days_ahead = datetime.strptime(start_date.strftime("%Y-%m-")+corn_query, "%Y-%m-%d")
+        if days_ahead>start_date:
+            current_date = days_ahead
+        else:
+            current_date = days_ahead+relativedelta(months=1)
+
+        while current_date <= end_date:
+            # 将日期添加到列表中
+            date_list.append(current_date)
+            # 增加七天
+            current_date += relativedelta(months=1)
+        return date_list
+    elif cycle=='0': #每月
+        d,m = corn_query.split()
+        days_ahead = datetime.strptime(start_date.strftime("%Y-")+m+'-'+d, "%Y-%m-%d")
+        if days_ahead>start_date:
+            current_date = days_ahead
+        else:
+            current_date = days_ahead+relativedelta(years=1)
+
+        while current_date <= end_date:
+            # 将日期添加到列表中
+            date_list.append(current_date)
+            # 增加七天
+            current_date += relativedelta(years=1)
+        return date_list
+def create_children_task(db,task_info,corn_query):
+    cycle = task_info.inspection_cycle
+    task_range = task_info.inspection_range
+    for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query):
+        new_children_task = RiskManagementInspectionTaskChildrenTask(
+            id = new_guid(),
+            task_id= task_info.id,
+            task_number= task_info.task_number,
+            type = task_info.inspection_business,
+            tsak_time = t,
+            cycle=cycle,
+            task_range = task_range,
+            task_num=get_area_num(db,task_range),
+            create_by=task_info.create_by
+        )
+        db.add(new_children_task)
+    db.commit()
 
 @router.get('/list')
 async def get_inspection_task_list(
@@ -148,6 +231,7 @@ async def get_inspection_task(
 
 @router.post('/create')
 async def create_inspection_task(
+    background_tasks: BackgroundTasks,
     db: Session = Depends(get_db),
     body = Depends(remove_xss_json),
     user_id = Depends(valid_access_token)
@@ -184,6 +268,7 @@ async def create_inspection_task(
         new_task.task_number = f'YJXC{str(new_task.id).zfill(10)}'
         db.commit()
         # 返回创建成功的响应
+        background_tasks.add_task(create_children_task,db,new_task,corn_query)
         return {
             "code": 200,
             "msg": "成功",
@@ -324,4 +409,126 @@ async def delete_inspection_task(
         # 处理异常
         if str(e) == '':
             e = detail
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+
+
+@router.get('/children/task/{task_id}/list')
+async def get_inspection_task_list(
+    task_id: str ,
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(10, gt=0, description='每页条目数量'),
+    db: Session = Depends(get_db),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 构建查询
+        query = db.query(RiskManagementInspectionTaskChildrenTask)
+        query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
+        # 应用查询条件
+
+        query = query.filter(RiskManagementInspectionTaskChildrenTask.task_id == task_id)
+
+        # 计算总条目数
+        total_items = query.count()
+
+        # 排序
+
+        query = query.order_by(RiskManagementInspectionTaskChildrenTask.tsak_time.asc())
+        # 执行分页查询
+        InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
+
+        # 将查询结果转换为列表形式的字典
+        InspectionTasks_list = []
+        for task in InspectionTasks:
+            task_num=task.task_num
+            completed_num = db.query(RiskManagementInspectionTaskChildrenTaskLog)\
+                .filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag!='2')\
+                .filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id==task.id).count()
+            incomplete_num = task_num-completed_num
+            task_info = {
+                "id": task.id,
+                "task_id":task.task_id,
+                "task_number": task.task_number,
+                "business": task.type,
+                "task_time": task.tsak_time.strftime('%Y-%m-%d'),
+                "cycle": task.cycle,
+                "inspection_range": task.task_range,
+                "completed_num": completed_num,
+                "incomplete_num": incomplete_num,
+                "create_time": task.create_time.strftime('%Y-%m-%d')
+            }
+            InspectionTasks_list.append(task_info)
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": InspectionTasks_list,
+            "total": total_items,
+            "page": page,
+            "pageSize": pageSize,
+            "totalPages": (total_items + pageSize - 1) // pageSize
+        }
+    except Exception as e:
+        # 处理异常
+        raise HTTPException(status_code=500, detail=str(e))
+
+
+
+@router.get('/children/task/log/{children_task_id}/list')
+async def get_inspection_task_list(
+    children_task_id: str ,
+    area_code: str = Query(None, description='区划编码'),
+    page: int = Query(1, gt=0, description='页码'),
+    pageSize: int = Query(10, gt=0, description='每页条目数量'),
+    db: Session = Depends(get_db),
+    user_id = Depends(valid_access_token)
+):
+    try:
+        # 构建查询
+        query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
+        query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
+        # 应用查询条件
+
+        query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == children_task_id)
+
+        if area_code:
+            query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.area_code == area_code)
+        # 计算总条目数
+        total_items = query.count()
+
+        # 排序
+
+        query = query.order_by(RiskManagementInspectionTaskChildrenTaskLog.create_time.desc())
+        # 执行分页查询
+        InspectionTasks = query.offset((page - 1) * pageSize).limit(pageSize).all()
+
+        # 将查询结果转换为列表形式的字典
+        InspectionTasks_list = []
+        for task in InspectionTasks:
+
+            task_info = {
+                "id": task.id,
+                "children_task_id":task.children_task_id,
+                "area_code": task.area_code,
+                "area": task.area,
+                "task_status": task.task_status,
+                "user_id": task.user_id,
+                "nick_name": task.nick_name,
+                "create_time": task.create_time.strftime('%Y-%m-%d')
+            }
+            InspectionTasks_list.append(task_info)
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": InspectionTasks_list,
+            "total": total_items,
+            "page": page,
+            "pageSize": pageSize,
+            "totalPages": (total_items + pageSize - 1) // pageSize
+        }
+    except Exception as e:
+        # 处理异常
         raise HTTPException(status_code=500, detail=str(e))