diff --git a/inventory-backend/app/extensions.py b/inventory-backend/app/extensions.py index 4e71948..4ee0efe 100644 --- a/inventory-backend/app/extensions.py +++ b/inventory-backend/app/extensions.py @@ -2,6 +2,7 @@ from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_cors import CORS from flask_jwt_extended import JWTManager # 确保引入了 JWTManager +from datetime import datetime, timezone, timedelta # 1. 创建扩展实例(此时未绑定具体的 App) db = SQLAlchemy() @@ -10,6 +11,11 @@ cors = CORS() jwt = JWTManager() # 必须实例化 +def beijing_time(): + """获取北京时间 (UTC+8)""" + return datetime.now(timezone(timedelta(hours=8))) + + # 2. 定义初始化函数 (供工厂函数 create_app 调用) def init_extensions(app): """ diff --git a/inventory-backend/app/models/audit.py b/inventory-backend/app/models/audit.py index 6176542..b574f37 100644 --- a/inventory-backend/app/models/audit.py +++ b/inventory-backend/app/models/audit.py @@ -1,5 +1,5 @@ # inventory-backend/app/models/audit.py -from app.extensions import db +from app.extensions import db, beijing_time from datetime import datetime @@ -25,7 +25,7 @@ class AuditLog(db.Model): url = db.Column(db.String(500)) # 请求URL status_code = db.Column(db.Integer) # 响应状态码 error_message = db.Column(db.Text) # 错误信息(如有) - created_at = db.Column(db.DateTime, default=datetime.now, index=True) # 操作时间 + created_at = db.Column(db.DateTime, default=beijing_time, index=True) # 操作时间 def to_dict(self): return { diff --git a/inventory-backend/app/models/inbound/service.py b/inventory-backend/app/models/inbound/service.py index 79b54ba..d59d2bb 100644 --- a/inventory-backend/app/models/inbound/service.py +++ b/inventory-backend/app/models/inbound/service.py @@ -1,5 +1,5 @@ # inventory-backend/app/models/inbound/service.py -from app.extensions import db +from app.extensions import db, beijing_time from datetime import datetime @@ -35,8 +35,8 @@ class StockService(db.Model): status = db.Column(db.String(20), default='active') # 时间与系统字段 - created_at = db.Column(db.DateTime, default=datetime.now, nullable=False) - updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) + created_at = db.Column(db.DateTime, default=beijing_time, nullable=False) + updated_at = db.Column(db.DateTime, default=beijing_time, onupdate=beijing_time) is_deleted = db.Column(db.Boolean, default=False) # ========================================================================== diff --git a/inventory-backend/app/models/inbound/stocktake.py b/inventory-backend/app/models/inbound/stocktake.py index feaf879..03c1864 100644 --- a/inventory-backend/app/models/inbound/stocktake.py +++ b/inventory-backend/app/models/inbound/stocktake.py @@ -1,4 +1,4 @@ -from app.extensions import db # .material -> .base refactor checked +from app.extensions import db, beijing_time # .material -> .base refactor checked from datetime import datetime class StocktakeDraft(db.Model): @@ -9,7 +9,7 @@ class StocktakeDraft(db.Model): uuid = db.Column(db.String(100)) # ★ 新增 quantity 字段 quantity = db.Column(db.Numeric(19, 4), default=1) - scan_time = db.Column(db.DateTime, default=datetime.now) + scan_time = db.Column(db.DateTime, default=beijing_time) def to_dict(self): return { diff --git a/inventory-backend/app/models/outbound.py b/inventory-backend/app/models/outbound.py index f9828a7..018d6ff 100644 --- a/inventory-backend/app/models/outbound.py +++ b/inventory-backend/app/models/outbound.py @@ -1,4 +1,4 @@ -from app.extensions import db +from app.extensions import db, beijing_time from datetime import datetime @@ -25,7 +25,7 @@ class TransOutbound(db.Model): # 签字与追溯 consumer_name = db.Column(db.String(100)) # 领用人/客户 signature_path = db.Column(db.Text) # 电子签名图片路径 - outbound_time = db.Column(db.DateTime, default=datetime.now) + outbound_time = db.Column(db.DateTime, default=beijing_time) operator_name = db.Column(db.String(100)) # 操作员 remark = db.Column(db.Text) diff --git a/inventory-backend/app/models/system.py b/inventory-backend/app/models/system.py index 3daa395..d1901e8 100644 --- a/inventory-backend/app/models/system.py +++ b/inventory-backend/app/models/system.py @@ -1,5 +1,5 @@ # inventory-backend/app/models/system.py -from app.extensions import db +from app.extensions import db, beijing_time from werkzeug.security import generate_password_hash, check_password_hash from datetime import datetime @@ -22,7 +22,7 @@ class SysUser(db.Model): role = db.Column(db.String(50)) status = db.Column(db.String(20), default='active') password_hash = db.Column(db.Text) - created_at = db.Column(db.DateTime, default=datetime.now) + created_at = db.Column(db.DateTime, default=beijing_time) def set_password(self, password): """生成加密密码""" @@ -76,7 +76,7 @@ class SysLog(db.Model): __tablename__ = 'sys_log' id = db.Column(db.Integer, primary_key=True) - op_time = db.Column(db.DateTime, default=datetime.now) + op_time = db.Column(db.DateTime, default=beijing_time) op_user_name = db.Column(db.String(100)) op_user_id = db.Column(db.String(50)) module_name = db.Column(db.String(100)) @@ -167,7 +167,7 @@ class SysWarehouseLocation(db.Model): full_path = db.Column(db.String(500)) # 完整路径,如 "A区/货架1/第3层" level = db.Column(db.Integer, default=0) # 层级深度,顶级为0 is_enabled = db.Column(db.Boolean, default=True) - created_at = db.Column(db.DateTime, default=datetime.now) + created_at = db.Column(db.DateTime, default=beijing_time) # 注意:数据库表中没有 updated_at 字段,不要添加! # 自关联 - 使用 backref 定义父节点的反向引用 diff --git a/inventory-backend/app/models/transaction.py b/inventory-backend/app/models/transaction.py index 32393fd..8bce544 100644 --- a/inventory-backend/app/models/transaction.py +++ b/inventory-backend/app/models/transaction.py @@ -1,4 +1,4 @@ -from app.extensions import db +from app.extensions import db, beijing_time from datetime import datetime from sqlalchemy import func @@ -14,7 +14,7 @@ class TransBorrow(db.Model): barcode = db.Column(db.String(100)) quantity = db.Column(db.Numeric(19, 4)) borrower_name = db.Column(db.String(100)) - borrow_time = db.Column(db.DateTime, default=datetime.now) + borrow_time = db.Column(db.DateTime, default=beijing_time) borrow_signature = db.Column(db.Text) expected_return_time = db.Column(db.DateTime) is_returned = db.Column(db.Boolean, default=False) @@ -110,7 +110,7 @@ class TransScrap(db.Model): quantity = db.Column(db.Numeric(19, 4)) reason = db.Column(db.Text) operator_name = db.Column(db.String(100)) - operation_time = db.Column(db.DateTime, default=datetime.now) + operation_time = db.Column(db.DateTime, default=beijing_time) approver_name = db.Column(db.String(100)) approval_status = db.Column(db.String(20), default='pending') cost_at_scrap = db.Column(db.Numeric(19, 4)) diff --git a/inventory-web/src/views/system/AuditLog.vue b/inventory-web/src/views/system/AuditLog.vue index 3b43eca..49812a5 100644 --- a/inventory-web/src/views/system/AuditLog.vue +++ b/inventory-web/src/views/system/AuditLog.vue @@ -53,7 +53,7 @@ {{ scope.row.module }} - + @@ -63,10 +63,10 @@