material.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  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,StreamingResponse
  6. from common.db import db_czrz
  7. from sqlalchemy.orm import Session
  8. from sqlalchemy.sql import func
  9. from common.auth_user import *
  10. from sqlalchemy import text
  11. from pydantic import BaseModel
  12. from common.BigDataCenterAPI import *
  13. from database import get_db
  14. from typing import List
  15. from models import *
  16. from utils import *
  17. from utils.spatial import *
  18. from utils.ry_system_util import *
  19. from utils.resource_provision_util import *
  20. from common.barcode import create_bar,create_qr
  21. import json
  22. import traceback
  23. import xlrd
  24. import os
  25. # 目录在文档上传接口写死
  26. UPLOAD_mergefile_PATH = '/data/upload/mergefile'
  27. router = APIRouter()
  28. @router.post("/create")
  29. async def create_pattern(
  30. user_id=Depends(valid_access_token),
  31. body = Depends(remove_xss_json),
  32. db: Session = Depends(get_db)
  33. ):
  34. try:
  35. new_material = ResourceProvisionMaterialInfo(
  36. # id = new_guid(),
  37. material_name=body['material_name'],
  38. warehouse_id=body['warehouse_id'],
  39. inventory=body['inventory'],
  40. specification=body['specification'],
  41. model=body['model'],
  42. category_name=body['category_name'],
  43. material_type=body['material_type_id'],
  44. unit_name=body['unit_name'],
  45. brand_name=body['brand_name'],
  46. length=body['length'],
  47. width=body['width'],
  48. height=body['height'],
  49. volume=body['volume'],
  50. gross_weight=body['gross_weight'],
  51. net_weight=body['net_weight'],
  52. manufacturer=body['manufacturer'],
  53. origin=body['origin'],
  54. status=body['status'],
  55. room_id=body['room_id'],
  56. package_quantity=body['package_quantity'],
  57. package_volume=body['package_volume'],
  58. package_weight=body['package_weight'],
  59. price=body['price'],
  60. selling_price=body['selling_price'],
  61. value=body['value'],
  62. cost_price=body['cost_price'],
  63. disaster_types=body['disaster_types'],
  64. maintenance=body['maintenance'],
  65. supplier_name=body['supplier_name'],
  66. special_transportation_requirements=body['special_transportation_requirements'],
  67. material=body['material'],
  68. shelf_life=body['shelf_life'],
  69. inventory_warning_pusher=body['inventory_warning_pusher'],
  70. inventory_warning_quantity=body['inventory_warning_quantity'],
  71. shelf_life_warning_days=body['shelf_life_warning_days'],
  72. shelf_life_warning_pusher=body['shelf_life_warning_pusher'],
  73. from_sys=body['from_sys'],
  74. create_by = user_id
  75. )
  76. db.add(new_material)
  77. new_file_list = body['fileList']
  78. db.commit()
  79. db.refresh(new_material)
  80. for file in new_file_list:
  81. file_name = file['url']
  82. file_name_desc = file['name']
  83. status = file['status']
  84. uid = file['uid']
  85. new_file = ResourceProvisionFile(
  86. file_id=uid,
  87. foreign_key=new_material.material_id,
  88. from_scenario='ResourceProvisionMaterialInfo',
  89. file_name=file_name,
  90. file_name_desc=file_name_desc,
  91. status=status
  92. )
  93. db.add(new_file)
  94. bar_fileanme = new_guid()+'.png'
  95. qr_fileanme = new_guid()+'.png'
  96. if create_bar(str(new_material.material_id),bar_fileanme) and create_qr(str(new_material.material_id),qr_fileanme):
  97. barcode = ResourceProvisionMaterialBarcode(
  98. id=new_guid(),
  99. material_code = new_material.material_id,
  100. barcode = bar_fileanme,
  101. qr_code = qr_fileanme
  102. )
  103. db.add(barcode)
  104. db.commit()
  105. return {"code": 200, "msg": "创建成功", "data": None}
  106. except Exception as e:
  107. traceback.print_exc()
  108. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  109. @router.put("/update/{id}")
  110. async def update_pattern(
  111. id :str ,
  112. user_id=Depends(valid_access_token),
  113. body=Depends(remove_xss_json),
  114. db: Session = Depends(get_db)
  115. ):
  116. try:
  117. info = material_id_get_material_info(db,id)
  118. if not info:
  119. return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
  120. # info.room_name = body['room_name']
  121. info.material_name = body['material_name']
  122. info.warehouse_id = body['warehouse_id']
  123. info.inventory = body['inventory']
  124. info.specification = body['specification']
  125. info.model = body['model']
  126. info.category_name = body['category_name']
  127. info.material_type = body['material_type_id']
  128. info.unit_name = body['unit_name']
  129. info.brand_name = body['brand_name']
  130. info.length = body['length']
  131. info.width = body['width']
  132. info.height = body['height']
  133. info.volume = body['volume']
  134. info.gross_weight = body['gross_weight']
  135. info.net_weight = body['net_weight']
  136. info.manufacturer = body['manufacturer']
  137. info.origin = body['origin']
  138. info.status = body['status']
  139. info.room_id = body['room_id']
  140. info.package_quantity = body['package_quantity']
  141. info.package_volume = body['package_volume']
  142. info.package_weight = body['package_weight']
  143. info.price = body['price']
  144. info.selling_price = body['selling_price']
  145. info.value = body['value']
  146. info.cost_price = body['cost_price']
  147. info.disaster_types = body['disaster_types']
  148. info.maintenance = body['maintenance']
  149. info.supplier_name = body['supplier_name']
  150. info.special_transportation_requirements = body['special_transportation_requirements']
  151. info.material = body['material']
  152. info.shelf_life = body['shelf_life']
  153. info.inventory_warning_pusher = body['inventory_warning_pusher']
  154. info.inventory_warning_quantity = body['inventory_warning_quantity']
  155. info.shelf_life_warning_days = body['shelf_life_warning_days']
  156. info.shelf_life_warning_pusher = body['shelf_life_warning_pusher']
  157. info.from_sys = body['from_sys']
  158. info.update_by = user_id
  159. delete_resource_provision_file(db,'ResourceProvisionMaterialInfo',id)
  160. new_file_list = body['fileList']
  161. for file in new_file_list:
  162. file_name = file['url']
  163. file_name_desc = file['name']
  164. status = file['status']
  165. uid = file['uid']
  166. new_file = ResourceProvisionFile(
  167. file_id=uid,
  168. foreign_key=id,
  169. from_scenario='ResourceProvisionMaterialInfo',
  170. file_name=file_name,
  171. file_name_desc=file_name_desc,
  172. status=status
  173. )
  174. db.add(new_file)
  175. db.commit()
  176. return {"code": 200, "msg": "更新成功"}
  177. except Exception as e:
  178. traceback.print_exc()
  179. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  180. @router.get("/info/{id}")
  181. async def get_pattern_info(
  182. id: str,
  183. user_id=Depends(valid_access_token),
  184. db: Session = Depends(get_db)
  185. ):
  186. try:
  187. info = material_id_get_material_info(db,id)
  188. if not info:
  189. return JSONResponse(status_code=404,content={"code":404,"msg":"warehouse room not found"})
  190. warehouse_info = warehouse_id_get_warehouse_info(db,info.warehouse_id)
  191. if warehouse_info:
  192. warehouse_name = warehouse_info.warehouse_name
  193. else:
  194. warehouse_name=None
  195. material_type_info = type_id_get_material_type_info(db,info.material_type)
  196. if material_type_info:
  197. material_category_name = material_type_info.material_category_name
  198. else:
  199. material_category_name=None
  200. warehouse_room_info = warehouse_room_id_get_warehouse_room_info(db, info.room_id)
  201. if warehouse_room_info:
  202. room_name = warehouse_room_info.room_name
  203. else:
  204. room_name = None
  205. data = {
  206. "material_id": info.material_id,
  207. "material_name": info.material_name,
  208. "warehouse_id": info.warehouse_id,
  209. "warehouse_name": warehouse_name,
  210. "inventory": info.inventory,
  211. "specification": info.specification,
  212. "model": info.model,
  213. "category_name": info.category_name,
  214. "material_type_id": info.material_type,
  215. "material_type_name": material_category_name,
  216. "unit_name": info.unit_name,
  217. "brand_name": info.brand_name,
  218. "length": info.length,
  219. "width": info.width,
  220. "height": info.height,
  221. "volume": info.volume,
  222. "gross_weight": info.gross_weight,
  223. "net_weight": info.net_weight,
  224. "manufacturer": info.manufacturer,
  225. "origin": info.origin,
  226. "status": info.status,
  227. "room_id": info.room_id,
  228. "room_name":room_name,
  229. "package_quantity": info.package_quantity,
  230. "package_volume": info.package_volume,
  231. "package_weight": info.package_weight,
  232. "price": info.price,
  233. "selling_price": info.selling_price,
  234. "value": info.value,
  235. "cost_price": info.cost_price,
  236. "disaster_types": info.disaster_types,
  237. "maintenance": info.maintenance,
  238. "supplier_name": info.supplier_name,
  239. "special_transportation_requirements": info.special_transportation_requirements,
  240. "material": info.material,
  241. "shelf_life": info.shelf_life,
  242. "inventory_warning_pusher": info.inventory_warning_pusher,
  243. "inventory_warning_quantity": info.inventory_warning_quantity,
  244. "shelf_life_warning_days": info.shelf_life_warning_days,
  245. "shelf_life_warning_pusher": info.shelf_life_warning_pusher,
  246. "from_sys": info.from_sys,
  247. "create_time":info.create_time,
  248. "fileList": get_resource_provision_file_query_fun(db=db,from_scenario='ResourceProvisionMaterialInfo', foreign_key=info.material_id)}
  249. return {"code": 200, "msg": "获取成功", "data": data}
  250. except Exception as e:
  251. traceback.print_exc()
  252. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  253. @router.get("/list")
  254. async def get_pattern_list(
  255. user_id=Depends(valid_access_token),
  256. material_id: str = Query(None, description='名称'),
  257. material_name: str = Query(None, description='名称'),
  258. warehouse_id: str = Query(None, description='名称'),
  259. from_sys: str = Query(None, description='名称'),
  260. page: int = Query(1, gt=0, description='页码'),
  261. pageSize: int = Query(10, gt=0, description='每页条目数量'),
  262. db: Session = Depends(get_db)
  263. ):
  264. try:
  265. query = db.query(ResourceProvisionMaterialInfo)
  266. query = query.filter_by(del_flag='0')
  267. if material_id:
  268. query = query.filter(ResourceProvisionMaterialInfo.material_id.like(f'%{material_id}%'))
  269. if material_name:
  270. query = query.filter(ResourceProvisionMaterialInfo.material_name.like(f'%{material_name}%'))
  271. if warehouse_id:
  272. query = query.filter(ResourceProvisionMaterialInfo.warehouse_id==warehouse_id)
  273. if from_sys:
  274. query = query.filter(ResourceProvisionMaterialInfo.from_sys==from_sys)
  275. total_items = query.count()
  276. # 排序
  277. query = query.order_by(ResourceProvisionMaterialInfo.create_time.desc())
  278. # 执行分页查询
  279. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  280. data = []
  281. for info in lists:
  282. warehouse_info = warehouse_id_get_warehouse_info(db, info.warehouse_id)
  283. if warehouse_info:
  284. warehouse_name = warehouse_info.warehouse_name
  285. else:
  286. warehouse_name = None
  287. material_type_info = type_id_get_material_type_info(db, info.material_type)
  288. if material_type_info:
  289. material_category_name = material_type_info.material_category_name
  290. else:
  291. material_category_name = None
  292. warehouse_room_info = warehouse_room_id_get_warehouse_room_info(db, info.room_id)
  293. if warehouse_room_info:
  294. room_name = warehouse_room_info.room_name
  295. else:
  296. room_name = None
  297. inventory = material_id_get_material_remaining_stock(db,info.material_id)
  298. data.append({
  299. "material_id": info.material_id,
  300. "material_name": info.material_name,
  301. "warehouse_id": info.warehouse_id,
  302. "warehouse_name": warehouse_name,
  303. "inventory": inventory,
  304. "specification": info.specification,
  305. "model": info.model,
  306. "category_name": info.category_name,
  307. "material_type_id": info.material_type,
  308. "material_type_name": material_category_name,
  309. "unit_name": info.unit_name,
  310. "brand_name": info.brand_name,
  311. "length": info.length,
  312. "width": info.width,
  313. "height": info.height,
  314. "volume": info.volume,
  315. "gross_weight": info.gross_weight,
  316. "net_weight": info.net_weight,
  317. "manufacturer": info.manufacturer,
  318. "origin": info.origin,
  319. "status": info.status,
  320. "room_id": info.room_id,
  321. "room_name":room_name,
  322. "package_quantity": info.package_quantity,
  323. "package_volume": info.package_volume,
  324. "package_weight": info.package_weight,
  325. "price": info.price,
  326. "selling_price": info.selling_price,
  327. "value": info.value,
  328. "cost_price": info.cost_price,
  329. "disaster_types": info.disaster_types,
  330. "maintenance": info.maintenance,
  331. "supplier_name": info.supplier_name,
  332. "special_transportation_requirements": info.special_transportation_requirements,
  333. "material": info.material,
  334. "shelf_life": info.shelf_life,
  335. "inventory_warning_pusher": info.inventory_warning_pusher,
  336. "inventory_warning_quantity": info.inventory_warning_quantity,
  337. "shelf_life_warning_days": info.shelf_life_warning_days,
  338. "shelf_life_warning_pusher": info.shelf_life_warning_pusher,
  339. "from_sys": info.from_sys,
  340. "create_time":info.create_time,
  341. "fileList": get_resource_provision_file_query_fun(db=db,from_scenario='ResourceProvisionMaterialInfo', foreign_key=info.material_id)})
  342. return {"code": 200, "msg": "查询成功", "data": data,
  343. "total": total_items,
  344. "page": page,
  345. "pageSize": pageSize,
  346. "totalPages": (total_items + pageSize - 1) // pageSize
  347. }
  348. except Exception as e:
  349. traceback.print_exc()
  350. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  351. @router.get("/list")
  352. async def get_pattern_list(
  353. request: Request,
  354. user_id=Depends(valid_access_token),
  355. material_id: str = Query(None, description='名称'),
  356. material_name: str = Query(None, description='名称'),
  357. warehouse_id: str = Query(None, description='名称'),
  358. from_sys: str = Query(None, description='名称'),
  359. auth_user: AuthUser = Depends(find_auth_user),
  360. db: Session = Depends(get_db)
  361. ):
  362. try:
  363. query = db.query(ResourceProvisionMaterialInfo)
  364. query = query.filter_by(del_flag='0')
  365. if material_id:
  366. query = query.filter(ResourceProvisionMaterialInfo.material_id.like(f'%{material_id}%'))
  367. if material_name:
  368. query = query.filter(ResourceProvisionMaterialInfo.material_name.like(f'%{material_name}%'))
  369. if warehouse_id:
  370. query = query.filter(ResourceProvisionMaterialInfo.warehouse_id==warehouse_id)
  371. if from_sys:
  372. query = query.filter(ResourceProvisionMaterialInfo.from_sys==from_sys)
  373. # 排序
  374. query = query.order_by(ResourceProvisionMaterialInfo.create_time.desc())
  375. # 执行分页查询
  376. lists = query.all()
  377. data = []
  378. for info in lists:
  379. warehouse_info = warehouse_id_get_warehouse_info(db, info.warehouse_id)
  380. if warehouse_info:
  381. warehouse_name = warehouse_info.warehouse_name
  382. else:
  383. warehouse_name = None
  384. material_type_info = type_id_get_material_type_info(db, info.material_type)
  385. if material_type_info:
  386. material_category_name = material_type_info.material_category_name
  387. else:
  388. material_category_name = None
  389. warehouse_room_info = warehouse_room_id_get_warehouse_room_info(db, info.room_id)
  390. if warehouse_room_info:
  391. room_name = warehouse_room_info.room_name
  392. else:
  393. room_name = None
  394. data.append({
  395. "物资编码": info.material_id,
  396. "物资名称": info.material_name,
  397. "仓库id": info.warehouse_id,
  398. "仓库": warehouse_name,
  399. "库存": info.inventory,
  400. "规格": info.specification,
  401. "型号": info.model,
  402. "分类名称": info.category_name,
  403. "物资类型id": info.material_type,
  404. "物资类型": material_category_name,
  405. "计量单位名称": info.unit_name,
  406. "品牌名称": info.brand_name,
  407. "长(厘米)": info.length,
  408. "宽(厘米)": info.width,
  409. "高(厘米)": info.height,
  410. "体积(立方厘米)": info.volume,
  411. "毛重(kg)": info.gross_weight,
  412. "净重(kg)": info.net_weight,
  413. "生产厂商": info.manufacturer,
  414. "产地": info.origin,
  415. "状态": info.status,
  416. "库房id": info.room_id,
  417. "库房":room_name,
  418. "包装数量": info.package_quantity,
  419. "包装体积(立方厘米)": info.package_volume,
  420. "包装重量(kg)": info.package_weight,
  421. "价格": info.price,
  422. "售卖价格": info.selling_price,
  423. "价值": info.value,
  424. "成本价格": info.cost_price,
  425. "适用灾种": info.disaster_types,
  426. "使用保养": info.maintenance,
  427. "供应商名称": info.supplier_name,
  428. "特殊运输要求": info.special_transportation_requirements,
  429. "材质": info.material,
  430. "保质期": info.shelf_life,
  431. "库存预警推送人": info.inventory_warning_pusher,
  432. "库存预警数量": info.inventory_warning_quantity,
  433. "保质期到期预警天数": info.shelf_life_warning_days,
  434. "保质期预警推送人": info.shelf_life_warning_pusher,
  435. "来源系统": info.from_sys,
  436. "数据创建时间":info.create_time})
  437. # "fileList": get_resource_provision_file_query_fun(db=db,from_scenario='ResourceProvisionMaterialInfo', foreign_key=info.material_id)})
  438. # 返回结果
  439. import pandas as pd
  440. from io import BytesIO
  441. # 将查询结果转换为 DataFrame
  442. df = pd.DataFrame(data)
  443. # 将 DataFrame 导出为 Excel 文件
  444. output = BytesIO()
  445. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  446. df.to_excel(writer, index=False)
  447. # 设置响应头
  448. output.seek(0)
  449. from urllib.parse import quote
  450. encoded_filename = f'物资明细{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  451. encoded_filename = quote(encoded_filename, encoding='utf-8')
  452. headers = {
  453. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  454. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  455. }
  456. db_czrz.log(db, auth_user, "物资储备管理", f"物资储备管理物资明细导出数据成功", request.client.host)
  457. # 返回文件流
  458. return StreamingResponse(output, headers=headers)
  459. except Exception as e:
  460. traceback.print_exc()
  461. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  462. @router.delete("/delete/{id}")
  463. async def delete_pattern(
  464. id: str,
  465. user_id=Depends(valid_access_token),
  466. db: Session = Depends(get_db)
  467. ):
  468. try:
  469. # 检查图案是否存在
  470. info = material_id_get_material_info(db, id)
  471. if not info:
  472. return JSONResponse(status_code=404, content={"code": 404, "msg": "warehouse room not found"})
  473. bar_info = material_id_get_material_barcode_info(db,id)
  474. info.del_flag='2'
  475. if bar_info is not None:
  476. bar_info.del_flag = '2'
  477. delete_resource_provision_file(db, 'ResourceProvisionMaterialInfo', id)
  478. db.commit()
  479. return {"code": 200, "msg": "删除成功"}
  480. except Exception as e:
  481. traceback.print_exc()
  482. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  483. @router.get("/barcode/list")
  484. async def get_pattern_list(
  485. user_id=Depends(valid_access_token),
  486. name: str = Query(None, description='名称'),
  487. page: int = Query(1, gt=0, description='页码'),
  488. pageSize: int = Query(None, gt=0, description='每页条目数量'),
  489. db: Session = Depends(get_db)
  490. ):
  491. try:
  492. material_code_list=None
  493. if name:
  494. query_1 = db.query(ResourceProvisionMaterialInfo.material_id)
  495. query_1 = query_1.filter(ResourceProvisionMaterialInfo.del_flag=='0')
  496. query_1 = query_1.filter(ResourceProvisionMaterialInfo.material_name.like(f'%{name}%'))
  497. material_code_list =[i.material_id for i in query_1.all()]
  498. query = db.query(ResourceProvisionMaterialBarcode)
  499. query = query.filter_by(del_flag='0')
  500. if material_code_list is not None:
  501. query = query.filter(ResourceProvisionMaterialBarcode.material_code.in_(material_code_list))
  502. total_items = query.count()
  503. # 排序
  504. if pageSize is None:
  505. pageSize=total_items
  506. query = query.order_by(ResourceProvisionMaterialBarcode.create_time.desc())
  507. # 执行分页查询
  508. lists = query.offset((page - 1) * pageSize).limit(pageSize).all()
  509. data = []
  510. for info in lists:
  511. material_info = material_id_get_material_info(db, info.material_code)
  512. data.append({"id": info.id,
  513. "material_name": material_info.material_name,
  514. "material_code": info.material_code,
  515. "barcode": info.barcode,
  516. "qr_code": info.qr_code,
  517. "status": info.status,
  518. "create_time": info.create_time} )
  519. return {"code": 200, "msg": "查询成功", "data": data,
  520. "total": total_items,
  521. "page": page,
  522. "pageSize": pageSize,
  523. "totalPages": (total_items + pageSize - 1) // pageSize
  524. }
  525. except Exception as e:
  526. traceback.print_exc()
  527. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  528. @router.get("/barcode/export")
  529. async def get_pattern_list(
  530. request: Request,
  531. user_id=Depends(valid_access_token),
  532. name: str = Query(None, description='名称'),
  533. auth_user: AuthUser = Depends(find_auth_user),
  534. db: Session = Depends(get_db)
  535. ):
  536. try:
  537. material_code_list=None
  538. if name:
  539. query_1 = db.query(ResourceProvisionMaterialInfo.material_id)
  540. query_1 = query_1.filter(ResourceProvisionMaterialInfo.del_flag=='0')
  541. query_1 = query_1.filter(ResourceProvisionMaterialInfo.material_name.like(f'%{name}%'))
  542. material_code_list =[i.material_id for i in query_1.all()]
  543. query = db.query(ResourceProvisionMaterialBarcode)
  544. query = query.filter_by(del_flag='0')
  545. if material_code_list is not None:
  546. query = query.filter(ResourceProvisionMaterialBarcode.material_code.in_(material_code_list))
  547. total_items = query.count()
  548. # 排序
  549. query = query.order_by(ResourceProvisionMaterialBarcode.create_time.desc())
  550. # 执行分页查询
  551. lists = query.all()
  552. data = []
  553. for info in lists:
  554. material_info = material_id_get_material_info(db, info.material_code)
  555. status = ""
  556. if info.status == "1":
  557. status = '启用'
  558. else:
  559. status='禁用'
  560. data.append({"id": info.id,
  561. "物资名称": material_info.material_name,
  562. "物资编号": info.material_code,
  563. "条形码": 'http://120.241.74.139:8086/api/file/get_img/get_img_by_id/'+info.barcode,
  564. "二维码": 'http://120.241.74.139:8086/api/file/get_img/get_img_by_id/'+info.qr_code,
  565. "条码状态": status,
  566. "创建时间": info.create_time} )
  567. # 返回结果
  568. import pandas as pd
  569. from io import BytesIO
  570. # 将查询结果转换为 DataFrame
  571. df = pd.DataFrame(data)
  572. # 将 DataFrame 导出为 Excel 文件
  573. output = BytesIO()
  574. with pd.ExcelWriter(output, engine='openpyxl') as writer:
  575. df.to_excel(writer, index=False)
  576. # 设置响应头
  577. output.seek(0)
  578. from urllib.parse import quote
  579. encoded_filename = f'条码管理{datetime.now().strftime("%Y%m%d%H%mi%s")}.xlsx'
  580. encoded_filename = quote(encoded_filename, encoding='utf-8')
  581. headers = {
  582. 'Content-Disposition': f'attachment; filename*=UTF-8\'\'{encoded_filename}',
  583. 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  584. }
  585. db_czrz.log(db, auth_user, "物资储备管理", f"物资储备管理条码管理导出数据成功", request.client.host)
  586. # 返回文件流
  587. return StreamingResponse(output, headers=headers)
  588. except Exception as e:
  589. traceback.print_exc()
  590. raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
  591. @router.put('/barcode/changeStatus')
  592. async def change_barcode_status(
  593. db: Session = Depends(get_db),
  594. body=Depends(remove_xss_json),
  595. user_id=Depends(valid_access_token)
  596. ):
  597. try:
  598. barcode_id = body['id']
  599. status = body['status']
  600. info = material_barcode_id_get_material_barcode_info(db, barcode_id)
  601. if not info:
  602. return JSONResponse(status_code=404, content={"code": 404, "msg": "barcode not found"})
  603. info.status= status
  604. info.update_by=user_id
  605. db.commit()
  606. return {
  607. "code": 200,
  608. "msg": "操作成功"
  609. }
  610. except Exception as e:
  611. # 处理异常
  612. traceback.print_exc()
  613. raise HTTPException(status_code=500, detail=str(e))
  614. @router.get('/treeselect')
  615. 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)):
  616. query = db.query(ResourceProvisionWarehouseInfo)
  617. query = query.filter_by(del_flag='0')
  618. query = query.filter_by(status='1')
  619. query = query.order_by(ResourceProvisionWarehouseInfo.create_time.desc())
  620. lists = query.all()
  621. data = []
  622. for info in lists:
  623. data_info = {"id": info.warehouse_id,
  624. "label": info.warehouse_name,
  625. "isWarehouse": True}
  626. # material_list = warehouse_id_get_material_list(db,info.warehouse_id)
  627. query1 = db.query(ResourceProvisionMaterialInfo)
  628. query1 = query1.filter_by(warehouse_id=info.warehouse_id, del_flag='0')
  629. if material_name:
  630. query1 = query1.filter_by(material_name=material_name)
  631. if material_type_name:
  632. query2 = db.query(ResourceProvisionMaterialType)
  633. query2 = query2.filter(ResourceProvisionMaterialType.material_category_name.like(f'%{material_type_name}%'), ResourceProvisionMaterialType.del_flag=='0')
  634. material_type_list = [str(material_type.id) for material_type in query2.all()]
  635. query1 = query1.filter(ResourceProvisionMaterialInfo.material_type.in_(material_type_list))
  636. material_list= query1.all()
  637. if material_list:
  638. data_info['children'] = []
  639. for material in material_list:
  640. type_info = type_id_get_material_type_info(db,material.material_type)
  641. material_category_name = None
  642. if type_info:
  643. material_category_name = type_info.material_category_name
  644. data_info['children'].append({"id": material.material_id,
  645. "label": material.material_name,
  646. "type_id": material.material_type,
  647. "type":material_category_name,
  648. "warehouse_id": info.warehouse_id,
  649. "warehouse_name":info.warehouse_name,
  650. "isWarehouse": False})
  651. data.append(data_info)
  652. return {
  653. "code": 200,
  654. "msg": "操作成功",
  655. "data": data
  656. }
  657. # 导入
  658. @router.post('/import')
  659. async def import_doc(
  660. request: Request,
  661. db: Session = Depends(get_db),
  662. body = Depends(remove_xss_json),
  663. user_id = Depends(valid_access_token)
  664. ):
  665. try:
  666. filename = body['filename']
  667. if len(filename) == 0:
  668. raise Exception()
  669. file = filename[0]
  670. url = file['url']
  671. file_path = f"{UPLOAD_mergefile_PATH}/uploads/{url}"
  672. file_path = os.path.abspath(file_path)
  673. print(file_path)
  674. book = xlrd.open_workbook(file_path)
  675. sheet = book.sheet_by_index(0)
  676. data = []
  677. return {
  678. 'code': 200,
  679. 'msg': '导入成功'
  680. }
  681. except Exception:
  682. traceback.print_exc()
  683. return {
  684. 'code': 500,
  685. 'msg': '导入发生异常'
  686. }