dispatch.py 15 KB

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