You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

183 lines
9.3 KiB

import json
import uuid
from typing import Optional
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.approval_vo import ApplyModel, OperateModel, ApprovalQueryObject, EditObjectModel, SaveConfModel
from module_admin.entity.vo.user_vo import CurrentUserModel
from module_admin.entity.do.approval_do import FlowApproval
from exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime
from utils.common_util import CamelCaseUtil
from module_admin.dao.approval_dao import ApprovalDao
from module_admin.dao.user_dao import UserDao
from module_admin.dao.meta_dao import MetaDao
class ApprovalService:
"""
智能问答服务层
"""
@classmethod
async def apply_services(cls, result_db: AsyncSession, apply: ApplyModel, module: str):
flow_approval = FlowApproval()
flow_approval.id = uuid.uuid4()
flow_approval.businessType = apply.businessType
flow_approval.businessId = apply.businessId
flow_approval.applicant = apply.applicant
flow_approval.applyTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
flow_approval.status = 'waiting'
listConf = await ApprovalDao.get_first_node_conf(module, result_db)
flow_approval.nextStep = json.dumps([item.id for item in listConf])
flow_approval.nextStepRole = json.dumps([item.code for item in listConf if item.type == 'Role'])
flow_approval.nextStepUser = json.dumps([item.code for item in listConf if item.type == 'User'])
await ApprovalDao.add_flow_approval(result_db, flow_approval)
await result_db.commit()
return CrudResponseModel(is_success=True, message='申请成功')
@classmethod
async def operate_services(cls, result_db: AsyncSession, operate: OperateModel, current_user: CurrentUserModel):
flow_approval = await ApprovalDao.get_flow_by_id(result_db, operate.flowId)
if flow_approval is None:
raise ServiceException(message=f'所操作的流程不存在')
if flow_approval.status == 'succeed' or flow_approval.status == 'rejected':
raise ServiceException(message='所操作的流程已结束')
if flow_approval.status == 'canceled':
raise ServiceException(message='所操作的流程已撤回')
edit = EditObjectModel()
edit.id = flow_approval.id
flowConfList = await ApprovalDao.get_conf_list(result_db, flow_approval.businessType)
nextSteps = json.loads(flow_approval.nextStep)
nextStepFlowList = [item for item in flowConfList if item.id in nextSteps]
nextFlowList = [item for item in nextStepFlowList if item.code in current_user.roles]
confNodeId = nextFlowList[0].id
array = []
if flow_approval.approvalFlow is not None:
array = json.loads(flow_approval.approvalFlow)
if operate.operateType == 'success':
nextFlow = []
for flowConf in flowConfList:
parent = json.loads(flowConf.parent)
if confNodeId in parent:
nextFlow.append(flowConf)
if len(nextFlow) > 0:
edit.status = 'pending' # 有下一步执行人,则设置为 pending
edit.nextStep = json.dumps([item.id for item in nextFlow])
edit.nextStepRole = json.dumps([item.code for item in nextFlow if item.type == 'Role'])
edit.nextStepUser = json.dumps([item.code for item in nextFlow if item.type == 'User'])
edit.currentNodeId = confNodeId
else:
edit.status = 'succeed'
edit.currentNodeId = confNodeId
edit.nextStep = '[]'
edit.nextStepRole = '[]'
edit.nextStepUser = '[]'
if operate.operateType == 'reject':
edit.status = 'rejected'
edit.currentNodeId = confNodeId
edit.nextStep = '[]'
edit.nextStepRole = '[]'
edit.nextStepUser = '[]'
array.append({'operator': current_user.user.user_name,
'confFlowId': confNodeId,
'operateTime': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
'operate': operate.operateType,
'operateComment': operate.operateComment,
})
edit.approvalFlow = json.dumps(array)
if flow_approval.businessType == 'metaDataInfo':
await cls.syncSuppInfo(result_db, flow_approval.businessId, edit.status)
await ApprovalDao.edit_flow_approval(result_db, edit.model_dump(exclude_unset=True))
await result_db.commit()
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
async def syncSuppInfo(cls, result_db: AsyncSession, suppId: str, operateType: str):
table = await MetaDao.get_supp_table_vett_by_id(suppId, result_db)
if table is None:
raise ServiceException(message='所查询的业务数据不存在')
if table.apply_status == 'succeed' or table.apply_status == 'rejected':
raise ServiceException(message='所改业务已审核完毕')
column_list = await MetaDao.get_meta_col_supp_vett(table, result_db)
if column_list is not None and len(column_list) > 0:
for column in column_list:
column.apply_status = operateType
suppColumn = await MetaDao.get_supp_column_by_vett(column, result_db)
await MetaDao.updateMetadataFldSuppInfoVett(column.onum, operateType, result_db)
if suppColumn is None:
await MetaDao.insertMetadataFldSuppInfo(column, result_db)
else:
await MetaDao.updateMetadataFldSuppInfo(suppColumn.onum, column, result_db)
suppTable = await MetaDao.get_supp_table_by_vett(table.ssys_cd, table.mdl_name, table.tab_eng_name, result_db)
await MetaDao.updateMetadataSuppInfoVett(table.onum, operateType, result_db)
if suppTable is None:
await MetaDao.insertMetadataSuppInfo(table, result_db)
else:
await MetaDao.updateMetadataSuppInfo(suppTable.onum, table, result_db)
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
async def get_flow_list_services(cls, query_db: AsyncSession, query_param: ApprovalQueryObject,
current_user: CurrentUserModel):
if query_param.status == 'waiting':
result = await ApprovalDao.get_flow_list(query_db, query_param, current_user)
return result
if query_param.status == 'over':
result = await ApprovalDao.get_owner_flow_list(query_db, query_param, current_user)
return result
return None
@classmethod
async def get_waiting_total_services(cls, query_db: AsyncSession, current_user: CurrentUserModel):
approval_list = await ApprovalDao.get_all_waitingOrPendingFlows(query_db)
count = 0
for item in approval_list:
nextRoles = json.loads(item.nextStepRole)
nextUsers = json.loads(item.nextStepUser)
if len(nextRoles)>0 and len(nextUsers) > 0:
if current_user.user.user_name in nextUsers:
count = count+1
break
if any(element in set(current_user.roles) for element in nextRoles):
count = count+1
break
if len(nextRoles) > 0 and len(nextUsers) == 0:
if any(element in set(current_user.roles) for element in nextRoles):
count = count+1
break
if len(nextRoles) == 0 and len(nextUsers) > 0:
if current_user.user.user_name in nextUsers:
count = count+1
break
return count
@classmethod
async def cancel_apply_services(cls, query_db: AsyncSession, flow_id: str,
current_user: CurrentUserModel):
flow = await ApprovalDao.get_flow_by_idAndUser(flow_id, current_user.user.user_name)
if flow is None:
raise ServiceException(message=f'所操作的流程不存在')
if flow.status == 'succeed' or flow.status == 'rejected':
raise ServiceException(message='所操作的流程已结束,无需撤回')
if flow.status == 'canceled':
raise ServiceException(message='所操作的流程已撤回,无需重复操作')
flow.status = 'canceled'
await ApprovalDao.edit_flow_approval(query_db, flow)
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
async def get_conf_list_services(cls, module: str, query_db: AsyncSession, current_user: CurrentUserModel):
result = await ApprovalDao.get_conf_list(query_db, module)
return result
@classmethod
async def save_flow_config_services(cls, query_db: AsyncSession, saveConfModel: SaveConfModel):
await ApprovalDao.delete_flow_by_module(saveConfModel.module, query_db)
for item in saveConfModel.confList:
confDict = item.model_dump(exclude_unset=True)
await ApprovalDao.add_flow_config(query_db, confDict)
await query_db.commit()
return CrudResponseModel(is_success=True, message='操作成功')