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.

155 lines
6.5 KiB

1 month ago
import io
import json
import uuid
from typing import Optional, List
1 month ago
import pandas as pd
from fastapi import UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.user_vo import CurrentUserModel
from module_admin.entity.vo.dataint_vo import CdplbPageObject, SaveCdplbModel
from module_admin.entity.do.dataint_do import SysCdplb
from module_admin.dao.cdplb_dao import CdplbDao
from exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime
1 month ago
from utils.common_util import *
class CdplbService:
"""
智能问答服务层
"""
@classmethod
async def get_cdplb_list_services(cls, result_db: AsyncSession, cdplb_query: CdplbPageObject, current_user: CurrentUserModel):
result = await CdplbDao.get_cdplb_list(result_db, cdplb_query)
return CamelCaseUtil.transform_result(result)
@classmethod
async def save_cdplb(cls, result_db: AsyncSession, saveCdplbModel: SaveCdplbModel, current_user: CurrentUserModel):
if saveCdplbModel.onum is None:
# add
saveCdplbModel.onum = uuid.uuid4()
addObj = SysCdplb(**saveCdplbModel.model_dump())
addObj.create_by = current_user.user.user_name
addObj.create_time = datetime.now()
addObj.update_by = current_user.user.user_name
addObj.update_time = datetime.now()
await CdplbDao.insert_cdplb(result_db, addObj)
else:
# update
oldObj = await CdplbDao.get_cdplb_by_id(result_db, saveCdplbModel.onum)
if oldObj is None:
raise ServiceException(message='所改对象不存在')
saveObj = saveCdplbModel.model_dump(exclude_unset=True)
saveObj['update_by'] = current_user.user.user_name
saveObj['update_time'] = datetime.now()
await CdplbDao.update_cdplb(result_db, saveObj)
await result_db.commit()
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
async def delete_cdplb(cls, db: AsyncSession, array: List[str]):
await CdplbDao.delete_cdplb(db, array)
await db.commit()
return CrudResponseModel(is_success=True, message='操作成功')
1 month ago
@staticmethod
async def get_import_template_services():
"""
获取元数据导入模板service
:return: 元数据导入模板excel的二进制数据
"""
table_header_list = ['批量对象表名', '批里对象字段名', '频次', '词性', '词性名称', '状态']
selector_header_list = ['状态']
option_list = [{'状态': ['正常', '停用']}]
sheet_config1 = dict(
sheet_name="词典批量补充", header_list=table_header_list, data_list=[], selector_header_list=selector_header_list
)
sheet_configs = [sheet_config1]
binary_data = get_excel_template_with_sheets(
sheet_configs, # 每个Sheet的配置(包含表头、选择器等)
option_list
)
return binary_data
@classmethod
async def batch_import_cdplb_data(cls,
result_db: AsyncSession,
file: UploadFile,
overWrite: bool,
current_user: CurrentUserModel):
table_header_dict = {
'批量对象表名': 'bath_obj_tab_name',
'批里对象字段名': 'bath_obj_fld_name',
'频次': 'freq',
'词性': 'pos',
'词性名称': 'pos_name',
'状态': 'status'
}
contents = await file.read()
excel_file = pd.ExcelFile(io.BytesIO(contents))
await file.close()
# 获取所有sheet名称
sheet_names = excel_file.sheet_names
# 逐个读取
tableSheet = sheet_names[0]
result_list = {
"rows": [],
"successCount": 0
}
if tableSheet == '词典批量补充':
df = excel_file.parse(sheet_name=tableSheet, dtype=str, keep_default_na=False, na_values=[])
df.rename(columns=table_header_dict, inplace=True)
for index, row in df.iterrows():
noneValid = ''
if row['bath_obj_tab_name'] is None or len(row['bath_obj_tab_name']) == 0:
noneValid += "批量对象表名不能为空"
if row['bath_obj_fld_name'] is None or len(row['bath_obj_fld_name']) == 0:
if len(noneValid) > 0:
noneValid += ",批里对象字段名不能为空"
else:
noneValid += "批里对象字段名不能为空"
if row['freq'] is None or len(row['freq']) == 0:
if len(noneValid) > 0:
noneValid += ",频次不能为空"
else:
noneValid += "频次不能为空"
if row['pos'] is None or len(row['pos']) == 0:
if len(noneValid) > 0:
noneValid += ",词性不能为空"
else:
noneValid += "词性不能为空"
if row['pos_name'] is None or len(row['pos_name']) == 0:
if len(noneValid) > 0:
noneValid += ",词性名称不能为空"
else:
noneValid += "词性名称不能为空"
if row['status'] is None or len(row['status']) == 0:
if len(noneValid) > 0:
noneValid += ",状态不能为空"
else:
noneValid += "状态不能为空"
if len(noneValid) > 0:
result_list['rows'].append({
"row": index + 2,
"errorInfo": noneValid
})
continue
cdplb = SaveCdplbModel()
cdplb.bath_obj_tab_name = row['bath_obj_tab_name']
cdplb.bath_obj_fld_name = row['bath_obj_fld_name']
cdplb.freq = row['freq']
cdplb.pos = row['pos']
cdplb.pos_name = row['pos_name']
cdplb.status = '1' if row['status'] == '正常' else '0'
await cls.save_cdplb(result_db, cdplb, current_user)
result_list['successCount'] += 1
return result_list