YueYunyun 3 kuukautta sitten
vanhempi
commit
daa3f61030

+ 121 - 91
SourceCode/IntelligentRailwayCosting/.script/init_sqlserver.sql

@@ -1,106 +1,136 @@
--- 创建数据库
-CREATE DATABASE iwb_railway_costing_v1;
+IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'iwb_railway_costing_v1')
+BEGIN
+    CREATE DATABASE iwb_railway_costing_v1
+END
 GO
 GO
 
 
-USE iwb_railway_costing_v1;
+USE iwb_railway_costing_v1
 GO
 GO
 
 
--- 创建项目任务表
-CREATE TABLE project_task (
-    id INT IDENTITY(1,1) PRIMARY KEY,
-    task_name NVARCHAR(255) NOT NULL, -- 任务名称
-    task_desc NVARCHAR(1000), -- 任务描述
-    project_id NVARCHAR(50) NOT NULL, -- 项目编号
-    budget_id INT NOT NULL DEFAULT 0, -- 概算序号
-    item_id INT NOT NULL, -- 条目序号
-    item_code NVARCHAR(255) NOT NULL, -- 条目编号
-    file_path TEXT, -- 文件路径
-    collect_status TINYINT NOT NULL DEFAULT 0, -- 采集状态(0:未开始, 1:进行中, 2:已完成, 3:采集失败)
-    collect_time DATETIME, -- 采集时间
-    collect_error TEXT, -- 采集错误信息
-    process_status TINYINT NOT NULL DEFAULT 0, -- 处理状态(0:未处理,1:处理中, 2:已处理, 3:处理失败)
-    process_time DATETIME, -- 处理时间
-    process_error TEXT, -- 处理错误信息
-    send_status TINYINT NOT NULL DEFAULT 0, -- 发送状态(0:未发送,1:发送中 ,2:已发送, 3:发送失败)
-    send_time DATETIME, -- 发送时间
-    send_error TEXT, -- 发送错误信息
-    is_del TINYINT NOT NULL DEFAULT 0, -- 是否删除(0:否, 1:是)
-    deleted_by NVARCHAR(50), -- 删除人
-    deleted_at DATETIME, -- 删除时间
-    created_by NVARCHAR(50), -- 创建人
-    created_at DATETIME , -- 创建时间
-    updated_by NVARCHAR(50), -- 更新人
-    updated_at DATETIME -- 更新时间
-);
+USE iwb_railway_costing_v1
 GO
 GO
 
 
--- 创建索引
-CREATE INDEX idx_project_id ON project_task (project_id);
-CREATE INDEX idx_budget_id ON project_task (budget_id);
-CREATE INDEX idx_item_id ON project_task (item_id);
-CREATE INDEX idx_item_code ON project_task (item_code);
-CREATE INDEX idx_created_at ON project_task (created_at);
+-- -- 删除项目任务表
+-- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[project_task]') AND type in (N'U'))
+-- BEGIN
+--     DROP TABLE [dbo].[project_task]
+-- END
+-- GO
+
+-- -- 删除项目定额表
+-- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[project_quota]') AND type in (N'U'))
+-- BEGIN
+--     DROP TABLE [dbo].[project_quota]
+-- END
+-- GO
+
+-- -- 删除日志表
+-- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_log]') AND type in (N'U'))
+-- BEGIN
+--     DROP TABLE [dbo].[sys_log]
+-- END
+-- GO
+
+
+-- 创建项目任务表
+IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[project_task]') AND type in (N'U'))
+BEGIN
+CREATE TABLE [dbo].[project_task] (
+    [id] INT IDENTITY(1,1) PRIMARY KEY,
+    [task_name] NVARCHAR(255) NOT NULL,
+    [task_desc] NVARCHAR(1000) NULL,
+    [project_id] NVARCHAR(50) NOT NULL,
+    [budget_id] INT DEFAULT 0,
+    [item_id] INT NOT NULL,
+    [item_code] NVARCHAR(255) NOT NULL,
+    [file_path] NVARCHAR(MAX) NULL,
+    [collect_status] INT NOT NULL DEFAULT 0,
+    [collect_time] DATETIME NULL,
+    [collect_error] NVARCHAR(1000) NULL,
+    [process_status] INT NOT NULL DEFAULT 0,
+    [process_time] DATETIME NULL,
+    [process_error] NVARCHAR(1000) NULL,
+    [send_status] INT NOT NULL DEFAULT 0,
+    [send_time] DATETIME NULL,
+    [send_error] NVARCHAR(1000) NULL,
+    [is_del] INT NOT NULL DEFAULT 0,
+    [deleted_by] NVARCHAR(50) NULL,
+    [deleted_at] DATETIME NULL,
+    [created_by] NVARCHAR(50) NULL,
+    [created_at] DATETIME NOT NULL DEFAULT GETDATE(),
+    [updated_by] NVARCHAR(50) NULL,
+    [updated_at] DATETIME NOT NULL DEFAULT GETDATE()
+)
+
+CREATE INDEX [idx_project_id] ON [dbo].[project_task] ([project_id])
+CREATE INDEX [idx_budget_id] ON [dbo].[project_task] ([budget_id])
+CREATE INDEX [idx_item_id] ON [dbo].[project_task] ([item_id])
+CREATE INDEX [idx_item_code] ON [dbo].[project_task] ([item_code])
+CREATE INDEX [idx_created_at] ON [dbo].[project_task] ([created_at])
+END
 GO
 GO
 
 
 -- 创建项目定额表
 -- 创建项目定额表
-CREATE TABLE project_quota (
-    id INT IDENTITY(1,1) PRIMARY KEY,
-    task_id INT NOT NULL, -- 任务编号
-    project_id NVARCHAR(50) NOT NULL, -- 项目编号
-    budget_id INT NOT NULL, -- 概算序号
-    item_id INT NOT NULL, -- 条目序号
-    item_code NVARCHAR(255) NOT NULL, -- 条目编号
-    quota_code NVARCHAR(50), -- 定额编号
-    project_name NVARCHAR(255), -- 工程或费用项目名称
-    unit NVARCHAR(20), -- 单位
-    project_quantity FLOAT, -- 工程数量
-    project_quantity_input NVARCHAR(1000), -- 工程数量输入
-    quota_adjustment NVARCHAR(1000), -- 定额调整
-    unit_price FLOAT, -- 单价
-    total_price FLOAT, -- 合价
-    unit_weight FLOAT, -- 单重
-    total_weight FLOAT, -- 合重
-    labor_cost FLOAT, -- 人工费
-    process_status TINYINT NOT NULL DEFAULT 0, -- 处理状态(0:未处理,1:处理中, 2:已处理, 3:处理失败)
-    process_time DATETIME, -- 处理时间
-    process_error TEXT, -- 处理错误信息
-    send_status TINYINT NOT NULL DEFAULT 0, -- 发送状态(0:未发送,1:发送中 ,2:已发送, 3:发送失败)
-    send_time DATETIME, -- 发送时间
-    send_error TEXT, -- 发送错误信息
-    is_del TINYINT NOT NULL DEFAULT 0, -- 是否删除(0:否, 1:是)
-    deleted_by NVARCHAR(50), -- 删除人
-    deleted_at DATETIME, -- 删除时间
-    created_by NVARCHAR(50), -- 创建人
-    created_at DATETIME , -- 创建时间
-    updated_by NVARCHAR(50), -- 更新人
-    updated_at DATETIME  -- 更新时间
-);
-GO
+IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[project_quota]') AND type in (N'U'))
+BEGIN
+CREATE TABLE [dbo].[project_quota] (
+    [id] INT IDENTITY(1,1) PRIMARY KEY,
+    [task_id] INT NOT NULL,
+    [project_id] NVARCHAR(50) NOT NULL,
+    [budget_id] INT NOT NULL,
+    [item_id] INT NOT NULL,
+    [item_code] NVARCHAR(255) NOT NULL,
+    [quota_code] NVARCHAR(50) NULL,
+    [project_name] NVARCHAR(255) NULL,
+    [unit] NVARCHAR(20) NULL,
+    [project_quantity] FLOAT NULL,
+    [project_quantity_input] NVARCHAR(1000) NULL,
+    [quota_adjustment] NVARCHAR(1000) NULL,
+    [unit_price] FLOAT NULL,
+    [total_price] FLOAT NULL,
+    [unit_weight] FLOAT NULL,
+    [total_weight] FLOAT NULL,
+    [labor_cost] FLOAT NULL,
+    [process_status] INT NOT NULL DEFAULT 0,
+    [process_time] DATETIME NULL,
+    [process_error] NVARCHAR(1000) NULL,
+    [send_status] INT NOT NULL DEFAULT 0,
+    [send_time] DATETIME NULL,
+    [send_error] NVARCHAR(1000) NULL,
+    [is_del] INT NOT NULL DEFAULT 0,
+    [deleted_by] NVARCHAR(50) NULL,
+    [deleted_at] DATETIME NULL,
+    [created_by] NVARCHAR(50) NULL,
+    [created_at] DATETIME NOT NULL DEFAULT GETDATE(),
+    [updated_by] NVARCHAR(50) NULL,
+    [updated_at] DATETIME NOT NULL DEFAULT GETDATE()
+)
 
 
--- 创建索引
-CREATE INDEX idx_project_id ON project_quota (project_id);
-CREATE INDEX idx_budget_id ON project_quota (budget_id);
-CREATE INDEX idx_item_id ON project_quota (item_id);
-CREATE INDEX idx_item_code ON project_quota (item_code);
-CREATE INDEX idx_created_at ON project_quota (created_at);
+CREATE INDEX [idx_project_id] ON [dbo].[project_quota] ([project_id])
+CREATE INDEX [idx_budget_id] ON [dbo].[project_quota] ([budget_id])
+CREATE INDEX [idx_item_id] ON [dbo].[project_quota] ([item_id])
+CREATE INDEX [idx_item_code] ON [dbo].[project_quota] ([item_code])
+CREATE INDEX [idx_created_at] ON [dbo].[project_quota] ([created_at])
+END
 GO
 GO
 
 
 -- 创建日志表
 -- 创建日志表
-CREATE TABLE sys_log (
-    id INT IDENTITY(1,1) PRIMARY KEY,
-    username NVARCHAR(255) NOT NULL, -- 用户名
-    operation_type NVARCHAR(50) NOT NULL, -- 操作类型
-    operation_desc NVARCHAR(1000), -- 操作描述
-    operation_result TINYINT, -- 操作结果(0:失败, 1:成功)
-    operation_module NVARCHAR(100), -- 操作模块
-    operation_data NVARCHAR(MAX), -- 操作数据
-    data_changes NVARCHAR(MAX), -- 数据变更记录
-    operation_ip NVARCHAR(50), -- 操作IP
-    created_at DATETIME NOT NULL DEFAULT GETDATE() -- 创建时间
-);
-GO
+IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sys_log]') AND type in (N'U'))
+BEGIN
+CREATE TABLE [dbo].[sys_log] (
+    [id] INT IDENTITY(1,1) PRIMARY KEY,
+    [username] NVARCHAR(255) NOT NULL,
+    [operation_type] NVARCHAR(50) NOT NULL,
+    [operation_desc] NVARCHAR(1000) NULL,
+    [operation_result] INT NULL,
+    [operation_module] NVARCHAR(100) NULL,
+    [operation_data] NVARCHAR(MAX) NULL,
+    [data_changes] NVARCHAR(MAX) NULL,
+    [operation_ip] NVARCHAR(50) NULL,
+    [created_at] DATETIME NOT NULL DEFAULT GETDATE()
+)
 
 
--- 创建索引
-CREATE INDEX idx_username ON sys_log (username);
-CREATE INDEX idx_created_at ON sys_log (created_at);
+CREATE INDEX [idx_username] ON [dbo].[sys_log] ([username])
+CREATE INDEX [idx_created_at] ON [dbo].[sys_log] ([created_at])
+END
 GO
 GO

+ 1 - 1
SourceCode/IntelligentRailwayCosting/app/core/dtos/project_task.py

@@ -72,6 +72,6 @@ class ProjectTaskDto(BaseModel):
         return self.model_dump()
         return self.model_dump()
 
 
     def get_path(self):
     def get_path(self):
-        return f"{self.project_id}_{self.budget_id}_{self.item_id}_{self.id}"
+        return f"{self.project_id}_{self.item_id}({self.item_code})_{self.id}"
     class Config:
     class Config:
         from_attributes = True
         from_attributes = True

+ 0 - 2
SourceCode/IntelligentRailwayCosting/app/core/dtos/quota_input.py

@@ -141,8 +141,6 @@ class QuotaInputDto(BaseModel):
             # quota_comprehensive_total_price=quota_dto.quota_comprehensive_total_price
             # quota_comprehensive_total_price=quota_dto.quota_comprehensive_total_price
         )
         )
 
 
-
-
     def to_dict(self) -> dict:
     def to_dict(self) -> dict:
         """转换为字典格式"""
         """转换为字典格式"""
         return self.model_dump()
         return self.model_dump()

+ 3 - 2
SourceCode/IntelligentRailwayCosting/app/services/project_task.py

@@ -67,7 +67,7 @@ class ProjectTaskService:
             dict: 包含总数和任务列表的字典
             dict: 包含总数和任务列表的字典
         """
         """
         try:
         try:
-            data =  self.store.get_tasks_paginated(
+            data =  self.store.get_tasks_paginated_bk(
                 budget_id=budget_id,
                 budget_id=budget_id,
                 project_id=project_id,
                 project_id=project_id,
                 item_code=item_code,
                 item_code=item_code,
@@ -123,7 +123,8 @@ class ProjectTaskService:
         try:
         try:
             if task:
             if task:
                 paths = self._process_file_upload(task, files, delete_old)
                 paths = self._process_file_upload(task, files, delete_old)
-                self.store.update_task_files(task.id,paths)
+                if paths != task.file_path:
+                    self.store.update_task_files(task.id,paths)
                 if task_id == 0:
                 if task_id == 0:
                     LogRecordHelper.log_success(OperationType.CREATE, OperationModule.TASK,
                     LogRecordHelper.log_success(OperationType.CREATE, OperationModule.TASK,
                                                 f"创建任务成功 任务:{task.task_name}", utils.to_str(task.to_dict()))
                                                 f"创建任务成功 任务:{task.task_name}", utils.to_str(task.to_dict()))

+ 1 - 1
SourceCode/IntelligentRailwayCosting/app/services/user.py

@@ -1,4 +1,4 @@
-from stores.user import UserStore
+from stores import UserStore
 from core.dtos import UserDto
 from core.dtos import UserDto
 class UserService:
 class UserService:
     def __init__(self):
     def __init__(self):

+ 2 - 1
SourceCode/IntelligentRailwayCosting/app/stores/__init__.py

@@ -1,4 +1,5 @@
-from stores.railway_costing_mysql import LogStore,ProjectQuotaStore,ProjectTaskStore
+# from stores.railway_costing_mysql import LogStore,ProjectQuotaStore,ProjectTaskStore
+from stores.railway_costing_sqlserver import LogStore,ProjectQuotaStore,ProjectTaskStore
 
 
 from .user import UserStore
 from .user import UserStore
 from .project import ProjectStore
 from .project import ProjectStore

+ 1 - 4
SourceCode/IntelligentRailwayCosting/app/stores/railway_costing_sqlserver/log.py

@@ -33,7 +33,6 @@ class LogStore:
         :param end_time: 结束时间
         :param end_time: 结束时间
         :return: 包含总记录数和日志列表的字典
         :return: 包含总记录数和日志列表的字典
         """
         """
-        # with db_helper.mysql_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
             pass
             pass
             query = db_session.query(LogModel)
             query = db_session.query(LogModel)
@@ -60,7 +59,7 @@ class LogStore:
             total = query.count()
             total = query.count()
 
 
             # 分页并按创建时间倒序排序
             # 分页并按创建时间倒序排序
-            logs = query.order_by(desc(LogModel.created_at))\
+            logs = query.order_by(LogModel.created_at.desc())\
                 .offset((page - 1) * page_size)\
                 .offset((page - 1) * page_size)\
                 .limit(page_size)\
                 .limit(page_size)\
                 .all()
                 .all()
@@ -103,7 +102,6 @@ class LogStore:
             data_changes=data_changes,
             data_changes=data_changes,
             operation_ip=operation_ip
             operation_ip=operation_ip
         )
         )
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             db_session.add(log)
             db_session.add(log)
             return log
             return log
@@ -115,7 +113,6 @@ class LogStore:
         :return: 创建的日志记录列表
         :return: 创建的日志记录列表
         """
         """
         log_models = [LogModel(**log) for log in logs]
         log_models = [LogModel(**log) for log in logs]
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             db_session.add_all(log_models)
             db_session.add_all(log_models)
             return log_models
             return log_models

+ 5 - 14
SourceCode/IntelligentRailwayCosting/app/stores/railway_costing_sqlserver/project_quota.py

@@ -45,7 +45,6 @@ class ProjectQuotaStore:
         Returns:
         Returns:
             Tuple[total_count, quotas]
             Tuple[total_count, quotas]
         """
         """
-        # with db_helper.mysql_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
             query = db_session.query(ProjectQuotaModel)
             query = db_session.query(ProjectQuotaModel)
 
 
@@ -72,7 +71,7 @@ class ProjectQuotaStore:
             total_count = query.count()
             total_count = query.count()
 
 
             # 分页
             # 分页
-            query = query.offset((page - 1) * page_size).limit(page_size)
+            query = query.order_by(ProjectQuotaModel.created_at.desc()).offset((page - 1) * page_size).limit(page_size)
 
 
             quotas = query.all()
             quotas = query.all()
 
 
@@ -83,8 +82,7 @@ class ProjectQuotaStore:
 
 
 
 
     def get_quotas_by_task_id(self,task_id:int, with_quota_code:bool=False):
     def get_quotas_by_task_id(self,task_id:int, with_quota_code:bool=False):
-        # with db_helper.sqlserver_query_session(self._database) as db_session:
-        with db_helper.mysql_query_session(self._database) as db_session:
+        with db_helper.sqlserver_query_session(self._database) as db_session:
             query = db_session.query(ProjectQuotaModel).filter(
             query = db_session.query(ProjectQuotaModel).filter(
                 and_(
                 and_(
                     ProjectQuotaModel.task_id == task_id,
                     ProjectQuotaModel.task_id == task_id,
@@ -107,7 +105,6 @@ class ProjectQuotaStore:
         Returns:
         Returns:
             Optional[ProjectQuotaDto]
             Optional[ProjectQuotaDto]
         """
         """
-        # with db_helper.mysql_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
             quota = db_session.query(ProjectQuotaModel).filter(
             quota = db_session.query(ProjectQuotaModel).filter(
                 and_(
                 and_(
@@ -138,7 +135,6 @@ class ProjectQuotaStore:
         Returns:
         Returns:
             ProjectQuotaDto
             ProjectQuotaDto
         """
         """
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             quota = ProjectQuotaModel(
             quota = ProjectQuotaModel(
                 project_id=quota_dto.project_id,
                 project_id=quota_dto.project_id,
@@ -183,7 +179,6 @@ class ProjectQuotaStore:
 
 
         if not quota:
         if not quota:
             return None
             return None
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             quota.quota_code = quota_dto.quota_code
             quota.quota_code = quota_dto.quota_code
             quota.project_name = quota_dto.project_name
             quota.project_name = quota_dto.project_name
@@ -216,12 +211,11 @@ class ProjectQuotaStore:
         if not quota:
         if not quota:
             return False
             return False
 
 
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             quota.is_del = 1
             quota.is_del = 1
             quota.deleted_by = self.current_user.username
             quota.deleted_by = self.current_user.username
             quota.deleted_at = datetime.now()
             quota.deleted_at = datetime.now()
-            quota = db_session.merge(quota)
+            db_session.merge(quota)
             return True
             return True
 
 
     def update_process_status(self,quota_id:int, status:int, err:str = None):
     def update_process_status(self,quota_id:int, status:int, err:str = None):
@@ -237,12 +231,11 @@ class ProjectQuotaStore:
         quota = self.get_quota(quota_id)
         quota = self.get_quota(quota_id)
         if not quota:
         if not quota:
             return False
             return False
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             quota.process_status = status
             quota.process_status = status
             quota.process_error = err
             quota.process_error = err
             quota.process_time = datetime.now()
             quota.process_time = datetime.now()
-            quota = db_session.merge(quota)
+            db_session.merge(quota)
             return True
             return True
 
 
     def update_send_status(self,quota_id:int, status:int, err:str = None) -> bool:
     def update_send_status(self,quota_id:int, status:int, err:str = None) -> bool:
@@ -258,12 +251,11 @@ class ProjectQuotaStore:
         quota = self.get_quota(quota_id)
         quota = self.get_quota(quota_id)
         if not quota:
         if not quota:
             return False
             return False
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             quota.send_status = status
             quota.send_status = status
             quota.send_error = err
             quota.send_error = err
             quota.send_time = datetime.now()
             quota.send_time = datetime.now()
-            quota = db_session.merge(quota)
+            db_session.merge(quota)
             return True
             return True
 
 
     def update_quota_code(self, quota_dto: ProjectQuotaDto):
     def update_quota_code(self, quota_dto: ProjectQuotaDto):
@@ -276,7 +268,6 @@ class ProjectQuotaStore:
         quota = self.get_quota(quota_dto.id)
         quota = self.get_quota(quota_dto.id)
         if not quota:
         if not quota:
             return False
             return False
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             quota.quota_code = quota_dto.quota_code
             quota.quota_code = quota_dto.quota_code
             quota.unit = quota_dto.unit
             quota.unit = quota_dto.unit

+ 67 - 19
SourceCode/IntelligentRailwayCosting/app/stores/railway_costing_sqlserver/project_task.py

@@ -19,8 +19,68 @@ class ProjectTaskStore:
         if self._current_user is None:
         if self._current_user is None:
             self._current_user = UserSession.get_current_user()
             self._current_user = UserSession.get_current_user()
         return self._current_user
         return self._current_user
-
     def get_tasks_paginated(
     def get_tasks_paginated(
+        self,
+        project_id: str,
+        item_code: str,
+        page: int = 1,
+        page_size: int = 10,
+        keyword: Optional[str] = None,
+        collect_status: Optional[int] = None,
+        process_status: Optional[int] = None,
+        send_status: Optional[int] = None,
+    ) :
+        """分页查询任务列表
+
+        Args:
+            page: 页码,从1开始
+            page_size: 每页数量
+            project_id: 项目编号
+            item_code: 条目编号
+            keyword: 关键字
+            collect_status: 采集状态
+            process_status: 处理状态
+            send_status: 发送状态
+
+        Returns:
+
+        """
+        with (db_helper.sqlserver_query_session(self._database) as db_session):
+            query = db_session.query(ProjectTaskModel)
+
+            # 构建查询条件
+            conditions = [
+                ProjectTaskModel.is_del == 0,
+                ProjectTaskModel.project_id == project_id,
+                # ProjectTaskModel.budget_id == budget_id,
+                ProjectTaskModel.item_code.like(f"{item_code}%")
+            ]
+            if keyword:
+                conditions.append(ProjectTaskModel.task_name.like(f'%{keyword}%'))
+            if collect_status is not None:
+                conditions.append(ProjectTaskModel.collect_status == collect_status)
+            if process_status is not None:
+                conditions.append(ProjectTaskModel.process_status == process_status)
+            if send_status is not None:
+                conditions.append(ProjectTaskModel.send_status == send_status)
+
+            query = query.filter(and_(*conditions))
+
+            # 计算总数
+            total_count = query.count()
+
+            # 分页
+            query = query.order_by(ProjectTaskModel.created_at.desc())\
+                .offset((page - 1) * page_size).limit(page_size)
+
+            tasks = query.all()
+
+            return {
+                'total': total_count,
+                'data': tasks
+            }
+
+    def get_tasks_paginated_bk(
         self,
         self,
         budget_id: int,
         budget_id: int,
         project_id: str,
         project_id: str,
@@ -48,7 +108,6 @@ class ProjectTaskStore:
         Returns:
         Returns:
 
 
         """
         """
-        # with db_helper.mysql_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
             query = db_session.query(ProjectTaskModel)
             query = db_session.query(ProjectTaskModel)
 
 
@@ -74,7 +133,7 @@ class ProjectTaskStore:
             total_count = query.count()
             total_count = query.count()
 
 
             # 分页
             # 分页
-            query = query.offset((page - 1) * page_size).limit(page_size)
+            query = query.order_by(ProjectTaskModel.created_at.desc()).offset((page - 1) * page_size).limit(page_size)
 
 
             tasks = query.all()
             tasks = query.all()
 
 
@@ -84,7 +143,6 @@ class ProjectTaskStore:
             }
             }
 
 
     def get_task(self, task_id: int) -> Optional[ProjectTaskModel]:
     def get_task(self, task_id: int) -> Optional[ProjectTaskModel]:
-        # with db_helper.mysql_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
         with db_helper.sqlserver_query_session(self._database) as db_session:
             task = db_session.query(ProjectTaskModel).filter(
             task = db_session.query(ProjectTaskModel).filter(
                 and_(
                 and_(
@@ -93,7 +151,6 @@ class ProjectTaskStore:
                 )).first()
                 )).first()
             return task
             return task
 
 
-
     def get_task_dto(self, task_id: int) -> Optional[ProjectTaskDto]:
     def get_task_dto(self, task_id: int) -> Optional[ProjectTaskDto]:
         """根据ID查询任务
         """根据ID查询任务
 
 
@@ -127,8 +184,7 @@ class ProjectTaskStore:
             created_at=datetime.now(),
             created_at=datetime.now(),
         )
         )
 
 
-        # with db_helper.mysql_session(self._database) as db_session:
-        with db_helper.sqlserver_query_session(self._database) as db_session:
+        with db_helper.sqlserver_session(self._database) as db_session:
             db_session.add(task)
             db_session.add(task)
             db_session.flush()
             db_session.flush()
             return ProjectTaskDto.from_model(task)
             return ProjectTaskDto.from_model(task)
@@ -146,7 +202,6 @@ class ProjectTaskStore:
 
 
         if not task:
         if not task:
             return None
             return None
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             task.task_name = task_dto.task_name
             task.task_name = task_dto.task_name
             task.task_desc = task_dto.task_desc
             task.task_desc = task_dto.task_desc
@@ -160,12 +215,10 @@ class ProjectTaskStore:
             task = db_session.merge(task)
             task = db_session.merge(task)
             return ProjectTaskDto.from_model(task)
             return ProjectTaskDto.from_model(task)
 
 
-
     def update_task_files(self, task_id: int,files: str):
     def update_task_files(self, task_id: int,files: str):
         task = self.get_task(task_id)
         task = self.get_task(task_id)
         if not task:
         if not task:
             return None
             return None
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             task.file_path = files
             task.file_path = files
             if task.collect_status != 0:
             if task.collect_status != 0:
@@ -192,51 +245,46 @@ class ProjectTaskStore:
         if not task:
         if not task:
             return False
             return False
 
 
-
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             task.is_del = 1
             task.is_del = 1
             task.deleted_by = self.current_user.username
             task.deleted_by = self.current_user.username
             task.deleted_at = datetime.now()
             task.deleted_at = datetime.now()
-            task = db_session.merge(task)
+            db_session.merge(task)
             return True
             return True
 
 
     def update_collect_status(self,task_id:int, status:int, err:str = None):
     def update_collect_status(self,task_id:int, status:int, err:str = None):
         task = self.get_task(task_id)
         task = self.get_task(task_id)
         if not task:
         if not task:
             return False
             return False
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             task.collect_status = status
             task.collect_status = status
             if err:
             if err:
                 task.collect_error = err
                 task.collect_error = err
             task.collect_time = datetime.now()
             task.collect_time = datetime.now()
-            task = db_session.merge(task)
+            db_session.merge(task)
             return True
             return True
 
 
     def update_process_status(self,task_id:int, status:int, err:str = None):
     def update_process_status(self,task_id:int, status:int, err:str = None):
         task = self.get_task(task_id)
         task = self.get_task(task_id)
         if not task:
         if not task:
             return False
             return False
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             task.process_status = status
             task.process_status = status
             if err:
             if err:
                 task.process_error = err
                 task.process_error = err
             task.process_time = datetime.now()
             task.process_time = datetime.now()
-            task = db_session.merge(task)
+            db_session.merge(task)
             return True
             return True
 
 
     def update_send_status(self,task_id:int, status:int, err:str = None):
     def update_send_status(self,task_id:int, status:int, err:str = None):
         task = self.get_task(task_id)
         task = self.get_task(task_id)
         if not task:
         if not task:
             return False
             return False
-        # with db_helper.mysql_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
         with db_helper.sqlserver_session(self._database) as db_session:
             task.send_status = status
             task.send_status = status
             if err:
             if err:
                 task.send_error = err
                 task.send_error = err
             task.send_time = datetime.now()
             task.send_time = datetime.now()
-            task = db_session.merge(task)
+            db_session.merge(task)
             return True
             return True
 
 

+ 3 - 1
SourceCode/IntelligentRailwayCosting/app/views/static/base/css/styles.css

@@ -34,7 +34,6 @@ body > .container, body > .container-fluid{
     margin: 0;
     margin: 0;
 }
 }
 
 
-.header
 .table-box{
 .table-box{
     position: relative;
     position: relative;
     width: 100%;
     width: 100%;
@@ -58,6 +57,9 @@ body > .container, body > .container-fluid{
 .table-box td > .link:hover{
 .table-box td > .link:hover{
     border-bottom: 2px solid;
     border-bottom: 2px solid;
 }
 }
+.table-box td > span{
+   font-size: 13px;
+}
 .table-box td > .btn{
 .table-box td > .btn{
     padding: calc(.2rem + 1px) calc(.4rem + 1px)!important;
     padding: calc(.2rem + 1px) calc(.4rem + 1px)!important;
     margin: 0 5px;
     margin: 0 5px;