修复产品需规保存与表格布局问题

This commit is contained in:
汤学会
2026-06-15 10:52:23 +08:00
parent 867fc3beee
commit b024b061e9
4 changed files with 422 additions and 12 deletions
+83
View File
@@ -88,6 +88,87 @@ from app.services.system_permissions import list_employee_options
router = APIRouter(dependencies=[Depends(require_authenticated_user)])
DEFAULT_PROCESS_CODE = "PROC-DEFAULT"
DEFAULT_PROCESS_NAME = "系统默认工序"
DEFAULT_WORK_CENTER_CODE = "WC-DEFAULT"
DEFAULT_WORK_CENTER_NAME = "系统默认工作中心"
DEFAULT_ORG_ROOT_CODE = "ORG_ROOT"
def _default_operation_department(db: Session) -> Department:
department = db.scalar(select(Department).where(Department.dept_code == DEFAULT_ORG_ROOT_CODE).limit(1))
if department:
return department
department = db.scalar(select(Department).order_by(Department.id.asc()).limit(1))
if department:
return department
now = datetime.now()
department = Department(
dept_code=DEFAULT_ORG_ROOT_CODE,
dept_name="总公司",
parent_id=None,
org_node_type="COMPANY",
dept_type="ADMIN",
manager_name=None,
manager_employee_id=None,
status="ACTIVE",
sort_no=0,
remark="系统自动创建的默认组织根节点",
created_at=now,
updated_at=now,
)
db.add(department)
db.flush()
return department
def _ensure_default_operation_foundation(db: Session) -> None:
changed = False
now = datetime.now()
process_exists = db.scalar(select(Process.id).limit(1))
if not process_exists:
db.add(
Process(
process_code=DEFAULT_PROCESS_CODE,
process_name=DEFAULT_PROCESS_NAME,
process_type="INTERNAL",
is_report_required=1,
is_quality_gate=0,
status="ACTIVE",
remark="系统自动创建,用于产品需规快速建档时生成默认工艺路线",
created_at=now,
updated_at=now,
)
)
changed = True
work_center_exists = db.scalar(select(WorkCenter.id).limit(1))
if not work_center_exists:
department = _default_operation_department(db)
db.add(
WorkCenter(
center_code=DEFAULT_WORK_CENTER_CODE,
center_name=DEFAULT_WORK_CENTER_NAME,
dept_id=department.id,
center_type="INTERNAL",
shift_pattern="默认班次",
capacity_hours_per_day=Decimal("8.00"),
status="ACTIVE",
remark="系统自动创建,用于产品需规快速建档时生成默认工艺路线",
created_at=now,
updated_at=now,
)
)
changed = True
if changed:
try:
db.commit()
except IntegrityError:
db.rollback()
MATERIAL_EXCEL_HEADERS = ["原材料编码", "原材料名称", "材质", "规格", "废料单价", "性能要求", "状态"]
MATERIAL_EXCEL_REQUIRED_HEADERS = ["原材料名称", "材质", "规格"]
MATERIAL_STATUS_LABELS = {
@@ -597,6 +678,7 @@ def list_work_centers(
limit: int = Query(default=100, ge=1, le=500),
db: Session = Depends(get_db),
) -> list[WorkCenterRead]:
_ensure_default_operation_foundation(db)
stmt = (
select(
WorkCenter.id.label("id"),
@@ -766,6 +848,7 @@ def list_processes(
limit: int = Query(default=100, ge=1, le=500),
db: Session = Depends(get_db),
) -> list[ProcessRead]:
_ensure_default_operation_foundation(db)
rows = db.execute(
select(
Process.id.label("process_id"),
@@ -0,0 +1,59 @@
from __future__ import annotations
import unittest
from sqlalchemy import BigInteger, create_engine, func, select
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.orm import Session, sessionmaker
@compiles(BigInteger, "sqlite")
def _compile_bigint_for_sqlite(type_, compiler, **kw) -> str:
_ = type_, compiler, kw
return "INTEGER"
import app.models.master_data # noqa: E402,F401
import app.models.miniapp # noqa: E402,F401
import app.models.operations # noqa: E402,F401
import app.models.org # noqa: E402,F401
import app.models.planning # noqa: E402,F401
import app.models.sales # noqa: E402,F401
from app.api.routes import master_data # noqa: E402
from app.models.base import Base # noqa: E402
from app.models.operations import Process, WorkCenter # noqa: E402
from app.models.org import Department # noqa: E402
class MasterDataDefaultOperationFoundationTest(unittest.TestCase):
def setUp(self) -> None:
engine = create_engine("sqlite+pysqlite:///:memory:", future=True)
Base.metadata.create_all(engine)
self.SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True)
self.db: Session = self.SessionLocal()
def tearDown(self) -> None:
self.db.close()
def test_list_processes_seeds_default_process_for_empty_system(self) -> None:
self.assertEqual(self.db.scalar(select(func.count(Process.id))), 0)
rows = master_data.list_processes(limit=100, db=self.db)
self.assertEqual(len(rows), 1)
self.assertEqual(rows[0].process_code, "PROC-DEFAULT")
self.assertEqual(rows[0].process_name, "系统默认工序")
self.assertEqual(self.db.scalar(select(func.count(Process.id))), 1)
def test_list_work_centers_seeds_default_work_center_for_empty_system(self) -> None:
self.assertEqual(self.db.scalar(select(func.count(Department.id))), 0)
self.assertEqual(self.db.scalar(select(func.count(WorkCenter.id))), 0)
rows = master_data.list_work_centers(limit=100, db=self.db)
self.assertEqual(len(rows), 1)
self.assertEqual(rows[0].center_code, "WC-DEFAULT")
self.assertEqual(rows[0].center_name, "系统默认工作中心")
self.assertEqual(rows[0].dept_name, "总公司")
self.assertEqual(self.db.scalar(select(func.count(Department.id))), 1)
self.assertEqual(self.db.scalar(select(func.count(WorkCenter.id))), 1)