汇总评分表导出

This commit is contained in:
李贵强 2024-12-06 14:00:49 +08:00
parent 579b47fc8d
commit 77296dc27b
2 changed files with 327 additions and 43 deletions

View File

@ -2,33 +2,54 @@ package shkd.repc.resm.formplugin;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.entity.LocaleString; import kd.bos.dataentity.entity.LocaleString;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.EntryType; import kd.bos.entity.EntryType;
import kd.bos.entity.MainEntityType; import kd.bos.entity.MainEntityType;
import kd.bos.entity.datamodel.events.GetEntityTypeEventArgs; import kd.bos.entity.datamodel.events.GetEntityTypeEventArgs;
import kd.bos.entity.property.DecimalProp;
import kd.bos.entity.property.IntegerProp; import kd.bos.entity.property.IntegerProp;
import kd.bos.entity.property.TextProp; import kd.bos.entity.property.TextProp;
import kd.bos.exception.ErrorCode; import kd.bos.exception.ErrorCode;
import kd.bos.exception.KDException; import kd.bos.exception.KDException;
import kd.bos.fileservice.FileItem;
import kd.bos.fileservice.FileService;
import kd.bos.fileservice.FileServiceFactory;
import kd.bos.form.FormShowParameter; import kd.bos.form.FormShowParameter;
import kd.bos.form.control.Button;
import kd.bos.form.control.Control; import kd.bos.form.control.Control;
import kd.bos.form.control.EntryGrid; import kd.bos.form.control.EntryGrid;
import kd.bos.form.control.Toolbar;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.events.LoadCustomControlMetasArgs; import kd.bos.form.events.LoadCustomControlMetasArgs;
import kd.bos.form.events.OnGetControlArgs; import kd.bos.form.events.OnGetControlArgs;
import kd.bos.form.field.IntegerEdit; import kd.bos.form.field.IntegerEdit;
import kd.bos.form.field.TextEdit; import kd.bos.form.field.TextEdit;
import kd.bos.form.plugin.AbstractFormPlugin; import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.isc.util.misc.Hash; import kd.bos.isc.util.misc.Hash;
import kd.bos.metadata.entity.commonfield.DecimalField;
import kd.bos.metadata.entity.commonfield.IntegerField; import kd.bos.metadata.entity.commonfield.IntegerField;
import kd.bos.metadata.entity.commonfield.TextField; import kd.bos.metadata.entity.commonfield.TextField;
import kd.bos.metadata.form.control.EntryAp; import kd.bos.metadata.form.control.EntryAp;
import kd.bos.metadata.form.control.EntryFieldAp; import kd.bos.metadata.form.control.EntryFieldAp;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import java.awt.*;
import java.awt.Color;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.List;
/** /**
* 动态考察汇总表单插件 * 动态考察汇总表单插件
@ -92,9 +113,9 @@ public class DynamicExamPageFormPlugin extends AbstractFormPlugin implements Plu
JSONObject supOfUserGrade_json = (JSONObject) customParams.get("supOfUserGrade"); JSONObject supOfUserGrade_json = (JSONObject) customParams.get("supOfUserGrade");
for (String key : supOfUserGrade_json.keySet()) { for (String key : supOfUserGrade_json.keySet()) {
JSONObject userByGrade = (JSONObject) supOfUserGrade_json.get(key);//获取人员对应成绩集合 JSONObject userByGrade = (JSONObject) supOfUserGrade_json.get(key);//获取人员对应成绩集合
HashMap<String, BigDecimal> userGraderMap = new HashMap<>(); HashMap<String, Object> userGraderMap = new HashMap<>();
for (String userName : userByGrade.keySet()) { for (String userName : userByGrade.keySet()) {
BigDecimal grade = (BigDecimal) userByGrade.get(userName); Object grade= userByGrade.get(userName);
userGraderMap.put(userName,grade); userGraderMap.put(userName,grade);
} }
supOfUserGrade.put(key,userGraderMap); supOfUserGrade.put(key,userGraderMap);
@ -171,9 +192,9 @@ public class DynamicExamPageFormPlugin extends AbstractFormPlugin implements Plu
DynamicObject addNew = qeug_entryentity.addNew(); DynamicObject addNew = qeug_entryentity.addNew();
//供应商名称赋值 //供应商名称赋值
addNew.set("qeug_supplier",key); addNew.set("qeug_supplier",key);
HashMap<String, BigDecimal> userGrades = (HashMap<String, BigDecimal>) supOfUserGrade.get(key);//人员对象对应考察得分 HashMap<String, Object> userGrades = (HashMap<String, Object>) supOfUserGrade.get(key);//人员对象对应考察得分
for (String userName : userGrades.keySet()) { for (String userName : userGrades.keySet()) {
BigDecimal grade = userGrades.get(userName); Object grade = userGrades.get(userName);
addNew.set("grade_"+userName,grade); addNew.set("grade_"+userName,grade);
} }
} }
@ -192,6 +213,7 @@ public class DynamicExamPageFormPlugin extends AbstractFormPlugin implements Plu
this.createSupplierNameFileAp(entryAp); this.createSupplierNameFileAp(entryAp);
this.createUserNamesFileAp(entryAp); this.createUserNamesFileAp(entryAp);
this.createUserAvgFileAp(entryAp);
return entryAp; return entryAp;
} }
@ -222,19 +244,46 @@ public class DynamicExamPageFormPlugin extends AbstractFormPlugin implements Plu
apMat.setKey("grade_"+username); apMat.setKey("grade_"+username);
apMat.setName(new LocaleString(name)); apMat.setName(new LocaleString(name));
apMat.setLock("new,edit,view,submit,audit");//设置锁定性 apMat.setLock("new,edit,view,submit,audit");//设置锁定性
IntegerField integerField = new IntegerField(); TextField decimalField = new TextField();
integerField.setScale(2); apMat.setField(decimalField);
integerField.setZeroShow(true);
apMat.setField(integerField);
entryAp.getItems().add(apMat); entryAp.getItems().add(apMat);
} }
} }
public void createUserAvgFileAp(EntryAp entryAp) {
EntryFieldAp apMat = new EntryFieldAp();
apMat.setId("grade_avg");
apMat.setKey("grade_avg");
apMat.setName(new LocaleString("平均分"));
apMat.setLock("new,edit,view,submit,audit");//设置锁定性
DecimalField decimalField = new DecimalField();
decimalField.setScale(2);
decimalField.setZeroShow(true);
apMat.setField(decimalField);
entryAp.getItems().add(apMat);
EntryFieldAp apMat2 = new EntryFieldAp();
apMat2.setId("grade_ranking");
apMat2.setKey("grade_ranking");
apMat2.setName(new LocaleString("排名"));
apMat2.setLock("new,edit,view,submit,audit");//设置锁定性
IntegerField integerField2 = new IntegerField();
integerField2.setScale(2);
integerField2.setZeroShow(true);
apMat2.setField(integerField2);
entryAp.getItems().add(apMat2);
}
public void registerDynamicProps(MainEntityType newMainType){ public void registerDynamicProps(MainEntityType newMainType){
//获取当前单据体实体 //获取当前单据体实体
EntryType entryType = (EntryType) newMainType.getAllEntities().get("qeug_entryentity");//单据体标识 EntryType entryType = (EntryType) newMainType.getAllEntities().get("qeug_entryentity");//单据体标识
this.createSupplierNameProps(entryType); this.createSupplierNameProps(entryType);
this.createUserNamesProps(entryType); this.createUserNamesProps(entryType);
this.createUserAvgProps(entryType);
} }
public void createSupplierNameProps(EntryType entryType) { public void createSupplierNameProps(EntryType entryType) {
@ -249,14 +298,207 @@ public class DynamicExamPageFormPlugin extends AbstractFormPlugin implements Plu
HashMap<String,String> value = (HashMap<String, String>)userNames.get(key); HashMap<String,String> value = (HashMap<String, String>)userNames.get(key);
String username = value.get("username"); String username = value.get("username");
String name = value.get("name"); String name = value.get("name");
TextProp decimalProp = new TextProp();
decimalProp.setName("grade_"+username);
decimalProp.setDisplayName(new LocaleString(name));//标题
entryType.registerSimpleProperty(decimalProp);
}
}
public void createUserAvgProps(EntryType entryType) {
DecimalProp decimalProp = new DecimalProp();
decimalProp.setName("grade_avg");
decimalProp.setDisplayName(new LocaleString("平均分"));//标题
decimalProp.setScale(2);
decimalProp.setZeroShow(true);
entryType.registerSimpleProperty(decimalProp);
IntegerProp integerProp = new IntegerProp(); IntegerProp integerProp = new IntegerProp();
integerProp.setName("grade_"+username); integerProp.setName("grade_ranking");
integerProp.setDisplayName(new LocaleString(name));//标题 integerProp.setDisplayName(new LocaleString("排名"));//标题
integerProp.setScale(2); integerProp.setScale(2);
integerProp.setZeroShow(true); integerProp.setZeroShow(true);
entryType.registerSimpleProperty(integerProp); entryType.registerSimpleProperty(integerProp);
} }
@Override
public void registerListener(EventObject e) {
super.registerListener(e);
//工具栏控件
this.addItemClickListeners("qeug_toolbarap");
} }
@Override
public void itemClick(ItemClickEvent evt) {
super.itemClick(evt);
//工具栏控件里的工具栏项-导出
if (StringUtils.equals("qeug_export",evt.getItemKey())){
//TODO:业务逻辑
Map<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
// 提取数据
String titleName = (String) customParams.get("titleName");
JSONObject userNames = (JSONObject) customParams.get("userNames");
JSONObject supOfUserGrade = (JSONObject) customParams.get("supOfUserGrade");
// 创建Excel工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 创建工作表
XSSFSheet sheet = workbook.createSheet("考察结果汇总");
// 设置标题
XSSFRow titleRow = sheet.createRow(0);
XSSFCell titleCell = titleRow.createCell(0);
titleCell.setCellValue(titleName+"评分汇总"); // 设置标题
// 设置标题单元格样式居中对齐
XSSFCellStyle titleStyle = workbook.createCellStyle();
XSSFFont titleFont = workbook.createFont();
titleFont.setBold(true); // 加粗
titleFont.setFontHeightInPoints((short) 12); // 字体加大
titleStyle.setFont(titleFont);
this.setUniformCellStyle(titleStyle);
titleCell.setCellStyle(titleStyle);
// 动态生成表头
XSSFRow headerRow = sheet.createRow(1);
List<String> headers = new ArrayList<>();
headers.add("供应商");
// 动态添加用户名作为表头
for (String userKey : userNames.keySet()) {
JSONObject user = (JSONObject) userNames.get(userKey);
String userName = user.getString("name");
headers.add(userName);
}
headers.add("平均分");
headers.add("排名");
// 设置表头样式背景色为矢车菊蓝浅色60%
XSSFCellStyle headerStyle = workbook.createCellStyle();
XSSFFont headerFont = workbook.createFont();
headerFont.setBold(true); // 加粗
headerStyle.setFont(headerFont);
this.setUniformCellStyle(headerStyle);
// 设置表头背景色为矢车菊蓝着色1浅色60%
headerStyle.setFillForegroundColor(new XSSFColor(new Color(155, 194, 230),new DefaultIndexedColorMap())); // 矢车菊蓝色
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 设置表头
for (int i = 0; i < headers.size(); i++) {
XSSFCell headerCell = headerRow.createCell(i);
headerCell.setCellValue(headers.get(i));
headerCell.setCellStyle(headerStyle);
}
// 合并第一行的标题单元格从供应商到排名
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headers.size() - 1));
XSSFCellStyle borderStyle = workbook.createCellStyle();
this.setUniformCellStyle(borderStyle);
// 填充数据行
int rowIndex = 2;
for (String supplier : supOfUserGrade.keySet()) {
JSONObject supplierData = (JSONObject) supOfUserGrade.get(supplier);
// 创建数据行
XSSFRow dataRow = sheet.createRow(rowIndex++);
XSSFCell supplierCell = dataRow.createCell(0);
supplierCell.setCellValue(supplier);
supplierCell.setCellStyle(borderStyle);
// 获取评分数据用户名字和评分
int colIndex = 1; // 从第二列开始
for (String userKey : userNames.keySet()) {
// 获取评分和排名
BigDecimal score = supplierData.getBigDecimal(userKey);
// 填充评分列
XSSFCell userCell = dataRow.createCell(colIndex++);
userCell.setCellValue(score == null ? "/" : score.toString());
userCell.setCellStyle(borderStyle);
}
// 填充平均分和排名
XSSFCell avgCell = dataRow.createCell(colIndex++);
avgCell.setCellValue(supplierData.getBigDecimal("avg") == null ? "/" : supplierData.getBigDecimal("avg").toString());
XSSFCellStyle avgCellStyle = workbook.createCellStyle();
XSSFFont avgFont = workbook.createFont();
avgFont.setColor(IndexedColors.RED.getIndex()); // 字体红色
avgCellStyle.setFont(avgFont);
this.setUniformCellStyle(avgCellStyle);
avgCell.setCellStyle(avgCellStyle);
XSSFCell rankingCell = dataRow.createCell(colIndex);
rankingCell.setCellValue(supplierData.getInteger("ranking"));
XSSFCellStyle rankingCellStyle = workbook.createCellStyle();
XSSFFont rankingFont = workbook.createFont();
rankingFont.setColor(IndexedColors.RED.getIndex()); // 字体红色
rankingCellStyle.setFont(rankingFont);
// 设置背景色为浅绿着色6浅色60%
rankingCellStyle.setFillForegroundColor(new XSSFColor(new Color(198, 224, 180),new DefaultIndexedColorMap())); // 浅绿色
rankingCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
this.setUniformCellStyle(rankingCellStyle);
rankingCell.setCellStyle(rankingCellStyle);
}
// 自动调整 "供应商" 列宽
sheet.autoSizeColumn(0);
// 上传Excel文件
String uploadedFilePath = uploadExcel(workbook);
// 拼接下载地址
String downloadUrl = RequestContext.get().getClientFullContextPath() + "/attachment/download.do?path=" + uploadedFilePath;
this.getView().openUrl(downloadUrl);
}
}
/**
* 上传Excel文件并返回路径
* @param workbook
* @return 文件路径
*/
private String uploadExcel(XSSFWorkbook workbook) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
String fileName = "考察结果汇总" + sdf.format(new Date()) + ".xlsx";
String pathName = "/offices/" + fileName;
try {
OutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
InputStream inputStream = parse(outputStream);
FileService fs = FileServiceFactory.getAttachmentFileService();
return fs.upload(new FileItem(fileName, pathName, inputStream));
} catch (Exception e) {
throw new RuntimeException("上传Excel失败", e);
}
}
/**
* 解析输出流为输入流
* @param out 输出流
* @return 输入流
* @throws Exception
*/
public ByteArrayInputStream parse(final OutputStream out) throws Exception {
ByteArrayOutputStream outputStream = (ByteArrayOutputStream) out;
return new ByteArrayInputStream(outputStream.toByteArray());
}
/**
* 统一设置表格样式
* @param cellStyle 样式
*/
public void setUniformCellStyle(XSSFCellStyle cellStyle){
//边框
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
// 水平居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 垂直居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
}
} }

View File

@ -61,6 +61,10 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
HashSet<Long> userNamesNow = new HashSet<Long>();//当前任务人员主键集合 HashSet<Long> userNamesNow = new HashSet<Long>();//当前任务人员主键集合
ArrayList<DynamicObject> userDys = new ArrayList<>();//当前任务人员对象集合存放当前考察任务对应的考察人员对象 ArrayList<DynamicObject> userDys = new ArrayList<>();//当前任务人员对象集合存放当前考察任务对应的考察人员对象
DynamicObject suppliername = plandetail.getDynamicObject("suppliername");//供应商对象 DynamicObject suppliername = plandetail.getDynamicObject("suppliername");//供应商对象
if (suppliername==null){
this.getView().showMessage("缺少供应商!");
return;
}
Object sup_pkValue = suppliername.getPkValue();//供应商主键 Object sup_pkValue = suppliername.getPkValue();//供应商主键
String supName = suppliername.getString("name"); String supName = suppliername.getString("name");
DynamicObject evaltask_l = plandetail.getDynamicObject("evaltask");//考察任务 DynamicObject evaltask_l = plandetail.getDynamicObject("evaltask");//考察任务
@ -106,13 +110,21 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
DynamicObject[] resm_myexams = BusinessDataServiceHelper.load("resm_myexam", "creator,evalscore", myexam_QF.toArray()); DynamicObject[] resm_myexams = BusinessDataServiceHelper.load("resm_myexam", "creator,evalscore", myexam_QF.toArray());
//todo:开始构建供应商对应人员评分 //todo:开始构建供应商对应人员评分
HashMap<String, BigDecimal> userGrades = new HashMap<String, BigDecimal>();//人员成绩key为人员用户名value为人员分数 HashMap<String, BigDecimal> userGrades = new HashMap<String, BigDecimal>();//人员成绩key为人员用户名value为人员分数
if (resm_myexams.length > 0) { if (resm_myexams.length > 0) {
BigDecimal allGrade = BigDecimal.ZERO;
for (DynamicObject resm_myexam : resm_myexams) { for (DynamicObject resm_myexam : resm_myexams) {
DynamicObject creator = resm_myexam.getDynamicObject("creator");//当前考察人 DynamicObject creator = resm_myexam.getDynamicObject("creator");//当前考察人
BigDecimal evalscore = resm_myexam.getBigDecimal("evalscore");//考察得分 BigDecimal evalscore = resm_myexam.getBigDecimal("evalscore").setScale(2);//考察得分
String username = creator.getString("username");//人员用户名 String username = creator.getString("username");//人员用户名
userGrades.put(username, evalscore); userGrades.put(username, evalscore);
//考察得分累加
allGrade = allGrade.add(evalscore);
} }
//平均分
BigDecimal divide = allGrade.divide(BigDecimal.valueOf(resm_myexams.length));
userGrades.put("avg", divide);
} else { } else {
//我的考察还未下达时,先赋值0 //我的考察还未下达时,先赋值0
for (DynamicObject userDy : userDys) { for (DynamicObject userDy : userDys) {
@ -121,6 +133,33 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
} }
} }
supOfUserGrade.put(supName, userGrades); supOfUserGrade.put(supName, userGrades);
//HashMap<String, HashMap<String, BigDecimal>> supOfUserGrade = new HashMap<>(); // 假设这是原始的supOfUserGrade
// 1. 创建一个临时的列表来存储公司和他们的averageScore
List<Map.Entry<String, HashMap<String, BigDecimal>>> companyList = new ArrayList<>(supOfUserGrade.entrySet());
// 2. 按照每个公司的averageScore进行排序
companyList.sort((entry1, entry2) -> {
BigDecimal avgScore1 = entry1.getValue().get("avg");
BigDecimal avgScore2 = entry2.getValue().get("avg");
return avgScore2.compareTo(avgScore1); // 降序排序
});
// 3. 给每个公司添加排名
int rank = 1;
for (Map.Entry<String, HashMap<String, BigDecimal>> companyEntry : companyList) {
String companyName = companyEntry.getKey();
HashMap<String, BigDecimal> companyGrades = companyEntry.getValue();
// 为当前公司添加排名
companyGrades.put("ranking", new BigDecimal(rank));
// 4. 将修改后的companyGrades重新放入supOfUserGrade
supOfUserGrade.put(companyName, companyGrades);
// 增加排名
rank++;
}
} }
//todo: 构建传参 //todo: 构建传参
FormShowParameter formShowParameter = new FormShowParameter(); FormShowParameter formShowParameter = new FormShowParameter();
@ -128,6 +167,8 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
formShowParameter.setCaption(projectName + "供应商评分汇总表"); formShowParameter.setCaption(projectName + "供应商评分汇总表");
formShowParameter.setCustomParam("supOfUserGrade", supOfUserGrade); formShowParameter.setCustomParam("supOfUserGrade", supOfUserGrade);
formShowParameter.setCustomParam("userNames", userNames); formShowParameter.setCustomParam("userNames", userNames);
//考察结果-考察任务名称
formShowParameter.setCustomParam("titleName",selectedRows.get(0).getBillNo());
formShowParameter.getOpenStyle().setShowType(ShowType.Modal); formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
// StyleCss inlineStyleCss = new StyleCss(); // StyleCss inlineStyleCss = new StyleCss();
// inlineStyleCss.setHeight("600"); // inlineStyleCss.setHeight("600");
@ -140,4 +181,5 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
} }
} }
} }
} }