supplier.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. """Supplier API routes."""
  2. from flask_restx import Namespace, Resource, fields
  3. from app.services.supplier_service import SupplierService
  4. from app.utils.auth_decorator import require_auth
  5. supplier_ns = Namespace('suppliers', description='供应商管理接口')
  6. # API models for Swagger documentation
  7. supplier_model = supplier_ns.model('Supplier', {
  8. 'id': fields.Integer(readonly=True, description='供应商ID'),
  9. 'name': fields.String(required=True, description='供应商名称'),
  10. 'created_at': fields.String(readonly=True, description='创建时间'),
  11. 'updated_at': fields.String(readonly=True, description='更新时间')
  12. })
  13. supplier_input = supplier_ns.model('SupplierInput', {
  14. 'name': fields.String(required=True, description='供应商名称')
  15. })
  16. supplier_update = supplier_ns.model('SupplierUpdate', {
  17. 'id': fields.Integer(required=True, description='供应商ID'),
  18. 'name': fields.String(description='供应商名称')
  19. })
  20. supplier_delete = supplier_ns.model('SupplierDelete', {
  21. 'id': fields.Integer(required=True, description='供应商ID')
  22. })
  23. # Response models
  24. success_response = supplier_ns.model('SuccessResponse', {
  25. 'success': fields.Boolean(description='操作是否成功'),
  26. 'data': fields.Raw(description='返回数据'),
  27. 'message': fields.String(description='消息')
  28. })
  29. error_response = supplier_ns.model('ErrorResponse', {
  30. 'success': fields.Boolean(description='操作是否成功'),
  31. 'error': fields.String(description='错误信息'),
  32. 'code': fields.String(description='错误代码')
  33. })
  34. @supplier_ns.route('')
  35. class SupplierList(Resource):
  36. """Resource for listing all suppliers."""
  37. @supplier_ns.doc('list_suppliers')
  38. @supplier_ns.response(200, 'Success', success_response)
  39. @require_auth
  40. def get(self):
  41. """获取所有供应商列表"""
  42. suppliers = SupplierService.get_all()
  43. return {
  44. 'success': True,
  45. 'data': suppliers,
  46. 'message': 'Suppliers retrieved successfully'
  47. }, 200
  48. @supplier_ns.route('/<int:id>')
  49. @supplier_ns.param('id', '供应商ID')
  50. class SupplierDetail(Resource):
  51. """Resource for getting a single supplier."""
  52. @supplier_ns.doc('get_supplier')
  53. @supplier_ns.response(200, 'Success', success_response)
  54. @supplier_ns.response(404, 'Supplier not found', error_response)
  55. @require_auth
  56. def get(self, id):
  57. """根据ID获取供应商信息"""
  58. supplier, error = SupplierService.get_by_id(id)
  59. if error:
  60. return {
  61. 'success': False,
  62. 'error': error,
  63. 'code': 'NOT_FOUND'
  64. }, 404
  65. return {
  66. 'success': True,
  67. 'data': supplier,
  68. 'message': 'Supplier retrieved successfully'
  69. }, 200
  70. @supplier_ns.route('/create')
  71. class SupplierCreate(Resource):
  72. """Resource for creating a supplier."""
  73. @supplier_ns.doc('create_supplier')
  74. @supplier_ns.expect(supplier_input)
  75. @supplier_ns.response(200, 'Success', success_response)
  76. @supplier_ns.response(400, 'Validation error', error_response)
  77. @require_auth
  78. def post(self):
  79. """创建新供应商"""
  80. data = supplier_ns.payload
  81. name = data.get('name', '')
  82. supplier, error = SupplierService.create(name)
  83. if error:
  84. code = 'DUPLICATE_NAME' if '已存在' in error else 'VALIDATION_ERROR'
  85. return {
  86. 'success': False,
  87. 'error': error,
  88. 'code': code
  89. }, 400
  90. return {
  91. 'success': True,
  92. 'data': supplier,
  93. 'message': 'Supplier created successfully'
  94. }, 200
  95. @supplier_ns.route('/update')
  96. class SupplierUpdate(Resource):
  97. """Resource for updating a supplier."""
  98. @supplier_ns.doc('update_supplier')
  99. @supplier_ns.expect(supplier_update)
  100. @supplier_ns.response(200, 'Success', success_response)
  101. @supplier_ns.response(400, 'Validation error', error_response)
  102. @supplier_ns.response(404, 'Supplier not found', error_response)
  103. @require_auth
  104. def post(self):
  105. """更新供应商信息"""
  106. data = supplier_ns.payload
  107. supplier_id = data.get('id')
  108. name = data.get('name')
  109. if not supplier_id:
  110. return {
  111. 'success': False,
  112. 'error': 'Supplier ID is required',
  113. 'code': 'VALIDATION_ERROR'
  114. }, 400
  115. supplier, error = SupplierService.update(supplier_id, name)
  116. if error:
  117. if '未找到' in error:
  118. return {
  119. 'success': False,
  120. 'error': error,
  121. 'code': 'NOT_FOUND'
  122. }, 404
  123. code = 'DUPLICATE_NAME' if '已存在' in error else 'VALIDATION_ERROR'
  124. return {
  125. 'success': False,
  126. 'error': error,
  127. 'code': code
  128. }, 400
  129. return {
  130. 'success': True,
  131. 'data': supplier,
  132. 'message': 'Supplier updated successfully'
  133. }, 200
  134. @supplier_ns.route('/delete')
  135. class SupplierDelete(Resource):
  136. """Resource for deleting a supplier."""
  137. @supplier_ns.doc('delete_supplier')
  138. @supplier_ns.expect(supplier_delete)
  139. @supplier_ns.response(200, 'Success', success_response)
  140. @supplier_ns.response(400, 'Cannot delete', error_response)
  141. @supplier_ns.response(404, 'Supplier not found', error_response)
  142. @require_auth
  143. def post(self):
  144. """删除供应商"""
  145. data = supplier_ns.payload
  146. supplier_id = data.get('id')
  147. if not supplier_id:
  148. return {
  149. 'success': False,
  150. 'error': 'Supplier ID is required',
  151. 'code': 'VALIDATION_ERROR'
  152. }, 400
  153. success, error = SupplierService.delete(supplier_id)
  154. if error:
  155. if '未找到' in error:
  156. return {
  157. 'success': False,
  158. 'error': error,
  159. 'code': 'NOT_FOUND'
  160. }, 404
  161. return {
  162. 'success': False,
  163. 'error': error,
  164. 'code': 'FOREIGN_KEY_VIOLATION'
  165. }, 400
  166. return {
  167. 'success': True,
  168. 'data': None,
  169. 'message': 'Supplier deleted successfully'
  170. }, 200