material.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  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.barcode import create_bar,create_qr
  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. new_material = ResourceProvisionMaterialInfo(
  31. # id = new_guid(),
  32. material_name=body['material_name'],
  33. warehouse_id=body['warehouse_id'],
  34. inventory=body['inventory'],
  35. specification=body['specification'],
  36. model=body['model'],
  37. category_name=body['category_name'],
  38. material_type=body['material_type_id'],
  39. unit_name=body['unit_name'],
  40. brand_name=body['brand_name'],
  41. length=body['length'],
  42. width=body['width'],
  43. height=body['height'],
  44. volume=body['volume'],
  45. gross_weight=body['gross_weight'],
  46. net_weight=body['net_weight'],
  47. manufacturer=body['manufacturer'],
  48. origin=body['origin'],
  49. status=body['status'],
  50. room_id=body['room_id'],
  51. package_quantity=body['package_quantity'],
  52. package_volume=body['package_volume'],
  53. package_weight=body['package_weight'],
  54. price=body['price'],
  55. selling_price=body['selling_price'],
  56. value=body['value'],
  57. cost_price=body['cost_price'],
  58. disaster_types=body['disaster_types'],
  59. maintenance=body['maintenance'],
  60. supplier_name=body['supplier_name'],
  61. special_transportation_requirements=body['special_transportation_requirements'],
  62. material=body['material'],
  63. shelf_life=body['shelf_life'],
  64. inventory_warning_pusher=body['inventory_warning_pusher'],
  65. inventory_warning_quantity=body['inventory_warning_quantity'],
  66. shelf_life_warning_days=body['shelf_life_warning_days'],
  67. shelf_life_warning_pusher=body['shelf_life_warning_pusher'],
  68. from_sys=body['from_sys'],
  69. create_by = user_id
  70. )
  71. db.add(new_material)
  72. new_file_list = body['fileList']
  73. db.commit()
  74. db.refresh(new_material)
  75. for file in new_file_list:
  76. file_name = file['url']
  77. file_name_desc = file['name']
  78. status = file['status']
  79. uid = file['uid']
  80. new_file = ResourceProvisionFile(
  81. file_id=uid,
  82. foreign_key=new_material.material_id,
  83. from_scenario='ResourceProvisionMaterialInfo',
  84. file_name=file_name,
  85. file_name_desc=file_name_desc,
  86. status=status
  87. )
  88. db.add(new_file)
  89. bar_fileanme = new_guid()+'.png'
  90. qr_fileanme = new_guid()+'.png'
  91. if create_bar(str(new_material.material_id),bar_fileanme) and create_qr(str(new_material.material_id),qr_fileanme):
  92. barcode = ResourceProvisionMaterialBarcode(
  93. id=new_guid(),
  94. material_code = new_material.material_id,
  95. barcode = bar_fileanme,
  96. qr_code = qr_fileanme
  97. )
  98. db.add(barcode)
  99. db.commit()
  100. return {"code": 200, "msg": "创建成功", "data": None}
  101. except Exception as e:
  102. traceback.print_exc()
  103. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  104. @router.put("/update/{id}")
  105. async def update_pattern(
  106. id :str ,
  107. user_id=Depends(valid_access_token),
  108. body=Depends(remove_xss_json),
  109. db: Session = Depends(get_db)
  110. ):
  111. try:
  112. info = material_id_get_material_info(db,id)
  113. if not info:
  114. return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
  115. # info.room_name = body['room_name']
  116. info.material_name = body['material_name']
  117. info.warehouse_id = body['warehouse_id']
  118. info.inventory = body['inventory']
  119. info.specification = body['specification']
  120. info.model = body['model']
  121. info.category_name = body['category_name']
  122. info.material_type = body['material_type_id']
  123. info.unit_name = body['unit_name']
  124. info.brand_name = body['brand_name']
  125. info.length = body['length']
  126. info.width = body['width']
  127. info.height = body['height']
  128. info.volume = body['volume']
  129. info.gross_weight = body['gross_weight']
  130. info.net_weight = body['net_weight']
  131. info.manufacturer = body['manufacturer']
  132. info.origin = body['origin']
  133. info.status = body['status']
  134. info.room_id = body['room_id']
  135. info.package_quantity = body['package_quantity']
  136. info.package_volume = body['package_volume']
  137. info.package_weight = body['package_weight']
  138. info.price = body['price']
  139. info.selling_price = body['selling_price']
  140. info.value = body['value']
  141. info.cost_price = body['cost_price']
  142. info.disaster_types = body['disaster_types']
  143. info.maintenance = body['maintenance']
  144. info.supplier_name = body['supplier_name']
  145. info.special_transportation_requirements = body['special_transportation_requirements']
  146. info.material = body['material']
  147. info.shelf_life = body['shelf_life']
  148. info.inventory_warning_pusher = body['inventory_warning_pusher']
  149. info.inventory_warning_quantity = body['inventory_warning_quantity']
  150. info.shelf_life_warning_days = body['shelf_life_warning_days']
  151. info.shelf_life_warning_pusher = body['shelf_life_warning_pusher']
  152. info.from_sys = body['from_sys']
  153. info.update_by = user_id
  154. delete_resource_provision_file(db,'ResourceProvisionMaterialInfo',id)
  155. new_file_list = body['fileList']
  156. for file in new_file_list:
  157. file_name = file['url']
  158. file_name_desc = file['name']
  159. status = file['status']
  160. uid = file['uid']
  161. new_file = ResourceProvisionFile(
  162. file_id=uid,
  163. foreign_key=id,
  164. from_scenario='ResourceProvisionMaterialInfo',
  165. file_name=file_name,
  166. file_name_desc=file_name_desc,
  167. status=status
  168. )
  169. db.add(new_file)
  170. db.commit()
  171. return {"code": 200, "msg": "更新成功"}
  172. except Exception as e:
  173. traceback.print_exc()
  174. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  175. @router.get("/info/{id}")
  176. async def get_pattern_info(
  177. id: str,
  178. user_id=Depends(valid_access_token),
  179. db: Session = Depends(get_db)
  180. ):
  181. try:
  182. info = material_id_get_material_info(db,id)
  183. if not info:
  184. return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
  185. warehouse_info = warehouse_id_get_warehouse_info(db,info.warehouse_id)
  186. if warehouse_info:
  187. warehouse_name = warehouse_info.warehouse_name
  188. else:
  189. warehouse_name=None
  190. material_type_info = type_id_get_material_type_info(db,info.material_type)
  191. if material_type_info:
  192. material_category_name = material_type_info.material_category_name
  193. else:
  194. material_category_name=None
  195. warehouse_room_info = warehouse_room_id_get_warehouse_room_info(db, info.room_id)
  196. if warehouse_room_info:
  197. room_name = warehouse_room_info.room_name
  198. else:
  199. room_name = None
  200. data = {
  201. "material_id": info.material_id,
  202. "material_name": info.material_name,
  203. "warehouse_id": info.warehouse_id,
  204. "warehouse_name": warehouse_name,
  205. "inventory": info.inventory,
  206. "specification": info.specification,
  207. "model": info.model,
  208. "category_name": info.category_name,
  209. "material_type_id": info.material_type,
  210. "material_type_name": material_category_name,
  211. "unit_name": info.unit_name,
  212. "brand_name": info.brand_name,
  213. "length": info.length,
  214. "width": info.width,
  215. "height": info.height,
  216. "volume": info.volume,
  217. "gross_weight": info.gross_weight,
  218. "net_weight": info.net_weight,
  219. "manufacturer": info.manufacturer,
  220. "origin": info.origin,
  221. "status": info.status,
  222. "room_id": info.room_id,
  223. "room_name":room_name,
  224. "package_quantity": info.package_quantity,
  225. "package_volume": info.package_volume,
  226. "package_weight": info.package_weight,
  227. "price": info.price,
  228. "selling_price": info.selling_price,
  229. "value": info.value,
  230. "cost_price": info.cost_price,
  231. "disaster_types": info.disaster_types,
  232. "maintenance": info.maintenance,
  233. "supplier_name": info.supplier_name,
  234. "special_transportation_requirements": info.special_transportation_requirements,
  235. "material": info.material,
  236. "shelf_life": info.shelf_life,
  237. "inventory_warning_pusher": info.inventory_warning_pusher,
  238. "inventory_warning_quantity": info.inventory_warning_quantity,
  239. "shelf_life_warning_days": info.shelf_life_warning_days,
  240. "shelf_life_warning_pusher": info.shelf_life_warning_pusher,
  241. "from_sys": info.from_sys,
  242. "create_time":info.create_time,
  243. "fileList": get_resource_provision_file_query_fun(db=db,from_scenario='ResourceProvisionMaterialInfo', foreign_key=info.material_id)}
  244. return {"code": 200, "msg": "获取成功", "data": data}
  245. except Exception as e:
  246. traceback.print_exc()
  247. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  248. @router.get("/list")
  249. async def get_pattern_list(
  250. user_id=Depends(valid_access_token),
  251. material_id: str = Query(None, description='名称'),
  252. material_name: str = Query(None, description='名称'),
  253. warehouse_id: str = Query(None, description='名称'),
  254. from_sys: str = Query(None, description='名称'),
  255. page: int = Query(1, gt=0, description='页码'),
  256. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  257. db: Session = Depends(get_db)
  258. ):
  259. try:
  260. query = db.query(ResourceProvisionMaterialInfo)
  261. query = query.filter_by(del_flag='0')
  262. if material_id:
  263. query = query.filter(ResourceProvisionMaterialInfo.material_id.like(f'%{material_id}%'))
  264. if material_name:
  265. query = query.filter(ResourceProvisionMaterialInfo.material_name.like(f'%{material_name}%'))
  266. if warehouse_id:
  267. query = query.filter(ResourceProvisionMaterialInfo.warehouse_id==warehouse_id)
  268. if from_sys:
  269. query = query.filter(ResourceProvisionMaterialInfo.from_sys==from_sys)
  270. total_items = query.count()
  271. # 排序
  272. query = query.order_by(ResourceProvisionMaterialInfo.create_time.desc())
  273. # 执行分页查询
  274. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  275. data = []
  276. for info in lists:
  277. warehouse_info = warehouse_id_get_warehouse_info(db, info.warehouse_id)
  278. if warehouse_info:
  279. warehouse_name = warehouse_info.warehouse_name
  280. else:
  281. warehouse_name = None
  282. material_type_info = type_id_get_material_type_info(db, info.material_type)
  283. if material_type_info:
  284. material_category_name = material_type_info.material_category_name
  285. else:
  286. material_category_name = None
  287. warehouse_room_info = warehouse_room_id_get_warehouse_room_info(db, info.room_id)
  288. if warehouse_room_info:
  289. room_name = warehouse_room_info.room_name
  290. else:
  291. room_name = None
  292. data.append({
  293. "material_id": info.material_id,
  294. "material_name": info.material_name,
  295. "warehouse_id": info.warehouse_id,
  296. "warehouse_name": warehouse_name,
  297. "inventory": info.inventory,
  298. "specification": info.specification,
  299. "model": info.model,
  300. "category_name": info.category_name,
  301. "material_type_id": info.material_type,
  302. "material_type_name": material_category_name,
  303. "unit_name": info.unit_name,
  304. "brand_name": info.brand_name,
  305. "length": info.length,
  306. "width": info.width,
  307. "height": info.height,
  308. "volume": info.volume,
  309. "gross_weight": info.gross_weight,
  310. "net_weight": info.net_weight,
  311. "manufacturer": info.manufacturer,
  312. "origin": info.origin,
  313. "status": info.status,
  314. "room_id": info.room_id,
  315. "room_name":room_name,
  316. "package_quantity": info.package_quantity,
  317. "package_volume": info.package_volume,
  318. "package_weight": info.package_weight,
  319. "price": info.price,
  320. "selling_price": info.selling_price,
  321. "value": info.value,
  322. "cost_price": info.cost_price,
  323. "disaster_types": info.disaster_types,
  324. "maintenance": info.maintenance,
  325. "supplier_name": info.supplier_name,
  326. "special_transportation_requirements": info.special_transportation_requirements,
  327. "material": info.material,
  328. "shelf_life": info.shelf_life,
  329. "inventory_warning_pusher": info.inventory_warning_pusher,
  330. "inventory_warning_quantity": info.inventory_warning_quantity,
  331. "shelf_life_warning_days": info.shelf_life_warning_days,
  332. "shelf_life_warning_pusher": info.shelf_life_warning_pusher,
  333. "from_sys": info.from_sys,
  334. "create_time":info.create_time,
  335. "fileList": get_resource_provision_file_query_fun(db=db,from_scenario='ResourceProvisionMaterialInfo', foreign_key=info.material_id)})
  336. return {"code": 200, "msg": "查询成功", "data": data,
  337. "total": total_items,
  338. "page": page,
  339. "pageSize": pageSize,
  340. "totalPages": (total_items + pageSize - 1) // pageSize
  341. }
  342. except Exception as e:
  343. traceback.print_exc()
  344. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  345. @router.delete("/delete/{id}")
  346. async def delete_pattern(
  347. id: str,
  348. user_id=Depends(valid_access_token),
  349. db: Session = Depends(get_db)
  350. ):
  351. try:
  352. # 检查图案是否存在
  353. info = material_id_get_material_info(db, id)
  354. if not info:
  355. return JSONResponse(status_code=404, content={"code": 404, "msg": "warehouse room not found"})
  356. bar_info = material_id_get_material_barcode_info(db,id)
  357. info.del_flag='2'
  358. if bar_info is not None:
  359. bar_info.del_flag = '2'
  360. delete_resource_provision_file(db, 'ResourceProvisionMaterialInfo', id)
  361. db.commit()
  362. return {"code": 200, "msg": "删除成功"}
  363. except Exception as e:
  364. traceback.print_exc()
  365. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  366. @router.get("/barcode/list")
  367. async def get_pattern_list(
  368. user_id=Depends(valid_access_token),
  369. name: str = Query(None, description='名称'),
  370. page: int = Query(1, gt=0, description='页码'),
  371. pageSize: int = Query(None, gt=0, description='每页条目数量'),
  372. db: Session = Depends(get_db)
  373. ):
  374. try:
  375. material_code_list=None
  376. if name:
  377. query_1 = db.query(ResourceProvisionMaterialInfo.material_id)
  378. query_1 = query_1.filter(ResourceProvisionMaterialInfo.del_flag=='0')
  379. query_1 = query_1.filter(ResourceProvisionMaterialInfo.material_name.like(f'%{name}%'))
  380. material_code_list =[i.material_id for i in query_1.all()]
  381. query = db.query(ResourceProvisionMaterialBarcode)
  382. query = query.filter_by(del_flag='0')
  383. if material_code_list is not None:
  384. query = query.filter(ResourceProvisionMaterialBarcode.material_code.in_(material_code_list))
  385. total_items = query.count()
  386. # 排序
  387. if pageSize is None:
  388. pageSize=total_items
  389. query = query.order_by(ResourceProvisionMaterialBarcode.create_time.desc())
  390. # 执行分页查询
  391. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  392. data = []
  393. for info in lists:
  394. material_info = material_id_get_material_info(db, info.material_code)
  395. data.append({"id": info.id,
  396. "material_name": material_info.material_name,
  397. "material_code": info.material_code,
  398. "barcode": info.barcode,
  399. "qr_code": info.qr_code,
  400. "status": info.status,
  401. "create_time": info.create_time} )
  402. return {"code": 200, "msg": "查询成功", "data": data,
  403. "total": total_items,
  404. "page": page,
  405. "pageSize": pageSize,
  406. "totalPages": (total_items + pageSize - 1) // pageSize
  407. }
  408. except Exception as e:
  409. traceback.print_exc()
  410. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  411. @router.put('/barcode/changeStatus')
  412. async def change_barcode_status(
  413. db: Session = Depends(get_db),
  414. body=Depends(remove_xss_json),
  415. user_id=Depends(valid_access_token)
  416. ):
  417. try:
  418. barcode_id = body['id']
  419. status = body['status']
  420. info = material_barcode_id_get_material_barcode_info(db, barcode_id)
  421. if not info:
  422. return JSONResponse(status_code=404, content={"code": 404, "msg": "barcode not found"})
  423. info.status= status
  424. info.update_by=user_id
  425. db.commit()
  426. return {
  427. "code": 200,
  428. "msg": "操作成功"
  429. }
  430. except Exception as e:
  431. # 处理异常
  432. traceback.print_exc()
  433. raise HTTPException(status_code=500, detail=str(e))
  434. @router.get('/treeselect')
  435. async def gettreeselect(request: Request,material_name: str = Query(None, description='名称'),material_type_name: str = Query(None, description='名称'),db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
  436. query = db.query(ResourceProvisionWarehouseInfo)
  437. query = query.filter_by(del_flag='0')
  438. query = query.filter_by(status='1')
  439. query = query.order_by(ResourceProvisionWarehouseInfo.create_time.desc())
  440. lists = query.all()
  441. data = []
  442. for info in lists:
  443. data_info = {"id": info.warehouse_id,
  444. "label": info.warehouse_name,
  445. "isWarehouse": True}
  446. # material_list = warehouse_id_get_material_list(db,info.warehouse_id)
  447. query1 = db.query(ResourceProvisionMaterialInfo)
  448. query1 = query1.filter_by(warehouse_id=info.warehouse_id, del_flag='0')
  449. if material_name:
  450. query1 = query1.filter_by(material_name=material_name)
  451. if material_type_name:
  452. query2 = db.query(ResourceProvisionMaterialType)
  453. query2 = query2.filter(ResourceProvisionMaterialType.material_category_name.like(f'%{material_type_name}%'), ResourceProvisionMaterialType.del_flag=='0')
  454. material_type_list = [str(material_type.id) for material_type in query2.all()]
  455. query1 = query1.filter(ResourceProvisionMaterialInfo.material_type.in_(material_type_list))
  456. material_list= query1.all()
  457. if material_list:
  458. data_info['children'] = []
  459. for material in material_list:
  460. type_info = type_id_get_material_type_info(db,material.material_type)
  461. material_category_name = None
  462. if type_info:
  463. material_category_name = type_info.material_category_name
  464. data_info['children'].append({"id": material.material_id,
  465. "label": material.material_name,
  466. "type_id": material.material_type,
  467. "type":material_category_name,
  468. "warehouse_id": info.warehouse_id,
  469. "warehouse_name":info.warehouse_name,
  470. "isWarehouse": False})
  471. data.append(data_info)
  472. return {
  473. "code": 200,
  474. "msg": "操作成功",
  475. "data": data
  476. }