feat: 为核心业务 API 全面挂载审计日志装饰器
This commit is contained in:
@ -4,7 +4,7 @@ from app.models.base import MaterialBase
|
|||||||
from app.models.bom import BomTable
|
from app.models.bom import BomTable
|
||||||
from app.extensions import db
|
from app.extensions import db
|
||||||
from flask_jwt_extended import jwt_required, get_jwt
|
from flask_jwt_extended import jwt_required, get_jwt
|
||||||
from app.utils.decorators import permission_required
|
from app.utils.decorators import permission_required, audit_log
|
||||||
from app.services.auth_service import AuthService
|
from app.services.auth_service import AuthService
|
||||||
|
|
||||||
bom_bp = Blueprint('bom', __name__)
|
bom_bp = Blueprint('bom', __name__)
|
||||||
@ -109,6 +109,11 @@ def get_bom_detail(bom_no):
|
|||||||
@bom_bp.route('/save', methods=['POST'])
|
@bom_bp.route('/save', methods=['POST'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@permission_required('bom_manage:operation')
|
@permission_required('bom_manage:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='BOM管理',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('bom_no') if request.get_json() else None
|
||||||
|
)
|
||||||
def save_bom():
|
def save_bom():
|
||||||
"""保存或更新 BOM 配方(支持自定义 bom_no 和 多版本)"""
|
"""保存或更新 BOM 配方(支持自定义 bom_no 和 多版本)"""
|
||||||
try:
|
try:
|
||||||
@ -191,6 +196,11 @@ def get_bom_with_stock_by_no(bom_no):
|
|||||||
@bom_bp.route('/<path:bom_no>', methods=['DELETE'])
|
@bom_bp.route('/<path:bom_no>', methods=['DELETE'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@permission_required('bom_manage:operation')
|
@permission_required('bom_manage:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='BOM管理',
|
||||||
|
action='删除',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('bom_no')
|
||||||
|
)
|
||||||
def delete_bom(bom_no):
|
def delete_bom(bom_no):
|
||||||
"""
|
"""
|
||||||
根据 BOM 编号删除
|
根据 BOM 编号删除
|
||||||
@ -243,6 +253,11 @@ def get_bom(parent_id):
|
|||||||
@bom_bp.route('', methods=['POST'])
|
@bom_bp.route('', methods=['POST'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
@permission_required('bom_manage:operation')
|
@permission_required('bom_manage:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='BOM管理',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('bom_no') if request.get_json() else None
|
||||||
|
)
|
||||||
def save_bom_legacy():
|
def save_bom_legacy():
|
||||||
try:
|
try:
|
||||||
req_data = request.get_json()
|
req_data = request.get_json()
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from flask import Blueprint, request, jsonify, send_file, g
|
from flask import Blueprint, request, jsonify, send_file, g
|
||||||
from app.services.inbound.base_service import MaterialBaseService
|
from app.services.inbound.base_service import MaterialBaseService
|
||||||
from app.utils.decorators import login_required, permission_required
|
from app.utils.decorators import login_required, permission_required, audit_log
|
||||||
import traceback
|
import traceback
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
@ -197,6 +197,11 @@ def export_data():
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@inbound_base_bp.route('/', methods=['POST'])
|
@inbound_base_bp.route('/', methods=['POST'])
|
||||||
@permission_required('material_list:operation')
|
@permission_required('material_list:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='基础信息管理',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('name') if request.get_json() else None
|
||||||
|
)
|
||||||
def create():
|
def create():
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -253,6 +258,12 @@ def create():
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@inbound_base_bp.route('/<int:id>', methods=['PUT'])
|
@inbound_base_bp.route('/<int:id>', methods=['PUT'])
|
||||||
@permission_required('material_list:operation')
|
@permission_required('material_list:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='基础信息管理',
|
||||||
|
action='修改',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id'),
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('name') if request.get_json() else None
|
||||||
|
)
|
||||||
def update(id):
|
def update(id):
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -302,6 +313,11 @@ def update(id):
|
|||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@inbound_base_bp.route('/<int:id>', methods=['DELETE'])
|
@inbound_base_bp.route('/<int:id>', methods=['DELETE'])
|
||||||
@permission_required('material_list:operation')
|
@permission_required('material_list:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='基础信息管理',
|
||||||
|
action='删除',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id')
|
||||||
|
)
|
||||||
def delete(id):
|
def delete(id):
|
||||||
try:
|
try:
|
||||||
MaterialBaseService.delete_material(id)
|
MaterialBaseService.delete_material(id)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from app.services.inbound.buy_service import BuyInboundService
|
from app.services.inbound.buy_service import BuyInboundService
|
||||||
from app.utils.decorators import permission_required
|
from app.utils.decorators import permission_required, audit_log
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
inbound_buy_bp = Blueprint('stock_buy', __name__)
|
inbound_buy_bp = Blueprint('stock_buy', __name__)
|
||||||
@ -155,6 +155,11 @@ def get_list():
|
|||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
@inbound_buy_bp.route('/submit', methods=['POST'])
|
@inbound_buy_bp.route('/submit', methods=['POST'])
|
||||||
@permission_required('inbound_buy:operation')
|
@permission_required('inbound_buy:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='采购入库',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def submit():
|
def submit():
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -224,6 +229,12 @@ def submit():
|
|||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
@inbound_buy_bp.route('/<int:id>', methods=['PUT'])
|
@inbound_buy_bp.route('/<int:id>', methods=['PUT'])
|
||||||
@permission_required('inbound_buy:operation')
|
@permission_required('inbound_buy:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='采购入库',
|
||||||
|
action='修改',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id'),
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def update_buy(id):
|
def update_buy(id):
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -283,6 +294,11 @@ def update_buy(id):
|
|||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
@inbound_buy_bp.route('/<int:id>', methods=['DELETE'])
|
@inbound_buy_bp.route('/<int:id>', methods=['DELETE'])
|
||||||
@permission_required('inbound_buy:operation')
|
@permission_required('inbound_buy:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='采购入库',
|
||||||
|
action='删除',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id')
|
||||||
|
)
|
||||||
def delete_buy(id):
|
def delete_buy(id):
|
||||||
try:
|
try:
|
||||||
BuyInboundService.delete_inbound(id)
|
BuyInboundService.delete_inbound(id)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
# inventory-backend/app/api/v1/inbound/product.py
|
# inventory-backend/app/api/v1/inbound/product.py
|
||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from app.services.inbound.product_service import ProductInboundService
|
from app.services.inbound.product_service import ProductInboundService
|
||||||
from app.utils.decorators import permission_required
|
from app.utils.decorators import permission_required, audit_log
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# === 这一行非常关键,绝对不能丢!===
|
# === 这一行非常关键,绝对不能丢!===
|
||||||
@ -123,6 +123,11 @@ def get_list():
|
|||||||
|
|
||||||
@inbound_product_bp.route('/submit', methods=['POST'])
|
@inbound_product_bp.route('/submit', methods=['POST'])
|
||||||
@permission_required('inbound_product:operation')
|
@permission_required('inbound_product:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='成品入库',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def submit():
|
def submit():
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -141,6 +146,12 @@ def submit():
|
|||||||
|
|
||||||
@inbound_product_bp.route('/<int:id>', methods=['PUT'])
|
@inbound_product_bp.route('/<int:id>', methods=['PUT'])
|
||||||
@permission_required('inbound_product:operation')
|
@permission_required('inbound_product:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='成品入库',
|
||||||
|
action='修改',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id'),
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def update(id):
|
def update(id):
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -158,6 +169,11 @@ def update(id):
|
|||||||
|
|
||||||
@inbound_product_bp.route('/<int:id>', methods=['DELETE'])
|
@inbound_product_bp.route('/<int:id>', methods=['DELETE'])
|
||||||
@permission_required('inbound_product:operation')
|
@permission_required('inbound_product:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='成品入库',
|
||||||
|
action='删除',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id')
|
||||||
|
)
|
||||||
def delete(id):
|
def delete(id):
|
||||||
try:
|
try:
|
||||||
ProductInboundService.delete_inbound(id)
|
ProductInboundService.delete_inbound(id)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
# inventory-backend/app/api/v1/inbound/semi.py
|
# inventory-backend/app/api/v1/inbound/semi.py
|
||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from app.services.inbound.semi_service import SemiInboundService
|
from app.services.inbound.semi_service import SemiInboundService
|
||||||
from app.utils.decorators import permission_required
|
from app.utils.decorators import permission_required, audit_log
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# === 这一行非常关键,绝对不能丢!===
|
# === 这一行非常关键,绝对不能丢!===
|
||||||
@ -118,6 +118,11 @@ def get_list():
|
|||||||
|
|
||||||
@inbound_semi_bp.route('/submit', methods=['POST'])
|
@inbound_semi_bp.route('/submit', methods=['POST'])
|
||||||
@permission_required('inbound_semi:operation')
|
@permission_required('inbound_semi:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='半成品入库',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def submit():
|
def submit():
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -136,6 +141,12 @@ def submit():
|
|||||||
|
|
||||||
@inbound_semi_bp.route('/<int:id>', methods=['PUT'])
|
@inbound_semi_bp.route('/<int:id>', methods=['PUT'])
|
||||||
@permission_required('inbound_semi:operation')
|
@permission_required('inbound_semi:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='半成品入库',
|
||||||
|
action='修改',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id'),
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def update_semi(id):
|
def update_semi(id):
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -153,6 +164,11 @@ def update_semi(id):
|
|||||||
|
|
||||||
@inbound_semi_bp.route('/<int:id>', methods=['DELETE'])
|
@inbound_semi_bp.route('/<int:id>', methods=['DELETE'])
|
||||||
@permission_required('inbound_semi:operation')
|
@permission_required('inbound_semi:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='半成品入库',
|
||||||
|
action='删除',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('id')
|
||||||
|
)
|
||||||
def delete_semi(id):
|
def delete_semi(id):
|
||||||
try:
|
try:
|
||||||
SemiInboundService.delete_inbound(id)
|
SemiInboundService.delete_inbound(id)
|
||||||
|
|||||||
@ -3,7 +3,7 @@ from flask import request, jsonify, current_app
|
|||||||
from flask_jwt_extended import jwt_required
|
from flask_jwt_extended import jwt_required
|
||||||
from . import inbound_bp
|
from . import inbound_bp
|
||||||
from app.services.inbound.service_service import ServiceService
|
from app.services.inbound.service_service import ServiceService
|
||||||
from app.utils.decorators import role_required, permission_required
|
from app.utils.decorators import role_required, permission_required, audit_log
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
|
||||||
@ -112,6 +112,11 @@ def get_service_list():
|
|||||||
|
|
||||||
@inbound_bp.route('/service', methods=['POST'])
|
@inbound_bp.route('/service', methods=['POST'])
|
||||||
@permission_required('inbound_service:operation')
|
@permission_required('inbound_service:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='服务权益',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def create_service():
|
def create_service():
|
||||||
"""创建服务权益"""
|
"""创建服务权益"""
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -188,6 +193,12 @@ def get_service(service_id):
|
|||||||
|
|
||||||
@inbound_bp.route('/service/<int:service_id>', methods=['PUT'])
|
@inbound_bp.route('/service/<int:service_id>', methods=['PUT'])
|
||||||
@permission_required('inbound_service:operation')
|
@permission_required('inbound_service:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='服务权益',
|
||||||
|
action='修改',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('service_id'),
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('material_name') if request.get_json() else None
|
||||||
|
)
|
||||||
def update_service(service_id):
|
def update_service(service_id):
|
||||||
"""更新服务权益"""
|
"""更新服务权益"""
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
@ -247,6 +258,11 @@ def update_service(service_id):
|
|||||||
|
|
||||||
@inbound_bp.route('/service/<int:service_id>', methods=['DELETE'])
|
@inbound_bp.route('/service/<int:service_id>', methods=['DELETE'])
|
||||||
@permission_required('inbound_service:operation')
|
@permission_required('inbound_service:operation')
|
||||||
|
@audit_log(
|
||||||
|
module='服务权益',
|
||||||
|
action='删除',
|
||||||
|
get_target_id_fn=lambda: request.view_args.get('service_id')
|
||||||
|
)
|
||||||
def delete_service(service_id):
|
def delete_service(service_id):
|
||||||
"""删除服务权益"""
|
"""删除服务权益"""
|
||||||
try:
|
try:
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from app.services.outbound_service import OutboundService
|
from app.services.outbound_service import OutboundService
|
||||||
from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
|
from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
|
||||||
from app.utils.decorators import permission_required
|
from app.utils.decorators import permission_required, audit_log
|
||||||
from app.services.auth_service import AuthService
|
from app.services.auth_service import AuthService
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
@ -107,6 +107,11 @@ def scan_barcode():
|
|||||||
# --------------------------------------------------------
|
# --------------------------------------------------------
|
||||||
@outbound_bp.route('', methods=['POST'])
|
@outbound_bp.route('', methods=['POST'])
|
||||||
@jwt_required()
|
@jwt_required()
|
||||||
|
@audit_log(
|
||||||
|
module='出库管理',
|
||||||
|
action='新增',
|
||||||
|
get_target_name_fn=lambda: request.get_json().get('order_no') if request.get_json() else None
|
||||||
|
)
|
||||||
def create_outbound():
|
def create_outbound():
|
||||||
# 权限检查:需要 outbound_create:operation 或 outbound_selection:operation 之一
|
# 权限检查:需要 outbound_create:operation 或 outbound_selection:operation 之一
|
||||||
claims = get_jwt()
|
claims = get_jwt()
|
||||||
|
|||||||
Reference in New Issue
Block a user