procurement.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from fastapi import APIRouter, Request, Depends, Query, HTTPException, status,WebSocket,WebSocketDisconnect
  4. from common.security import valid_access_token,valid_websocket_token
  5. from fastapi.responses import JSONResponse
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy.sql import func
  8. from common.auth_user import *
  9. from sqlalchemy import text
  10. from pydantic import BaseModel
  11. from common.BigDataCenterAPI import *
  12. from database import get_db
  13. from typing import List
  14. from models import *
  15. from utils import *
  16. from utils.spatial import *
  17. from utils.ry_system_util import *
  18. from utils.resource_provision_util import *
  19. from common.websocketManager import *
  20. import json
  21. import traceback
  22. router = APIRouter()
  23. @router.post("/create")
  24. async def create_pattern(
  25. user_id=Depends(valid_access_token),
  26. body = Depends(remove_xss_json),
  27. db: Session = Depends(get_db)
  28. ):
  29. try:
  30. dept_info = user_id_get_user_info(db,user_id)
  31. new_declaration = ResourceProvisionProcurementDeclaration(
  32. id = new_guid(),
  33. declaration_amount=body['declaration_amount'],
  34. declaration_person=user_id,
  35. declaration_unit=dept_info.dept_id,
  36. declaration_details = '1',
  37. create_by = user_id
  38. )
  39. db.add(new_declaration)
  40. for info in body['detail']:
  41. new_detail = ResourceProvisionProcurementDeclarationDetail(
  42. id=new_guid(),
  43. serial_number=info['serial_number'],
  44. declaration_id = new_declaration.id,
  45. warehouse_id = info['warehouse_id'],
  46. material_type = info['material_type'],
  47. material_code = info['material_code'],
  48. material_quantity = info['material_quantity'],
  49. material_unit_price = info['material_unit_price'],
  50. material_purpose = info['material_purpose'],
  51. create_by = user_id
  52. )
  53. db.add(new_detail)
  54. db.commit()
  55. return {"code": 200, "msg": "创建成功", "data": None}
  56. except Exception as e:
  57. traceback.print_exc()
  58. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  59. @router.put("/update/{id}")
  60. async def update_pattern(
  61. id :str ,
  62. user_id=Depends(valid_access_token),
  63. body=Depends(remove_xss_json),
  64. db: Session = Depends(get_db)
  65. ):
  66. try:
  67. update_declaration = declaration_id_get_declaration_info(db,id)
  68. if not update_declaration:
  69. return JSONResponse(status_code=404,content={"code":404,"msg":"declaration not found"})
  70. if str(update_declaration.declaration_person) != str(user_id):
  71. return JSONResponse(status_code=404, content={"code": 404, "msg": "declaration not permission"})
  72. update_declaration.declaration_amount = body['declaration_amount']
  73. update_declaration.update_by = user_id
  74. detail_list = []
  75. for info in body['detail']:
  76. if info['id']=='':
  77. new_detail = ResourceProvisionProcurementDeclarationDetail(
  78. id=new_guid(),
  79. serial_number=info['serial_number'],
  80. declaration_id=update_declaration.id,
  81. warehouse_id = info['warehouse_id'],
  82. material_type=info['material_type'],
  83. material_code=info['material_code'],
  84. material_quantity=info['material_quantity'],
  85. material_unit_price=info['material_unit_price'],
  86. material_purpose=info['material_purpose'],
  87. create_by=user_id
  88. )
  89. db.add(new_detail)
  90. detail_list.append(new_detail.id)
  91. else:
  92. detail = detail_id_get_declaration_detail_info(db,info['id'])
  93. if detail is None:
  94. new_detail = ResourceProvisionProcurementDeclarationDetail(
  95. id=new_guid(),
  96. serial_number=info['serial_number'],
  97. declaration_id=update_declaration.id,
  98. warehouse_id = info['warehouse_id'],
  99. material_type=info['material_type'],
  100. material_code=info['material_code'],
  101. material_quantity=info['material_quantity'],
  102. material_unit_price=info['material_unit_price'],
  103. material_purpose=info['material_purpose'],
  104. create_by=user_id
  105. )
  106. db.add(new_detail)
  107. detail_list.append(new_detail.id)
  108. else:
  109. detail.serial_number = info['serial_number']
  110. detail.warehouse_id = info['warehouse_id']
  111. detail.material_type = info['material_type']
  112. detail.material_code = info['material_code']
  113. detail.material_quantity = info['material_quantity']
  114. detail.material_unit_price = info['material_unit_price']
  115. detail.material_purpose = info['material_purpose']
  116. detail.update_by = user_id
  117. detail_list.append(info['id'])
  118. query = db.query(ResourceProvisionProcurementDeclarationDetail)
  119. query = query.filter_by(declaration_id=id, del_flag='0').filter(~ResourceProvisionProcurementDeclarationDetail.id.in_(detail_list))
  120. for i in query.all():
  121. i.del_flag='2'
  122. db.commit()
  123. return {"code": 200, "msg": "更新成功"}
  124. except Exception as e:
  125. traceback.print_exc()
  126. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  127. @router.get("/info/{id}")
  128. async def get_pattern_info(
  129. id: str,
  130. db: Session = Depends(get_db)
  131. ):
  132. try:
  133. info = declaration_id_get_declaration_info(db,id)
  134. if not info:
  135. return JSONResponse(status_code=404,content={"code":404,"msg":"type not found"})
  136. dept_info = dept_id_get_dept_info(db,info.declaration_unit)
  137. user_info = user_id_get_user_info(db,info.declaration_person)
  138. review_info = declaration_id_get_declaration_review_info(db,id)
  139. if review_info is None:
  140. declaration_details = info.declaration_details
  141. else:
  142. declaration_details = review_info.review_result
  143. data = {"id": info.id,
  144. "declaration_date": info.declaration_date,
  145. "declaration_amount": info.declaration_amount,
  146. "declaration_unit": info.declaration_unit,
  147. "declaration_unit_name": dept_info.dept_name,
  148. "declaration_person": info.declaration_person,
  149. "declaration_person_name": user_info.nick_name,
  150. "declaration_details": declaration_details,
  151. "create_time": info.create_time}
  152. detail=[]
  153. for detail_info in declaration_id_get_declaration_detail_list(db,id):
  154. material_type_info = type_id_get_material_type_info(db,detail_info.material_type)
  155. if material_type_info:
  156. material_category_name=material_type_info.material_category_name
  157. else:
  158. material_category_name = None
  159. material_into = material_id_get_material_info(db,detail_info.material_code)
  160. if material_into:
  161. material_name = material_into.material_name
  162. else:
  163. material_name = None
  164. warehouse_info = warehouse_id_get_warehouse_info(db,detail_info.warehouse_id)
  165. if warehouse_info:
  166. warehouse_name = warehouse_info.warehouse_name
  167. else:
  168. warehouse_name = None
  169. detail.append({"id":detail_info.id,
  170. "serial_number":detail_info.serial_number,
  171. "warehouse_id":detail_info.warehouse_id,
  172. "warehouse_name":warehouse_name,
  173. "material_type":detail_info.material_type,
  174. "material_category_name":material_category_name,
  175. "material_code":detail_info.material_code,
  176. "material_name":material_name,
  177. "material_quantity":detail_info.material_quantity,
  178. "material_unit_price":detail_info.material_unit_price,
  179. "material_purpose":detail_info.material_purpose})
  180. data['detail']=detail
  181. return {"code": 200, "msg": "获取成功", "data": data}
  182. except Exception as e:
  183. traceback.print_exc()
  184. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  185. @router.get("/list")
  186. async def get_pattern_list(
  187. # declaration_details: str = Query(None, description='名称'),
  188. page: int = Query(1, gt=0, description='页码'),
  189. pageSize: int = Query(None, gt=0, description='每页条目数量'),
  190. db: Session = Depends(get_db)
  191. ):
  192. try:
  193. query = db.query(ResourceProvisionProcurementDeclaration)
  194. query = query.filter_by(del_flag='0')
  195. # if declaration_details:
  196. # query = query.filter(ResourceProvisionProcurementDeclaration.declaration_details==declaration_details)
  197. total_items = query.count()
  198. # 排序
  199. if pageSize is None:
  200. pageSize=total_items
  201. query = query.order_by(ResourceProvisionProcurementDeclaration.declaration_date.desc())
  202. # 执行分页查询
  203. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  204. data = []
  205. for info in lists:
  206. dept_info = dept_id_get_dept_info(db, info.declaration_unit)
  207. user_info = user_id_get_user_info(db, info.declaration_person)
  208. review_info = declaration_id_get_declaration_review_info(db, info.id)
  209. if review_info is None:
  210. declaration_details = info.declaration_details
  211. else:
  212. declaration_details = review_info.review_result
  213. data .append( {"id": info.id,
  214. "declaration_date": info.declaration_date,
  215. "declaration_amount": info.declaration_amount,
  216. "declaration_unit": info.declaration_unit,
  217. "declaration_unit_name": dept_info.dept_name,
  218. "declaration_person": info.declaration_person,
  219. "declaration_person_name": user_info.nick_name,
  220. "declaration_details": declaration_details,
  221. "create_time": info.create_time})
  222. return {"code": 200, "msg": "查询成功", "data": data,
  223. "total": total_items,
  224. "page": page,
  225. "pageSize": pageSize,
  226. "totalPages": (total_items + pageSize - 1) // pageSize
  227. }
  228. except Exception as e:
  229. traceback.print_exc()
  230. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  231. # @router.delete("/delete/{id}")
  232. # async def delete_pattern(
  233. # id: str,
  234. # db: Session = Depends(get_db)
  235. # ):
  236. # try:
  237. # # 检查图案是否存在
  238. # info = declaration_id_get_declaration_info(db, id)
  239. # if not info:
  240. # return JSONResponse(status_code=404, content={"code": 404, "msg": "type not found"})
  241. # info.del_flag='2'
  242. # review_info = declaration_id_get_declaration_review_info(db, id)
  243. # review_info.del_flag ='2'
  244. # for detail_info in declaration_id_get_declaration_detail_list(db, id):
  245. # detail_info.del_flag='2'
  246. # db.commit()
  247. # return {"code": 200, "msg": "删除成功"}
  248. # except Exception as e:
  249. # traceback.print_exc()
  250. # raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  251. @router.post("/review")
  252. async def create_pattern(
  253. user_id=Depends(valid_access_token),
  254. body = Depends(remove_xss_json),
  255. db: Session = Depends(get_db)
  256. ):
  257. try:
  258. new_review = ResourceProvisionProcurementReview(
  259. id=new_guid(),
  260. reviewer=user_id,
  261. declaration_id=body['declaration_id'],
  262. review_result=body['review_result'],
  263. review_comments=body['review_comments'],
  264. create_by = user_id
  265. )
  266. db.add(new_review)
  267. db.commit()
  268. return {"code": 200, "msg": "审核成功", "data": None}
  269. except Exception as e:
  270. traceback.print_exc()
  271. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  272. @router.get("/review/list")
  273. async def get_pattern_list(
  274. page: int = Query(1, gt=0, description='页码'),
  275. pageSize: int = Query(None, gt=0, description='每页条目数量'),
  276. db: Session = Depends(get_db)
  277. ):
  278. try:
  279. review_list = [info.declaration_id for info in get_declaration_review_list(db)]
  280. query = db.query(ResourceProvisionProcurementDeclaration)
  281. query = query.filter_by(del_flag='0')
  282. query = query.filter(~ResourceProvisionProcurementDeclaration.id.in_(review_list))
  283. total_items = query.count()
  284. # 排序
  285. if pageSize is None:
  286. pageSize=total_items
  287. query = query.order_by(ResourceProvisionProcurementDeclaration.declaration_date.desc())
  288. # 执行分页查询
  289. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  290. data = []
  291. for info in lists:
  292. dept_info = dept_id_get_dept_info(db, info.declaration_unit)
  293. user_info = user_id_get_user_info(db, info.declaration_person)
  294. # review_info = declaration_id_get_declaration_review_info(db, info.id)
  295. # if review_info is None:
  296. # declaration_details = info.declaration_details
  297. # else:
  298. # declaration_details = review_info.review_result
  299. data = {"id": info.id,
  300. "declaration_date": info.declaration_date,
  301. "declaration_amount": info.declaration_amount,
  302. "declaration_unit": info.declaration_unit,
  303. "declaration_unit_name": dept_info.dept_name,
  304. "declaration_person": info.declaration_person,
  305. "declaration_person_name": user_info.nick_name,
  306. "declaration_details": info.declaration_details,
  307. "create_time": info.create_time}
  308. return {"code": 200, "msg": "查询成功", "data": data,
  309. "total": total_items,
  310. "page": page,
  311. "pageSize": pageSize,
  312. "totalPages": (total_items + pageSize - 1) // pageSize
  313. }
  314. except Exception as e:
  315. traceback.print_exc()
  316. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")