dispatch.py 16 KB

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