新增订单收票付款交货跟进并完善使用升级手册

增加部分付款和部分交货状态、工作台筛选、权限校验、跟进记录及 v4 数据迁移;补充 Windows EXE 构建与验收脚本。附 16 页 PDF 使用升级手册及企业微信详细配置说明、生成脚本和测试截图。验证:76 项回归测试、EXE 浏览器验收与 PDF 逐页校验通过。
This commit is contained in:
reddaniel110
2026-09-16 13:40:43 +08:00
parent bf952196fa
commit 768b4705dc
28 changed files with 3783 additions and 43 deletions
+34 -1
View File
@@ -58,6 +58,10 @@ ROLE_TEXT = {
"approver": u"审批员",
}
INVOICE_STATUS = {'unknown': '未登记', 'pending': '未收票', 'received': '已收票'}
DELIVERY_STATUS = {'unknown': '未登记', 'pending': '未交货', 'partial': '部分交货', 'delivered': '已交货'}
PAYMENT_STATUS = {'unknown': '未登记', 'unpaid': '未付款', 'partial': '部分付款', 'paid': '已付款'}
class User(Base):
__tablename__ = "users"
@@ -135,6 +139,15 @@ class Order(Base):
approved_by_id = Column(Integer, ForeignKey('users.id'))
revision = Column(Integer, nullable=False, default=0)
row_version = Column(Integer, nullable=False, default=1)
needs_prepayment = Column(Boolean, nullable=False, default=False)
invoice_status = Column(String(20), nullable=False, default='pending')
delivery_status = Column(String(20), nullable=False, default='pending')
payment_status = Column(String(20), nullable=False, default='unpaid')
payment_date = Column(String(10), nullable=False, default='')
fulfillment_note = Column(Text, nullable=False, default='')
payment_note = Column(Text, nullable=False, default='')
fulfillment_revision = Column(Integer, nullable=False, default=-1)
payment_revision = Column(Integer, nullable=False, default=-1)
__mapper_args__ = {'version_id_col': row_version}
items = relationship("OrderItem", backref="order", cascade="all, delete-orphan",
@@ -151,6 +164,26 @@ class Order(Base):
def doc_type_text(self):
return DOC_TYPES.get(self.doc_type, self.doc_type)
@property
def invoice_status_text(self):
return INVOICE_STATUS.get(self.invoice_status, '未登记')
@property
def delivery_status_text(self):
return DELIVERY_STATUS.get(self.delivery_status, '未登记')
@property
def payment_status_text(self):
return PAYMENT_STATUS.get(self.payment_status, '未登记')
@property
def fulfillment_stale(self):
return self.fulfillment_revision >= 0 and self.fulfillment_revision != self.revision
@property
def payment_stale(self):
return self.payment_revision >= 0 and self.payment_revision != self.revision
class OrderItem(Base):
__tablename__ = "order_items"
@@ -244,5 +277,5 @@ def init_db(db_path):
Base.metadata.create_all(engine)
if not existed:
with engine.connect() as con:
con.exec_driver_sql('PRAGMA user_version=3')
con.exec_driver_sql('PRAGMA user_version=4')
return engine, sessionmaker(bind=engine)