procurement.py 15 KB

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