views.py 76 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703
  1. from rest_framework import viewsets
  2. from .models import ListModel,DepartmentListModel,BoundTypeListModel,BoundBSListModel,BoundCodeTypeListModel,BoundStatusListModel,ProductListModel,baseset
  3. from . import serializers
  4. from utils.page import MyPageNumberPagination
  5. from rest_framework.filters import OrderingFilter
  6. from django_filters.rest_framework import DjangoFilterBackend
  7. from rest_framework.response import Response
  8. from .filter import Filter,DepartmentFilter,BoundTypeFilter,BoundBSFilter,BoundCodeTypeFilter,BoundStatusFilter,ProductFilter
  9. from rest_framework.exceptions import APIException
  10. from staff.models import ListModel as StaffListModel
  11. from operation_log.views import log_success_operation, log_failure_operation, log_operation
  12. class APIViewSet(viewsets.ModelViewSet):
  13. pagination_class = MyPageNumberPagination
  14. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  15. ordering_fields = ['id', "create_time", "update_time", ]
  16. filter_class = Filter
  17. def get_project(self):
  18. # 获取项目ID,如果不存在则返回None
  19. try:
  20. id = self.kwargs.get('pk')
  21. return id
  22. except:
  23. return None
  24. def get_queryset(self):
  25. # 根据请求用户过滤查询集
  26. id = self.get_project()
  27. if self.request.user:
  28. if id is None:
  29. return ListModel.objects.filter( is_delete=False)
  30. else:
  31. return ListModel.objects.filter( id=id, is_delete=False)
  32. else:
  33. return ListModel.objects.none()
  34. def get_serializer_class(self):
  35. # 根据操作类型选择合适的序列化器
  36. if self.action in ['list', 'retrieve', 'destroy']:
  37. return serializers.WarehouseGetSerializer
  38. elif self.action in ['create']:
  39. return serializers.WarehousePostSerializer
  40. elif self.action in ['update']:
  41. return serializers.WarehouseUpdateSerializer
  42. elif self.action in ['partial_update']:
  43. return serializers.WarehousePartialUpdateSerializer
  44. else:
  45. return self.http_method_not_allowed(request=self.request)
  46. def create(self, request, *args, **kwargs):
  47. # 创建一个数据行
  48. data = self.request.data
  49. try:
  50. data['openid'] = self.request.auth.openid
  51. if len(data['warehouse_name']) > 45:
  52. log_failure_operation(
  53. request=self.request,
  54. operation_content=f"创建仓库失败,仓库名称超过45个字符:{data.get('warehouse_name', '')}",
  55. operation_level="new",
  56. operator=self.request.auth.name if self.request.auth else None,
  57. module_name="仓库管理"
  58. )
  59. raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
  60. if ListModel.objects.filter( warehouse_name=data['warehouse_name'],
  61. is_delete=False).exists():
  62. log_failure_operation(
  63. request=self.request,
  64. operation_content=f"创建仓库失败,仓库已存在:{data.get('warehouse_name', '')}",
  65. operation_level="new",
  66. operator=self.request.auth.name if self.request.auth else None,
  67. module_name="仓库管理"
  68. )
  69. raise APIException({"detail": "Data Exists"})
  70. else:
  71. # if ListModel.objects.filter(openid=data['openid'], is_delete=False).count() >= 1:
  72. # raise APIException({"detail": "You Just Can Add 1 Warehouse"})
  73. # else:
  74. serializer = self.get_serializer(data=data)
  75. serializer.is_valid(raise_exception=True)
  76. serializer.save()
  77. headers = self.get_success_headers(serializer.data)
  78. log_success_operation(
  79. request=self.request,
  80. operation_content=f"创建仓库成功,仓库名称:{data.get('warehouse_name', '')}",
  81. operation_level="new",
  82. operator=self.request.auth.name if self.request.auth else None,
  83. object_id=serializer.data.get('id'),
  84. module_name="仓库管理"
  85. )
  86. return Response(serializer.data, status=200, headers=headers)
  87. except APIException:
  88. raise
  89. except Exception as e:
  90. log_failure_operation(
  91. request=self.request,
  92. operation_content=f"创建仓库失败:{str(e)}",
  93. operation_level="new",
  94. operator=self.request.auth.name if self.request.auth else None,
  95. module_name="仓库管理"
  96. )
  97. raise
  98. def update(self, request, pk):
  99. # 更新一个数据行
  100. qs = self.get_object()
  101. try:
  102. data = self.request.data
  103. if len(data['warehouse_name']) > 45:
  104. log_failure_operation(
  105. request=self.request,
  106. operation_content=f"更新仓库失败,仓库名称超过45个字符:{data.get('warehouse_name', '')}",
  107. operation_level="update",
  108. operator=self.request.auth.name if self.request.auth else None,
  109. object_id=pk,
  110. module_name="仓库管理"
  111. )
  112. raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
  113. serializer = self.get_serializer(qs, data=data)
  114. serializer.is_valid(raise_exception=True)
  115. serializer.save()
  116. headers = self.get_success_headers(serializer.data)
  117. log_success_operation(
  118. request=self.request,
  119. operation_content=f"更新仓库成功,仓库名称:{data.get('warehouse_name', '')}",
  120. operation_level="update",
  121. operator=self.request.auth.name if self.request.auth else None,
  122. object_id=pk,
  123. module_name="仓库管理"
  124. )
  125. return Response(serializer.data, status=200, headers=headers)
  126. except APIException:
  127. raise
  128. except Exception as e:
  129. log_failure_operation(
  130. request=self.request,
  131. operation_content=f"更新仓库失败 ID:{pk}:{str(e)}",
  132. operation_level="update",
  133. operator=self.request.auth.name if self.request.auth else None,
  134. object_id=pk,
  135. module_name="仓库管理"
  136. )
  137. raise
  138. def partial_update(self, request, pk):
  139. # 部分更新一个数据行
  140. qs = self.get_object()
  141. try:
  142. data = self.request.data
  143. if len(data.get('warehouse_name', '')) > 45:
  144. log_failure_operation(
  145. request=self.request,
  146. operation_content=f"部分更新仓库失败,仓库名称超过45个字符:{data.get('warehouse_name', '')}",
  147. operation_level="update",
  148. operator=self.request.auth.name if self.request.auth else None,
  149. object_id=pk,
  150. module_name="仓库管理"
  151. )
  152. raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
  153. serializer = self.get_serializer(qs, data=data, partial=True)
  154. serializer.is_valid(raise_exception=True)
  155. serializer.save()
  156. headers = self.get_success_headers(serializer.data)
  157. log_success_operation(
  158. request=self.request,
  159. operation_content=f"部分更新仓库成功 ID:{pk}",
  160. operation_level="update",
  161. operator=self.request.auth.name if self.request.auth else None,
  162. object_id=pk,
  163. module_name="仓库管理"
  164. )
  165. return Response(serializer.data, status=200, headers=headers)
  166. except APIException:
  167. raise
  168. except Exception as e:
  169. log_failure_operation(
  170. request=self.request,
  171. operation_content=f"部分更新仓库失败 ID:{pk}:{str(e)}",
  172. operation_level="update",
  173. operator=self.request.auth.name if self.request.auth else None,
  174. object_id=pk,
  175. module_name="仓库管理"
  176. )
  177. raise
  178. def destroy(self, request, pk):
  179. # 逻辑删除一个数据行
  180. qs = self.get_object()
  181. warehouse_name = getattr(qs, 'warehouse_name', '未知')
  182. try:
  183. qs.is_delete = True
  184. qs.save()
  185. serializer = self.get_serializer(qs, many=False)
  186. headers = self.get_success_headers(serializer.data)
  187. log_success_operation(
  188. request=self.request,
  189. operation_content=f"删除仓库成功,仓库名称:{warehouse_name}",
  190. operation_level="delete",
  191. operator=self.request.auth.name if self.request.auth else None,
  192. object_id=pk,
  193. module_name="仓库管理"
  194. )
  195. return Response(serializer.data, status=200, headers=headers)
  196. except APIException:
  197. raise
  198. except Exception as e:
  199. log_failure_operation(
  200. request=self.request,
  201. operation_content=f"删除仓库失败 ID:{pk}:{str(e)}",
  202. operation_level="delete",
  203. operator=self.request.auth.name if self.request.auth else None,
  204. object_id=pk,
  205. module_name="仓库管理"
  206. )
  207. raise
  208. class DepartmentAPIViewSet(viewsets.ModelViewSet):
  209. pagination_class = MyPageNumberPagination
  210. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  211. ordering_fields = ['id', "create_time", "update_time", ]
  212. filter_class = DepartmentFilter
  213. def get_project(self):
  214. # 获取项目ID,如果不存在则返回None
  215. try:
  216. id = self.kwargs.get('pk')
  217. return id
  218. except:
  219. return None
  220. def get_queryset(self):
  221. # 根据请求用户过滤查询集
  222. id = self.get_project()
  223. if self.request.user:
  224. if id is None:
  225. return DepartmentListModel.objects.filter( is_delete=False)
  226. else:
  227. return DepartmentListModel.objects.filter( id=id, is_delete=False)
  228. else:
  229. return DepartmentListModel.objects.none()
  230. def get_serializer_class(self):
  231. # 根据操作类型选择合适的序列化器
  232. if self.action in ['list', 'retrieve', 'destroy']:
  233. return serializers.DepartmentGetSerializer
  234. elif self.action in ['create']:
  235. return serializers.DepartmentPostSerializer
  236. elif self.action in ['update']:
  237. return serializers.DepartmentUpdateSerializer
  238. elif self.action in ['partial_update']:
  239. return serializers.DepartmentPartialUpdateSerializer
  240. else:
  241. return self.http_method_not_allowed(request=self.request)
  242. def create(self, request, *args, **kwargs):
  243. # 创建一个数据行
  244. data = self.request.data
  245. try:
  246. data['openid'] = self.request.auth.openid
  247. if len(data['department_name']) > 45:
  248. log_failure_operation(
  249. request=self.request,
  250. operation_content=f"创建部门失败,部门名称超过45个字符:{data.get('department_name', '')}",
  251. operation_level="new",
  252. operator=self.request.auth.name if self.request.auth else None,
  253. module_name="部门管理"
  254. )
  255. raise APIException({"detail": "The department name is set to more than 45 characters"})
  256. if DepartmentListModel.objects.filter(department_name=data['department_name'],
  257. is_delete=False).exists():
  258. log_failure_operation(
  259. request=self.request,
  260. operation_content=f"创建部门失败,部门已存在:{data.get('department_name', '')}",
  261. operation_level="new",
  262. operator=self.request.auth.name if self.request.auth else None,
  263. module_name="部门管理"
  264. )
  265. raise APIException({"detail": "Data Exists"})
  266. else:
  267. serializer = self.get_serializer(data=data)
  268. serializer.is_valid(raise_exception=True)
  269. serializer.save()
  270. headers = self.get_success_headers(serializer.data)
  271. log_success_operation(
  272. request=self.request,
  273. operation_content=f"创建部门成功,部门名称:{data.get('department_name', '')}",
  274. operation_level="new",
  275. operator=self.request.auth.name if self.request.auth else None,
  276. object_id=serializer.data.get('id'),
  277. module_name="部门管理"
  278. )
  279. return Response(serializer.data, status=200, headers=headers)
  280. except APIException:
  281. raise
  282. except Exception as e:
  283. log_failure_operation(
  284. request=self.request,
  285. operation_content=f"创建部门失败:{str(e)}",
  286. operation_level="new",
  287. operator=self.request.auth.name if self.request.auth else None,
  288. module_name="部门管理"
  289. )
  290. raise
  291. def update(self, request, pk):
  292. # 更新一个数据行
  293. qs = self.get_object()
  294. try:
  295. data = self.request.data
  296. if len(data['department_name']) > 45:
  297. log_failure_operation(
  298. request=self.request,
  299. operation_content=f"更新部门失败,部门名称超过45个字符:{data.get('department_name', '')}",
  300. operation_level="update",
  301. operator=self.request.auth.name if self.request.auth else None,
  302. object_id=pk,
  303. module_name="部门管理"
  304. )
  305. raise APIException({"detail": "The department name is set to more than 45 characters"})
  306. serializer = self.get_serializer(qs, data=data)
  307. serializer.is_valid(raise_exception=True)
  308. serializer.save()
  309. headers = self.get_success_headers(serializer.data)
  310. log_success_operation(
  311. request=self.request,
  312. operation_content=f"更新部门成功,部门名称:{data.get('department_name', '')}",
  313. operation_level="update",
  314. operator=self.request.auth.name if self.request.auth else None,
  315. object_id=pk,
  316. module_name="部门管理"
  317. )
  318. return Response(serializer.data, status=200, headers=headers)
  319. except APIException:
  320. raise
  321. except Exception as e:
  322. log_failure_operation(
  323. request=self.request,
  324. operation_content=f"更新部门失败 ID:{pk}:{str(e)}",
  325. operation_level="update",
  326. operator=self.request.auth.name if self.request.auth else None,
  327. object_id=pk,
  328. module_name="部门管理"
  329. )
  330. raise
  331. def partial_update(self, request, pk):
  332. # 部分更新一个数据行
  333. qs = self.get_object()
  334. try:
  335. data = self.request.data
  336. if len(data.get('department_name', '')) > 45:
  337. log_failure_operation(
  338. request=self.request,
  339. operation_content=f"部分更新部门失败,部门名称超过45个字符:{data.get('department_name', '')}",
  340. operation_level="update",
  341. operator=self.request.auth.name if self.request.auth else None,
  342. object_id=pk,
  343. module_name="部门管理"
  344. )
  345. raise APIException({"detail": "The department name is set to more than 45 characters"})
  346. serializer = self.get_serializer(qs, data=data, partial=True)
  347. serializer.is_valid(raise_exception=True)
  348. serializer.save()
  349. headers = self.get_success_headers(serializer.data)
  350. log_success_operation(
  351. request=self.request,
  352. operation_content=f"部分更新部门成功 ID:{pk}",
  353. operation_level="update",
  354. operator=self.request.auth.name if self.request.auth else None,
  355. object_id=pk,
  356. module_name="部门管理"
  357. )
  358. return Response(serializer.data, status=200, headers=headers)
  359. except APIException:
  360. raise
  361. except Exception as e:
  362. log_failure_operation(
  363. request=self.request,
  364. operation_content=f"部分更新部门失败 ID:{pk}:{str(e)}",
  365. operation_level="update",
  366. operator=self.request.auth.name if self.request.auth else None,
  367. object_id=pk,
  368. module_name="部门管理"
  369. )
  370. raise
  371. def destroy(self, request, pk):
  372. # 逻辑删除一个数据行
  373. qs = self.get_object()
  374. department_name = getattr(qs, 'department_name', '未知')
  375. try:
  376. qs.is_delete = True
  377. qs.save()
  378. serializer = self.get_serializer(qs, many=False)
  379. headers = self.get_success_headers(serializer.data)
  380. log_success_operation(
  381. request=self.request,
  382. operation_content=f"删除部门成功,部门名称:{department_name}",
  383. operation_level="delete",
  384. operator=self.request.auth.name if self.request.auth else None,
  385. object_id=pk,
  386. module_name="部门管理"
  387. )
  388. return Response(serializer.data, status=200, headers=headers)
  389. except APIException:
  390. raise
  391. except Exception as e:
  392. log_failure_operation(
  393. request=self.request,
  394. operation_content=f"删除部门失败 ID:{pk}:{str(e)}",
  395. operation_level="delete",
  396. operator=self.request.auth.name if self.request.auth else None,
  397. object_id=pk,
  398. module_name="部门管理"
  399. )
  400. raise
  401. class BoundTypeAPIViewSet(viewsets.ModelViewSet):
  402. pagination_class = MyPageNumberPagination
  403. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  404. ordering_fields = ['id', "create_time", "update_time", ]
  405. filter_class = BoundTypeFilter
  406. def get_project(self):
  407. # 获取项目ID,如果不存在则返回None
  408. try:
  409. id = self.kwargs.get('pk')
  410. return id
  411. except:
  412. return None
  413. def get_queryset(self):
  414. # 根据请求用户过滤查询集
  415. id = self.get_project()
  416. if self.request.user:
  417. if id is None:
  418. return BoundTypeListModel.objects.filter( is_delete=False)
  419. else:
  420. return BoundTypeListModel.objects.filter( id=id, is_delete=False)
  421. else:
  422. return BoundTypeListModel.objects.none()
  423. def get_serializer_class(self):
  424. # 根据操作类型选择合适的序列化器
  425. if self.action in ['list', 'retrieve', 'destroy']:
  426. return serializers.BoundTypeGetSerializer
  427. elif self.action in ['create']:
  428. return serializers.BoundTypePostSerializer
  429. elif self.action in ['update']:
  430. return serializers.BoundTypeUpdateSerializer
  431. elif self.action in ['partial_update']:
  432. return serializers.BoundTypePartialUpdateSerializer
  433. else:
  434. return self.http_method_not_allowed(request=self.request)
  435. def create(self, request, *args, **kwargs):
  436. # 创建一个数据行
  437. data = self.request.data
  438. try:
  439. data['openid'] = self.request.auth.openid
  440. if len(data['bound_type_name']) > 45:
  441. log_failure_operation(
  442. request=self.request,
  443. operation_content=f"创建出入库类型失败,类型名称超过45个字符:{data.get('bound_type_name', '')}",
  444. operation_level="new",
  445. operator=self.request.auth.name if self.request.auth else None,
  446. module_name="出入库类型管理"
  447. )
  448. raise APIException({"detail": "The bound type name is set to more than 45 characters"})
  449. if BoundTypeListModel.objects.filter(bound_type_name=data['bound_type_name'],
  450. is_delete=False).exists():
  451. log_failure_operation(
  452. request=self.request,
  453. operation_content=f"创建出入库类型失败,类型已存在:{data.get('bound_type_name', '')}",
  454. operation_level="new",
  455. operator=self.request.auth.name if self.request.auth else None,
  456. module_name="出入库类型管理"
  457. )
  458. raise APIException({"detail": "Data Exists"})
  459. else:
  460. serializer = self.get_serializer(data=data)
  461. serializer.is_valid(raise_exception=True)
  462. serializer.save()
  463. headers = self.get_success_headers(serializer.data)
  464. log_success_operation(
  465. request=self.request,
  466. operation_content=f"创建出入库类型成功,类型名称:{data.get('bound_type_name', '')}",
  467. operation_level="new",
  468. operator=self.request.auth.name if self.request.auth else None,
  469. object_id=serializer.data.get('id'),
  470. module_name="出入库类型管理"
  471. )
  472. return Response(serializer.data, status=200, headers=headers)
  473. except APIException:
  474. raise
  475. except Exception as e:
  476. log_failure_operation(
  477. request=self.request,
  478. operation_content=f"创建出入库类型失败:{str(e)}",
  479. operation_level="new",
  480. operator=self.request.auth.name if self.request.auth else None,
  481. module_name="出入库类型管理"
  482. )
  483. raise
  484. def update(self, request, pk):
  485. # 更新一个数据行
  486. qs = self.get_object()
  487. try:
  488. data = self.request.data
  489. if len(data['bound_type_name']) > 45:
  490. log_failure_operation(
  491. request=self.request,
  492. operation_content=f"更新出入库类型失败,类型名称超过45个字符:{data.get('bound_type_name', '')}",
  493. operation_level="update",
  494. operator=self.request.auth.name if self.request.auth else None,
  495. object_id=pk,
  496. module_name="出入库类型管理"
  497. )
  498. raise APIException({"detail": "The bound type name is set to more than 45 characters"})
  499. serializer = self.get_serializer(qs, data=data)
  500. serializer.is_valid(raise_exception=True)
  501. serializer.save()
  502. headers = self.get_success_headers(serializer.data)
  503. log_success_operation(
  504. request=self.request,
  505. operation_content=f"更新出入库类型成功,类型名称:{data.get('bound_type_name', '')}",
  506. operation_level="update",
  507. operator=self.request.auth.name if self.request.auth else None,
  508. object_id=pk,
  509. module_name="出入库类型管理"
  510. )
  511. return Response(serializer.data, status=200, headers=headers)
  512. except APIException:
  513. raise
  514. except Exception as e:
  515. log_failure_operation(
  516. request=self.request,
  517. operation_content=f"更新出入库类型失败 ID:{pk}:{str(e)}",
  518. operation_level="update",
  519. operator=self.request.auth.name if self.request.auth else None,
  520. object_id=pk,
  521. module_name="出入库类型管理"
  522. )
  523. raise
  524. def partial_update(self, request, pk):
  525. # 部分更新一个数据行
  526. qs = self.get_object()
  527. try:
  528. data = self.request.data
  529. if len(data.get('bound_type_name', '')) > 45:
  530. log_failure_operation(
  531. request=self.request,
  532. operation_content=f"部分更新出入库类型失败,类型名称超过45个字符:{data.get('bound_type_name', '')}",
  533. operation_level="update",
  534. operator=self.request.auth.name if self.request.auth else None,
  535. object_id=pk,
  536. module_name="出入库类型管理"
  537. )
  538. raise APIException({"detail": "The bound type name is set to more than 45 characters"})
  539. serializer = self.get_serializer(qs, data=data, partial=True)
  540. serializer.is_valid(raise_exception=True)
  541. serializer.save()
  542. headers = self.get_success_headers(serializer.data)
  543. log_success_operation(
  544. request=self.request,
  545. operation_content=f"部分更新出入库类型成功 ID:{pk}",
  546. operation_level="update",
  547. operator=self.request.auth.name if self.request.auth else None,
  548. object_id=pk,
  549. module_name="出入库类型管理"
  550. )
  551. return Response(serializer.data, status=200, headers=headers)
  552. except APIException:
  553. raise
  554. except Exception as e:
  555. log_failure_operation(
  556. request=self.request,
  557. operation_content=f"部分更新出入库类型失败 ID:{pk}:{str(e)}",
  558. operation_level="update",
  559. operator=self.request.auth.name if self.request.auth else None,
  560. object_id=pk,
  561. module_name="出入库类型管理"
  562. )
  563. raise
  564. def destroy(self, request, pk):
  565. # 逻辑删除一个数据行
  566. qs = self.get_object()
  567. bound_type_name = getattr(qs, 'bound_type_name', '未知')
  568. try:
  569. qs.is_delete = True
  570. qs.save()
  571. serializer = self.get_serializer(qs, many=False)
  572. headers = self.get_success_headers(serializer.data)
  573. log_success_operation(
  574. request=self.request,
  575. operation_content=f"删除出入库类型成功,类型名称:{bound_type_name}",
  576. operation_level="delete",
  577. operator=self.request.auth.name if self.request.auth else None,
  578. object_id=pk,
  579. module_name="出入库类型管理"
  580. )
  581. return Response(serializer.data, status=200, headers=headers)
  582. except APIException:
  583. raise
  584. except Exception as e:
  585. log_failure_operation(
  586. request=self.request,
  587. operation_content=f"删除出入库类型失败 ID:{pk}:{str(e)}",
  588. operation_level="delete",
  589. operator=self.request.auth.name if self.request.auth else None,
  590. object_id=pk,
  591. module_name="出入库类型管理"
  592. )
  593. raise
  594. class BoundBusinessAPIViewSet(viewsets.ModelViewSet):
  595. pagination_class = MyPageNumberPagination
  596. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  597. ordering_fields = ['id', "create_time", "update_time", ]
  598. filter_class = BoundBSFilter
  599. def get_project(self):
  600. # 获取项目ID,如果不存在则返回None
  601. try:
  602. id = self.kwargs.get('pk')
  603. return id
  604. except:
  605. return None
  606. def get_queryset(self):
  607. # 根据请求用户过滤查询集
  608. id = self.get_project()
  609. if self.request.user:
  610. if id is None:
  611. return BoundBSListModel.objects.filter( is_delete=False)
  612. else:
  613. return BoundBSListModel.objects.filter( id=id, is_delete=False)
  614. else:
  615. return BoundBSListModel.objects.none()
  616. def get_serializer_class(self):
  617. # 根据操作类型选择合适的序列化器
  618. if self.action in ['list', 'retrieve', 'destroy']:
  619. return serializers.BoundBSGetSerializer
  620. elif self.action in ['create']:
  621. return serializers.BoundBSPostSerializer
  622. elif self.action in ['update']:
  623. return serializers.BoundBSUpdateSerializer
  624. elif self.action in ['partial_update']:
  625. return serializers.BoundBSPartialUpdateSerializer
  626. else:
  627. return self.http_method_not_allowed(request=self.request)
  628. def create(self, request, *args, **kwargs):
  629. # 创建一个数据行
  630. data = self.request.data
  631. try:
  632. data['openid'] = self.request.auth.openid
  633. if len(data['bound_bs_name']) > 45:
  634. log_failure_operation(
  635. request=self.request,
  636. operation_content=f"创建出入库业务失败,业务名称超过45个字符:{data.get('bound_bs_name', '')}",
  637. operation_level="new",
  638. operator=self.request.auth.name if self.request.auth else None,
  639. module_name="出入库业务管理"
  640. )
  641. raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
  642. if BoundBSListModel.objects.filter(bound_bs_name=data['bound_bs_name'],
  643. is_delete=False).exists():
  644. log_failure_operation(
  645. request=self.request,
  646. operation_content=f"创建出入库业务失败,业务已存在:{data.get('bound_bs_name', '')}",
  647. operation_level="new",
  648. operator=self.request.auth.name if self.request.auth else None,
  649. module_name="出入库业务管理"
  650. )
  651. raise APIException({"detail": "Data Exists"})
  652. else:
  653. serializer = self.get_serializer(data=data)
  654. serializer.is_valid(raise_exception=True)
  655. serializer.save()
  656. headers = self.get_success_headers(serializer.data)
  657. log_success_operation(
  658. request=self.request,
  659. operation_content=f"创建出入库业务成功,业务名称:{data.get('bound_bs_name', '')}",
  660. operation_level="new",
  661. operator=self.request.auth.name if self.request.auth else None,
  662. object_id=serializer.data.get('id'),
  663. module_name="出入库业务管理"
  664. )
  665. return Response(serializer.data, status=200, headers=headers)
  666. except APIException:
  667. raise
  668. except Exception as e:
  669. log_failure_operation(
  670. request=self.request,
  671. operation_content=f"创建出入库业务失败:{str(e)}",
  672. operation_level="new",
  673. operator=self.request.auth.name if self.request.auth else None,
  674. module_name="出入库业务管理"
  675. )
  676. raise
  677. def update(self, request, pk):
  678. # 更新一个数据行
  679. qs = self.get_object()
  680. try:
  681. data = self.request.data
  682. if len(data['bound_bs_name']) > 45:
  683. log_failure_operation(
  684. request=self.request,
  685. operation_content=f"更新出入库业务失败,业务名称超过45个字符:{data.get('bound_bs_name', '')}",
  686. operation_level="update",
  687. operator=self.request.auth.name if self.request.auth else None,
  688. object_id=pk,
  689. module_name="出入库业务管理"
  690. )
  691. raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
  692. serializer = self.get_serializer(qs, data=data)
  693. serializer.is_valid(raise_exception=True)
  694. serializer.save()
  695. headers = self.get_success_headers(serializer.data)
  696. log_success_operation(
  697. request=self.request,
  698. operation_content=f"更新出入库业务成功,业务名称:{data.get('bound_bs_name', '')}",
  699. operation_level="update",
  700. operator=self.request.auth.name if self.request.auth else None,
  701. object_id=pk,
  702. module_name="出入库业务管理"
  703. )
  704. return Response(serializer.data, status=200, headers=headers)
  705. except APIException:
  706. raise
  707. except Exception as e:
  708. log_failure_operation(
  709. request=self.request,
  710. operation_content=f"更新出入库业务失败 ID:{pk}:{str(e)}",
  711. operation_level="update",
  712. operator=self.request.auth.name if self.request.auth else None,
  713. object_id=pk,
  714. module_name="出入库业务管理"
  715. )
  716. raise
  717. def partial_update(self, request, pk):
  718. # 部分更新一个数据行
  719. qs = self.get_object()
  720. try:
  721. data = self.request.data
  722. if len(data.get('bound_bs_name', '')) > 45:
  723. log_failure_operation(
  724. request=self.request,
  725. operation_content=f"部分更新出入库业务失败,业务名称超过45个字符:{data.get('bound_bs_name', '')}",
  726. operation_level="update",
  727. operator=self.request.auth.name if self.request.auth else None,
  728. object_id=pk,
  729. module_name="出入库业务管理"
  730. )
  731. raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
  732. serializer = self.get_serializer(qs, data=data, partial=True)
  733. serializer.is_valid(raise_exception=True)
  734. serializer.save()
  735. headers = self.get_success_headers(serializer.data)
  736. log_success_operation(
  737. request=self.request,
  738. operation_content=f"部分更新出入库业务成功 ID:{pk}",
  739. operation_level="update",
  740. operator=self.request.auth.name if self.request.auth else None,
  741. object_id=pk,
  742. module_name="出入库业务管理"
  743. )
  744. return Response(serializer.data, status=200, headers=headers)
  745. except APIException:
  746. raise
  747. except Exception as e:
  748. log_failure_operation(
  749. request=self.request,
  750. operation_content=f"部分更新出入库业务失败 ID:{pk}:{str(e)}",
  751. operation_level="update",
  752. operator=self.request.auth.name if self.request.auth else None,
  753. object_id=pk,
  754. module_name="出入库业务管理"
  755. )
  756. raise
  757. def destroy(self, request, pk):
  758. # 逻辑删除一个数据行
  759. qs = self.get_object()
  760. bound_bs_name = getattr(qs, 'bound_bs_name', '未知')
  761. try:
  762. qs.is_delete = True
  763. qs.save()
  764. serializer = self.get_serializer(qs, many=False)
  765. headers = self.get_success_headers(serializer.data)
  766. log_success_operation(
  767. request=self.request,
  768. operation_content=f"删除出入库业务成功,业务名称:{bound_bs_name}",
  769. operation_level="delete",
  770. operator=self.request.auth.name if self.request.auth else None,
  771. object_id=pk,
  772. module_name="出入库业务管理"
  773. )
  774. return Response(serializer.data, status=200, headers=headers)
  775. except APIException:
  776. raise
  777. except Exception as e:
  778. log_failure_operation(
  779. request=self.request,
  780. operation_content=f"删除出入库业务失败 ID:{pk}:{str(e)}",
  781. operation_level="delete",
  782. operator=self.request.auth.name if self.request.auth else None,
  783. object_id=pk,
  784. module_name="出入库业务管理"
  785. )
  786. raise
  787. class BoundCodeTypeAPIViewSet(viewsets.ModelViewSet):
  788. pagination_class = MyPageNumberPagination
  789. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  790. ordering_fields = ['id', "create_time", "update_time", ]
  791. filter_class = BoundCodeTypeFilter
  792. def get_project(self):
  793. # 获取项目ID,如果不存在则返回None
  794. try:
  795. id = self.kwargs.get('pk')
  796. return id
  797. except:
  798. return None
  799. def get_queryset(self):
  800. # 根据请求用户过滤查询集
  801. id = self.get_project()
  802. if self.request.user:
  803. if id is None:
  804. return BoundCodeTypeListModel.objects.filter( is_delete=False)
  805. else:
  806. return BoundCodeTypeListModel.objects.filter( id=id, is_delete=False)
  807. else:
  808. return BoundCodeTypeListModel.objects.none()
  809. def get_serializer_class(self):
  810. # 根据操作类型选择合适的序列化器
  811. if self.action in ['list', 'retrieve', 'destroy']:
  812. return serializers.BoundCodeTypeGetSerializer
  813. elif self.action in ['create']:
  814. return serializers.BoundCodeTypePostSerializer
  815. elif self.action in ['update']:
  816. return serializers.BoundCodeTypeUpdateSerializer
  817. elif self.action in ['partial_update']:
  818. return serializers.BoundCodeTypePartialUpdateSerializer
  819. else:
  820. return self.http_method_not_allowed(request=self.request)
  821. def create(self, request, *args, **kwargs):
  822. # 创建一个数据行
  823. data = self.request.data
  824. try:
  825. data['openid'] = self.request.auth.openid
  826. if len(data['bound_code_type_name']) > 45:
  827. log_failure_operation(
  828. request=self.request,
  829. operation_content=f"创建出入库编码类型失败,类型名称超过45个字符:{data.get('bound_code_type_name', '')}",
  830. operation_level="new",
  831. operator=self.request.auth.name if self.request.auth else None,
  832. module_name="出入库编码类型管理"
  833. )
  834. raise APIException({"detail": "The bound code type name is set to more than 45 characters"})
  835. if BoundCodeTypeListModel.objects.filter(bound_code_type_name=data['bound_code_type_name'],
  836. is_delete=False).exists():
  837. log_failure_operation(
  838. request=self.request,
  839. operation_content=f"创建出入库编码类型失败,类型已存在:{data.get('bound_code_type_name', '')}",
  840. operation_level="new",
  841. operator=self.request.auth.name if self.request.auth else None,
  842. module_name="出入库编码类型管理"
  843. )
  844. raise APIException({"detail": "Data Exists"})
  845. else:
  846. serializer = self.get_serializer(data=data)
  847. serializer.is_valid(raise_exception=True)
  848. serializer.save()
  849. headers = self.get_success_headers(serializer.data)
  850. log_success_operation(
  851. request=self.request,
  852. operation_content=f"创建出入库编码类型成功,类型名称:{data.get('bound_code_type_name', '')}",
  853. operation_level="new",
  854. operator=self.request.auth.name if self.request.auth else None,
  855. object_id=serializer.data.get('id'),
  856. module_name="出入库编码类型管理"
  857. )
  858. return Response(serializer.data, status=200, headers=headers)
  859. except APIException:
  860. raise
  861. except Exception as e:
  862. log_failure_operation(
  863. request=self.request,
  864. operation_content=f"创建出入库编码类型失败:{str(e)}",
  865. operation_level="new",
  866. operator=self.request.auth.name if self.request.auth else None,
  867. module_name="出入库编码类型管理"
  868. )
  869. raise
  870. def update(self, request, pk):
  871. # 更新一个数据行
  872. qs = self.get_object()
  873. try:
  874. data = self.request.data
  875. if len(data['bound_code_type_name']) > 45:
  876. log_failure_operation(
  877. request=self.request,
  878. operation_content=f"更新出入库编码类型失败,类型名称超过45个字符:{data.get('bound_code_type_name', '')}",
  879. operation_level="update",
  880. operator=self.request.auth.name if self.request.auth else None,
  881. object_id=pk,
  882. module_name="出入库编码类型管理"
  883. )
  884. raise APIException({"detail": "The bound code type name is set to more than 45 characters"})
  885. serializer = self.get_serializer(qs, data=data)
  886. serializer.is_valid(raise_exception=True)
  887. serializer.save()
  888. headers = self.get_success_headers(serializer.data)
  889. log_success_operation(
  890. request=self.request,
  891. operation_content=f"更新出入库编码类型成功,类型名称:{data.get('bound_code_type_name', '')}",
  892. operation_level="update",
  893. operator=self.request.auth.name if self.request.auth else None,
  894. object_id=pk,
  895. module_name="出入库编码类型管理"
  896. )
  897. return Response(serializer.data, status=200, headers=headers)
  898. except APIException:
  899. raise
  900. except Exception as e:
  901. log_failure_operation(
  902. request=self.request,
  903. operation_content=f"更新出入库编码类型失败 ID:{pk}:{str(e)}",
  904. operation_level="update",
  905. operator=self.request.auth.name if self.request.auth else None,
  906. object_id=pk,
  907. module_name="出入库编码类型管理"
  908. )
  909. raise
  910. def partial_update(self, request, pk):
  911. # 部分更新一个数据行
  912. qs = self.get_object()
  913. try:
  914. data = self.request.data
  915. if len(data.get('bound_code_type_name', '')) > 45:
  916. log_failure_operation(
  917. request=self.request,
  918. operation_content=f"部分更新出入库编码类型失败,类型名称超过45个字符:{data.get('bound_code_type_name', '')}",
  919. operation_level="update",
  920. operator=self.request.auth.name if self.request.auth else None,
  921. object_id=pk,
  922. module_name="出入库编码类型管理"
  923. )
  924. raise APIException({"detail": "The bound code type name is set to more than 45 characters"})
  925. serializer = self.get_serializer(qs, data=data, partial=True)
  926. serializer.is_valid(raise_exception=True)
  927. serializer.save()
  928. headers = self.get_success_headers(serializer.data)
  929. log_success_operation(
  930. request=self.request,
  931. operation_content=f"部分更新出入库编码类型成功 ID:{pk}",
  932. operation_level="update",
  933. operator=self.request.auth.name if self.request.auth else None,
  934. object_id=pk,
  935. module_name="出入库编码类型管理"
  936. )
  937. return Response(serializer.data, status=200, headers=headers)
  938. except APIException:
  939. raise
  940. except Exception as e:
  941. log_failure_operation(
  942. request=self.request,
  943. operation_content=f"部分更新出入库编码类型失败 ID:{pk}:{str(e)}",
  944. operation_level="update",
  945. operator=self.request.auth.name if self.request.auth else None,
  946. object_id=pk,
  947. module_name="出入库编码类型管理"
  948. )
  949. raise
  950. def destroy(self, request, pk):
  951. # 逻辑删除一个数据行
  952. qs = self.get_object()
  953. bound_code_type_name = getattr(qs, 'bound_code_type_name', '未知')
  954. try:
  955. qs.is_delete = True
  956. qs.save()
  957. serializer = self.get_serializer(qs, many=False)
  958. headers = self.get_success_headers(serializer.data)
  959. log_success_operation(
  960. request=self.request,
  961. operation_content=f"删除出入库编码类型成功,类型名称:{bound_code_type_name}",
  962. operation_level="delete",
  963. operator=self.request.auth.name if self.request.auth else None,
  964. object_id=pk,
  965. module_name="出入库编码类型管理"
  966. )
  967. return Response(serializer.data, status=200, headers=headers)
  968. except APIException:
  969. raise
  970. except Exception as e:
  971. log_failure_operation(
  972. request=self.request,
  973. operation_content=f"删除出入库编码类型失败 ID:{pk}:{str(e)}",
  974. operation_level="delete",
  975. operator=self.request.auth.name if self.request.auth else None,
  976. object_id=pk,
  977. module_name="出入库编码类型管理"
  978. )
  979. raise
  980. class BoundStatusAPIViewSet(viewsets.ModelViewSet):
  981. pagination_class = MyPageNumberPagination
  982. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  983. ordering_fields = ['id', "create_time", "update_time", ]
  984. filter_class = BoundStatusFilter
  985. def get_project(self):
  986. # 获取项目ID,如果不存在则返回None
  987. try:
  988. id = self.kwargs.get('pk')
  989. return id
  990. except:
  991. return None
  992. def get_queryset(self):
  993. # 根据请求用户过滤查询集
  994. id = self.get_project()
  995. if self.request.user:
  996. if id is None:
  997. return BoundStatusListModel.objects.filter( is_delete=False)
  998. else:
  999. return BoundStatusListModel.objects.filter( id=id, is_delete=False)
  1000. else:
  1001. return BoundStatusListModel.objects.none()
  1002. def get_serializer_class(self):
  1003. # 根据操作类型选择合适的序列化器
  1004. if self.action in ['list', 'retrieve', 'destroy']:
  1005. return serializers.BoundStatusGetSerializer
  1006. elif self.action in ['create']:
  1007. return serializers.BoundStatusPostSerializer
  1008. elif self.action in ['update']:
  1009. return serializers.BoundStatusUpdateSerializer
  1010. elif self.action in ['partial_update']:
  1011. return serializers.BoundStatusPartialUpdateSerializer
  1012. else:
  1013. return self.http_method_not_allowed(request=self.request)
  1014. def create(self, request, *args, **kwargs):
  1015. # 创建一个数据行
  1016. data = self.request.data
  1017. try:
  1018. data['openid'] = self.request.auth.openid
  1019. if len(data['bound_status_name']) > 45:
  1020. log_failure_operation(
  1021. request=self.request,
  1022. operation_content=f"创建出入库状态失败,状态名称超过45个字符:{data.get('bound_status_name', '')}",
  1023. operation_level="new",
  1024. operator=self.request.auth.name if self.request.auth else None,
  1025. module_name="出入库状态管理"
  1026. )
  1027. raise APIException({"detail": "The bound status name is set to more than 45 characters"})
  1028. if BoundStatusListModel.objects.filter(bound_status_name=data['bound_status_name'],
  1029. is_delete=False).exists():
  1030. log_failure_operation(
  1031. request=self.request,
  1032. operation_content=f"创建出入库状态失败,状态已存在:{data.get('bound_status_name', '')}",
  1033. operation_level="new",
  1034. operator=self.request.auth.name if self.request.auth else None,
  1035. module_name="出入库状态管理"
  1036. )
  1037. raise APIException({"detail": "Data Exists"})
  1038. else:
  1039. serializer = self.get_serializer(data=data)
  1040. serializer.is_valid(raise_exception=True)
  1041. serializer.save()
  1042. headers = self.get_success_headers(serializer.data)
  1043. log_success_operation(
  1044. request=self.request,
  1045. operation_content=f"创建出入库状态成功,状态名称:{data.get('bound_status_name', '')}",
  1046. operation_level="new",
  1047. operator=self.request.auth.name if self.request.auth else None,
  1048. object_id=serializer.data.get('id'),
  1049. module_name="出入库状态管理"
  1050. )
  1051. return Response(serializer.data, status=200, headers=headers)
  1052. except APIException:
  1053. raise
  1054. except Exception as e:
  1055. log_failure_operation(
  1056. request=self.request,
  1057. operation_content=f"创建出入库状态失败:{str(e)}",
  1058. operation_level="new",
  1059. operator=self.request.auth.name if self.request.auth else None,
  1060. module_name="出入库状态管理"
  1061. )
  1062. raise
  1063. def update(self, request, pk):
  1064. # 更新一个数据行
  1065. qs = self.get_object()
  1066. try:
  1067. data = self.request.data
  1068. if len(data['bound_status_name']) > 45:
  1069. log_failure_operation(
  1070. request=self.request,
  1071. operation_content=f"更新出入库状态失败,状态名称超过45个字符:{data.get('bound_status_name', '')}",
  1072. operation_level="update",
  1073. operator=self.request.auth.name if self.request.auth else None,
  1074. object_id=pk,
  1075. module_name="出入库状态管理"
  1076. )
  1077. raise APIException({"detail": "The bound status name is set to more than 45 characters"})
  1078. serializer = self.get_serializer(qs, data=data)
  1079. serializer.is_valid(raise_exception=True)
  1080. serializer.save()
  1081. headers = self.get_success_headers(serializer.data)
  1082. log_success_operation(
  1083. request=self.request,
  1084. operation_content=f"更新出入库状态成功,状态名称:{data.get('bound_status_name', '')}",
  1085. operation_level="update",
  1086. operator=self.request.auth.name if self.request.auth else None,
  1087. object_id=pk,
  1088. module_name="出入库状态管理"
  1089. )
  1090. return Response(serializer.data, status=200, headers=headers)
  1091. except APIException:
  1092. raise
  1093. except Exception as e:
  1094. log_failure_operation(
  1095. request=self.request,
  1096. operation_content=f"更新出入库状态失败 ID:{pk}:{str(e)}",
  1097. operation_level="update",
  1098. operator=self.request.auth.name if self.request.auth else None,
  1099. object_id=pk,
  1100. module_name="出入库状态管理"
  1101. )
  1102. raise
  1103. def partial_update(self, request, pk):
  1104. # 部分更新一个数据行
  1105. qs = self.get_object()
  1106. try:
  1107. data = self.request.data
  1108. if len(data.get('bound_status_name', '')) > 45:
  1109. log_failure_operation(
  1110. request=self.request,
  1111. operation_content=f"部分更新出入库状态失败,状态名称超过45个字符:{data.get('bound_status_name', '')}",
  1112. operation_level="update",
  1113. operator=self.request.auth.name if self.request.auth else None,
  1114. object_id=pk,
  1115. module_name="出入库状态管理"
  1116. )
  1117. raise APIException({"detail": "The bound status name is set to more than 45 characters"})
  1118. serializer = self.get_serializer(qs, data=data, partial=True)
  1119. serializer.is_valid(raise_exception=True)
  1120. serializer.save()
  1121. headers = self.get_success_headers(serializer.data)
  1122. log_success_operation(
  1123. request=self.request,
  1124. operation_content=f"部分更新出入库状态成功 ID:{pk}",
  1125. operation_level="update",
  1126. operator=self.request.auth.name if self.request.auth else None,
  1127. object_id=pk,
  1128. module_name="出入库状态管理"
  1129. )
  1130. return Response(serializer.data, status=200, headers=headers)
  1131. except APIException:
  1132. raise
  1133. except Exception as e:
  1134. log_failure_operation(
  1135. request=self.request,
  1136. operation_content=f"部分更新出入库状态失败 ID:{pk}:{str(e)}",
  1137. operation_level="update",
  1138. operator=self.request.auth.name if self.request.auth else None,
  1139. object_id=pk,
  1140. module_name="出入库状态管理"
  1141. )
  1142. raise
  1143. def destroy(self, request, pk):
  1144. # 逻辑删除一个数据行
  1145. qs = self.get_object()
  1146. bound_status_name = getattr(qs, 'bound_status_name', '未知')
  1147. try:
  1148. qs.is_delete = True
  1149. qs.save()
  1150. serializer = self.get_serializer(qs, many=False)
  1151. headers = self.get_success_headers(serializer.data)
  1152. log_success_operation(
  1153. request=self.request,
  1154. operation_content=f"删除出入库状态成功,状态名称:{bound_status_name}",
  1155. operation_level="delete",
  1156. operator=self.request.auth.name if self.request.auth else None,
  1157. object_id=pk,
  1158. module_name="出入库状态管理"
  1159. )
  1160. return Response(serializer.data, status=200, headers=headers)
  1161. except APIException:
  1162. raise
  1163. except Exception as e:
  1164. log_failure_operation(
  1165. request=self.request,
  1166. operation_content=f"删除出入库状态失败 ID:{pk}:{str(e)}",
  1167. operation_level="delete",
  1168. operator=self.request.auth.name if self.request.auth else None,
  1169. object_id=pk,
  1170. module_name="出入库状态管理"
  1171. )
  1172. raise
  1173. class MultipleViewSet(viewsets.ModelViewSet):
  1174. authentication_classes = []
  1175. pagination_class = MyPageNumberPagination
  1176. permission_classes = []
  1177. throttle_classes = []
  1178. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  1179. ordering_fields = ['-id', ]
  1180. filter_class = Filter
  1181. def get_project(self):
  1182. # 获取项目ID,如果不存在则返回None
  1183. try:
  1184. id = self.kwargs.get('pk')
  1185. return id
  1186. except:
  1187. return None
  1188. def get_queryset(self):
  1189. # 根据请求用户过滤查询集
  1190. id = self.get_project()
  1191. if self.request.user:
  1192. if id is None:
  1193. return ListModel.objects.filter(is_delete=False)
  1194. else:
  1195. return ListModel.objects.filter(id=id, is_delete=False)
  1196. else:
  1197. return ListModel.objects.none()
  1198. def get_serializer_class(self):
  1199. # 根据操作类型选择合适的序列化器
  1200. if self.action in ['list', 'retrieve']:
  1201. return serializers.WarehouseGetSerializer
  1202. else:
  1203. return self.http_method_not_allowed(request=self.request)
  1204. class ProductAPIViewSet(viewsets.ModelViewSet):
  1205. pagination_class = MyPageNumberPagination
  1206. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  1207. ordering_fields = ['id', "create_time", "update_time", ]
  1208. filter_class = ProductFilter
  1209. def get_project(self):
  1210. # 获取项目ID,如果不存在则返回None
  1211. try:
  1212. id = self.kwargs.get('pk')
  1213. return id
  1214. except:
  1215. return None
  1216. def get_queryset(self):
  1217. # 根据请求用户过滤查询集
  1218. id = self.get_project()
  1219. if self.request.user:
  1220. if id is None:
  1221. return ProductListModel.objects.filter(is_delete=False)
  1222. else:
  1223. return ProductListModel.objects.filter(id=id, is_delete=False)
  1224. else:
  1225. return ProductListModel.objects.none()
  1226. def get_serializer_class(self):
  1227. # 根据操作类型选择合适的序列化器
  1228. if self.action in ['list', 'retrieve', 'destroy']:
  1229. return serializers.ProductGetSerializer
  1230. elif self.action in ['create']:
  1231. return serializers.ProductPostSerializer
  1232. elif self.action in ['update']:
  1233. return serializers.ProductUpdateSerializer
  1234. elif self.action in ['partial_update']:
  1235. return serializers.ProductPartialUpdateSerializer
  1236. else:
  1237. return self.http_method_not_allowed(request=self.request)
  1238. def create(self, request, *args, **kwargs):
  1239. # 创建一个数据行
  1240. data = self.request.data
  1241. try:
  1242. if len(data['product_name']) > 45:
  1243. log_failure_operation(
  1244. request=self.request,
  1245. operation_content=f"创建产品失败,产品名称超过45个字符:{data.get('product_name', '')}",
  1246. operation_level="new",
  1247. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1248. module_name="产品管理"
  1249. )
  1250. raise APIException({"detail": "The product name is set to more than 45 characters"})
  1251. if ProductListModel.objects.filter(product_code=data['product_code'],
  1252. is_delete=False).exists():
  1253. log_failure_operation(
  1254. request=self.request,
  1255. operation_content=f"创建产品失败,产品编码已存在:{data.get('product_code', '')}",
  1256. operation_level="new",
  1257. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1258. module_name="产品管理"
  1259. )
  1260. raise APIException({"detail": "Data Exists"})
  1261. else:
  1262. serializer = self.get_serializer(data=data)
  1263. serializer.is_valid(raise_exception=True)
  1264. serializer.save()
  1265. headers = self.get_success_headers(serializer.data)
  1266. log_success_operation(
  1267. request=self.request,
  1268. operation_content=f"创建产品成功,产品名称:{data.get('product_name', '')}",
  1269. operation_level="new",
  1270. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1271. object_id=serializer.data.get('id'),
  1272. module_name="产品管理"
  1273. )
  1274. return Response(serializer.data, status=200, headers=headers)
  1275. except APIException:
  1276. raise
  1277. except Exception as e:
  1278. log_failure_operation(
  1279. request=self.request,
  1280. operation_content=f"创建产品失败:{str(e)}",
  1281. operation_level="new",
  1282. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1283. module_name="产品管理"
  1284. )
  1285. raise
  1286. def update(self, request, pk):
  1287. # 更新一个数据行
  1288. qs = self.get_object()
  1289. try:
  1290. data = self.request.data
  1291. if len(data['product_name']) > 45:
  1292. log_failure_operation(
  1293. request=self.request,
  1294. operation_content=f"更新产品失败,产品名称超过45个字符:{data.get('product_name', '')}",
  1295. operation_level="update",
  1296. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1297. object_id=pk,
  1298. module_name="产品管理"
  1299. )
  1300. raise APIException({"detail": "The product name is set to more than 45 characters"})
  1301. if ProductListModel.objects.filter(product_code=data['product_code'],
  1302. is_delete=False).exists():
  1303. log_failure_operation(
  1304. request=self.request,
  1305. operation_content=f"更新产品失败,产品编码已存在:{data.get('product_code', '')}",
  1306. operation_level="update",
  1307. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1308. object_id=pk,
  1309. module_name="产品管理"
  1310. )
  1311. raise APIException({"detail": "Data Exists"})
  1312. serializer = self.get_serializer(qs, data=data)
  1313. serializer.is_valid(raise_exception=True)
  1314. serializer.save()
  1315. headers = self.get_success_headers(serializer.data)
  1316. log_success_operation(
  1317. request=self.request,
  1318. operation_content=f"更新产品成功,产品名称:{data.get('product_name', '')}",
  1319. operation_level="update",
  1320. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1321. object_id=pk,
  1322. module_name="产品管理"
  1323. )
  1324. return Response(serializer.data, status=200, headers=headers)
  1325. except APIException:
  1326. raise
  1327. except Exception as e:
  1328. log_failure_operation(
  1329. request=self.request,
  1330. operation_content=f"更新产品失败 ID:{pk}:{str(e)}",
  1331. operation_level="update",
  1332. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1333. object_id=pk,
  1334. module_name="产品管理"
  1335. )
  1336. raise
  1337. def partial_update(self, request, pk):
  1338. # 部分更新一个数据行
  1339. qs = self.get_object()
  1340. try:
  1341. data = self.request.data
  1342. if len(data.get('product_name', '')) > 45:
  1343. log_failure_operation(
  1344. request=self.request,
  1345. operation_content=f"部分更新产品失败,产品名称超过45个字符:{data.get('product_name', '')}",
  1346. operation_level="update",
  1347. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1348. object_id=pk,
  1349. module_name="产品管理"
  1350. )
  1351. raise APIException({"detail": "The product name is set to more than 45 characters"})
  1352. if ProductListModel.objects.filter(product_code=data.get('product_code', ''),
  1353. is_delete=False).exists():
  1354. log_failure_operation(
  1355. request=self.request,
  1356. operation_content=f"部分更新产品失败,产品编码已存在:{data.get('product_code', '')}",
  1357. operation_level="update",
  1358. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1359. object_id=pk,
  1360. module_name="产品管理"
  1361. )
  1362. raise APIException({"detail": "Data Exists"})
  1363. serializer = self.get_serializer(qs, data=data, partial=True)
  1364. serializer.is_valid(raise_exception=True)
  1365. serializer.save()
  1366. headers = self.get_success_headers(serializer.data)
  1367. log_success_operation(
  1368. request=self.request,
  1369. operation_content=f"部分更新产品成功 ID:{pk}",
  1370. operation_level="update",
  1371. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1372. object_id=pk,
  1373. module_name="产品管理"
  1374. )
  1375. return Response(serializer.data, status=200, headers=headers)
  1376. except APIException:
  1377. raise
  1378. except Exception as e:
  1379. log_failure_operation(
  1380. request=self.request,
  1381. operation_content=f"部分更新产品失败 ID:{pk}:{str(e)}",
  1382. operation_level="update",
  1383. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1384. object_id=pk,
  1385. module_name="产品管理"
  1386. )
  1387. raise
  1388. def destroy(self, request, pk):
  1389. # 逻辑删除一个数据行
  1390. qs = self.get_object()
  1391. product_name = getattr(qs, 'product_name', '未知')
  1392. try:
  1393. qs.is_delete = True
  1394. qs.save()
  1395. serializer = self.get_serializer(qs, many=False)
  1396. headers = self.get_success_headers(serializer.data)
  1397. log_success_operation(
  1398. request=self.request,
  1399. operation_content=f"删除产品成功,产品名称:{product_name}",
  1400. operation_level="delete",
  1401. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1402. object_id=pk,
  1403. module_name="产品管理"
  1404. )
  1405. return Response(serializer.data, status=200, headers=headers)
  1406. except APIException:
  1407. raise
  1408. except Exception as e:
  1409. log_failure_operation(
  1410. request=self.request,
  1411. operation_content=f"删除产品失败 ID:{pk}:{str(e)}",
  1412. operation_level="delete",
  1413. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1414. object_id=pk,
  1415. module_name="产品管理"
  1416. )
  1417. raise
  1418. class basesetAPIViewSet(viewsets.ModelViewSet):
  1419. pagination_class = MyPageNumberPagination
  1420. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  1421. ordering_fields = ['id' ]
  1422. filter_class = Filter
  1423. def get_project(self):
  1424. # 获取项目ID,如果不存在则返回None
  1425. try:
  1426. id = self.kwargs.get('pk')
  1427. return id
  1428. except:
  1429. return None
  1430. def get_queryset(self):
  1431. # 根据请求用户过滤查询集
  1432. id = self.get_project()
  1433. if self.request.user:
  1434. if id is None:
  1435. return baseset.objects.filter(is_delete=False)
  1436. else:
  1437. return baseset.objects.filter(id=id, is_delete=False)
  1438. else:
  1439. return baseset.objects.none()
  1440. def get_serializer_class(self):
  1441. # 根据操作类型选择合适的序列化器
  1442. if self.action in ['list', 'retrieve', 'destroy']:
  1443. return serializers.BaseGetSerializer
  1444. elif self.action in ['create']:
  1445. return serializers.BasePostSerializer
  1446. elif self.action in ['update']:
  1447. return serializers.BaseUpdateSerializer
  1448. elif self.action in ['partial_update']:
  1449. return serializers.BasePartialUpdateSerializer
  1450. else:
  1451. return self.http_method_not_allowed(request=self.request)
  1452. def create(self, request, *args, **kwargs):
  1453. # 创建一个数据行
  1454. data = self.request.data
  1455. staff_openid = self.request.auth.openid
  1456. staff_obj = StaffListModel.objects.filter(openid=staff_openid).first()
  1457. if staff_obj is None:
  1458. raise APIException({"detail": "Staff not exists"})
  1459. if staff_obj.staff_type != 'Admin' :
  1460. raise APIException({"detail": "Permission denied"})
  1461. if len(data['set_name']) > 45:
  1462. raise APIException({"detail": "The base name is set to more than 45 characters"})
  1463. if baseset.objects.filter(set_name=data['set_name'],
  1464. is_delete=False).exists():
  1465. raise APIException({"detail": "Data Exists"})
  1466. else:
  1467. serializer = self.get_serializer(data=data)
  1468. serializer.is_valid(raise_exception=True)
  1469. serializer.save()
  1470. headers = self.get_success_headers(serializer.data)
  1471. try:
  1472. log_success_operation(
  1473. request=self.request,
  1474. operation_content=f"创建基础设置:{data.get('set_name', '未知')}",
  1475. operation_level="new",
  1476. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1477. object_id=serializer.data.get('id'),
  1478. module_name="仓库管理"
  1479. )
  1480. except Exception as e:
  1481. pass
  1482. return Response(serializer.data, status=200, headers=headers)
  1483. def update(self, request, pk):
  1484. # 更新一个数据行
  1485. qs = self.get_object()
  1486. staff_openid = self.request.auth.openid
  1487. staff_obj = StaffListModel.objects.filter(openid=staff_openid).first()
  1488. if staff_obj is None:
  1489. raise APIException({"detail": "Staff not exists"})
  1490. if staff_obj.staff_type != 'Admin' :
  1491. raise APIException({"detail": "Permission denied"})
  1492. data = self.request.data
  1493. if len(data['set_name']) > 45:
  1494. raise APIException({"detail": "The base name is set to more than 45 characters"})
  1495. serializer = self.get_serializer(qs, data=data)
  1496. serializer.is_valid(raise_exception=True)
  1497. serializer.save()
  1498. headers = self.get_success_headers(serializer.data)
  1499. try:
  1500. log_success_operation(
  1501. request=self.request,
  1502. operation_content=f"更新基础设置 ID:{pk}:{data.get('set_name', '未知')}",
  1503. operation_level="update",
  1504. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1505. object_id=pk,
  1506. module_name="仓库管理"
  1507. )
  1508. except Exception as e:
  1509. pass
  1510. return Response(serializer.data, status=200, headers=headers)
  1511. def partial_update(self, request, pk):
  1512. # 部分更新一个数据行
  1513. qs = self.get_object()
  1514. try:
  1515. staff_openid = self.request.auth.openid
  1516. staff_obj = StaffListModel.objects.filter(openid=staff_openid).first()
  1517. if staff_obj is None:
  1518. log_failure_operation(
  1519. request=self.request,
  1520. operation_content=f"部分更新基础设置失败,员工不存在 ID:{pk}",
  1521. operation_level="update",
  1522. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1523. object_id=pk,
  1524. module_name="基础设置管理"
  1525. )
  1526. raise APIException({"detail": "Staff not exists"})
  1527. if staff_obj.staff_type != 'Admin':
  1528. log_failure_operation(
  1529. request=self.request,
  1530. operation_content=f"部分更新基础设置失败,权限不足 ID:{pk}",
  1531. operation_level="update",
  1532. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1533. object_id=pk,
  1534. module_name="基础设置管理"
  1535. )
  1536. raise APIException({"detail": "Permission denied"})
  1537. data = self.request.data
  1538. if len(data.get('set_name', '')) > 45:
  1539. log_failure_operation(
  1540. request=self.request,
  1541. operation_content=f"部分更新基础设置失败,设置名称超过45个字符:{data.get('set_name', '')}",
  1542. operation_level="update",
  1543. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1544. object_id=pk,
  1545. module_name="基础设置管理"
  1546. )
  1547. raise APIException({"detail": "The base name is set to more than 45 characters"})
  1548. serializer = self.get_serializer(qs, data=data, partial=True)
  1549. serializer.is_valid(raise_exception=True)
  1550. serializer.save()
  1551. headers = self.get_success_headers(serializer.data)
  1552. log_success_operation(
  1553. request=self.request,
  1554. operation_content=f"部分更新基础设置成功 ID:{pk}:{data.get('set_name', '未知')}",
  1555. operation_level="update",
  1556. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1557. object_id=pk,
  1558. module_name="基础设置管理"
  1559. )
  1560. return Response(serializer.data, status=200, headers=headers)
  1561. except APIException:
  1562. raise
  1563. except Exception as e:
  1564. log_failure_operation(
  1565. request=self.request,
  1566. operation_content=f"部分更新基础设置失败 ID:{pk}:{str(e)}",
  1567. operation_level="update",
  1568. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1569. object_id=pk,
  1570. module_name="基础设置管理"
  1571. )
  1572. raise
  1573. def destroy(self, request, pk):
  1574. # 逻辑删除一个数据行
  1575. qs = self.get_object()
  1576. set_name = getattr(qs, 'set_name', '未知')
  1577. try:
  1578. staff_openid = self.request.auth.openid
  1579. staff_obj = StaffListModel.objects.filter(openid=staff_openid).first()
  1580. if staff_obj is None:
  1581. log_failure_operation(
  1582. request=self.request,
  1583. operation_content=f"删除基础设置失败,员工不存在 ID:{pk}",
  1584. operation_level="delete",
  1585. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1586. object_id=pk,
  1587. module_name="基础设置管理"
  1588. )
  1589. raise APIException({"detail": "Staff not exists"})
  1590. if staff_obj.staff_type != 'Admin':
  1591. log_failure_operation(
  1592. request=self.request,
  1593. operation_content=f"删除基础设置失败,权限不足 ID:{pk}",
  1594. operation_level="delete",
  1595. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1596. object_id=pk,
  1597. module_name="基础设置管理"
  1598. )
  1599. raise APIException({"detail": "Permission denied"})
  1600. qs.is_delete = True
  1601. qs.save()
  1602. serializer = self.get_serializer(qs, many=False)
  1603. headers = self.get_success_headers(serializer.data)
  1604. log_success_operation(
  1605. request=self.request,
  1606. operation_content=f"删除基础设置成功,设置名称:{set_name}",
  1607. operation_level="delete",
  1608. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1609. object_id=pk,
  1610. module_name="基础设置管理"
  1611. )
  1612. return Response(serializer.data, status=200, headers=headers)
  1613. except APIException:
  1614. raise
  1615. except Exception as e:
  1616. log_failure_operation(
  1617. request=self.request,
  1618. operation_content=f"删除基础设置失败 ID:{pk}:{str(e)}",
  1619. operation_level="delete",
  1620. operator=self.request.auth.name if hasattr(self.request, 'auth') and self.request.auth else None,
  1621. object_id=pk,
  1622. module_name="基础设置管理"
  1623. )
  1624. raise