Commit a06e9b89 authored by 高建强's avatar 高建强

item:知识库导入迁移

parent aaccb931
package com.yeejoin.amos.knowledgebase.face.util.excel;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeDynamicsOptionModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagInstanceModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagModel;
import com.yeejoin.amos.knowledgebase.face.model.KnowledgeTagValueModel;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDocContent;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeDynamicsValue;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagInstance;
import com.yeejoin.amos.knowledgebase.face.orm.entity.KnowledgeTagValue;
import com.yeejoin.amos.knowledgebase.face.util.DocSortUtil;
import lombok.Data;
import lombok.Getter;
import lombok.NonNull;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.exception.BaseException;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.text.DecimalFormat;
import java.util.*;
import java.util.regex.Pattern;
/**
* excel格式的战例解析--定制化
*
* @author tiantao
*/
public class ExcelParserOld {
private static final Pattern NUMBER_STRING_PATTEN = Pattern.compile("^[-\\+]?[\\d]*$");
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String DATE_FORMAT4_HTML = "yyyy-MM-dd HH:mm";
public static final String VALUE_TAG_FIELD_SINGLEVALUE = "singleValue";//单值字段名
public static final String VALUE_TAG_FIELD_RANGE_MAX = "rangeMax";//范围值 上界
public static final String VALUE_TAG_FIELD_RANGE_MIN = "rangeMin";//范围值 下界
public static final String VALUE_TAG_FIELD_TEXT = "text";//文本值
public static final String VALUE_TAG_FIELD_DATE_H = "dateH";//时间,年月日时分秒
public static final String VALUE_TAG_FIELD_ENUM_NAME = "enumName";// 枚举类型字段名
public static final String DOC_STATUS_UNPUBLISHED = "UNPUBLISHED";//文档发布状态--未发布
public static final String DOC_STATUS_PUBLISHED = "PUBLISHED"; //文
public static final String MARKING_TYPE_DOC = "DOC"; // 标记类型--文档标签
public static final String MARKING_TYPE_CONTENT = "CONTENT";// 标记类型--内容标签
/**
* 审核状态--待提交
*/
public static final String DOC_AUDIT_STATUS_SAVED = "SAVED";
/**
* 审核状态--待审核
*/
public static final String DOC_AUDIT_STATUS_SUBMITTED = "SUBMITTED";
/**
* 审核状态--通过
*/
public static final String DOC_AUDIT_STATUS_PASSED = "PASSED";
/**
* 审核状态--驳回
*/
public static final String DOC_AUDIT_STATUS_REJECTED = "REJECTED";
private static final String TAG_INSTANCE_LABEL = "label";
private static String DELETE_SYNC_PLAN_TOPIC = "DELETE_SYNC_PLAN_DOC";
private static String getHolderRegex(Integer index) {
return "#\\{knowledge-" + index + "\\}";
}
private static String getHolderAllRegex() {
return "#\\{knowledge-\\d+\\}";
}
private static String removeAllHolder(String str) {
return str.replaceAll(getHolderAllRegex(), "");
}
private static String replaceHolder(String str, Integer index, String text) {
if (text == null) {
text = "";
}
return str.replaceAll(getHolderRegex(index), text);
}
/**
* 配置信息中涉及的标签列表以id为key
*/
private final Map<Long, KnowledgeTagModel> tagMap;
/**
* 导入配置
*/
private final Map<String, ExcelImportConfig> excelConfigMap;
/**
* 文档动态字段数据类型Map
*/
private final Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap;
/**
* 标签的值类型
*/
private final Map<Long, String> tagValueTypeMap;
/**
* 涉及的枚举信息,以分组为外层key,中文值为内层key,英文值为value
*/
private final Map<String, Map<String, String>> enumCnEnMap;
/**
* 标签的单位
*/
private final Map<Long, String> tagUnitMap;
/**
* 解析的数据及返回结果数据
*/
private List<ImportResult> ImportResults = new ArrayList<>();
private TablesDataList tablesDataList = new TablesDataList();
private Sequence sequence;
public List<ImportResult> getImportResults() {
return ImportResults;
}
private Date now = new Date();
private final String orgCode;
public ExcelParserOld(@NonNull Map<Long, KnowledgeTagModel> tagMap, @NonNull Map<String, ExcelImportConfig> excelConfigMap,
Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap, @NonNull Map<Long, String> tagValueTypeMap,
@NonNull Map<String, Map<String, String>> enumCnEnMap, @NonNull Map<Long, String> tagUnitMap,
@NonNull Sequence sequence, String orgCode) {
this.tagMap = Collections.unmodifiableMap(tagMap);
this.excelConfigMap = excelConfigMap;
this.fieldTypeMap = Collections.unmodifiableMap(fieldTypeMap);
this.tagValueTypeMap = Collections.unmodifiableMap(tagValueTypeMap);
this.enumCnEnMap = Collections.unmodifiableMap(enumCnEnMap);
this.tagUnitMap = Collections.unmodifiableMap(tagUnitMap);
this.sequence = sequence;
this.orgCode = orgCode;
}
/**
* 解析表格行
*
* @param row 表格行对象
*/
public void parseRow(Row row, Map<String, Long> typeValueMap) {
try {
String typeValue = convertCellValueToString(row.getCell(1));
if (ValidationUtil.isEmpty(typeValue) || ValidationUtil.isEmpty(typeValueMap.get(typeValue))) {
throw new BadRequest("缺少基本信息");
}
ExcelImportConfig excelConfig = this.excelConfigMap.get(String.valueOf(typeValueMap.get(typeValue)));
String docTitle = convertCellValueToString(row.getCell(excelConfig.getTitleColumn()));
// String docDirectory = convertCellValueToString(row.getCell(excelConfig.getDirectoryColumn()));
String docDirectory = excelConfig.getDirectoryColumn();
if (ValidationUtil.isEmpty(docTitle) || ValidationUtil.isEmpty(docDirectory)) {
throw new BadRequest("缺少基本信息");
}
Long directoryId = Long.parseLong(docDirectory);
// 创建文档
KnowledgeDocContent docContent = getNewDoc(excelConfig);
// 设置文档分类
docContent.setDocTitle(docTitle);
docContent.setDirectoryId(directoryId);
// 创建动态字段
List<KnowledgeDynamicsValue> dynamicsValues = getDynamicsValueList(excelConfig, row, docContent);
// 创建标签实例
List<KnowledgeTagInstance> tagInstances = new ArrayList<>();
// 以及标签值实例
List<KnowledgeTagValue> tagValues = new ArrayList<>();
Map<Long, List<Integer>> tagColumns = excelConfig.getTagColumns();
Map<Integer, String> formatMap = excelConfig.getFormatMap();
for (Long tagSeq : tagColumns.keySet()) {
if (!tagMap.containsKey(tagSeq) || !tagValueTypeMap.containsKey(tagSeq)) {
continue;
}
String valueType = tagValueTypeMap.get(tagSeq);
KnowledgeTagInstance tagInstance = getTagInstance(tagMap.get(tagSeq), docContent.getSequenceNbr());
switch (valueType) {
case "single": {
Integer valueColIndex = tagColumns.get(tagSeq).get(0);
String cellValue = convertCellValueToString(row.getCell(valueColIndex));
if (ValidationUtil.isEmpty(cellValue) || !NUMBER_STRING_PATTEN.matcher(cellValue).matches()) {
continue;
}
tagValues.add(getTagValue(tagInstance, VALUE_TAG_FIELD_SINGLEVALUE, cellValue));
replaceHtmlHolder(docContent, valueColIndex, cellValue, cellValue);
break;
}
case "date": {
Integer valueColIndex = tagColumns.get(tagSeq).get(0);
String cellValue = convertCellValueToString(row.getCell(valueColIndex));
if (ValidationUtil.isEmpty(cellValue) || !formatMap.containsKey(valueColIndex)) {
continue;
}
try {
Date date = DateUtil.formatStringToDate(cellValue, formatMap.get(valueColIndex));
cellValue = DateUtil.formatDate(date, DATE_FORMAT);
String htmlDateStr = DateUtil.formatDate(date, DATE_FORMAT4_HTML);
tagValues.add(getTagValue(tagInstance, VALUE_TAG_FIELD_DATE_H, cellValue));
replaceHtmlHolder(docContent, valueColIndex, htmlDateStr, cellValue);
} catch (Exception e) {
continue;
}
break;
}
case "text": {
Integer valueColIndex = tagColumns.get(tagSeq).get(0);
String cellValue = convertCellValueToString(row.getCell(valueColIndex));
if (ValidationUtil.isEmpty(cellValue)) {
continue;
}
tagValues.add(getTagValue(tagInstance, VALUE_TAG_FIELD_TEXT, cellValue));
replaceHtmlHolder(docContent, valueColIndex, cellValue, cellValue);
break;
}
case "range":
if (tagColumns.get(tagSeq).size() > 1) {
Integer valueColIndex1 = tagColumns.get(tagSeq).get(0);
String cellValue1 = convertCellValueToString(row.getCell(valueColIndex1));
Integer valueColIndex2 = tagColumns.get(tagSeq).get(1);
String cellValue2 = convertCellValueToString(row.getCell(valueColIndex2));
if (ValidationUtil.isEmpty(cellValue1) && ValidationUtil.isEmpty(cellValue2)
|| !NUMBER_STRING_PATTEN.matcher(cellValue1).matches() || !NUMBER_STRING_PATTEN.matcher(cellValue2).matches()) {
continue;
}
if (!ValidationUtil.isEmpty(cellValue1)) {
tagValues.add(getTagValue(tagInstance, VALUE_TAG_FIELD_RANGE_MIN, cellValue1));
replaceHtmlHolder(docContent, valueColIndex1, cellValue1, cellValue1);
}
if (!ValidationUtil.isEmpty(cellValue2)) {
tagValues.add(getTagValue(tagInstance, VALUE_TAG_FIELD_RANGE_MAX, cellValue2));
replaceHtmlHolder(docContent, valueColIndex2, cellValue2, cellValue2);
}
} else {
continue;
}
break;
default:
break;
}
tagInstances.add(tagInstance);
}
if (ValidationUtil.isEmpty(excelConfig.getTitleColumn())) {
throw new BadRequest("缺少标题所在的索引信息");
}
replaceHtmlHolder(docContent, excelConfig.getTitleColumn(), docTitle, docTitle);
docContent.setHtmlContent(removeAllHolder(docContent.getHtmlContent()));
docContent.setTextContent(removeAllHolder(docContent.getTextContent()));
String textContent = String.valueOf(docContent.getTextContent());
docContent.setSummary(textContent.substring(0, Math.min(300, textContent.length())));
List<KnowledgeTagInstanceModel> docTags = stuffTagValues(tagInstances, tagValues);
docContent.setSortStr(DocSortUtil.getSortStr(docTags));
this.tablesDataList.getDocContentList().add(docContent);
this.tablesDataList.getDynamicsValueList().addAll(dynamicsValues);
this.tablesDataList.getTagInstanceList().addAll(tagInstances);
this.tablesDataList.getTagValueList().addAll(tagValues);
this.ImportResults.add(new ImportResult(row.getRowNum()));
} catch (BaseException e) {
this.ImportResults.add(new ImportResult(row.getRowNum(), e.getMessage()));
} catch (Exception e) {
this.ImportResults.add(new ImportResult(row.getRowNum(), e.getStackTrace()[0].getMethodName()));
}
}
private List<KnowledgeTagInstanceModel> stuffTagValues(List<KnowledgeTagInstance> tagInstances, List<KnowledgeTagValue> tagValues) {
if (ValidationUtil.isEmpty(tagInstances)) {
return Collections.emptyList();
}
ArrayList<KnowledgeTagInstanceModel> resList = Bean.toModels(tagInstances, KnowledgeTagInstanceModel.class);
Map<Object, KnowledgeTagInstanceModel> instanceModelMap = Bean.listToMap(resList, "sequenceNbr", KnowledgeTagInstanceModel.class);
if (!ValidationUtil.isEmpty(tagValues)) {
tagValues.forEach(tagValue -> {
KnowledgeTagInstanceModel instanceModel = instanceModelMap.get(tagValue.getInstanceSeq());
List<KnowledgeTagValueModel> tagValueModels = instanceModel.getTagValues();
if (null == tagValueModels) {
tagValueModels = new ArrayList<>();
instanceModel.setTagValues(tagValueModels);
}
tagValueModels.add(Bean.toModel(tagValue, new KnowledgeTagValueModel()));
});
}
return resList;
}
private void replaceHtmlHolder(KnowledgeDocContent docContent, Integer colIndex, String contentValue, String textValue) {
docContent.setHtmlContent(replaceHolder(docContent.getHtmlContent(), colIndex, contentValue));
docContent.setTextContent(replaceHolder(docContent.getTextContent(), colIndex, textValue));
}
/**
* 获取解析到的数据列表,并刷新以备下一波解析
*
* @return 数据列表合集
*/
public TablesDataList getAndFlushDatas() {
TablesDataList res = this.tablesDataList;
this.tablesDataList = new TablesDataList();
return res;
}
/**
* 创建一个新的文档
*
* @return
*/
private KnowledgeDocContent getNewDoc(ExcelImportConfig excelConfig) {
KnowledgeDocContent docContent = new KnowledgeDocContent();
docContent.setSequenceNbr(sequence.nextId());
docContent.setRecDate(now);
docContent.setRecUserId(RequestContext.getExeUserId());
docContent.setUserId(RequestContext.getExeUserId());
docContent.setCreateTime(now);
docContent.setAgencyCode(RequestContext.getAgencyCode());
docContent.setOrgCode(this.orgCode);
docContent.setHtmlContent(excelConfig.getHtmlModule());
docContent.setTextContent(excelConfig.getSummaryModule());
docContent.setDocStatus(DOC_STATUS_UNPUBLISHED);
docContent.setAuditStatus(DOC_AUDIT_STATUS_SAVED);
docContent.setHaveAttachment(false);
return docContent;
}
private List<KnowledgeDynamicsValue> getDynamicsValueList(ExcelImportConfig excelConfig, Row row, KnowledgeDocContent docContent) {
List<KnowledgeDynamicsValue> dynamicsValues = new ArrayList<>();
Map<String, Integer> basicColumns = excelConfig.getBasicColumns();
Map<Integer, String> enumMap = excelConfig.getEnumMap();
for (String fieldName : basicColumns.keySet()) {
Integer colIndex = basicColumns.get(fieldName);
Cell cell = row.getCell(colIndex);
KnowledgeDynamicsOptionModel optionModel = fieldTypeMap.get(fieldName);
if (null == optionModel) {
throw new BadRequest("无法识别的字段名:" + fieldName);
}
String type = fieldTypeMap.get(fieldName).getDataType();
String cellValue = convertCellValueToString(cell);
if (type.toUpperCase().equals("ENUM")) {
if (!enumMap.containsKey(colIndex)) {
throw new BadRequest("缺少枚举字段的配置信息:" + fieldName);
}
String enumName = enumMap.get(colIndex);
cellValue = enumCnEnMap.get(enumName).get(cellValue);
}
dynamicsValues.add(getNewDynamicsField(optionModel, cellValue, docContent.getSequenceNbr()));
// 替换模板占位字符
replaceHtmlHolder(docContent, colIndex, cellValue, cellValue);
}
return dynamicsValues;
}
private KnowledgeDynamicsValue getNewDynamicsField(KnowledgeDynamicsOptionModel optionModel, String cellValue, Long docSequenceNbr) {
KnowledgeDynamicsValue dynamicsValue = new KnowledgeDynamicsValue();
dynamicsValue.setSequenceNbr(sequence.nextId());
dynamicsValue.setRecDate(now);
dynamicsValue.setRecUserId(RequestContext.getExeUserId());
dynamicsValue.setFieldName(optionModel.getFieldName());
dynamicsValue.setFieldValue(ValidationUtil.isEmpty(cellValue) ? "" : cellValue);
dynamicsValue.setDataType(optionModel.getDataType());
dynamicsValue.setAgencyCode(RequestContext.getAgencyCode());
dynamicsValue.setFieldLabel(optionModel.getFieldLabel());
dynamicsValue.setGroupSeq(optionModel.getGroupSeq());
dynamicsValue.setQueryStrategy(optionModel.getQueryStrategy());
dynamicsValue.setInstanceId(docSequenceNbr);
dynamicsValue.setOptionSeq(optionModel.getSequenceNbr());
return dynamicsValue;
}
KnowledgeTagInstance getTagInstance(KnowledgeTagModel tagModel, Long docSequenceNbr) {
KnowledgeTagInstance tagInstance = new KnowledgeTagInstance();
tagInstance.setSequenceNbr(sequence.nextId());
tagInstance.setRecDate(now);
tagInstance.setRecUserId(RequestContext.getExeUserId());
tagInstance.setAgencyCode(RequestContext.getAgencyCode());
tagInstance.setTagSeq(tagModel.getSequenceNbr());
tagInstance.setTargetSeq(docSequenceNbr);
tagInstance.setTagType(tagModel.getTagType());
tagInstance.setTagName(tagModel.getTagName());
tagInstance.setMarkingType(MARKING_TYPE_DOC);
return tagInstance;
}
/**
* 创建一个新的标签值实例
*
* @param tagInstance 实例对象
* @param value 值
* @return Model
*/
private KnowledgeTagValue getTagValue(KnowledgeTagInstance tagInstance, String fieldName, String value) {
KnowledgeTagValue tagValue = new KnowledgeTagValue();
tagValue.setSequenceNbr(sequence.nextId());
tagValue.setRecDate(now);
tagValue.setRecUserId(RequestContext.getExeUserId());
tagValue.setAgencyCode(RequestContext.getAgencyCode());
tagValue.setInstanceSeq(tagInstance.getSequenceNbr());
tagValue.setFieldName(fieldName);
tagValue.setTagValue(value);
tagValue.setUnit(tagUnitMap.get(tagInstance.getTagSeq()));
return tagValue;
}
/**
* 获取单元格的文本内容
*
* @param cell
* @return
*/
public static String convertCellValueToString(Cell cell) {
if (cell == null) {
return null;
}
String returnValue = null;
switch (cell.getCellType()) {
//数字
case NUMERIC:
Double doubleValue = cell.getNumericCellValue();
// 格式化科学计数法,取一位整数
DecimalFormat df = new DecimalFormat("0");
returnValue = df.format(doubleValue);
break;
//字符串
case STRING:
returnValue = cell.getStringCellValue().trim();
break;
//布尔
case BOOLEAN:
Boolean booleanValue = cell.getBooleanCellValue();
returnValue = booleanValue.toString();
break;
// 空值
case BLANK:
break;
// 公式
case FORMULA:
returnValue = cell.getCellFormula();
break;
// 故障
case ERROR:
break;
default:
}
return returnValue;
}
/**
* 数据涉及对象列表缓存
*/
@Getter
public class TablesDataList {
private List<KnowledgeDocContent> docContentList = new ArrayList<>();
private List<KnowledgeTagInstance> tagInstanceList = new ArrayList<>();
private List<KnowledgeTagValue> tagValueList = new ArrayList<>();
private List<KnowledgeDynamicsValue> dynamicsValueList = new ArrayList<>();
}
@Data
class ImportResult {
// 行号
private Integer rowIndex;
// 是否导入成功
private boolean success;
// 错误信息
private String errorMessege;
ImportResult(Integer rowIndex, String errorMessege) {
this.rowIndex = rowIndex;
this.success = false;
this.errorMessege = errorMessege;
}
ImportResult(Integer rowIndex) {
this.rowIndex = rowIndex;
this.success = true;
}
}
}
package com.yeejoin.amos.knowledgebase.controller; package com.yeejoin.amos.knowledgebase.controller;
import java.util.List;
import java.util.Map; import java.util.Map;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONArray;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -212,18 +214,31 @@ public class DocLibraryResource { ...@@ -212,18 +214,31 @@ public class DocLibraryResource {
docLibraryService.export(id, type, response); docLibraryService.export(id, type, response);
} }
// @TycloudOperation(ApiLevel = UserType.AGENCY)
// @ApiOperation(value = "导入excel文档")
// @RequestMapping(value = "/import", method = RequestMethod.POST)
// public ResponseModel importExcel(@RequestPart(value = "file") MultipartFile file,
// @RequestPart(value = "module") String moduleStr) {
// ExcelImportConfig excelConfig;
// try {
// excelConfig = JSON.parseObject(moduleStr, ExcelImportConfig.class);
// } catch (Exception e) {
// throw new BadRequest("模板配置信息格式有误");
// }
// return ResponseHelper.buildResponse(docLibraryService.importExcel(file, excelConfig));
// }
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "导入excel文档") @ApiOperation(value = "导入excel文档")
@RequestMapping(value = "/import", method = RequestMethod.POST) @RequestMapping(value = "/import", method = RequestMethod.POST)
public ResponseModel importExcel(@RequestPart(value = "file") MultipartFile file, public ResponseModel importExcel(@RequestPart(value = "file") MultipartFile file, @RequestPart(value = "module") String moduleStr) {
@RequestPart(value = "module") String moduleStr) { List<ExcelImportConfig> excelConfigList;
ExcelImportConfig excelConfig;
try { try {
excelConfig = JSON.parseObject(moduleStr, ExcelImportConfig.class); excelConfigList = JSONArray.parseArray(moduleStr, ExcelImportConfig.class);
} catch (Exception e) { } catch (Exception e) {
throw new BadRequest("模板配置信息格式有误"); throw new BadRequest("模板配置信息格式有误");
} }
return ResponseHelper.buildResponse(docLibraryService.importExcel(file, excelConfig)); return ResponseHelper.buildResponse(docLibraryService.importExcel(file, excelConfigList));
} }
} }
package com.yeejoin.amos.knowledgebase.face.service; package com.yeejoin.amos.knowledgebase.face.service;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -257,4 +250,13 @@ public class DocCategoryService extends BaseService<KnowledgeDocCategoryModel, K ...@@ -257,4 +250,13 @@ public class DocCategoryService extends BaseService<KnowledgeDocCategoryModel, K
List<KnowledgeDocCategoryModel> categoryModelList = this.queryForList(null, true, categoryName, parentId); List<KnowledgeDocCategoryModel> categoryModelList = this.queryForList(null, true, categoryName, parentId);
return categoryModelList.isEmpty() ? null : categoryModelList.get(0); return categoryModelList.isEmpty() ? null : categoryModelList.get(0);
} }
public Map<String, Long> getGroupNameValue(List<Long> ids) {
List<KnowledgeDocCategoryModel> list = this.queryBatchSeq(ids);
Map<String, Long> result = new HashMap<>();
for(KnowledgeDocCategoryModel knowledgeDocCategoryModel: list) {
result.put(knowledgeDocCategoryModel.getCategoryName(), knowledgeDocCategoryModel.getSequenceNbr());
}
return result;
}
} }
...@@ -21,6 +21,7 @@ import com.yeejoin.amos.knowledgebase.face.util.*; ...@@ -21,6 +21,7 @@ import com.yeejoin.amos.knowledgebase.face.util.*;
import com.yeejoin.amos.knowledgebase.face.util.FileExporter.FileType; import com.yeejoin.amos.knowledgebase.face.util.FileExporter.FileType;
import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelImportConfig; import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelImportConfig;
import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelParser; import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelParser;
import com.yeejoin.amos.knowledgebase.face.util.excel.ExcelParserOld;
import com.yeejoin.amos.knowledgebase.face.util.pdf.PdfBuilder; import com.yeejoin.amos.knowledgebase.face.util.pdf.PdfBuilder;
import com.yeejoin.amos.knowledgebase.face.util.sql.BaseSqlCondition; import com.yeejoin.amos.knowledgebase.face.util.sql.BaseSqlCondition;
import com.yeejoin.amos.knowledgebase.face.util.word.DocxBuilder; import com.yeejoin.amos.knowledgebase.face.util.word.DocxBuilder;
...@@ -582,26 +583,221 @@ public class DocLibraryService { ...@@ -582,26 +583,221 @@ public class DocLibraryService {
FileExporter.exportFile(fileType, docTitle, bytes, response); FileExporter.exportFile(fileType, docTitle, bytes, response);
} }
@Transactional(rollbackFor = {Exception.class, BaseException.class}) // @Transactional(rollbackFor = { Exception.class, BaseException.class })
public List importExcel(MultipartFile file, ExcelImportConfig excelConfig) { // public List importExcel(MultipartFile file, List<ExcelImportConfig> excelConfigList) {
// String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName());
// if (ValidationUtil.isEmpty(inputerOrg)) {
// throw new RequestForbidden("非录入者角色用户无权录入");
// }
// int finishedNum = 0;
//
// Set<Long> involvedTagIds = new HashSet<>();
// Set<String> enumNameList = new HashSet<>();
// Map<String, ExcelImportConfig> excelConfigMap = new HashMap();
// List<Long> directoryList = new ArrayList<>();
// for (ExcelImportConfig excelConfig : excelConfigList) {
// if (!excelConfig.check()) {
// throw new BadRequest("模板配置数据有误");
// }
// excelConfigMap.put(excelConfig.getDirectoryColumn(), excelConfig);
// Set<Long> involvedTags = excelConfig.getTagColumns().keySet();
// involvedTagIds.addAll(involvedTags);
// Set<String> enumNames = new HashSet<>(excelConfig.getEnumMap().values());
// enumNameList.addAll(enumNames);
// directoryList.add(Long.parseLong(excelConfig.getDirectoryColumn()));
// }
// Map<String, Long> directoryMap = docCategoryService.getGroupNameValue(directoryList);
// Workbook workbook = getBookWithFile(file);
// Sheet sheet = workbook.getSheetAt(0);
// if (sheet == null) {
// throw new BadRequest("文档sheet页为空");
// }
// int rowNumber = getRowNumber(sheet, excelConfigList.get(0));
// if (rowNumber <= 0) {
// throw new BadRequest("数据条目为零");
// }
//
// // 组装标签信息Map
// Map<Long, KnowledgeTagModel> tagMap = new HashMap();
// if (!ValidationUtil.isEmpty(involvedTagIds)) {
// List<KnowledgeTagModel> tagModelList = tagService.queryByIds(involvedTagIds);
// for (KnowledgeTagModel tagModel : tagModelList) {
// tagMap.put(tagModel.getSequenceNbr(), tagModel);
// }
// }
// // 组装文档动态字段数据类型Map
// Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap = new HashMap<>();
// List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService
// .queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name());
// for (KnowledgeDynamicsOptionModel optionModel : optionModels) {
// fieldTypeMap.put(optionModel.getFieldName(), optionModel);
// }
//
// // 组装标签值类型Map
// Map<Long, String> tagValueTypeMap = new HashMap<>();
// if (!ValidationUtil.isEmpty(involvedTagIds)) {
// List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "valueType");
// for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
// tagValueTypeMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
// }
// }
// // 组装字典中英文Map
// Map<String, Map<String, String>> enumCnEnMap = new HashMap<>();
// for (String enumName : enumNameList) {
// try {
// List<DictionarieValueModel> dictList = RemoteData.queryDict(enumName);
// Map<String, String> cnEnMap = new HashMap<>();
// for (DictionarieValueModel dictionarieValueModel : dictList) {
// cnEnMap.put(dictionarieValueModel.getDictDataValue(), dictionarieValueModel.getDictDataKey());
// }
// enumCnEnMap.put(enumName, cnEnMap);
// } catch (Exception e) {
// throw new RequestForbidden("获取字典数据出错,解析无法进行");
// }
// }
// // 组装标签单位Map
// Map<Long, String> tagUnitMap = new HashMap<>();
// if (!ValidationUtil.isEmpty(involvedTagIds)) {
// List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "unit");
// for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
// tagUnitMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
// }
// }
//
// ExcelParser excelParser = new ExcelParser(tagMap, excelConfigMap, fieldTypeMap, tagValueTypeMap, enumCnEnMap,
// tagUnitMap, this.sequence, inputerOrg);
// // 逐行解析
// while (finishedNum < rowNumber) {
// for (int i = 0; i < BATCH_IMPORT_ONCE_NUM && finishedNum < rowNumber; i++, finishedNum++) {
// Row row = sheet.getRow(excelConfigList.get(0).getStartRowIndex() + finishedNum);
// excelParser.parseRow(row, directoryMap);
// if (i % 500 == 0) {
// batchInsertDocDataAll(excelParser.getAndFlushDatas());
// }
// }
// QuoteCountFlushTiming.needFlushTag();
// }
// return excelParser.getImportResults();
// }
// @Transactional(rollbackFor = {Exception.class, BaseException.class})
// public List importExcel(MultipartFile file, List<ExcelImportConfig> excelConfigList) {
// String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName());
// if (ValidationUtil.isEmpty(inputerOrg)) {
// throw new RequestForbidden("非录入者角色用户无权录入");
// }
// int finishedNum = 0;
// List<Object> list = new ArrayList<>();
// for (ExcelImportConfig excelConfig : excelConfigList) {
// if (!excelConfig.check()) {
// throw new BadRequest("模板配置数据有误");
// }
// Workbook workbook = getBookWithFile(file);
// Sheet sheet = workbook.getSheetAt(0);
// if (sheet == null) {
// throw new BadRequest("文档sheet页为空");
// }
// int rowNumber = getRowNumber(sheet, excelConfig);
// if (rowNumber <= 0) {
// throw new BadRequest("数据条目为零");
// }
// Set<Long> involvedTagIds = excelConfig.getTagColumns().keySet();
// // 组装标签信息Map
// Map<Long, KnowledgeTagModel> tagMap = new HashMap();
// if (!ValidationUtil.isEmpty(involvedTagIds)) {
// List<KnowledgeTagModel> tagModelList = tagService.queryByIds(involvedTagIds);
// for (KnowledgeTagModel tagModel : tagModelList) {
// tagMap.put(tagModel.getSequenceNbr(), tagModel);
// }
// }
// // 组装文档动态字段数据类型Map
// Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap = new HashMap<>();
// List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name());
// for (KnowledgeDynamicsOptionModel optionModel : optionModels) {
// fieldTypeMap.put(optionModel.getFieldName(), optionModel);
// }
//
// // 组装标签值类型Map
// Map<Long, String> tagValueTypeMap = new HashMap<>();
// if (!ValidationUtil.isEmpty(involvedTagIds)) {
// List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "valueType");
// for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
// tagValueTypeMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
// }
// }
// // 组装字典中英文Map
// Map<String, Map<String, String>> enumCnEnMap = new HashMap<>();
// Set<String> enumNameList = new HashSet<>(excelConfig.getEnumMap().values());
// for (String enumName : enumNameList) {
// try {
// List<DictionarieValueModel> dictList = RemoteData.queryDict(enumName);
// Map<String, String> cnEnMap = new HashMap<>();
// for (DictionarieValueModel dictionarieValueModel : dictList) {
// cnEnMap.put(dictionarieValueModel.getDictDataValue(), dictionarieValueModel.getDictDataKey());
// }
// enumCnEnMap.put(enumName, cnEnMap);
// } catch (Exception e) {
// throw new RequestForbidden("获取字典数据出错,解析无法进行");
// }
// }
// // 组装标签单位Map
// Map<Long, String> tagUnitMap = new HashMap<>();
// if (!ValidationUtil.isEmpty(involvedTagIds)) {
// List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "unit");
// for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
// tagUnitMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
// }
// }
//
// ExcelParser excelParser = new ExcelParser(tagMap, excelConfig, fieldTypeMap, tagValueTypeMap, enumCnEnMap, tagUnitMap, this.sequence, inputerOrg);
// // 逐行解析
// while (finishedNum <= rowNumber) {
// for (int i = 0; i < BATCH_IMPORT_ONCE_NUM && finishedNum < rowNumber; i++, finishedNum++) {
// Row row = sheet.getRow(excelConfig.getStartRowIndex() + finishedNum);
// excelParser.parseRow(row);
// }
// batchInsertDocDataAll(excelParser.getAndFlushDatas());
// QuoteCountFlushTiming.needFlushTag();
// }
// list.add(excelParser.getImportResults());
// }
// return list;
// }
@Transactional(rollbackFor = { Exception.class, BaseException.class })
public List importExcel(MultipartFile file, List<ExcelImportConfig> excelConfigList) {
String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName()); String inputerOrg = RemoteData.getOrgWithCurUserAndRole(KnowledgeRoleName.INPUTER.getRoleName());
if (ValidationUtil.isEmpty(inputerOrg)) { if (ValidationUtil.isEmpty(inputerOrg)) {
throw new RequestForbidden("非录入者角色用户无权录入"); throw new RequestForbidden("非录入者角色用户无权录入");
} }
int finishedNum = 0; int finishedNum = 0;
Set<Long> involvedTagIds = new HashSet<>();
Set<String> enumNameList = new HashSet<>();
Map<String, ExcelImportConfig> excelConfigMap = new HashMap();
List<Long> directoryList = new ArrayList<>();
for (ExcelImportConfig excelConfig : excelConfigList) {
if (!excelConfig.check()) { if (!excelConfig.check()) {
throw new BadRequest("模板配置数据有误"); throw new BadRequest("模板配置数据有误");
} }
excelConfigMap.put(excelConfig.getDirectoryColumn(), excelConfig);
Set<Long> involvedTags = excelConfig.getTagColumns().keySet();
involvedTagIds.addAll(involvedTags);
Set<String> enumNames = new HashSet<>(excelConfig.getEnumMap().values());
enumNameList.addAll(enumNames);
directoryList.add(Long.parseLong(excelConfig.getDirectoryColumn()));
}
Map<String, Long> directoryMap = docCategoryService.getGroupNameValue(directoryList);
Workbook workbook = getBookWithFile(file); Workbook workbook = getBookWithFile(file);
Sheet sheet = workbook.getSheetAt(0); Sheet sheet = workbook.getSheetAt(0);
if (sheet == null) { if (sheet == null) {
throw new BadRequest("文档sheet页为空"); throw new BadRequest("文档sheet页为空");
} }
int rowNumber = getRowNumber(sheet, excelConfig); int rowNumber = getRowNumber(sheet, excelConfigList.get(0));
if (rowNumber <= 0) { if (rowNumber <= 0) {
throw new BadRequest("数据条目为零"); throw new BadRequest("数据条目为零");
} }
Set<Long> involvedTagIds = excelConfig.getTagColumns().keySet();
// 组装标签信息Map // 组装标签信息Map
Map<Long, KnowledgeTagModel> tagMap = new HashMap(); Map<Long, KnowledgeTagModel> tagMap = new HashMap();
if (!ValidationUtil.isEmpty(involvedTagIds)) { if (!ValidationUtil.isEmpty(involvedTagIds)) {
...@@ -612,7 +808,8 @@ public class DocLibraryService { ...@@ -612,7 +808,8 @@ public class DocLibraryService {
} }
// 组装文档动态字段数据类型Map // 组装文档动态字段数据类型Map
Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap = new HashMap<>(); Map<String, KnowledgeDynamicsOptionModel> fieldTypeMap = new HashMap<>();
List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name()); List<KnowledgeDynamicsOptionModel> optionModels = dynamicsOptionService
.queryByFunctional(RequestContext.getAppKey(), DynamicsFunctional.DOC_BASEINFO.name());
for (KnowledgeDynamicsOptionModel optionModel : optionModels) { for (KnowledgeDynamicsOptionModel optionModel : optionModels) {
fieldTypeMap.put(optionModel.getFieldName(), optionModel); fieldTypeMap.put(optionModel.getFieldName(), optionModel);
} }
...@@ -620,14 +817,14 @@ public class DocLibraryService { ...@@ -620,14 +817,14 @@ public class DocLibraryService {
// 组装标签值类型Map // 组装标签值类型Map
Map<Long, String> tagValueTypeMap = new HashMap<>(); Map<Long, String> tagValueTypeMap = new HashMap<>();
if (!ValidationUtil.isEmpty(involvedTagIds)) { if (!ValidationUtil.isEmpty(involvedTagIds)) {
List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "valueType"); List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService
.queryFieldValueByIds(new ArrayList(involvedTagIds), "valueType");
for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) { for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
tagValueTypeMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue()); tagValueTypeMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
} }
} }
// 组装字典中英文Map // 组装字典中英文Map
Map<String, Map<String, String>> enumCnEnMap = new HashMap<>(); Map<String, Map<String, String>> enumCnEnMap = new HashMap<>();
Set<String> enumNameList = new HashSet<>(excelConfig.getEnumMap().values());
for (String enumName : enumNameList) { for (String enumName : enumNameList) {
try { try {
List<DictionarieValueModel> dictList = RemoteData.queryDict(enumName); List<DictionarieValueModel> dictList = RemoteData.queryDict(enumName);
...@@ -643,26 +840,31 @@ public class DocLibraryService { ...@@ -643,26 +840,31 @@ public class DocLibraryService {
// 组装标签单位Map // 组装标签单位Map
Map<Long, String> tagUnitMap = new HashMap<>(); Map<Long, String> tagUnitMap = new HashMap<>();
if (!ValidationUtil.isEmpty(involvedTagIds)) { if (!ValidationUtil.isEmpty(involvedTagIds)) {
List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService.queryFieldValueByIds(new ArrayList(involvedTagIds), "unit"); List<KnowledgeDynamicsValueModel> dynamicsValueList = dynamicsValueService
.queryFieldValueByIds(new ArrayList(involvedTagIds), "unit");
for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) { for (KnowledgeDynamicsValueModel dynamicsValueModel : dynamicsValueList) {
tagUnitMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue()); tagUnitMap.put(dynamicsValueModel.getInstanceId(), dynamicsValueModel.getFieldValue());
} }
} }
ExcelParser excelParser = new ExcelParser(tagMap, excelConfig, fieldTypeMap, tagValueTypeMap, enumCnEnMap, tagUnitMap, this.sequence, inputerOrg); ExcelParserOld excelParser = new ExcelParserOld(tagMap, excelConfigMap, fieldTypeMap, tagValueTypeMap, enumCnEnMap,
tagUnitMap, this.sequence, inputerOrg);
// 逐行解析 // 逐行解析
while (finishedNum < rowNumber) { while (finishedNum < rowNumber) {
for (int i = 0; i < BATCH_IMPORT_ONCE_NUM && finishedNum < rowNumber; i++, finishedNum++) { for (int i = 0; i < BATCH_IMPORT_ONCE_NUM && finishedNum < rowNumber; i++, finishedNum++) {
Row row = sheet.getRow(excelConfig.getStartRowIndex() + finishedNum); Row row = sheet.getRow(excelConfigList.get(0).getStartRowIndex() + finishedNum);
excelParser.parseRow(row); excelParser.parseRow(row, directoryMap);
}
batchInsertDocDataAll(excelParser.getAndFlushDatas()); batchInsertDocDataAll(excelParser.getAndFlushDatas());
// if (i % 500 == 0) {
// batchInsertDocDataAll(excelParser.getAndFlushDatas());
// }
}
QuoteCountFlushTiming.needFlushTag(); QuoteCountFlushTiming.needFlushTag();
} }
return excelParser.getImportResults(); return excelParser.getImportResults();
} }
void batchInsertDocDataAll(ExcelParser.TablesDataList datas) { void batchInsertDocDataAll(ExcelParserOld.TablesDataList datas) {
docContentService.saveBatch(datas.getDocContentList()); docContentService.saveBatch(datas.getDocContentList());
dynamicsValueService.saveBatch(datas.getDynamicsValueList()); dynamicsValueService.saveBatch(datas.getDynamicsValueList());
tagInstanceService.saveBatch(datas.getTagInstanceList()); tagInstanceService.saveBatch(datas.getTagInstanceList());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment