Compare commits
2 Commits
d7df1dea57
...
032479fe38
| Author | SHA1 | Date | |
|---|---|---|---|
| 032479fe38 | |||
| b08bbba718 |
@ -227,8 +227,8 @@ def delete_user(user_id):
|
||||
claims = get_jwt()
|
||||
operator_role = claims.get('role')
|
||||
|
||||
AuthService.delete_user(user_id, operator_role)
|
||||
return jsonify({'msg': '删除成功'}), 200
|
||||
username = AuthService.delete_user(user_id, operator_role)
|
||||
return jsonify({'msg': '删除成功', 'username': username}), 200
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"Delete User Failed: {str(e)}")
|
||||
return jsonify({'msg': str(e)}), 400
|
||||
|
||||
@ -222,7 +222,8 @@ def delete_bom(bom_no):
|
||||
db.session.commit()
|
||||
return jsonify({
|
||||
'code': 200,
|
||||
'msg': '删除成功'
|
||||
'msg': '删除成功',
|
||||
'bom_no': bom_no
|
||||
})
|
||||
except Exception as e:
|
||||
current_app.logger.error(f'删除BOM失败: {str(e)}')
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
# 文件路径: app/api/v1/inbound/base.py
|
||||
|
||||
from flask import Blueprint, request, jsonify, send_file, g, current_app
|
||||
from app.extensions import db
|
||||
from app.extensions import db, beijing_time
|
||||
from app.services.inbound.base_service import MaterialBaseService
|
||||
from app.utils.decorators import login_required, permission_required, audit_log
|
||||
from app.models.base import MaterialBase, MaterialWarningSetting
|
||||
@ -185,9 +185,8 @@ def export_data():
|
||||
file_stream = MaterialBaseService.export_excel(filters, user_permissions)
|
||||
|
||||
# 生成文件名:库存统计+年月日+时分秒 (北京时间 UTC+8)
|
||||
# 简单处理:UTC时间 + 8小时
|
||||
beijing_time = datetime.datetime.utcnow() + datetime.timedelta(hours=8)
|
||||
filename = f"库存统计_{beijing_time.strftime('%Y%m%d_%H%M%S')}.xlsx"
|
||||
bj_time = beijing_time()
|
||||
filename = f"库存统计_{bj_time.strftime('%Y%m%d_%H%M%S')}.xlsx"
|
||||
|
||||
# 发送文件
|
||||
# 注意:download_name 仅在较新 Flask 版本有效,旧版本可能需要手动 header,
|
||||
@ -331,8 +330,8 @@ def update(id):
|
||||
)
|
||||
def delete(id):
|
||||
try:
|
||||
MaterialBaseService.delete_material(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功"})
|
||||
material_name = MaterialBaseService.delete_material(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功", "material_name": material_name})
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
return jsonify({"code": 500, "msg": str(e)}), 500
|
||||
|
||||
@ -307,8 +307,8 @@ def update_buy(id):
|
||||
)
|
||||
def delete_buy(id):
|
||||
try:
|
||||
BuyInboundService.delete_inbound(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功"})
|
||||
material_name = BuyInboundService.delete_inbound(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功", "material_name": material_name})
|
||||
except Exception as e:
|
||||
return jsonify({"code": 500, "msg": str(e)}), 500
|
||||
|
||||
|
||||
@ -183,8 +183,8 @@ def update(id):
|
||||
)
|
||||
def delete(id):
|
||||
try:
|
||||
ProductInboundService.delete_inbound(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功"})
|
||||
material_name = ProductInboundService.delete_inbound(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功", "material_name": material_name})
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
return jsonify({"code": 500, "msg": str(e)}), 500
|
||||
|
||||
@ -178,8 +178,8 @@ def update_semi(id):
|
||||
)
|
||||
def delete_semi(id):
|
||||
try:
|
||||
SemiInboundService.delete_inbound(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功"})
|
||||
material_name = SemiInboundService.delete_inbound(id)
|
||||
return jsonify({"code": 200, "msg": "删除成功", "material_name": material_name})
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
return jsonify({"code": 500, "msg": str(e)}), 500
|
||||
|
||||
@ -266,10 +266,11 @@ def update_service(service_id):
|
||||
def delete_service(service_id):
|
||||
"""删除服务权益"""
|
||||
try:
|
||||
ServiceService.delete_service(service_id)
|
||||
service_name = ServiceService.delete_service(service_id)
|
||||
return jsonify({
|
||||
'code': 200,
|
||||
'msg': '删除成功'
|
||||
'msg': '删除成功',
|
||||
'service_name': service_name
|
||||
})
|
||||
except ValueError as e:
|
||||
return jsonify({'code': 404, 'msg': str(e)}), 404
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
from flask import Blueprint, request, jsonify
|
||||
from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
|
||||
from app.utils.decorators import permission_required
|
||||
from app.extensions import db
|
||||
from app.extensions import db, beijing_time
|
||||
from app.models.stock.adjustment import StockAdjustment
|
||||
from app.models.base import MaterialBase
|
||||
from app.models.inbound.buy import StockBuy
|
||||
@ -17,7 +17,7 @@ adjustment_bp = Blueprint('adjustment', __name__, url_prefix='/stock/adjustment'
|
||||
|
||||
def get_beijing_time():
|
||||
"""获取北京时间 (UTC+8)"""
|
||||
return datetime.utcnow() + timedelta(hours=8)
|
||||
return beijing_time()
|
||||
|
||||
|
||||
def generate_order_no():
|
||||
|
||||
@ -186,11 +186,11 @@ def delete_location(location_id):
|
||||
|
||||
delete_recursive(location)
|
||||
db.session.commit()
|
||||
|
||||
|
||||
return jsonify({
|
||||
'code': 200,
|
||||
'msg': '删除成功',
|
||||
'data': None
|
||||
'location_code': location.location_code
|
||||
})
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
|
||||
@ -16,8 +16,8 @@ redis_client = None
|
||||
|
||||
|
||||
def beijing_time():
|
||||
"""获取北京时间 (UTC+8)"""
|
||||
return datetime.now(timezone(timedelta(hours=8)))
|
||||
"""获取北京时间 (UTC+8),剥离时区信息以兼容数据库 naive DateTime 字段"""
|
||||
return datetime.now(timezone(timedelta(hours=8))).replace(tzinfo=None)
|
||||
|
||||
|
||||
# 2. 定义初始化函数 (供工厂函数 create_app 调用)
|
||||
|
||||
@ -317,9 +317,11 @@ class AuthService:
|
||||
if not user:
|
||||
raise Exception("用户不存在")
|
||||
|
||||
# 提前获取用户名用于审计日志
|
||||
username = user.username
|
||||
db.session.delete(user)
|
||||
db.session.commit()
|
||||
return True
|
||||
return username
|
||||
|
||||
@staticmethod
|
||||
def get_user_permissions(role_code):
|
||||
|
||||
@ -568,6 +568,9 @@ class MaterialBaseService:
|
||||
if not material:
|
||||
raise ValueError("数据不存在")
|
||||
|
||||
# 提前获取物料名称用于审计日志
|
||||
material_name = material.name
|
||||
|
||||
buy_usage_count = StockBuy.query.filter_by(base_id=m_id).count()
|
||||
semi_usage_count = StockSemi.query.filter_by(base_id=m_id).count()
|
||||
prod_usage_count = StockProduct.query.filter_by(base_id=m_id).count()
|
||||
@ -585,7 +588,7 @@ class MaterialBaseService:
|
||||
|
||||
db.session.delete(material)
|
||||
db.session.commit()
|
||||
return True
|
||||
return material_name
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
|
||||
@ -280,9 +280,11 @@ class BuyInboundService:
|
||||
try:
|
||||
stock = StockBuy.query.get(stock_id)
|
||||
if not stock: raise ValueError("记录不存在")
|
||||
# 提前获取物料名称用于审计日志
|
||||
material_name = stock.material_name
|
||||
db.session.delete(stock)
|
||||
db.session.commit()
|
||||
return True
|
||||
return material_name
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
raise e
|
||||
|
||||
@ -252,9 +252,12 @@ class ProductInboundService:
|
||||
try:
|
||||
stock = StockProduct.query.get(stock_id)
|
||||
if stock:
|
||||
# 提前获取物料名称用于审计日志
|
||||
material_name = stock.material_name
|
||||
db.session.delete(stock)
|
||||
db.session.commit()
|
||||
return True
|
||||
return material_name
|
||||
return None
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
raise e
|
||||
|
||||
@ -341,9 +341,11 @@ class SemiInboundService:
|
||||
stock = StockSemi.query.get(stock_id)
|
||||
if not stock:
|
||||
raise ValueError("记录不存在")
|
||||
# 提前获取物料名称用于审计日志
|
||||
material_name = stock.material_name
|
||||
db.session.delete(stock)
|
||||
db.session.commit()
|
||||
return True
|
||||
return material_name
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
raise e
|
||||
|
||||
@ -144,10 +144,12 @@ class ServiceService:
|
||||
def delete_service(cls, service_id):
|
||||
"""软删除"""
|
||||
service = cls.get_service(service_id)
|
||||
# 提前获取服务名称用于审计日志
|
||||
service_name = service.service_name
|
||||
service.is_deleted = True
|
||||
service.updated_at = datetime.now()
|
||||
db.session.commit()
|
||||
return True
|
||||
return service_name
|
||||
|
||||
@classmethod
|
||||
def get_service_list(cls, page=1, per_page=20, keyword=None,
|
||||
|
||||
@ -257,6 +257,23 @@ def audit_log(module: str, action: str = None, get_target_id_fn=None, get_target
|
||||
target_name = get_target_name_fn()
|
||||
except Exception:
|
||||
pass
|
||||
# 如果仍未获取到目标名称,尝试从响应 JSON 中常见字段获取
|
||||
if not target_name and hasattr(response, 'json'):
|
||||
resp_data = response.get_json()
|
||||
if resp_data and isinstance(resp_data, dict):
|
||||
# 优先从顶层获取
|
||||
for field in ['order_no', 'outbound_no', 'borrow_no', 'adjustment_no', 'material_name']:
|
||||
if field in resp_data:
|
||||
target_name = resp_data[field]
|
||||
break
|
||||
# 再尝试从 data 字段获取(部分 API 返回格式)
|
||||
if not target_name and 'data' in resp_data:
|
||||
data = resp_data['data']
|
||||
if isinstance(data, dict):
|
||||
for field in ['order_no', 'outbound_no', 'borrow_no', 'adjustment_no', 'material_name']:
|
||||
if field in data:
|
||||
target_name = data[field]
|
||||
break
|
||||
|
||||
# 获取 details
|
||||
details = None
|
||||
|
||||
Reference in New Issue
Block a user