Browse Source

码值审批界面

master
siyaqi 1 month ago
parent
commit
4a80081e0f
  1. 34
      vue-fastapi-backend/module_admin/controller/datastd_controller.py
  2. 74
      vue-fastapi-backend/module_admin/dao/datastd_dao.py
  3. 2
      vue-fastapi-backend/module_admin/service/approval_service.py
  4. 82
      vue-fastapi-backend/module_admin/service/datastd_service.py
  5. 21
      vue-fastapi-frontend/src/api/datastd/std.js
  6. 286
      vue-fastapi-frontend/src/views/system/flow/codeItemCommon.vue
  7. 210
      vue-fastapi-frontend/src/views/system/flow/dataStdCodeAppr.vue
  8. 11
      vue-fastapi-frontend/src/views/system/flow/index.vue

34
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.entity.vo.user_vo import CurrentUserModel
from module_admin.annotation.log_annotation import Log from module_admin.annotation.log_annotation import Log
from module_admin.aspect.interface_auth import CheckUserInterfaceAuth 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.datastd_service import DataStdService
from module_admin.service.login_service import LoginService from module_admin.service.login_service import LoginService
from utils.log_util import logger from utils.log_util import logger
@ -29,9 +29,17 @@ async def get_std_code_list(
query_db: AsyncSession = Depends(get_db), 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) 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) 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( @datastdController.get(
'/stdcode/code/maplist', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] '/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), 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) 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) 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( @datastdController.get(
'/stdcode/code/{id}', response_model=DataStdCodeModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] '/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) config_detail_result = await DataStdService.code_detail_services(query_db, id)
logger.info(f'获取config_id为{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) return ResponseUtil.success(data=config_detail_result)
@datastdController.post('/stdcode/code', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:add'))]) @datastdController.post('/stdcode/code', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:add'))])
@Log(title='代码管理', business_type=BusinessType.INSERT) @Log(title='代码管理', business_type=BusinessType.INSERT)

74
vue-fastapi-backend/module_admin/dao/datastd_dao.py

@ -12,7 +12,19 @@ from datetime import datetime
class DataStdDao: 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 @classmethod
async def get_std_code_list(cls, db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False): 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 return col_list
@classmethod @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 ): async def get_last_std_code_appr_by_id(cls,db: AsyncSession, Id: str ):
result = await db.execute( result = await db.execute(
select(DataStdCodeAppr) select(DataStdCodeAppr)
@ -155,7 +210,15 @@ class DataStdDao:
) )
).scalars().first() ).scalars().first()
return col 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 @classmethod
async def add_std_code(cls, db: AsyncSession,model:DataStdCodeModel): async def add_std_code(cls, db: AsyncSession,model:DataStdCodeModel):
@ -814,12 +877,7 @@ class DataStdDao:
filters.append(DataStdDictAppr.flowId == flowId) filters.append(DataStdDictAppr.flowId == flowId)
query = select(DataStdDictAppr).where(*filters).order_by(desc(DataStdDictAppr.create_time)) query = select(DataStdDictAppr).where(*filters).order_by(desc(DataStdDictAppr.create_time))
return await PageUtil.paginate(db, query, 0, 0, False) 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 @classmethod
async def get_std_main_appr_by_id(cls, db: AsyncSession, Id: str): async def get_std_main_appr_by_id(cls, db: AsyncSession, Id: str):
col = await db.execute(select(DataStdMainAppr).where(DataStdMainAppr.id == Id)) col = await db.execute(select(DataStdMainAppr).where(DataStdMainAppr.id == Id))

2
vue-fastapi-backend/module_admin/service/approval_service.py

@ -199,7 +199,7 @@ class ApprovalService:
@classmethod @classmethod
async def syncStdCodeInfo(cls, result_db: AsyncSession, suppId: str, operateType: str): 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: for appr in apprList:
# 将 SQLAlchemy 模型实例转换为 Pydantic 模型实例 # 将 SQLAlchemy 模型实例转换为 Pydantic 模型实例

82
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) col_list_result = await DataStdDao.get_std_code_list(query_db, query_object, is_page)
return col_list_result 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 @classmethod
async def get_std_code_map_list_services( async def get_std_code_map_list_services(
cls, query_db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False cls, query_db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False
@ -104,6 +152,22 @@ class DataStdService:
return result return result
@classmethod @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): 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.approStatus = "waiting"
std_code_appr.code_status = "9" std_code_appr.code_status = "9"
std_code_appr.flowId = flow_id std_code_appr.flowId = flow_id
std_code_appr.update_by = current_user.user.user_name std_code_appr.id=str(uuid.uuid4())
std_code_appr.update_time = datetime.now() 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) await DataStdDao.add_std_code_appr(query_db, std_code_appr)
# 发起审批流程(每个标准代码一条审批) # 发起审批流程(每个标准代码一条审批)
apply_model = ApplyModel() apply_model = ApplyModel()
@ -278,7 +343,7 @@ class DataStdService:
item.update_by = current_user.user.user_name item.update_by = current_user.user.user_name
item.update_time = datetime.now() item.update_time = datetime.now()
item.sys_name = '公司级' if 'company' == item.code_type else item.sys_name 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): if not await cls.check_code_unique_services(query_db, item):
@ -360,8 +425,8 @@ class DataStdService:
code_item.id 存在为修改若为空则为新增 code_item.id 存在为修改若为空则为新增
""" """
# 更新时间及人 # 更新时间及人
code.update_by = current_user.user.user_name code.create_by = current_user.user.user_name
code.update_time = datetime.now() code.create_time = datetime.now()
code.sys_name = '公司级' if 'company' == code.code_type else code.sys_name 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) 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.changeType = "update"
item_appr_model.compareId = last_item_appr.id 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.oldInstId = item.id
item_appr_model.approStatus = "waiting" item_appr_model.approStatus = "waiting"
item_appr_model.flowId = appr_model.flowId item_appr_model.flowId = appr_model.flowId
@ -427,6 +493,7 @@ class DataStdService:
item_appr_model.oldInstId = item.id item_appr_model.oldInstId = item.id
item_appr_model.approStatus = "waiting" item_appr_model.approStatus = "waiting"
item_appr_model.flowId = appr_model.flowId 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) await DataStdDao.add_std_code_appr(query_db, item_appr_model)
for old_item in code_item_list_old: for old_item in code_item_list_old:
@ -440,9 +507,10 @@ class DataStdService:
delete_appr_model.approStatus = "waiting" delete_appr_model.approStatus = "waiting"
delete_appr_model.flowId = appr_model.flowId delete_appr_model.flowId = appr_model.flowId
delete_appr_model.id = str(uuid.uuid4()) 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.create_by = current_user.user.user_name
delete_appr_model.update_time = datetime.now() delete_appr_model.create_time = datetime.now()
await DataStdDao.add_std_code_appr(query_db, delete_appr_model) await DataStdDao.add_std_code_appr(query_db, delete_appr_model)
# 创建审批流程 # 创建审批流程

21
vue-fastapi-frontend/src/api/datastd/std.js

@ -9,6 +9,13 @@ export function listStdCode(query) {
params: query params: query
}) })
} }
export function listStdCodeApprById(query) {
return request({
url: '/default-api/datastd/stdcode/Appr/list',
method: 'get',
params: query
})
}
export function listStdCodeCompany() { export function listStdCodeCompany() {
return request({ return request({
url: '/default-api/datastd/stdcode/code/list', url: '/default-api/datastd/stdcode/code/list',
@ -39,7 +46,12 @@ export function getStdCode(colId) {
method: 'get' method: 'get'
}) })
} }
export function getStdCodeAppr(colId) {
return request({
url: '/default-api/datastd/stdcode/codeAppr/' + parseStrEmpty(colId),
method: 'get'
})
}
// 查询标准代码项详情 // 查询标准代码项详情
export function getStdCodeItem(rowId) { export function getStdCodeItem(rowId) {
return request({ return request({
@ -204,6 +216,13 @@ export function listStdDictAppr(query) {
params: query params: query
}) })
} }
export function listStdCodeAppr(query) {
return request({
url: '/default-api/datastd/stdcode/code/listappr',
method: 'get',
params: query
})
}
// 查询数据标准列表 // 查询数据标准列表
export function listStdMainSelect(query) { export function listStdMainSelect(query) {
return request({ return request({

286
vue-fastapi-frontend/src/views/system/flow/codeItemCommon.vue

@ -0,0 +1,286 @@
<template>
<el-form :model="form" ref="formRef" label-width="120px" >
<div class="form-container">
<el-row :gutter="20">
<!-- 代码归属 -->
<el-col :span="8">
<span class="info-text">代码归属: {{ form.sysName || '暂无代码归属' }}</span>
</el-col>
<!-- 代码编号 -->
<el-col :span="8">
<span class="info-text">代码编号: {{ form.codeNum || '暂无代码编号' }}</span>
</el-col>
<!-- 代码名称 -->
<el-col :span="8">
<span class="info-text">代码名称: {{ form.codeName || '暂无代码名称' }}</span>
</el-col>
</el-row>
</div>
<!-- 查询表单 -->
<div class="query-form-container">
<el-form :model="queryParams" ref="queryRef" :inline="true">
<el-form-item label="代码值/名称" prop="codeNum">
<el-input
v-model="queryParams.codeNum"
placeholder="请输入标准代码编号"
clearable
style="width: 220px"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</div>
</el-form>
<!-- 表格展示 -->
<el-table
v-loading="loading"
:data="tableData"
:row-class-name="tableRowClassName"
@selection-change="handleSelectionChange"
border
style="width: 100%"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column
label="代码值"
align="center"
prop="codeNum"
:editable="true"
>
</el-table-column>
<el-table-column
label="代码含义"
align="center"
prop="codeName"
:editable="true"
>
</el-table-column>
<el-table-column label="变更类型" align="center">
<template #default="{ row }">
{{ changeTypeMap[row.changeType] || row.changeType }}
</template>
</el-table-column>
</el-table>
</template>
<script setup>
import { ref, reactive, onMounted, toRefs } from 'vue';
import { listStdCodeApprById,getStdCodeAppr} from "@/api/datastd/std"; //
const { proxy } = getCurrentInstance();
const { std_code_status } = proxy.useDict("std_code_status");
const props = defineProps({
codeId: {
type: Object,
required: false
}
});
console.log(props.codeNum)
const queryParams = ref({
codeNum: '',
parentId: props.codeId,
codeName: '',
codeType: '',
sysName: '',
classId: 'codeItem',
sysId: '',
pageNum: 1,
pageSize: 100
});
const form = ref({
id: "",
codeNum: '',
codeName: '',
codeType: 'company',
codeStatus: '',
sysName: '',
classId: 'code',
codeMapId: '',
codeMapName: '',
codeMapNum: '',
sysId: undefined
});
const tableData = ref([]);
const selections = ref([]);
const loading = ref(false);
const showSys = ref(false);
const multiple = ref(false);
//
if (props.codeId) {
form.value = { ...props.rowData };
if (form.value.codeType == "sys") {
showSys.value = true;
} else {
showSys.value = false;
}
}
//
const getList = async () => {
loading.value = true;
console.log(queryParams.value,"queryParams.value")
const response = await listStdCodeApprById(queryParams.value);
tableData.value = response.rows.map(item => ({ ...item}));
loading.value = false;
};
const handleCodeClick = (row) => {
console.log('点击了标准代码名称', row);
};
function tableRowClassName({ row }) {
switch (row.changeType) {
case 'add':
return 'row-add'
case 'update':
return 'row-edit'
case 'delete':
return 'row-delete'
default:
return ''
}
}
const handleSelectionChange = (selection) => {
multiple.value = selection.length > 0;
selections.value = selection; //
console.log(selections.value,"子页面选中")
};
const changeTypeMap = {
add: '新增',
update: '修改',
delete: '删除'
};
//
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
//
const resetQuery = () => {
queryParams.value = {
parentId:props.codeId,
pageNum: 1,
pageSize: 100
};
};
defineExpose({
selections
});
onMounted(() => {
getStdCodeAppr(props.codeId).then(response => {
form.value = response.data;
});
getList();
// getcompanyList()
});
</script>
<style scoped>
.app-container {
padding: 20px;
}
.query-form-container {
margin-bottom: 20px;
}
.el-table .el-input {
width: 100%;
}
.form-container {
margin-bottom: 20px;
}
.info-text {
font-size: 18px; /* 调整字体大小 */
line-height: 1.6; /* 行高,使文字更易于阅读 */
color: #333; /* 字体颜色 */
font-weight: 500; /* 设置字体加粗 */
display: inline-block;
width: 100%;
}
</style>
<style scoped>
.custom-form-container .el-form-item {
margin-bottom: 15px; /* 增加表单项间距 */
margin-left: 20px;
}
.changed-label,
.changed-value {
color: rgb(137, 189, 58) !important;;
font-weight: bold;
}
.custom-form-container .el-form-item .el-input,
.custom-form-container .el-form-item .el-select {
width: 100%; /* 输入框和选择框宽度填满 */
}
.custom-form-container .el-form-item span {
font-size: 14px; /* 字体大小 */
color: #333; /* 字体颜色 */
}
.custom-form-item label {
font-weight: bold; /* 加粗标签 */
margin-right: 10px; /* 为标签添加右侧间距 */
}
.el-dialog__footer {
text-align: center;
}
.dialog-footer-btn {
width: 100px; /* 按钮宽度 */
font-size: 14px;
}
::v-deep(.row-add) {
background-color: #bae7ff !important;
}
::v-deep(.row-edit) {
background-color: #d9f7be !important;
}
::v-deep(.row-delete) {
background-color: #ffa39e !important;
}
</style>

210
vue-fastapi-frontend/src/views/system/flow/dataStdCodeAppr.vue

@ -0,0 +1,210 @@
<template>
<el-table
v-loading="loading"
:data="tableData"
border
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="归属" align="center" width="200">
<template #default="{ row }">
{{
row.dictLevel === 'company'
? '公司级'
: '系统级(' + row.sysName + ')'
}}
</template>
</el-table-column>
<el-table-column label="类型" align="center">
<template #default="{ row }">
{{ row.dictType == 0 ? '基础数据' : '指标数据' }}
</template>
</el-table-column>
<el-table-column label="代码归属" align="center" prop="sysName" />
<el-table-column label="标准代码编号" align="center" prop="codeNum" />
<el-table-column label="标准代码名称" align="center" prop="codeName" />
<el-table-column label="变更类型" align="center">
<template #default="{ row }">
{{ changeTypeMap[row.changeType] || row.changeType }}
</template>
</el-table-column>
<el-table-column label="审批状态" align="center">
<template #default="{ row }">
{{ approStatusMap[row.approStatus] || row.approStatus }}
</template>
</el-table-column>
<!-- 查看 操作列固定右侧 -->
<el-table-column fixed="right" label="操作" width="100" align="center">
<template #default="{ row }">
<el-button text type="primary" @click="handleView(row.id)">
查看
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 弹窗 -->
<!-- 字典详情弹窗样式保留 -->
<el-dialog
v-model="formVisible"
title="字典详情"
width="70%"
@close="formData = {}"
>
<!-- 引入第二个页面组件 -->
<code-item-common ref="showCodeDialog" v-if="formVisible" :codeId="codeId"/>
<template #footer>
<el-button @click="formVisible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref, watch } from 'vue';
import { listStdCodeAppr,} from '@/api/datastd/std';
import codeItemCommon from './codeItemCommon.vue'; //
const props = defineProps({
flowId: {
type: String,
required: true
},
stdCodeVisible:{
type: Boolean,
required: true
}
});
//
function tableRowClassName({ row }) {
switch (row.changeType) {
case 'add':
return 'row-add'
case 'update':
return 'row-edit'
case 'delete':
return 'row-delete'
default:
return ''
}
}
const isChanged = (val) => !!val && typeof val === 'string' && val.includes('==>');
const formatValue = (val) => {
if (!val) return ''
if (isChanged(val)) {
const [oldVal, newVal] = val.split('==>')
return `${oldVal.trim()} ==> ${newVal.trim()}`
}
return val
}
const loading = ref(false);
const codeId = ref("");
const tableData = ref([]);
const changeTypeMap = {
add: '新增',
update: '修改',
delete: '删除'
};
const approStatusMap = {
waiting: '待审核',
pending: '审核中',
succeed: '通过',
rejected: '拒绝',
canceled: '已取消'
};
const formVisible = ref(false);
const formData = ref({});
const getList = async () => {
loading.value = true;
try {
const params = { flowId: props.flowId };
const res = await listStdCodeAppr(params);
tableData.value = res.data || [];
} catch (e) {
console.error('加载失败', e);
} finally {
loading.value = false;
}
};
watch(() => props.stdCodeVisible, (newVal) => {
if (newVal) {
getList();
}
});
onMounted(() => {
if (props.flowId) {
getList();
}
});
const handleView = async (id) => {
try {
codeId.value=id
formVisible.value = true;
} catch (e) {
console.error('获取详情失败', e);
}
};
</script>
<style scoped>
.custom-form-container .el-form-item {
margin-bottom: 15px; /* 增加表单项间距 */
margin-left: 20px;
}
.changed-label,
.changed-value {
color: rgb(137, 189, 58) !important;;
font-weight: bold;
}
.custom-form-container .el-form-item .el-input,
.custom-form-container .el-form-item .el-select {
width: 100%; /* 输入框和选择框宽度填满 */
}
.custom-form-container .el-form-item span {
font-size: 14px; /* 字体大小 */
color: #333; /* 字体颜色 */
}
.custom-form-item label {
font-weight: bold; /* 加粗标签 */
margin-right: 10px; /* 为标签添加右侧间距 */
}
.el-dialog__footer {
text-align: center;
}
.dialog-footer-btn {
width: 100px; /* 按钮宽度 */
font-size: 14px;
}
::v-deep(.row-add) {
background-color: #bae7ff !important;
}
::v-deep(.row-edit) {
background-color: #d9f7be !important;
}
::v-deep(.row-delete) {
background-color: #ffa39e !important;
}
</style>

11
vue-fastapi-frontend/src/views/system/flow/index.vue

@ -524,6 +524,9 @@
<el-dialog v-model="stdDictVisible" title="数据字典变更详情" width="80%" > <el-dialog v-model="stdDictVisible" title="数据字典变更详情" width="80%" >
<DataStdDictTable :flowId="selectedFlowId" :stdDictVisible="stdDictVisible"/> <DataStdDictTable :flowId="selectedFlowId" :stdDictVisible="stdDictVisible"/>
</el-dialog> </el-dialog>
<el-dialog v-model="stdCodeVisible" title="标准代码变更详情" width="80%" >
<DataStdCodeTable :flowId="selectedFlowId" :stdCodeVisible="stdCodeVisible"/>
</el-dialog>
</div> </div>
</template> </template>
@ -533,9 +536,11 @@ import { getMetaInfoApplyBusinessDetail } from "@/api/meta/metaInfo"
import {v4 as uuid} from 'uuid' import {v4 as uuid} from 'uuid'
import DataStdMainTable from './dataStdMainAppr.vue'; // import DataStdMainTable from './dataStdMainAppr.vue'; //
import DataStdDictTable from './dataStdDictAppr.vue'; // import DataStdDictTable from './dataStdDictAppr.vue'; //
import DataStdCodeTable from './dataStdCodeAppr.vue'; //
const stdMainVisible = ref(false); const stdMainVisible = ref(false);
const stdDictVisible = ref(false); const stdDictVisible = ref(false);
const stdCodeVisible = ref(false);
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import {getWaitingFlowCount} from "../../../api/flow/flow.js"; import {getWaitingFlowCount} from "../../../api/flow/flow.js";
@ -967,16 +972,18 @@ function showBusinessDataDialog(row){
} }
}) })
}else if(row.businessType ==="dataStdMain"){ }else if(row.businessType ==="dataStdMain"){
console.log("打开标准1111")
selectedFlowId.value = row.businessId; selectedFlowId.value = row.businessId;
stdMainVisible.value = true; stdMainVisible.value = true;
}else if(row.businessType ==="dataStdDict"){ }else if(row.businessType ==="dataStdDict"){
console.log("打开字典222")
selectedFlowId.value = row.businessId; selectedFlowId.value = row.businessId;
stdDictVisible.value = true; stdDictVisible.value = true;
}else if(row.businessType ==="dataStdCode"){
selectedFlowId.value = row.businessId;
stdCodeVisible.value = true;
} }
} }
function agree(row){ function agree(row){
//nodeId //nodeId

Loading…
Cancel
Save