1.新增-导入相同产品更新面积数据功能

2.优化-选中产品构成更改面积数据后刷新页面不丢失选中行
3.优化-多选产品构成后面积合计数据可汇总显示
4.新增-二开引出,根据勾选的产品构成引出分录数据(携带产品名称),可多选;
   标准引出按钮(隐藏)
This commit is contained in:
李贵强 2025-03-04 10:50:08 +08:00
parent 7296f5be49
commit a2bece6b4d
3 changed files with 413 additions and 57 deletions

View File

@ -38,6 +38,7 @@ import kd.tsc.tsrbs.business.domain.oprecord.service.helper.OprecordHelper;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* 位置:项目主数据-项目建立-表单插件 * 位置:项目主数据-项目建立-表单插件
@ -93,12 +94,28 @@ public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClic
public void entryRowClick(RowClickEvent evt) { public void entryRowClick(RowClickEvent evt) {
EntryGrid entryGrid = (EntryGrid) evt.getSource(); EntryGrid entryGrid = (EntryGrid) evt.getSource();
if (PRODUCT_ENTRY.equals(entryGrid.getKey())) { if (PRODUCT_ENTRY.equals(entryGrid.getKey())) {
// 业务逻辑 //选中行
DynamicObjectCollection subEntryEntity = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY); int[] selectRows = entryGrid.getSelectRows();
if (subEntryEntity != null) { if (selectRows != null && selectRows.length > 0) {
onlyCalculateArea(subEntryEntity); //产品构成
DynamicObjectCollection productEntity = this.getModel().getEntryEntity(PRODUCT_ENTRY);
if (null !=productEntity && productEntity.size()!=0){
DynamicObjectCollection areaEntry = new DynamicObjectCollection();
for (int selectRow : selectRows) {
DynamicObject productObj = productEntity.get(selectRow);
if (null!=productObj){
DynamicObjectCollection collection = productObj.getDynamicObjectCollection(SUB_ENTRY);
if (null!=collection&&collection.size()!=0){
areaEntry.addAll(collection);
}
}
}
if (areaEntry.size()!=0) {
onlyCalculateArea(areaEntry);
}
this.getView().updateView(SUB_ENTRY);
}
} }
this.getView().updateView(SUB_ENTRY);
} }
} }
@ -111,17 +128,23 @@ public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClic
String fieldKey = e.getProperty().getName(); String fieldKey = e.getProperty().getName();
switch (fieldKey){ switch (fieldKey){
case ENTRY_VALUE: case ENTRY_VALUE:
int index = this.getModel().getEntryCurrentRowIndex(PRODUCT_ENTRY);
DynamicObjectCollection collections = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY); DynamicObjectCollection collections = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY);
DynamicObject parent = (DynamicObject) collections.get(0).getParent(); if (null!=collections&&collections.size()!=0){
Long id = parent.getLong("id"); DynamicObject parent = (DynamicObject) collections.get(0).getParent();
if (id != 0L) { Long id = parent.getLong("id");
//更新指标信息数据 if (id != 0L) {
Object pkValue = this.getModel().getValue("id"); //更新指标信息数据
Long typeId = parent.getLong("productentry_producttype.id"); Object pkValue = this.getModel().getValue("id");
this.updateMetricInfo(collections, typeId, pkValue); Long typeId = parent.getLong("productentry_producttype.id");
//更新产品构成数据不切换标签也能生效 this.updateMetricInfo(collections, typeId, pkValue);
DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY); //更新产品构成数据不切换标签也能生效
this.setProductEntryValue(productEntry,collections,id); DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY);
this.setProductEntryValue(productEntry,collections,id);
}
//依旧选择该行数据
EntryGrid entryGrid = this.getControl("productentry");
entryGrid.selectRows(index);
} }
break; break;
case BILL_NAME: case BILL_NAME:
@ -151,27 +174,50 @@ public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClic
super.afterBindData(e); super.afterBindData(e);
DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY); DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY);
if (null != productEntry && productEntry.size() != 0) { if (null != productEntry && productEntry.size() != 0) {
//选中第一条数据 //进入页面
EntryGrid entryGrid = this.getControl("productentry"); boolean isImport = productEntry.stream()
entryGrid.selectRows(0); .allMatch(d -> d.getLong("id") != 0L);
//查询是否有未保存数据id==0L //防止页面打开触发该方法
boolean exitNoSaveData = false; if (!isImport){
for (int i = 0; i < productEntry.size(); i++) { //选中第一条数据
Long id = productEntry.get(i).getLong("id"); EntryGrid entryGrid = this.getControl("productentry");
if (id == 0L) { entryGrid.selectRows(0);
exitNoSaveData = true; //已保存数据的产品id
break; Set<Long> savedProductTypeIds = productEntry.stream()
.filter(d -> d.getLong("id")!=0L)
.map(d -> d.getLong("productentry_producttype.id"))
.collect(Collectors.toSet());
//相同产品数据
boolean exitSameProduct = false;
// 2. 倒序循环检查未保存数据id == 0L
for (int i = productEntry.size() - 1; i >= 0; i--) {
DynamicObject dynamicObject = productEntry.get(i);
long id = dynamicObject.getLong("id");
if (id == 0L) { // 未保存数据
long productTypeId = dynamicObject.getLong("productentry_producttype.id");
if (savedProductTypeIds.contains(productTypeId)) {
// 获取未保存数据的 transferredEntry
DynamicObjectCollection transferredEntry = dynamicObject.getDynamicObjectCollection(SUB_ENTRY);
if (transferredEntry != null && !transferredEntry.isEmpty()) {
// 3. 查找对应的已保存数据
for (DynamicObject savedObject : productEntry) {
if (savedObject.getLong("id") != 0L && savedObject.getLong("productentry_producttype.id")==productTypeId) {
// 4. 替换已保存数据的 SUB_ENTRY
savedObject.set(SUB_ENTRY, transferredEntry);
// 5. 移除未保存的数据
productEntry.remove(i);
exitSameProduct=true;
break; // 找到匹配项后就可以退出循环
}
}
}
}
}
} }
} if (exitSameProduct){
if (exitNoSaveData) { for (int i = 0; i < productEntry.size(); i++) {
DynamicObjectCollection subEntryEntity = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY);
if (null != subEntryEntity && subEntryEntity.size() != 0) {
//获取产品构成分录父数据实体类型
DynamicObject parent = (DynamicObject) ((DynamicObject) subEntryEntity.getParent()).getParent();
DynamicObjectCollection productParent = parent.getDynamicObjectCollection(PRODUCT_ENTRY);
for (int i = 0; i < productParent.size(); i++) {
//获取产品构成分录相关联的面积数据分录 //获取产品构成分录相关联的面积数据分录
DynamicObjectCollection collections = productParent.get(i).getDynamicObjectCollection(SUB_ENTRY); DynamicObjectCollection collections = productEntry.get(i).getDynamicObjectCollection(SUB_ENTRY);
//先清空计入估算表数值再赋值触发保存 //先清空计入估算表数值再赋值触发保存
for (int j = 0; j < collections.size(); j++) { for (int j = 0; j < collections.size(); j++) {
if (collections.get(j).getString("qeug_fl").equals("非标")){ if (collections.get(j).getString("qeug_fl").equals("非标")){
@ -185,8 +231,31 @@ public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClic
} }
} }
} }
this.getView().addClientCallBack("auto_save", 0); }else {
DynamicObjectCollection subEntryEntity = (DynamicObjectCollection) this.getModel().getValue(SUB_ENTRY);
if (null != subEntryEntity && subEntryEntity.size() != 0) {
//获取产品构成分录父数据实体类型
DynamicObject parent = (DynamicObject) ((DynamicObject) subEntryEntity.getParent()).getParent();
DynamicObjectCollection productParent = parent.getDynamicObjectCollection(PRODUCT_ENTRY);
for (int i = 0; i < productParent.size(); i++) {
//获取产品构成分录相关联的面积数据分录
DynamicObjectCollection collections = productParent.get(i).getDynamicObjectCollection(SUB_ENTRY);
//先清空计入估算表数值再赋值触发保存
for (int j = 0; j < collections.size(); j++) {
if (collections.get(j).getString("qeug_fl").equals("非标")){
this.getModel().setValue("qeug_jrgsbsz", BigDecimal.ONE, j, i);
this.getModel().setValue("qeug_jrgsbsz", BigDecimal.ZERO, j, i);
}else {
this.getModel().setValue("qeug_jrgsbsz", BigDecimal.ZERO, j, i);
BigDecimal hjs = collections.get(j).getBigDecimal("qeug_hjs");
BigDecimal tzz = collections.get(j).getBigDecimal("qeug_tzz");
this.getModel().setValue("qeug_jrgsbsz", hjs.add(tzz), j, i);
}
}
}
}
} }
this.getView().addClientCallBack("auto_save", 0);
} }
} }
} }
@ -200,14 +269,14 @@ public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClic
DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY); DynamicObjectCollection productEntry = this.getModel().getEntryEntity(PRODUCT_ENTRY);
if (null != productEntry && productEntry.size() != 0) { if (null != productEntry && productEntry.size() != 0) {
for (int i = 0; i < productEntry.size(); i++) { for (int i = 0; i < productEntry.size(); i++) {
if (productEntry.get(i).getBigDecimal("productentry_buildingarea").compareTo(BigDecimal.ZERO) == 0) { DynamicObjectCollection collections = productEntry.get(i).getDynamicObjectCollection(SUB_ENTRY);
DynamicObjectCollection collections = productEntry.get(i).getDynamicObjectCollection(SUB_ENTRY); if (null!=collections){
this.setProductEntryValue(productEntry,collections,productEntry.get(i).getLong("id")); this.setProductEntryValue(productEntry,collections,productEntry.get(i).getLong("id"));
//指标信息赋值 //指标信息赋值
Long typeId = productEntry.get(i).getLong("productentry_producttype.id"); Long typeId = productEntry.get(i).getLong("productentry_producttype.id");
this.updateMetricInfo(collections, typeId, pkValue); this.updateMetricInfo(collections, typeId, pkValue);
} }
} }
Tab tab = this.getView().getControl("tabap"); Tab tab = this.getView().getControl("tabap");
tab.activeTab("indexpage_tab"); tab.activeTab("indexpage_tab");
@ -313,9 +382,9 @@ public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClic
indexVsMsgMap.put(rowNum, "" + (i + 1) + "行:产品类型编码不能为空或空字符串"); indexVsMsgMap.put(rowNum, "" + (i + 1) + "行:产品类型编码不能为空或空字符串");
} }
// 校验物料编码是否已经存在于当前页面的表格中 // 校验物料编码是否已经存在于当前页面的表格中
if (existCodes.contains(number)) { // if (existCodes.contains(number)) {
indexVsMsgMap.put(rowNum, "" + (i + 1) + "行:产品类型编码已存在表单分录,不能重复导入"); // indexVsMsgMap.put(rowNum, "" + (i + 1) + "行:产品类型编码已存在表单分录,不能重复导入");
} // }
} }
return indexVsMsgMap; return indexVsMsgMap;
} }
@ -430,15 +499,23 @@ public class TotalAssignmentPlugin extends AbstractFormPlugin implements RowClic
*/ */
private void setProductEntryValue(DynamicObjectCollection productEntry, DynamicObjectCollection collections, Long id) { private void setProductEntryValue(DynamicObjectCollection productEntry, DynamicObjectCollection collections, Long id) {
//公区面积汇总 //公区面积汇总
BigDecimal publicArea = areaSummary(collections,"公区"); BigDecimal publicArea=BigDecimal.ZERO;
//套内面积汇总 BigDecimal hardcoverArea=BigDecimal.ZERO;
BigDecimal hardcoverArea = areaSummary(collections,"套内"); BigDecimal waterproofArea=BigDecimal.ZERO;
//防水面积汇总 BigDecimal hireArea=BigDecimal.ZERO;
BigDecimal waterproofArea = areaSummary(collections,"防水"); BigDecimal allArea=BigDecimal.ZERO;
//可出租面积 if (collections.size()!=0){
BigDecimal hireArea = areaSummary(collections,"可出租面积"); //公区面积汇总
//总面积 publicArea = areaSummary(collections,"公区");
BigDecimal allArea = areaSummary(collections,"总面积"); //套内面积汇总
hardcoverArea = areaSummary(collections,"套内");
//防水面积汇总
waterproofArea = areaSummary(collections,"防水");
//可出租面积
hireArea = areaSummary(collections,"可出租面积");
//总面积
allArea = areaSummary(collections,"总面积");
}
for (int i = 0; i < productEntry.size(); i++) { for (int i = 0; i < productEntry.size(); i++) {
DynamicObject dynamicObject = productEntry.get(i); DynamicObject dynamicObject = productEntry.get(i);

View File

@ -0,0 +1,261 @@
package shkd.repc.repmd.template;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.plugin.args.AfterOperationArgs;
import kd.bos.entity.validate.AbstractValidator;
import kd.bos.form.*;
import kd.bos.form.control.Control;
import kd.bos.form.control.EntryGrid;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.events.MessageBoxClosedEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.sdk.plugin.Plugin;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import shkd.repc.repmd.template.util.ExportTemplateUtil;
import shkd.repc.repmd.template.util.Template;
import java.math.BigDecimal;
import java.util.*;
/**
* 面积数据导出-二开插件
*/
public class AreaDataExportPlugin extends AbstractFormPlugin implements Plugin {
@Override
public void registerListener(EventObject e) {
super.registerListener(e);
this.addItemClickListeners("qeug_advcontoolbarap");
}
@Override
public void itemClick(ItemClickEvent evt) {
super.itemClick(evt);
if (StringUtils.equals("qeug_areadataexport", evt.getItemKey())) {
DynamicObjectCollection productEntry = this.getModel().getEntryEntity("productentry");
if (null==productEntry||productEntry.size()==0){
this.getView().showMessage("暂无可导出数据!");
return;
}
EntryGrid entryGrid = this.getControl("productentry");
int[] selectRows = entryGrid.getSelectRows();
String top="导出确认提示";
String body;
//默认导出
if (selectRows.length==0){
body = "默认导出所有【产品构成】数据?";
this.showExportMessage(top,body,"default");
}else {
body = "导出 " + selectRows.length + " 行【产品构成】数据?";
this.showExportMessage(top,body,"select");
}
}
}
@Override
public void confirmCallBack(MessageBoxClosedEvent evt) {
super.confirmCallBack(evt);
String callBackId = evt.getCallBackId();
StringBuilder tipsBuffer = new StringBuilder();
if (StringUtils.equalsIgnoreCase("export_area", callBackId) && evt.getResult().getValue() == 6) {
String customValue = evt.getCustomVaule();
boolean isDefaultExport = "default".equals(customValue);
// 获取模板
DynamicObject templateObj = getTemplate();
if (templateObj == null) {
return;
}
// 读取系统模板
Control productView = this.getView().getControl("productentry");
Control areaView = this.getView().getControl("qeug_subentryentity");
List<Template> templateList = ExportTemplateUtil.readSysTemplate(templateObj, productView, areaView, tipsBuffer);
if (templateList.isEmpty()) {
return;
}
// 创建 Excel
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = createExcelSheet(workbook, templateList, areaView);
// 获取表头信息第三行
List<String> columnHeaders = getColumnHeaders(sheet);
// 获取数据
DynamicObjectCollection productEntry = this.getModel().getEntryEntity("productentry");
List<DynamicObject> exportData = isDefaultExport ? new ArrayList<>(productEntry) : getSelectedData(productEntry);
// 填充数据
fillExcelData(sheet, exportData, columnHeaders);
// 上传文件并提供下载链接
exportAndDownload(workbook, customValue);
tipsBuffer.append("导出成功");
this.getView().showSuccessNotification(tipsBuffer.toString());
}
}
/**
* 获取模板对象
*/
private DynamicObject getTemplate() {
QFilter numberFilter = new QFilter("number", QCP.equals, "repmd_projectbill_IMPT_ENTRY");
return BusinessDataServiceHelper.loadSingle("bos_importentry_template", numberFilter.toArray());
}
/**
* 创建 Excel Sheet 并填充标题描述表头等
*/
private XSSFSheet createExcelSheet(XSSFWorkbook workbook, List<Template> templateList, Control areaView) {
XSSFSheet sheet = workbook.createSheet("产品构成 # productentry");
ExportTemplateUtil.createTitleRow(sheet, workbook);
ExportTemplateUtil.createDescriptionRow(sheet, workbook);
ExportTemplateUtil.createTemplateHeaders(sheet, workbook, templateList);
ExportTemplateUtil.otherStyleSet(sheet, areaView);
return sheet;
}
/**
* 获取第三行的表头信息
*/
private List<String> getColumnHeaders(XSSFSheet sheet) {
List<String> columnHeaders = new ArrayList<>();
XSSFRow thirdRow = sheet.getRow(2);
if (thirdRow != null) {
for (int cellIndex = 0; cellIndex < thirdRow.getLastCellNum(); cellIndex++) {
XSSFCell cell = thirdRow.getCell(cellIndex);
columnHeaders.add(cell != null ? cell.getStringCellValue().trim() : ""); // 避免 null
}
}
return columnHeaders;
}
/**
* 获取选中的数据
*/
private List<DynamicObject> getSelectedData(DynamicObjectCollection productEntry) {
List<DynamicObject> selectedData = new ArrayList<>();
EntryGrid entryGrid = this.getControl("productentry");
int[] selectedRows = entryGrid.getSelectRows();
for (int row : selectedRows) {
selectedData.add(productEntry.get(row));
}
return selectedData;
}
/**
* 填充 Excel 数据
*/
private void fillExcelData(XSSFSheet sheet, List<DynamicObject> productEntries, List<String> columnHeaders) {
int rowIndex = 4; // Excel 5 行开始填充
for (DynamicObject productObj : productEntries) {
if (productObj == null) continue;
String productTypeNumber = productObj.getString("productentry_producttype.number");
String productTypeName = productObj.getString("productentry_producttype.name");
DynamicObjectCollection areaEntries = productObj.getDynamicObjectCollection("qeug_subentryentity");
if (areaEntries != null && !areaEntries.isEmpty()) {
for (DynamicObject areaObj : areaEntries) {
XSSFRow dataRow = sheet.createRow(rowIndex);
int cellIndex = 0;
for (String header : columnHeaders) {
XSSFCell cell = dataRow.createCell(cellIndex);
if ("productentry_producttype.number".equals(header)) {
cell.setCellValue(productTypeNumber);
} else if ("productentry_producttype.name".equals(header)) {
cell.setCellValue(productTypeName);
} else {
Object value = areaObj.get(header);
setCellValue(cell, value);
}
cellIndex++;
}
rowIndex++;
}
}
}
}
/**
* 设置 Excel 单元格值
*/
private void setCellValue(XSSFCell cell, Object value) {
if (value instanceof String) {
cell.setCellValue((String) value);
} else if (value instanceof BigDecimal) {
cell.setCellValue(((BigDecimal) value).doubleValue());
} else if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Double) {
cell.setCellValue((Double) value);
} else if (value != null) {
cell.setCellValue(value.toString());
}
}
/**
* 导出 Excel 并提供下载链接
*/
private void exportAndDownload(XSSFWorkbook workbook, String fileName) {
String uploadedFilePath = ExportTemplateUtil.uploadExcel(workbook, fileName);
String url = RequestContext.get().getClientFullContextPath() + "/attachment/download.do?path=" + uploadedFilePath;
this.getView().openUrl(url);
}
private void showExportMessage(String top,String body,String customValue){
// 基本信息
// 备注: \r\n 可换行
//String msg = "消息头\r\n message header...";
// 详细消息
//String detail = "消息体\r\nmessage body...";
// 消息框按钮类型
// None:不启用 Toast:简短提示,几秒后消失
MessageBoxOptions options = MessageBoxOptions.OKCancel;
// 确认提示类型
// Default:默认提示 Save:保存提交类提示 Delete:删除类提示 Wait:等待类提示 Fail:失败类提示
ConfirmTypes confirmTypes = ConfirmTypes.Default;
// 确认框回调
ConfirmCallBackListener callBack = new ConfirmCallBackListener("export_area", this);
// 按钮名称
// 注意: 按钮名称参数Map的key值必须和 options 参数相对应, 否则按钮名称修改不生效!
// : options 使用 MessageBoxOptions.OKCancel, 按钮名称参数Map的key必须为2 or 6
// options 使用 MessageBoxOptions.AbortRetryIgnore, 按钮名称参数Map的key必须为3 or 4 or 5
// none-0; ok-1; cancel-2; abort-3; retry-4; ignore-5; yes-6; no-7; custom-8
// -----------------------------------------------------------------
// options | btnNameMaps的key的取值
// MessageBoxOptions.None | 2
// MessageBoxOptions.OK | 2
// MessageBoxOptions.OKCancel | 2 & 6
// MessageBoxOptions.AbortRetryIgnore | 3 & 4 & 5
// MessageBoxOptions.YesNoCancel | 6 & 7 & 2
// MessageBoxOptions.YesNo | 6 & 7
// MessageBoxOptions.RetryCancel | 4 & 2
// MessageBoxOptions.Toast | 2
// -----------------------------------------------------------------
Map<Integer, String> btnNameMaps = new HashMap<>();
btnNameMaps.put(2, "取消");
btnNameMaps.put(6, "确认");
// 用户自定义参数,前端会在afterConfirm中返回
//String customValue = "allowExport";
this.getView().showConfirm(top, body, options, confirmTypes, callBack, btnNameMaps,customValue);
}
}

View File

@ -63,7 +63,7 @@ public class ExportTemplateUtil {
createDescriptionRow(sheet, workbook); createDescriptionRow(sheet, workbook);
createTemplateHeaders(sheet, workbook, templateList); createTemplateHeaders(sheet, workbook, templateList);
//其它设置 //其它设置
otherStyleSet(sheet,workbook,areaView); otherStyleSet(sheet,areaView);
// 上传Excel文件并获取下载路径 // 上传Excel文件并获取下载路径
String uploadedFilePath = uploadExcel(workbook, templateName); String uploadedFilePath = uploadExcel(workbook, templateName);
return RequestContext.get().getClientFullContextPath() + "/attachment/download.do?path=" + uploadedFilePath; return RequestContext.get().getClientFullContextPath() + "/attachment/download.do?path=" + uploadedFilePath;
@ -109,7 +109,7 @@ public class ExportTemplateUtil {
createDescriptionRow(sheet, workbook); createDescriptionRow(sheet, workbook);
createTemplateHeaders(sheet, workbook, templateList); createTemplateHeaders(sheet, workbook, templateList);
//其它设置 //其它设置
otherStyleSet(sheet,workbook,areaView); otherStyleSet(sheet,areaView);
// 填充自定义模板数据 // 填充自定义模板数据
fillCustomTemplateData(sheet, workbook, collections, templateList, message); fillCustomTemplateData(sheet, workbook, collections, templateList, message);
@ -125,7 +125,7 @@ public class ExportTemplateUtil {
} }
} }
private static void otherStyleSet(XSSFSheet sheet,XSSFWorkbook workbook, Control areaView) { public static void otherStyleSet(XSSFSheet sheet, Control areaView) {
int numColumns = sheet.getRow(3).getPhysicalNumberOfCells(); // 获取总列数 int numColumns = sheet.getRow(3).getPhysicalNumberOfCells(); // 获取总列数
// 遍历第四行检查是否为分类*分类 // 遍历第四行检查是否为分类*分类
@ -163,7 +163,7 @@ public class ExportTemplateUtil {
/** /**
* 创建标题行 * 创建标题行
*/ */
private static void createTitleRow(XSSFSheet sheet, XSSFWorkbook workbook) { public static void createTitleRow(XSSFSheet sheet, XSSFWorkbook workbook) {
XSSFRow row1 = sheet.createRow(0); XSSFRow row1 = sheet.createRow(0);
XSSFCell cell1 = row1.createCell(0); XSSFCell cell1 = row1.createCell(0);
cell1.setCellValue("产品构成 # productentry"); cell1.setCellValue("产品构成 # productentry");
@ -186,7 +186,7 @@ public class ExportTemplateUtil {
/** /**
* 创建说明行 * 创建说明行
*/ */
private static void createDescriptionRow(XSSFSheet sheet, XSSFWorkbook workbook) { public static void createDescriptionRow(XSSFSheet sheet, XSSFWorkbook workbook) {
XSSFRow row2 = sheet.createRow(1); XSSFRow row2 = sheet.createRow(1);
XSSFCell cell3 = row2.createCell(0); XSSFCell cell3 = row2.createCell(0);
cell3.setCellValue("1、请将鼠标移到灰色标题行查看字段录入要求。2、红色带星号*)的字段为必录字段。"); cell3.setCellValue("1、请将鼠标移到灰色标题行查看字段录入要求。2、红色带星号*)的字段为必录字段。");
@ -209,7 +209,7 @@ public class ExportTemplateUtil {
/** /**
* 创建模板头部行 * 创建模板头部行
*/ */
private static void createTemplateHeaders(XSSFSheet sheet, XSSFWorkbook workbook, List<Template> templateList) { public static void createTemplateHeaders(XSSFSheet sheet, XSSFWorkbook workbook, List<Template> templateList) {
XSSFRow row3 = sheet.createRow(2); XSSFRow row3 = sheet.createRow(2);
for (int i = 0; i < templateList.size(); i++) { for (int i = 0; i < templateList.size(); i++) {
Template template = templateList.get(i); Template template = templateList.get(i);
@ -266,6 +266,7 @@ public class ExportTemplateUtil {
for (int i = 0; i < collections.size(); i++) { for (int i = 0; i < collections.size(); i++) {
DynamicObject dynamicObject = collections.get(i); DynamicObject dynamicObject = collections.get(i);
String productNumber = dynamicObject.getString("qeug_productentry.number"); String productNumber = dynamicObject.getString("qeug_productentry.number");
String productName = dynamicObject.getString("qeug_productentry.name");
String name = dynamicObject.getString("qeug_kmname"); String name = dynamicObject.getString("qeug_kmname");
String type = dynamicObject.getString("qeug_fl"); String type = dynamicObject.getString("qeug_fl");
@ -275,11 +276,13 @@ public class ExportTemplateUtil {
try { try {
// 获取列索引 // 获取列索引
int productNumberColumnIndex = findColumnIndex(sheet, "productentry_producttype.number"); int productNumberColumnIndex = findColumnIndex(sheet, "productentry_producttype.number");
int productNameColumnIndex = findColumnIndex(sheet, "productentry_producttype.name");
int nameColumnIndex = findColumnIndex(sheet, "qeug_kmname"); int nameColumnIndex = findColumnIndex(sheet, "qeug_kmname");
int typeColumnIndex = findColumnIndex(sheet, "qeug_fl"); int typeColumnIndex = findColumnIndex(sheet, "qeug_fl");
// 填充数据 // 填充数据
createCell(dataRow, productNumberColumnIndex, productNumber, workbook); createCell(dataRow, productNumberColumnIndex, productNumber, workbook);
createCell(dataRow, productNameColumnIndex, productName, workbook);
createCell(dataRow, nameColumnIndex, name, workbook); createCell(dataRow, nameColumnIndex, name, workbook);
createCell(dataRow, typeColumnIndex, type, workbook); createCell(dataRow, typeColumnIndex, type, workbook);
@ -333,7 +336,7 @@ public class ExportTemplateUtil {
/** /**
* 上传Excel文件并返回路径 * 上传Excel文件并返回路径
*/ */
private static String uploadExcel(XSSFWorkbook workbook, String templateName) { public static String uploadExcel(XSSFWorkbook workbook, String templateName) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
String fileName = templateName + sdf.format(new Date()) + ".xlsx"; String fileName = templateName + sdf.format(new Date()) + ".xlsx";
String pathName = "/offices/" + fileName; String pathName = "/offices/" + fileName;
@ -405,6 +408,21 @@ public class ExportTemplateUtil {
} }
} }
}); });
// **固定插入第二行 (索引 1) 一个 Template**
Template productNameTemplate = new Template();
productNameTemplate.setName("产品名称");
productNameTemplate.setNumber("productentry_producttype.name");
productNameTemplate.setMustInput(false);
productNameTemplate.setImport(true);
productNameTemplate.setImportProp("");
// **插入到第二行如果列表长度 < 1则直接添加**
if (templateList.size() > 1) {
templateList.add(1, productNameTemplate);
} else {
templateList.add(productNameTemplate);
}
} else { } else {
message.append("模板中的 treeentryentity 为空或不存在\n"); message.append("模板中的 treeentryentity 为空或不存在\n");
} }