浏览代码

no message

libushang 1 月之前
父节点
当前提交
be1e5b7a54

+ 81 - 0
common/enc/building_project_info_data.py

@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from . import mpfun
+from models import *
+from sqlalchemy.orm import Session
+from database import get_local_db
+
+# 建筑工程信息表
+
+# 加密和HMAC签名
+def sign_row(db: Session, row: BuildingProjectInfo) -> None:
+    if row.sign != '':
+        return
+    
+    prjcode = mpfun.base64_data(row.prjcode) # 项目编号
+    prjname = mpfun.base64_data(row.prjname) # 项目名称
+    letternum = mpfun.base64_data(row.letternum) # 立项文号
+
+    prjtypename = mpfun.base64_data(row.prjtypename) # 项目类型
+    issueby = mpfun.base64_data(row.issueby) # 立项批复机关
+
+    address = mpfun.base64_data(row.address) # 项目地址
+    prjpropertyname = mpfun.base64_data(row.prjusefor) # 建设性质
+    prjusefor = mpfun.base64_data(row.prjusefor) # 工程用途
+    ownername = mpfun.base64_data(row.ownername) # 建设单位
+    
+    sign_data = ",".join([prjcode, prjname, letternum, prjtypename, issueby, address, prjpropertyname, prjusefor, ownername])
+    sign_hmac = mpfun.sign_data(sign_data)
+    # print('sign_tbl_user sign_data:', sign_data)
+    # print('sign_tbl_user sign_hmac:', sign_hmac)
+
+    row.sign = sign_hmac
+    
+    db.commit()
+
+# 比较字段合并字符串是否和MAC值匹配上,调用密码服务器[验证HMAC]接口
+def sign_valid_row(row: BuildingProjectInfo) -> bool:
+    if row.sign == '':
+        return True
+
+    # 关键字段合并字符串
+    sign_data = get_sign_str(row)
+    # print('sys_user sign_data:', sign_data)
+    
+    # 原HMACSM3数值
+    sign_hmac = row.sign
+    # print('sign_hmac:', sign_hmac)
+
+    return mpfun.hmac_verify(sign_data, sign_hmac)
+
+# 生成待签名的字符串
+def get_sign_str(row: BuildingProjectInfo) -> str:
+    prjcode = mpfun.base64_data(row.prjcode) # 项目编号
+    prjname = mpfun.base64_data(row.prjname) # 项目名称
+    letternum = mpfun.base64_data(row.letternum) # 立项文号
+
+    prjtypename = mpfun.base64_data(row.prjtypename) # 项目类型
+    issueby = mpfun.base64_data(row.issueby) # 立项批复机关
+
+    address = mpfun.base64_data(row.address) # 项目地址
+    prjpropertyname = mpfun.base64_data(row.prjusefor) # 建设性质
+    prjusefor = mpfun.base64_data(row.prjusefor) # 工程用途
+    ownername = mpfun.base64_data(row.ownername) # 建设单位
+
+    # 关键字段合并字符串
+    sign_data = ",".join([prjcode, prjname, letternum, prjtypename, issueby, address, prjpropertyname, prjusefor, ownername])
+    return sign_data
+
+# 生成HAMC签名值
+def get_sign_hmac(row: BuildingProjectInfo) -> str:
+    sign_data = get_sign_str(row)
+    return mpfun.sign_data(sign_data) 
+
+# 对所有数据进行签名
+def sign_table():
+    print('sign_building_project_info table =====>>>')
+    with get_local_db() as db:
+        rows = db.query(BuildingProjectInfo).filter(BuildingProjectInfo.sign == '').all()
+        for row in rows:
+            sign_row(db, row)

+ 4 - 4
common/enc/chemical_company_data.py

@@ -75,10 +75,10 @@ def get_sign_str(row: ChemicalCompany) -> str:
     credit_code = mpfun.base64_data(row.credit_code) # 统一社会信用代码
     industry_classification = mpfun.base64_data(row.industry_classification) # 行业分类
     
-    emergency_contact_number = mpfun.enc_data(row.emergency_contact_number) # 安全值班电话
-    emergency_response_hotline = mpfun.enc_data(row.emergency_response_hotline) # 应急咨询服务电话
-    emergency_contacqyagjgfzr_phonet_number = mpfun.enc_data(row.qyagjgfzr_phone) # 企业安管机构负责人手机号
-    qyfgaqfzr_phone = mpfun.enc_data(row.qyfgaqfzr_phone) # 企业分管安全负责人手机号
+    emergency_contact_number = (row.emergency_contact_number) # 安全值班电话
+    emergency_response_hotline = (row.emergency_response_hotline) # 应急咨询服务电话
+    emergency_contacqyagjgfzr_phonet_number = (row.qyagjgfzr_phone) # 企业安管机构负责人手机号
+    qyfgaqfzr_phone = (row.qyfgaqfzr_phone) # 企业分管安全负责人手机号
 
     xkzbh = mpfun.base64_data(row.xkzbh) # 许可证编号
     issuance_date = mpfun.base64_data(row.issuance_date) # 发证日期

+ 4 - 0
jobs/sign_data_job.py

@@ -14,6 +14,7 @@ from common.enc import emergency_contact_info_data
 from common.enc import three_proofing_responsible_person_data
 from common.enc import govdata_disaster_info_officer_data
 from common.enc import chemical_company_data
+from common.enc import building_project_info_data
 
 
 # 对数据进行加密处理
@@ -62,6 +63,9 @@ def sign_data_proc():
 
     # 危化企业信息表
     chemical_company_data.sign_table()
+
+    # 建筑工程信息表
+    building_project_info_data.sign_table()
     
     # 操作日志表
     sys_czrz_data.sign_table()

+ 49 - 0
models/sharedb.py

@@ -52,3 +52,52 @@ class ChemicalCompany(Base):
 
     class Config:
         orm_mode = True
+
+
+# 建筑工程信息表
+class BuildingProjectInfo(Base):
+    __tablename__ = 'building_project_info'
+
+    id = Column(BigInteger, primary_key=True,autoincrement=True, comment='主键')
+    prjcode = Column(String, default='', comment='项目编号')
+    prjname = Column(String, default='', comment='项目名称')
+    prjnum = Column(String, default='', comment='投资项目在线审批监管平台统一项目代码')
+    letternum = Column(String, default='', comment='立项文号')
+    prjlevel = Column(String, default='', comment='立项级别')
+    issueby = Column(String, default='', comment='立项批复机关')
+    dtissue = Column(DateTime, comment='立项批复时间')
+    prjtypename = Column(String, default='', comment='项目类型')
+    cityid = Column(String, default='', comment='项目所在地区编码(地市)')
+    cityname = Column(String, default='', comment='项目所在地区名称(地市)')
+    countyid = Column(Integer, comment='项目所在地区编码(县区)')
+    countyname = Column(String, default='', comment='项目所在地区名称(县区)')
+    address = Column(String, default='', comment='项目地址')
+    longitude = Column(Float, comment='经度')
+    latitude = Column(String, comment='纬度')
+    prjsizedes = Column(String, default='', comment='建设规模')
+    allinvest = Column(Float, default='', comment='总投资(万元)')
+    allarea = Column(Float, comment='总面积(平方米)')
+    alllength = Column(Float, comment='总长度(米)')
+    allspan = Column(Float, comment='总跨度(米)')
+    prjpropertyname = Column(String, default='', comment='建设性质')
+    prjusefor = Column(String, default='', comment='工程用途')
+    dtplans = Column(DateTime, comment='计划开工日期')
+    dtplane = Column(DateTime, comment='计划竣工日期')
+    ownername = Column(String, default='', comment='建设单位')
+    ownerid = Column(String, default='', comment='建设单位统一信用代码(或个人身份证号码)')
+    zjlygjzfczzjtz = Column(Float, comment='资金来源-各级政府财政资金投资')
+    zjlygyqyzjtz = Column(Float, comment='资金来源-国有企业资金投资')
+    zjlygjrz = Column(Float, comment='资金来源-国家融资')
+    zjlysygjzzhzwgzfzj = Column(Float, comment='资金来源-使用国际组织或外国政府资金')
+    zjlyjtjjzztz = Column(Float, comment='资金来源-集体经济组织投资')
+    zjlywstz = Column(Float, comment='资金来源-外商(国)投资')
+    zjlyggttz = Column(Float, comment='资金来源-港澳台投资')
+    zjlysytz = Column(Float, comment='资金来源-私(民)营投资')
+    zjlyqtzjly = Column(Float, comment='资金来源-其他资金来源')
+    add_time = Column(DateTime, comment='新增时间')
+    cd_time = Column(DateTime, comment='增量时间')
+    cd_operation = Column(String, default='', comment='增量标识')
+    cd_batch = Column(String, default='', comment='批次号')
+    sign = Column(String, server_default='', default='', comment='HMACSM3数值')
+    class Config:
+        orm_mode = True

+ 38 - 3
routers/api/gateway/sign_api.py

@@ -6,7 +6,7 @@ from database import get_db, get_share_db
 from sqlalchemy.orm import Session
 from utils import *
 from models import *
-from common.enc import mpfun, govdata_disaster_info_officer_data, chemical_company_data
+from common.enc import mpfun, govdata_disaster_info_officer_data, chemical_company_data, building_project_info_data
 from exceptions import HmacException
 
 
@@ -16,10 +16,11 @@ router = APIRouter()
 @router.post('/v2/get_point_info_emergency_disaster_info_officer')
 async def getEmergencyDisasterInfoOfficerDetails(
     request: Request,
-    id: str,
+    body = Depends(remove_xss_json),
     db: Session = Depends(get_db)
 ):
     try:
+        id = body['query']['id']
         row = db.query(GovdataDisasterInfoOfficer).filter(GovdataDisasterInfoOfficer.id == id).first()
         info = get_model_dict(row)
         info['cellphone'] = mpfun.dec_data(info['cellphone'])
@@ -49,10 +50,11 @@ async def getEmergencyDisasterInfoOfficerDetails(
 @router.post('/v2/get_point_info_chemical_company')
 async def getChemicalcompanyDetails(
     request: Request,
-    id: str,
+    body = Depends(remove_xss_json),
     db: Session = Depends(get_db)
 ):
     try:
+        id = body['query']['id']
         row = db.query(ChemicalCompany).filter(ChemicalCompany.id == id).first()
         info = get_model_dict(row)
         info['emergency_contact_number'] = mpfun.dec_data(info['emergency_contact_number'])
@@ -75,6 +77,39 @@ async def getChemicalcompanyDetails(
             'msg': e.msg
         }
 
+    except Exception as e:
+        return {
+            'code': 410,
+            'msg': '接口对应数据库暂不支持'
+        }
+    
+# 建筑工程信息详情
+@router.post('/v2/get_point_info_building_project_info')
+async def getBuildingProjectDetails(
+    request: Request,
+    body = Depends(remove_xss_json),
+    db: Session = Depends(get_db)
+):
+    try:
+        id = body['query']['id']
+        row = db.query(BuildingProjectInfo).filter(BuildingProjectInfo.id == id).first()
+        info = get_model_dict(row)
+        
+        if building_project_info_data.sign_valid_row(row) == False:
+            raise HmacException(500, "建筑工程信息表验证异常,已被非法篡改")
+        
+        return {
+            'code': 0,
+            'msg': 'success',
+            'rows': [info]
+        }
+    
+    except HmacException as e:
+        return {
+            'code': 500,
+            'msg': e.msg
+        }
+
     except Exception as e:
         return {
             'code': 410,