瀏覽代碼

Merge remote-tracking branch 'origin/master'

xuguoyang 4 月之前
父節點
當前提交
1bbbcdf083

+ 3 - 3
.env

@@ -21,7 +21,7 @@ DEV_YJXP_WEB_ROOT_PATH = "http://127.0.0.1:8086/yjxp/#"
 #粤政易APP回调地址
 DEV_YJXP_CALLBACK_WEB_PATH = "http://19.155.220.206:8086/api/yzy/callback.html"
 
-DEV_YZY_WEB_ROOT = "https://yjdev.tjp.com.cn:8086"
+DEV_YZY_WEB_ROOT = "https://yjxp.tjp.com.cn:8086"
 
 #########################################################################
 # 预发布环境配置
@@ -49,7 +49,7 @@ STAGE_YJXP_WEB_ROOT_PATH = "http://120.241.74.139:8086/yjxp/#"
 STAGE_YJXP_CALLBACK_WEB_PATH = "http://19.155.220.206:8086/api/yzy/callback.html"
 # STAGE_YJXP_CALLBACK_WEB_PATH = "http://120.241.74.139:8086/api/yzy/callback.html"
 
-STAGE_YZY_WEB_ROOT = "https://yjdev.tjp.com.cn:8086"
+STAGE_YZY_WEB_ROOT = "https://yjxp.tjp.com.cn:8086"
 
 #########################################################################
 # 生产环境配置
@@ -78,4 +78,4 @@ PROD_YJXP_WEB_ROOT_PATH = "http://120.241.74.139:8086/yjxp/#"
 # STAGE_YJXP_CALLBACK_WEB_PATH = "http://19.155.220.228:8086/yzy/callback.html"
 PROD_YJXP_CALLBACK_WEB_PATH = "http://120.241.74.139:8086/yzy/callback.html"
 
-PROD_YZY_WEB_ROOT = "https://yjdev.tjp.com.cn:8086"
+PROD_YZY_WEB_ROOT = "https://yjxp.mmsyjj.cn:8086"

+ 2 - 0
models/three_proofing_responsible_base.py

@@ -102,6 +102,8 @@ class ThreeProofingResponsiblePersonImportFileStatus(Base):
     id = Column(Integer, primary_key=True, autoincrement=True, comment='ID')
     file_uuid = Column(String(255), nullable=False, comment='文件uuid名称')
     file_name = Column(String(255), nullable=False, comment='文件名称')
+    error_num = Column(Integer, nullable=False,default=0, comment='错误数量')
+    warning_num = Column(Integer, nullable=False,default=0,comment='警告数量')
     status = Column(String(50), nullable=False, comment='状态')
     create_time = Column(DateTime, default=datetime.now, comment='创建时间')
     update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

+ 2 - 0
routers/api/ThreeProofingResponsible/import_status.py

@@ -60,6 +60,8 @@ async def get_emergency_contact_list(
                 "id": info.id,
                 "file_uuid": info.file_uuid,
                 "file_name": info.file_name,
+                "warning_num":info.warning_num,
+                "error_num":info.error_num,
                 "status": info.status,
                 "create_time":info.create_time.strftime('%Y-%m-%d %H:%M:%S'),
                 "update_time": info.update_time.strftime('%Y-%m-%d %H:%M:%S'),

+ 8 - 1
routers/api/ThreeProofingResponsible/person.py

@@ -520,6 +520,7 @@ def other_type_string_type_parent_id_create_data(db,string,type_parent_id,file_i
             reslte.append(new_person_type)
         else:
             file_info.remark= file_info.remark+f'\n行<{row+1}>责任类别未找到<{other_type_name}>'
+            file_info.error_num +=1
             return reslte ,False
     return reslte ,True
 def import_data(db,file_path,user_id,file_info):
@@ -530,6 +531,7 @@ def import_data(db,file_path,user_id,file_info):
         sheet = book.sheet_by_index(0)
     except :
         file_info.remark = file_info.remark + f'\n文件打开失败,请核实文件格式为xlsx/xlx>'
+        file_info.error_num +=1
         import_status = False
     data = []
     for row in range(4, sheet.nrows):
@@ -537,23 +539,27 @@ def import_data(db,file_path,user_id,file_info):
         name = sheet.cell(row, 0).value
         if name == '':
             file_info.remark = file_info.remark+f'\n行<{row+1}>姓名不能为空<{name}>'
+            file_info.error_num +=1
             import_status = False
         # 所属单位
         unit_name = sheet.cell(row, 1).value
         if unit_name == '':
             file_info.remark = file_info.remark+f'\n行<{row+1}>所属单位不能为空<{unit_name}>'
+            file_info.error_num +=1
             import_status = False
         unit_id = db_dept.get_dept_id_by_name(db, unit_name)
         # 职务
         position = sheet.cell(row, 2).value
         if position =='':
             file_info.remark = file_info.remark+f'\n行<{row+1}>职务不能为空<{position}>'
+            file_info.error_num +=1
             import_status = False
 
         # 电话号码(如有多个手机号请用“,”分隔)
         phone = str(sheet.cell(row, 3).value)
         if phone =='':
             file_info.remark = file_info.remark+f'\n行<{row+1}>电话号码不能为空<{phone}>'
+            file_info.error_num +=1
             import_status = False
         phone_list = [i for i in phone.split(',')]
         user_id_1=-1
@@ -579,9 +585,10 @@ def import_data(db,file_path,user_id,file_info):
             area_code=get_area_info_by_area_name(db,area_name)
             if area_code is None:
                 file_info.remark = file_info.remark+f'\n行<{row+1}>责任区域未找到'
+                file_info.error_num +=1
                 import_status = False
-            area_code = area_code.id
             area_code2 = area_code.area_code
+            area_code = area_code.id
         new_person = ThreeProofingResponsiblePerson(
             unit_id=unit_id,
             unit_name=unit_name,

+ 1 - 1
routers/api/eventManagement/checkin.py

@@ -70,7 +70,7 @@ async def get_qrcode2(
         detail_url = YzyApi.format_redirect_url(redirect_url)
     else:
         # 120.241.74.139
-        detail_url = "http://yjdev.tjp.com.cn:8086/yjxp/#" + redirect_url
+        detail_url = "http://yjxp.tjp.com.cn:8086/yjxp/#" + redirect_url
     '''
     detail_url = "{}{}".format(settings.YZY_WEB_ROOT, redirect_url)
 

+ 15 - 3
routers/api/eventManagement/event.py

@@ -142,8 +142,8 @@ async def get_event_list(
             where = and_(where, EventBase.event_status == event_status)
         if event_time != '':
             event_time = datetime.strptime(event_time, "%Y-%m-%d")
-            event_time = event_time + timedelta(days=1)
-            where = and_(where, EventBase.event_time.between(event_time, event_time + timedelta(days=1)))
+            # event_time = event_time + timedelta(days=1)
+            where = and_(where, EventBase.event_time.between(event_time, event_time + timedelta(days=1) - timedelta(microseconds=1)))
         if region_code != '':
             where = and_(where, EventBase.region_code.like('{}%'.format(region_code)))
         if keyword != '':
@@ -221,6 +221,9 @@ async def post_edit_event(
         body['deaths'] = None
         body['injuries'] = None
         body['missing'] = None
+
+    if 'deaths' in body or 'injuries' in body or 'missing' in body:
+        body['casualties'] = '1'
         
     db.query(EventBase).filter(EventBase.event_code == eventId).update(body)
     db.commit()
@@ -287,6 +290,7 @@ async def get_event_detail(
                     "latitude": row.latitude,
                     "longitude": row.longitude,
                     "address": row.address,
+                    "contact": row.contact,
                     "create_time": get_datetime_str(row.create_time),
                     
                     # 关联预案
@@ -384,6 +388,7 @@ async def close_event(
         if event_base.event_status != "3": 
             event_base.event_status = "3" 
             event_base.del_flag = "0" # 临时事件页改为正式事件
+            event_base.casualties = 1 # 伤亡情况已上报
             db.commit()
 
             event_tracking = EventTracking()
@@ -396,12 +401,16 @@ async def close_event(
             db.add(event_tracking)
             db.commit()
 
-        if 'fileName' in body:
+        if 'fileNames' in body:
+            # 删除旧数据
+            db.query(EventFile).filter(and_(EventFile.foreign_key == eventId, EventFile.from_scenario == 'event_summary_file')).delete()
+
             event_files = [
                 EventFile(
                     event_id=event_base.id,
                     file_name=fileName["name"],  # 使用 fileName["name"] 作为文件名
                     file_path=f'/data/upload/mergefile/uploads/{fileName["url"]}',
+                    file_size = os.path.getsize(f'/data/upload/mergefile/uploads/{fileName["url"]}'),
                     storage_file_name=fileName["url"],
                     foreign_key=event_base.event_code,
                     from_scenario="event_summary_file",
@@ -925,6 +934,9 @@ async def send_emergency_plan_task_by_yzy(
         _user_id = 0
         user_name = ''
         contact_row = db.query(EmergencyContactInfo).filter(and_(EmergencyContactInfo.del_flag == "0", EmergencyContactInfo.unit_id == dept_id)).first()
+        if contact_row is None:
+            continue
+        
         yzy_account = contact_row.yue_gov_ease_phone
         nick_name = contact_row.contact_name
         

+ 108 - 2
routers/api/videoResource/videoinfo.py

@@ -147,6 +147,112 @@ async def get_waterlogged_all_video_info(
         traceback.print_exc()
         raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
 
+@router.get('/get_video_list')
+async def get_video_forest_fire_list(
+        video_type:str = Query(None),
+        area:str = Query(None),
+        name:str = Query(None),
+        db: Session = Depends(get_db),
+        page: int = Query(1, gt=0, description='页码'),
+        pageSize: int = Query(0, gt=0, description='每页条目数量'),
+        body=Depends(remove_xss_json),
+        user_id=Depends(valid_access_token)):
+
+    try:
+        # video_type_list = ['sjyld','sgdfd','jtdd','dzzhyhd']
+        # video_code_list = [item[0] for item in db.query(TpVideoTag.id).filter(TpVideoTag.dict_value == '4').all()]
+        video_list = db.query(TpVideoLog)#.filter(TpVideoLog.area=='茂名市视频数据共享管理平台')
+        if video_type:
+            # if video_type in video_type_list:
+
+            lis = [i.video_code for i in db.query(TpVideoTag.video_code).filter(TpVideoTag.dict_value==video_type , TpVideoTag.del_flag =='0').all()]
+            video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
+        # if area:
+        #     if area=='直辖市':
+        #         lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).all()]
+        #         video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
+        #     else:
+        #         lis = [i.video_code for i in db.query(TpVideoLogTransportationAreaInfo.video_code).filter(TpVideoLogTransportationAreaInfo.area == area).all()]
+        #         video_list = video_list.filter(TpVideoLog.video_code.in_(lis))
+        if name:
+            video_list = video_list.filter(TpVideoLog.name.like(f'%{name}%'))
+        # 计算总条目数
+        total_items = video_list.count()
+        # 排序
+
+        video_list = video_list.order_by(TpVideoLog.video_code)
+        # 执行分页查询
+        # print(video_list.offset((page - 1) * pageSize).limit(pageSize))
+        if pageSize!=0:
+            video_list = video_list.offset((page - 1) * pageSize).limit(pageSize).all()
+            totalPages= (total_items + pageSize - 1) // pageSize
+        else:
+            pageSize = total_items
+            totalPages = 1
+            video_list = video_list.all()
+        result = []
+        # print(total_items,len(video_list),(page - 1) * pageSize,pageSize)
+        for video_info in video_list:
+            video_code = video_info.video_code
+            # video_type_label='其他'
+            longitude = 0
+            latitude = 0
+            area = '直辖市'
+            # video_type_li = db.query(TpVideoTag).filter(TpVideoTag.video_code == video_code,
+            #                                        TpVideoTag.del_flag == '0').first()
+            # if video_type_li:
+            #     query = db.query(SysDictData)
+            #     query = query.filter(SysDictData.del_flag != '2')
+            #     query = query.filter(SysDictData.dict_type == 'video_type')
+            #     query = query.filter(SysDictData.dict_value == video_type_li.dict_value).first()
+            #     if query:
+            #         video_type_label = query.dict_label
+            if '茂名市交通运输局' in video_info.name:
+                video_base_info = db.query(TpVideoLogTransportationAreaInfo).filter(TpVideoLogTransportationAreaInfo.video_code==video_code).first()
+                if video_base_info:
+                    longitude = video_base_info.longitude
+                    latitude = video_base_info.latitude
+                    area = video_base_info.area
+            else:
+                video_base_info = db.query(TpVideoBase).filter(
+                    TpVideoBase.indexcode == video_code).first()
+                if video_base_info:
+                    longitude = video_base_info.longitude
+                    latitude = video_base_info.latitude
+                    area = video_info.name
+                    if '茂南' in area:
+                        area = '茂南区'
+                    elif '电白' in area:
+                        area = '电白区'
+                    elif '高州' in area:
+                        area = '高州区'
+                    elif '信宜' in area:
+                        area = '信宜区'
+                    elif '化州' in area:
+                        area = '化州区'
+            result.append({"area":area,
+                           "status":video_info.status,
+                           "name":video_info.name,
+                           "video_code":video_info.video_code_int,
+                           # "video_type_label":video_type_label,
+                           "longitude":longitude,
+                           "latitude":latitude})
+
+
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": result,
+            'total':total_items,
+            "page": page,
+            "pageSize": pageSize,
+            "totalPages": totalPages
+        }
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
 @router.get('/get_video_transportation_list')
 async def get_video_forest_fire_list(
         video_type:str = Query(None),
@@ -207,7 +313,7 @@ async def get_video_forest_fire_list(
                 longitude = video_base_info.longitude
                 latitude = video_base_info.latitude
                 area = video_base_info.area
-            result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_info.video_code,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
+            result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_info.video_code_int,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
 
 
         return {
@@ -271,7 +377,7 @@ async def get_video_forest_fire_list(
                 longitude = video_base_info.longitude
                 latitude = video_base_info.latitude
                 area = video_base_info.area
-            result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_info.video_code,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
+            result.append({"area":area,"status":video_info.status,"name":video_info.name,"video_code":video_info.video_code_int,"video_type_label":video_type_label,"longitude":longitude,"latitude":latitude})
 
 
         return {

+ 4 - 1
routers/prod_api/__init__.py

@@ -6,6 +6,7 @@ from routers.api import upload_file
 from . import system
 from . import auth
 from . import zwrz
+from . import sso
 
 router = APIRouter()
 
@@ -15,4 +16,6 @@ router.include_router(system.router, prefix="/system")#, dependencies=[Depends(v
 
 router.include_router(upload_file.router, prefix="/file")
 
-router.include_router(zwrz.router)
+router.include_router(zwrz.router)
+
+router.include_router(sso.router, prefix="/sso")

+ 103 - 0
routers/prod_api/sso.py

@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+
+from fastapi import APIRouter, Depends, Request, Header, Form, Body
+from fastapi.responses import FileResponse, StreamingResponse
+from sqlalchemy.orm import Session
+from fastapi.responses import JSONResponse
+from database import get_db
+from utils import *
+from utils.vcode import *
+from utils.redis_util import *
+import base64
+from common.const import *
+from io import BytesIO
+from utils.StripTagsHTMLParser import *
+from common import security
+from datetime import timedelta
+from common.security import valid_access_token
+from common.auth_user import *
+from common import YzyApi
+from models import *
+from urllib.parse import quote
+import requests
+import jwt
+import traceback
+
+router = APIRouter()
+
+
+# 提供给数科使用的单点登录token
+@router.post('/token/create')
+def sso_token(request: Request,
+    user_id: int = Depends(valid_access_token),
+    db: Session = Depends(get_db)):
+
+    sso_token_expires = timedelta(seconds = 300)
+    sso_token = security.create_access_token(
+        data={"sub": user_id}, expires_delta = sso_token_expires
+    )
+
+    return {
+        "code": 200,
+        "msg": "操作成功",
+        "data": {
+            "sso_token": sso_token
+        }
+    }
+
+# token校验
+@router.post('/token/valid')
+def sso_token(request: Request,
+    sso_token: str,
+    db: Session = Depends(get_db)):
+
+    try:
+        payload = jwt.decode(sso_token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
+        print(payload,payload.get("sub"))
+        user_id: str = payload.get("sub")
+
+        row = db.query(SysUser).filter(SysUser.user_id == int(user_id)).first()
+        if row is None:
+            return {
+                "code": 500,
+                "msg": "token异常"
+            }
+        
+        # 角色信息
+        roles = []
+        role_ids = db.query(SysUserRole).filter(SysUserRole.user_id == int(user_id)).all()
+        for role in role_ids:
+            role_info = db.query(SysRole).filter(SysRole.role_id == role.role_id).first()
+            roles.append(
+                {
+                    "roleId": role_info.role_id,
+                    "roleName": role_info.role_name,
+                    "roleKey": role_info.role_key
+                }
+            )
+
+        role_keys = [
+            n['roleKey']
+            for n in roles
+        ]
+        
+        data = {
+            "userId": row.user_id,
+            "userName": row.user_name,
+            "nickName": row.nick_name,
+            "roles": role_keys
+        }
+    
+        return {
+            "code": 200,
+            "msg": "操作成功",
+            "data": data
+        }
+        
+    except Exception:
+        traceback.print_exc()
+        return {
+            "code": 500,
+            "msg": "token异常"
+        }
+    

+ 4 - 1
routers/prod_api/system/area/__init__.py

@@ -65,6 +65,9 @@ def read_all_areas(parent_id:int = 1,db: Session = Depends(get_db)):
         return query.first()
     try:
         area_info = id_get_area_info(parent_id)
+        parentLabel=''
+        if area_info:
+            parentLabel = area_info.area_name
         area_list = parent_id_get_area_info(parent_id)
         data = []
 
@@ -76,7 +79,7 @@ def read_all_areas(parent_id:int = 1,db: Session = Depends(get_db)):
                 'label': info.area_name,
                 'personSum': 0,
                 'isShowSelect': isShowSelect,
-                'parentLabel': area_info.area_name})
+                'parentLabel': parentLabel})
         return {
                 "code": 200,
                 "msg": "成功",

+ 4 - 4
routers/prod_api/system/user/__init__.py

@@ -777,10 +777,10 @@ async def userlist( #user_id_1: int = Query(None ,description='用户id'),
                 "createTime": user.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else '',
                 "delFlag":user.del_flag,
                 "dept":{
-                        "createBy": user_id_get_user_info(db,dept.create_by).user_name if user.create_by else  None,
-                        "createTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else None,
-                        "updateBy": user_id_get_user_info(db,dept.update_by).user_name if user.update_by else  None,
-                        "updateTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if user.create_time else None,
+                        "createBy": user_id_get_user_info(db,dept.create_by).user_name if dept.create_by else  None,
+                        "createTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
+                        "updateBy": user_id_get_user_info(db,dept.update_by).user_name if dept.update_by else  None,
+                        "updateTime": dept.create_time.strftime('%Y-%m-%d %H:%M:%S') if dept.create_time else None,
                         "remark": '',#dept.remark,
                         "deptId": dept.dept_id,
                         "parentId": dept.parent_id,