diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index 63b0e07..0596011 100644 --- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py +++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py @@ -6,7 +6,7 @@ from config.get_db import get_db from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictApprModel, DataStdCodePageQueryModel, DeleteDataStdModel,DataStdDictModel,DataStdDictPageQueryModel,DataStdMainModel,DataStdMainPageQueryModel,DataStdMainApprModel +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictApprModel,DataStdCodeApprModel, DataStdCodePageQueryModel, DeleteDataStdModel,DataStdDictModel,DataStdDictPageQueryModel,DataStdMainModel,DataStdMainPageQueryModel,DataStdMainApprModel from module_admin.service.datastd_service import DataStdService from module_admin.service.login_service import LoginService from utils.log_util import logger @@ -29,9 +29,17 @@ async def get_std_code_list( query_db: AsyncSession = Depends(get_db), ): code_page_query_result = await DataStdService.get_std_code_list_services(query_db, code_page_query, is_page=True) - logger.info('获取列配置列表成功') return ResponseUtil.success(model_content=code_page_query_result) - +@datastdController.get( + '/stdcode/Appr/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] +) +async def get_appr_std_code_list( + request: Request, + code_page_query: DataStdCodePageQueryModel = Depends(DataStdCodePageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + code_page_query_result = await DataStdService.get_appr_std_code_list_services(query_db, code_page_query, is_page=True) + return ResponseUtil.success(model_content=code_page_query_result) @datastdController.get( '/stdcode/code/maplist', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] ) @@ -41,9 +49,17 @@ async def get_std_code_map_list( query_db: AsyncSession = Depends(get_db), ): code_page_query_result = await DataStdService.get_std_code_map_list_services(query_db, code_page_query, is_page=True) - logger.info('获取列配置列表成功') return ResponseUtil.success(model_content=code_page_query_result) - +@datastdController.get('/stdcode/code/listappr', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:list'))] +) +async def get_std_code_appr_list( + request: Request, + main_page_query: DataStdCodeApprModel= Depends(DataStdCodeApprModel), + query_db: AsyncSession = Depends(get_db), +): + main_page_query_result = await DataStdService.get_std_code_appr_list(query_db, main_page_query, is_page=True) + logger.info('获取数据标准列表成功') + return ResponseUtil.success(data=main_page_query_result) @datastdController.get( '/stdcode/code/{id}', response_model=DataStdCodeModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] ) @@ -51,6 +67,14 @@ async def query_detail_code(request: Request, id: str, query_db: AsyncSession = config_detail_result = await DataStdService.code_detail_services(query_db, id) logger.info(f'获取config_id为{id}的信息成功') + return ResponseUtil.success(data=config_detail_result) +@datastdController.get( + '/stdcode/codeAppr/{id}', response_model=DataStdCodeModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] +) +async def query_detail_code_appr(request: Request, id: str, query_db: AsyncSession = Depends(get_db)): + config_detail_result = await DataStdService.code_appr_detail_services(query_db, id) + logger.info(f'获取config_id为{id}的信息成功') + return ResponseUtil.success(data=config_detail_result) @datastdController.post('/stdcode/code', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:add'))]) @Log(title='代码管理', business_type=BusinessType.INSERT) diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index 34d3882..c340b2e 100644 --- a/vue-fastapi-backend/module_admin/dao/datastd_dao.py +++ b/vue-fastapi-backend/module_admin/dao/datastd_dao.py @@ -12,7 +12,19 @@ from datetime import datetime class DataStdDao: # ----------------------------------------------------------------数据标准模块---------------------------------------------------------------------------------------------------- - + @classmethod + async def get_std_code_appr_list(cls, flowId:str,db: AsyncSession): + filters = [] + filters.append(DataStdCodeAppr.flowId == flowId) + filters.append(DataStdCodeAppr.class_id == "code") + query = select(DataStdCodeAppr).where(*filters).order_by(desc(DataStdCodeAppr.create_time)) + return await PageUtil.paginate(db, query, 0, 0, False) + @classmethod + async def get_std_code_appr_list_Flow(cls, flowId:str,db: AsyncSession): + filters = [] + filters.append(DataStdCodeAppr.flowId == flowId) + query = select(DataStdCodeAppr).where(*filters).order_by(desc(DataStdCodeAppr.create_time)) + return await PageUtil.paginate(db, query, 0, 0, False) @classmethod async def get_std_code_list(cls, db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False): """ @@ -57,6 +69,49 @@ class DataStdDao: ) return col_list @classmethod + async def get_appr_std_code_list(cls, db: AsyncSession, query_object: DataStdCodeApprModel, is_page: bool = False): + """ + 获取 DataStdCode 的列表信息,支持模糊查询和分页 + :param db: ORM对象 + :param query_object: 查询参数对象 + :param is_page: 是否开启分页 + :return: 列表信息 + """ + # 构建查询条件 + filters = [] + if query_object.code_name: + filters.append(DataStdCodeAppr.code_name.like(f"%{query_object.code_name}%")) + if query_object.code_num: + filters.append( or_( + DataStdCodeAppr.code_name.like(f"%{query_object.code_num}%"), + DataStdCodeAppr.code_num.like(f"%{query_object.code_num}%") + )) + if query_object.code_status: + filters.append(DataStdCodeAppr.code_status==query_object.code_status) + if query_object.sys_id: + filters.append(DataStdCodeAppr.sys_id==query_object.sys_id) + if query_object.code_type: + filters.append(DataStdCodeAppr.code_type==query_object.code_type) + + if query_object.class_id: + filters.append(DataStdCodeAppr.class_id==query_object.class_id) + if query_object.class_id=='codeItem' and not query_object.parent_id: + filters.append(1==2) + if query_object.parent_id: + filters.append(DataStdCodeAppr.parent_id==query_object.parent_id) + # 构建查询语句 + query = ( + select(DataStdCodeAppr) + .where(*filters) + .order_by(desc(DataStdCodeAppr.create_time)) # 按创建时间降序排序 + ) + + # 分页处理 + col_list = await PageUtil.paginate( + db, query, query_object.page_num, query_object.page_size, is_page + ) + return col_list + @classmethod async def get_last_std_code_appr_by_id(cls,db: AsyncSession, Id: str ): result = await db.execute( select(DataStdCodeAppr) @@ -155,7 +210,15 @@ class DataStdDao: ) ).scalars().first() return col - + @classmethod + async def get_std_code_appr_by_id(cls, db: AsyncSession, Id: str): + col = ( + await db.execute( + select(DataStdCodeAppr) + .where(DataStdCodeAppr.id == Id) + ) + ).scalars().first() + return col @classmethod async def add_std_code(cls, db: AsyncSession,model:DataStdCodeModel): @@ -814,12 +877,7 @@ class DataStdDao: filters.append(DataStdDictAppr.flowId == flowId) query = select(DataStdDictAppr).where(*filters).order_by(desc(DataStdDictAppr.create_time)) return await PageUtil.paginate(db, query, 0, 0, False) - @classmethod - async def get_std_code_appr_list(cls, flowId:str,db: AsyncSession): - filters = [] - filters.append(DataStdCodeAppr.flowId == flowId) - query = select(DataStdCodeAppr).where(*filters).order_by(desc(DataStdCodeAppr.create_time)) - return await PageUtil.paginate(db, query, 0, 0, False) + @classmethod async def get_std_main_appr_by_id(cls, db: AsyncSession, Id: str): col = await db.execute(select(DataStdMainAppr).where(DataStdMainAppr.id == Id)) diff --git a/vue-fastapi-backend/module_admin/service/approval_service.py b/vue-fastapi-backend/module_admin/service/approval_service.py index 8804b15..59439f9 100644 --- a/vue-fastapi-backend/module_admin/service/approval_service.py +++ b/vue-fastapi-backend/module_admin/service/approval_service.py @@ -199,7 +199,7 @@ class ApprovalService: @classmethod async def syncStdCodeInfo(cls, result_db: AsyncSession, suppId: str, operateType: str): - apprList = await DataStdDao.get_std_code_appr_list(suppId, result_db) + apprList = await DataStdDao.get_std_code_appr_list_Flow(suppId, result_db) for appr in apprList: # 将 SQLAlchemy 模型实例转换为 Pydantic 模型实例 diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 6283137..2586b4e 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -33,7 +33,55 @@ class DataStdService: """ col_list_result = await DataStdDao.get_std_code_list(query_db, query_object, is_page) return col_list_result + # @classmethod + # async def get_appr_std_code_list_services( + # cls, query_db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False + # ): + # col_list_result = await DataStdDao.get_appr_std_code_list(query_db, query_object, is_page) + + # # for 循环col_list_result.rows 如果changeType是update的 去查他的compareId 用oldItem= get_std_code_appr_by_id(compareId ) 获取原始数据 比较 code_num code_name code_map_id (code_map_id都为空的情况应该判断一致) 如果三个属性都一致的 判定一致 移除这个col_list_result,不一致的把改属性改为 item.code_num=oldItem.code_num-->item.code_num + # return col_list_result + @classmethod + async def get_appr_std_code_list_services( + cls, query_db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False + ): + col_list_result = await DataStdDao.get_appr_std_code_list(query_db, query_object, is_page) + filtered_rows = [] + + for item in col_list_result.rows: + if item.get("changeType") == "update" and item.get("compareId"): + old_item = await DataStdDao.get_std_code_appr_by_id(query_db, item.get("compareId")) + + # 判断三个字段是否一致(空值也算一致) + is_code_num_same = item.get("codeNum") == old_item.code_num + is_code_name_same = item.get("codeName") == old_item.code_name + is_code_map_id_same = ( + (not item.get("codeMapId") and not old_item.code_map_id) or + (item.get("codeMapId") == old_item.code_map_id) + ) + + if is_code_num_same and is_code_name_same and is_code_map_id_same: + continue # 跳过完全一致的记录 + else: + # 拼接变更格式:旧值 ==> 新值 + if not is_code_num_same: + item["codeNum"] = f"{old_item.code_num or ''} ==> {item.get('codeNum', '')}" + if not is_code_name_same: + item["codeName"] = f"{old_item.code_name or ''} ==> {item.get('codeName', '')}" + if not is_code_map_id_same: + old_val = old_item.code_map_id or "" + new_val = item.get("codeMapId") or "" + item["codeMapId"] = f"{old_val} ==> {new_val}" + + filtered_rows.append(item) + + col_list_result.rows = filtered_rows + return col_list_result + + @classmethod + async def get_std_code_appr_list(cls, query_db: AsyncSession, query_object: DataStdCodeApprModel, is_page: bool = False): + return await DataStdDao.get_std_code_appr_list(query_object.flowId, query_db) @classmethod async def get_std_code_map_list_services( cls, query_db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False @@ -104,6 +152,22 @@ class DataStdService: return result @classmethod + async def code_appr_detail_services(cls, query_db: AsyncSession, col: str): + """ + 获取参数配置详细信息service + + :param query_db: orm对象 + :param config_id: 参数配置id + :return: 参数配置id对应的信息 + """ + config = await DataStdDao.get_std_code_appr_by_id(query_db, col) + if config: + result = DataStdCodeApprModel(**CamelCaseUtil.transform_result(config)) + else: + result = DataStdCodeApprModel(**dict()) + + return result + @classmethod async def edit_std_code_services(cls, request: Request, query_db: AsyncSession, page_object: DataStdCodeModel): """ 编辑列配置服务 @@ -159,8 +223,9 @@ class DataStdService: std_code_appr.approStatus = "waiting" std_code_appr.code_status = "9" std_code_appr.flowId = flow_id - std_code_appr.update_by = current_user.user.user_name - std_code_appr.update_time = datetime.now() + std_code_appr.id=str(uuid.uuid4()) + std_code_appr.create_by = current_user.user.user_name + std_code_appr.create_time = datetime.now() await DataStdDao.add_std_code_appr(query_db, std_code_appr) # 发起审批流程(每个标准代码一条审批) apply_model = ApplyModel() @@ -278,7 +343,7 @@ class DataStdService: item.update_by = current_user.user.user_name item.update_time = datetime.now() item.sys_name = '公司级' if 'company' == item.code_type else item.sys_name - item.parent_id = code.id # 设置父级 ID + item.parent_id = appr_model.id # 设置父级 ID # 校验代码项是否已存在于正式表中 if not await cls.check_code_unique_services(query_db, item): @@ -360,8 +425,8 @@ class DataStdService: code_item.id 存在为修改,若为空则为新增。 """ # 更新时间及人 - code.update_by = current_user.user.user_name - code.update_time = datetime.now() + code.create_by = current_user.user.user_name + code.create_time = datetime.now() code.sys_name = '公司级' if 'company' == code.code_type else code.sys_name # 校验标准代码是否存在并且唯一 @@ -406,6 +471,7 @@ class DataStdService: last_item_appr= await DataStdDao.get_last_std_code_appr_by_id(query_db,item_appr_model.id) item_appr_model.changeType = "update" item_appr_model.compareId = last_item_appr.id + item_appr_model.parent_id = appr_model.id item_appr_model.oldInstId = item.id item_appr_model.approStatus = "waiting" item_appr_model.flowId = appr_model.flowId @@ -427,7 +493,8 @@ class DataStdService: item_appr_model.oldInstId = item.id item_appr_model.approStatus = "waiting" item_appr_model.flowId = appr_model.flowId - + item_appr_model.parent_id = appr_model.id + await DataStdDao.add_std_code_appr(query_db, item_appr_model) for old_item in code_item_list_old: if old_item["id"] not in new_ids: @@ -440,9 +507,10 @@ class DataStdService: delete_appr_model.approStatus = "waiting" delete_appr_model.flowId = appr_model.flowId delete_appr_model.id = str(uuid.uuid4()) + delete_appr_model.parent_id = appr_model.id - delete_appr_model.update_by = current_user.user.user_name - delete_appr_model.update_time = datetime.now() + delete_appr_model.create_by = current_user.user.user_name + delete_appr_model.create_time = datetime.now() await DataStdDao.add_std_code_appr(query_db, delete_appr_model) # 创建审批流程 diff --git a/vue-fastapi-frontend/src/api/datastd/std.js b/vue-fastapi-frontend/src/api/datastd/std.js index 40d0d0d..2f68a31 100644 --- a/vue-fastapi-frontend/src/api/datastd/std.js +++ b/vue-fastapi-frontend/src/api/datastd/std.js @@ -9,6 +9,13 @@ export function listStdCode(query) { params: query }) } +export function listStdCodeApprById(query) { + return request({ + url: '/default-api/datastd/stdcode/Appr/list', + method: 'get', + params: query + }) +} export function listStdCodeCompany() { return request({ url: '/default-api/datastd/stdcode/code/list', @@ -39,7 +46,12 @@ export function getStdCode(colId) { method: 'get' }) } - +export function getStdCodeAppr(colId) { + return request({ + url: '/default-api/datastd/stdcode/codeAppr/' + parseStrEmpty(colId), + method: 'get' + }) +} // 查询标准代码项详情 export function getStdCodeItem(rowId) { return request({ @@ -204,6 +216,13 @@ export function listStdDictAppr(query) { params: query }) } +export function listStdCodeAppr(query) { + return request({ + url: '/default-api/datastd/stdcode/code/listappr', + method: 'get', + params: query + }) +} // 查询数据标准列表 export function listStdMainSelect(query) { return request({ diff --git a/vue-fastapi-frontend/src/views/system/flow/codeItemCommon.vue b/vue-fastapi-frontend/src/views/system/flow/codeItemCommon.vue new file mode 100644 index 0000000..24d540a --- /dev/null +++ b/vue-fastapi-frontend/src/views/system/flow/codeItemCommon.vue @@ -0,0 +1,286 @@ + + + + + + + 代码归属: {{ form.sysName || '暂无代码归属' }} + + + + + 代码编号: {{ form.codeNum || '暂无代码编号' }} + + + + + 代码名称: {{ form.codeName || '暂无代码名称' }} + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + + + + + + + + + + + + + + + {{ changeTypeMap[row.changeType] || row.changeType }} + + + + + + + + + + + + \ No newline at end of file diff --git a/vue-fastapi-frontend/src/views/system/flow/dataStdCodeAppr.vue b/vue-fastapi-frontend/src/views/system/flow/dataStdCodeAppr.vue new file mode 100644 index 0000000..6d52558 --- /dev/null +++ b/vue-fastapi-frontend/src/views/system/flow/dataStdCodeAppr.vue @@ -0,0 +1,210 @@ + + + + + + + {{ + row.dictLevel === 'company' + ? '公司级' + : '系统级(' + row.sysName + ')' + }} + + + + + + {{ row.dictType == 0 ? '基础数据' : '指标数据' }} + + + + + + + + + + + {{ changeTypeMap[row.changeType] || row.changeType }} + + + + + + {{ approStatusMap[row.approStatus] || row.approStatus }} + + + + + + + + 查看 + + + + + + + + + + + + + + 关闭 + + + + + + + \ No newline at end of file diff --git a/vue-fastapi-frontend/src/views/system/flow/index.vue b/vue-fastapi-frontend/src/views/system/flow/index.vue index e11d0ab..074517b 100644 --- a/vue-fastapi-frontend/src/views/system/flow/index.vue +++ b/vue-fastapi-frontend/src/views/system/flow/index.vue @@ -524,6 +524,9 @@ + + + @@ -533,9 +536,11 @@ import { getMetaInfoApplyBusinessDetail } from "@/api/meta/metaInfo" import {v4 as uuid} from 'uuid' import DataStdMainTable from './dataStdMainAppr.vue'; // 路径根据实际调整 import DataStdDictTable from './dataStdDictAppr.vue'; // 路径根据实际调整 +import DataStdCodeTable from './dataStdCodeAppr.vue'; // 路径根据实际调整 const stdMainVisible = ref(false); const stdDictVisible = ref(false); +const stdCodeVisible = ref(false); const { proxy } = getCurrentInstance(); import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import {getWaitingFlowCount} from "../../../api/flow/flow.js"; @@ -967,16 +972,18 @@ function showBusinessDataDialog(row){ } }) }else if(row.businessType ==="dataStdMain"){ - console.log("打开标准1111") selectedFlowId.value = row.businessId; stdMainVisible.value = true; }else if(row.businessType ==="dataStdDict"){ -console.log("打开字典222") selectedFlowId.value = row.businessId; stdDictVisible.value = true; +}else if(row.businessType ==="dataStdCode"){ +selectedFlowId.value = row.businessId; +stdCodeVisible.value = true; } + } function agree(row){ //获取用户当前的nodeId