daiban.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. # -*- coding: utf-8 -*-
  2. from fastapi import APIRouter, Depends
  3. from config import settings
  4. from pydantic import BaseModel
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy.sql import func
  7. from sqlalchemy import text, exists, and_, or_, not_
  8. from database import get_db
  9. import time
  10. import datetime
  11. from utils import *
  12. from extensions import logger
  13. from datetime import datetime, timedelta
  14. from models import *
  15. router = APIRouter()
  16. '''
  17. 在浏览器打开如下链接,并替换对应参数值,参数占位符为{xxx}。返回正确代码即基础校验通过。
  18. 文档说明
  19. https://bs-test.digitalgd.com.cn/yqt_back/scg/yst-ec/ec-task-record/checkTaskParam?accessToken={access_token}&accessApi={access_api}&accessPaasId={access_paasid}&accessPaasIdToken={access_paasid_token}&startTime={start_time}&endTime={end_time}
  20. 实际参数
  21. https://bs-test.digitalgd.com.cn/yqt_back/scg/yst-ec/ec-task-record/checkTaskParam?accessToken=af53d502-20e8-11f0-895f-0242ac140002&accessApi=/ebus/yst_mmsyjjzhyjxt/api/yst/daiban/query&startTime=2021-01-01%2001:01:01&endTime=2026-01-01%2001:01:01
  22. '''
  23. class DaibanQueryReq(BaseModel):
  24. # 访问Token
  25. accessToken: str
  26. # 当前页码
  27. pageNum: int
  28. # 每页显示记录数
  29. pageSize: int
  30. # 开始时间
  31. startTime: str
  32. # 结束时间
  33. endTime: str
  34. # 来源系统标识
  35. sourceSystemId: str = ''
  36. # 申请人类型
  37. applyerType: str = ''
  38. # 申请人证件类型
  39. applyerIdType: str = ''
  40. # 申请人证件号码
  41. applyerIdNum: str = ''
  42. # 申请人统一身份认证平台账号
  43. applyerUid: str = ''
  44. # 事项状态
  45. state: str = ''
  46. @router.post('/query', summary="待办查询接口")
  47. def index(
  48. req: DaibanQueryReq,
  49. db: Session = Depends(get_db)
  50. ):
  51. logger.info(req)
  52. if settings.IS_STAGE and req.accessToken != 'af53d502-20e8-11f0-895f-0242ac140002':
  53. logger.error('STAGE accessToken异常: {}',req.accessToken)
  54. return {
  55. "errcode": 1,
  56. "errmsg": "accessToken异常"
  57. }
  58. elif settings.IS_PROD and req.accessToken != 'b7a79d24-20e8-11f0-895f-0242ac140002':
  59. logger.error('PROD accessToken异常: {}',req.accessToken)
  60. return {
  61. "errcode": 1,
  62. "errmsg": "accessToken异常"
  63. }
  64. state = req.state
  65. applyerIdNum = req.applyerIdNum
  66. startTime = req.startTime
  67. endTime = req.endTime
  68. pageNum = req.pageNum
  69. pageSize = req.pageSize
  70. startTime = time.strptime(startTime, "%Y-%m-%d %H:%M:%S")
  71. endTime = time.strptime(endTime, "%Y-%m-%d %H:%M:%S")
  72. where = and_(VwYstDaiban.update_time >= startTime, VwYstDaiban.update_time <= endTime)
  73. if applyerIdNum != '':
  74. applyerIdNum = applyerIdNum
  75. where = and_(where, VwYstDaiban.sfzh == applyerIdNum)
  76. if state == '01': # 待办
  77. where = and_(where, VwYstDaiban.status == 2)
  78. elif state == '02': # 办理中
  79. where = and_(where, VwYstDaiban.status == 1)
  80. elif state == '03': # 办结
  81. where = and_(where, VwYstDaiban.status == 2)
  82. elif state == '04': # 已过期
  83. where = and_(where, VwYstDaiban.update_time < (datetime.now() - timedelta(days=180)))
  84. elif state == '09': # 已删除
  85. where = and_(where, VwYstDaiban.update_time < (datetime.now() - timedelta(days=365)))
  86. else:
  87. where = and_(where, VwYstDaiban.status > 0)
  88. # 条数
  89. q = db.query(func.count(VwYstDaiban.bzid))
  90. model_count = q.filter(where).scalar()
  91. print("model_count:", state, model_count)
  92. # 明细
  93. q = db.query(VwYstDaiban)
  94. q = q.filter(where).order_by(VwYstDaiban.update_time.desc())
  95. q = q.limit(pageSize).offset((int(pageNum) - 1) * pageSize)
  96. rows = q.all()
  97. records = []
  98. for row in rows:
  99. rec = new_record(get_model_dict(row))
  100. if rec is not None:
  101. records.append(rec)
  102. pageCount = len(records)
  103. pages = 1
  104. hasNextPage = pageCount >= pageSize
  105. resp = {
  106. "errcode": 0,
  107. "errmsg": "成功",
  108. "data": {
  109. "pageNum": pageNum,
  110. "pageSize": pageSize,
  111. "size": pageCount,
  112. "pages": pages,
  113. "total": model_count,
  114. "hasNextPage": hasNextPage,
  115. "records": records
  116. }
  117. }
  118. logger.info(resp)
  119. return resp
  120. def new_record(data: dict):
  121. shixiang = data['sxmc']
  122. projectNo = data['bzid']
  123. systemId = settings.YST_PASS_ID
  124. sourceSystemId = settings.YST_PASS_ID
  125. taskCodeLocal = shixiang
  126. applyTime = data['create_time']
  127. updateTime = data['update_time']
  128. cid = data['sfzh']
  129. name = data['xm']
  130. qymc = data['qymc']
  131. qydm = data['qydm']
  132. H5_HOST = "https://yst.mmsyjj.cn:8086"
  133. if settings.IS_PROD == False:
  134. H5_HOST = "http://120.241.74.139:8086"
  135. if shixiang == 'qyjcxx':
  136. taskTitle = '应急企业基础信息'
  137. detailURL = H5_HOST + '/mmh5_yjxm_yst/#/pages/mmyj/qyjcxx/jdxq/index?id=' + data['bzid']
  138. elif shixiang == 'qyyjya':
  139. taskTitle = '应急预案上报'
  140. detailURL = H5_HOST + '/mmh5_yjxm_yst/#/pages/mmyj/qyyjya/jdxq/index?id=' + data['bzid']
  141. elif shixiang == 'yjylzj':
  142. taskTitle = '应急演练总结'
  143. detailURL = H5_HOST + '/mmh5_yjxm_yst/#/pages/mmyj/yjylzj/jdxq/index?id=' + data['bzid']
  144. state = '10'
  145. businessState = '待办'
  146. if data['status'] == 1:
  147. state = '02'
  148. businessState = '审核中'
  149. elif data['status'] == 2:
  150. state = '03'
  151. businessState = '审核通过'
  152. elif data['status'] == 3:
  153. state = '03'
  154. businessState = '审核不通过'
  155. #elif data['status'] == 2:
  156. # state = '01'
  157. # businessState = '待办'
  158. if updateTime < (datetime.now() - timedelta(days=365)):
  159. state = '09'
  160. businessState = '已删除'
  161. if updateTime < (datetime.now() - timedelta(days=180)):
  162. state = '04'
  163. businessState = '已过期'
  164. taskNameLocal = taskTitle
  165. return {
  166. # 办件编号
  167. 'projectNo': projectNo,
  168. # 业务系统标识
  169. 'systemId': systemId,
  170. # 来源系统标识
  171. 'sourceSystemId': sourceSystemId,
  172. # 办件标题
  173. 'taskTitle': taskTitle,
  174. # 事项名称(可选)
  175. 'taskName': '' + taskTitle, # 标题来的,很重要
  176. # 事项编码(可选)
  177. 'taskCode': '',
  178. # 业务系统自编事项名称
  179. 'taskNameLocal': taskNameLocal,
  180. # 业务系统自编事项编码
  181. 'taskCodeLocal': taskCodeLocal,
  182. # 事项版本号
  183. 'taskVersion': '',
  184. # 事项状态
  185. 'state': state,
  186. # 业务状态
  187. 'businessState': businessState,
  188. # 受理部门编码(可选)
  189. 'orgCode': '',
  190. # 受理部门名称(可选)
  191. 'orgName': '',
  192. # 地市区划编码
  193. 'zoneCode': '4414',
  194. # 办件提交时间
  195. 'applyTime': get_datetime_str(applyTime),
  196. # 办件详细信息URL
  197. 'detailURL': detailURL,
  198. # 更新时间
  199. 'updateTime': get_datetime_str(updateTime),
  200. # 申请人信息
  201. 'applyerInfo': {
  202. # 申请人类型
  203. 'applyerType': '1', # 自然人
  204. # 申请人名称
  205. 'applyerName': qymc,
  206. # 申请人证件类型
  207. 'applyerIdType': '10', # 身份证
  208. # 申请人证件号码
  209. 'applyerIdNum': cid,
  210. # 申请人统一身份认证平台账号(可选)
  211. 'applyerUid': qydm,
  212. # 法定代表人(可选)
  213. 'legal': name
  214. },
  215. # 联系人信息
  216. 'contactInfo': {
  217. # 联系人/代理人姓名
  218. 'contactName': '',
  219. # 联系人/代理人证件类型
  220. 'contactIdType': '',
  221. # 联系人/代理人证件号码
  222. 'contactIdNum': '',
  223. # 联系人手机号码
  224. 'contactMobile': '',
  225. # 通讯地址
  226. 'address': '',
  227. # 联系人统一身份认证平台账号
  228. 'contactUid': ''
  229. }
  230. }