汇总评分表导出
This commit is contained in:
parent
579b47fc8d
commit
77296dc27b
|
@ -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");
|
||||||
IntegerProp integerProp = new IntegerProp();
|
TextProp decimalProp = new TextProp();
|
||||||
integerProp.setName("grade_"+username);
|
decimalProp.setName("grade_"+username);
|
||||||
integerProp.setDisplayName(new LocaleString(name));//标题
|
decimalProp.setDisplayName(new LocaleString(name));//标题
|
||||||
integerProp.setScale(2);
|
entryType.registerSimpleProperty(decimalProp);
|
||||||
integerProp.setZeroShow(true);
|
|
||||||
entryType.registerSimpleProperty(integerProp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.setName("grade_ranking");
|
||||||
|
integerProp.setDisplayName(new LocaleString("排名"));//标题
|
||||||
|
integerProp.setScale(2);
|
||||||
|
integerProp.setZeroShow(true);
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -36,11 +36,11 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
|
||||||
public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
|
public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
|
||||||
super.afterDoOperation(afterDoOperationEventArgs);
|
super.afterDoOperation(afterDoOperationEventArgs);
|
||||||
String operateKey = afterDoOperationEventArgs.getOperateKey();
|
String operateKey = afterDoOperationEventArgs.getOperateKey();
|
||||||
if ("viewsummary".equals(operateKey)){
|
if ("viewsummary".equals(operateKey)) {
|
||||||
ListSelectedRowCollection selectedRows = getSelectedRows();
|
ListSelectedRowCollection selectedRows = getSelectedRows();
|
||||||
if (selectedRows.size() > 1){
|
if (selectedRows.size() > 1) {
|
||||||
this.getView().showTipNotification("只能选择一条数据查看项目汇总");
|
this.getView().showTipNotification("只能选择一条数据查看项目汇总");
|
||||||
}else {
|
} else {
|
||||||
String projectName = "";
|
String projectName = "";
|
||||||
Object primaryKeyValue = selectedRows.get(0).getPrimaryKeyValue();//获取当前考察结果主键
|
Object primaryKeyValue = selectedRows.get(0).getPrimaryKeyValue();//获取当前考察结果主键
|
||||||
DynamicObject resm_examtask_summary = BusinessDataServiceHelper.loadSingle(primaryKeyValue, "resm_examtask_summary");
|
DynamicObject resm_examtask_summary = BusinessDataServiceHelper.loadSingle(primaryKeyValue, "resm_examtask_summary");
|
||||||
|
@ -48,19 +48,23 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
|
||||||
long evalTaskId = evaltask.getLong("id");
|
long evalTaskId = evaltask.getLong("id");
|
||||||
QFilter qFilter = new QFilter("plandetails.evaltask.id", QCP.equals, evalTaskId);
|
QFilter qFilter = new QFilter("plandetails.evaltask.id", QCP.equals, evalTaskId);
|
||||||
DynamicObject examPlan = BusinessDataServiceHelper.loadSingle("resm_investigationplan", qFilter.toArray());
|
DynamicObject examPlan = BusinessDataServiceHelper.loadSingle("resm_investigationplan", qFilter.toArray());
|
||||||
if (examPlan != null){
|
if (examPlan != null) {
|
||||||
DynamicObject qeug_project = examPlan.getDynamicObject("qeug_project");//考察计划的项目
|
DynamicObject qeug_project = examPlan.getDynamicObject("qeug_project");//考察计划的项目
|
||||||
if (qeug_project != null){
|
if (qeug_project != null) {
|
||||||
projectName = qeug_project.getString("name");
|
projectName = qeug_project.getString("name");
|
||||||
}
|
}
|
||||||
DynamicObjectCollection plandetails = examPlan.getDynamicObjectCollection("plandetails");//计划详情-分为多个考察任务
|
DynamicObjectCollection plandetails = examPlan.getDynamicObjectCollection("plandetails");//计划详情-分为多个考察任务
|
||||||
HashMap<String, HashMap<String, BigDecimal>> supOfUserGrade = new HashMap<String, HashMap<String, BigDecimal>>();//供应商对应人员评分:key为供应商名称,value为对应供应商考察成绩情况
|
HashMap<String, HashMap<String, BigDecimal>> supOfUserGrade = new HashMap<String, HashMap<String, BigDecimal>>();//供应商对应人员评分:key为供应商名称,value为对应供应商考察成绩情况
|
||||||
HashMap<String,HashMap<String,String>> userNames = new HashMap<String, HashMap<String,String>>();//人员及属性集合:用于构建单据字段
|
HashMap<String, HashMap<String, String>> userNames = new HashMap<String, HashMap<String, String>>();//人员及属性集合:用于构建单据字段
|
||||||
for (DynamicObject plandetail : plandetails) {//循环多条考察任务
|
for (DynamicObject plandetail : plandetails) {//循环多条考察任务
|
||||||
String suppliersource = plandetail.getString("suppliersource");//供应商来源:区分正式供应商和潜在供应商
|
String suppliersource = plandetail.getString("suppliersource");//供应商来源:区分正式供应商和潜在供应商
|
||||||
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");//考察任务
|
||||||
|
@ -73,71 +77,109 @@ public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plu
|
||||||
//todo:查询对应任务人员权重配置
|
//todo:查询对应任务人员权重配置
|
||||||
DynamicObject myEval = BusinessDataServiceHelper.loadSingle("resm_evaluator", "evalentryid,entry_evaluator.user,entry_evaluator.role", new QFilter[]{new QFilter("evalentryid", "=", String.valueOf(evalDetailRow.getPkValue()))});
|
DynamicObject myEval = BusinessDataServiceHelper.loadSingle("resm_evaluator", "evalentryid,entry_evaluator.user,entry_evaluator.role", new QFilter[]{new QFilter("evalentryid", "=", String.valueOf(evalDetailRow.getPkValue()))});
|
||||||
if (myEval != null) {
|
if (myEval != null) {
|
||||||
DynamicObjectCollection entryentity = myEval.getDynamicObjectCollection("entry_evaluator");
|
DynamicObjectCollection entryentity = myEval.getDynamicObjectCollection("entry_evaluator");
|
||||||
for(int k = 0; k < entryentity.size(); k++) {
|
for (int k = 0; k < entryentity.size(); k++) {
|
||||||
DynamicObject evaluatorEntryRow = (DynamicObject)entryentity.get(k);
|
DynamicObject evaluatorEntryRow = (DynamicObject) entryentity.get(k);
|
||||||
if (isRoleEval) {
|
if (isRoleEval) {
|
||||||
// evaluatorSet.add((Long)evaluatorEntryRow.getDynamicObject("role").getPkValue());
|
// evaluatorSet.add((Long)evaluatorEntryRow.getDynamicObject("role").getPkValue());
|
||||||
// evaluatorTempSet.add((Long)evaluatorEntryRow.getDynamicObject("role").getPkValue());
|
// evaluatorTempSet.add((Long)evaluatorEntryRow.getDynamicObject("role").getPkValue());
|
||||||
} else {
|
} else {
|
||||||
Long userPk = (Long) evaluatorEntryRow.getDynamicObject("user").getPkValue();
|
Long userPk = (Long) evaluatorEntryRow.getDynamicObject("user").getPkValue();
|
||||||
DynamicObject bos_user = BusinessDataServiceHelper.loadSingle(userPk, "bos_user");
|
DynamicObject bos_user = BusinessDataServiceHelper.loadSingle(userPk, "bos_user");
|
||||||
if (bos_user != null){
|
if (bos_user != null) {
|
||||||
String name = bos_user.getString("name");
|
String name = bos_user.getString("name");
|
||||||
String username = bos_user.getString("username");
|
String username = bos_user.getString("username");
|
||||||
HashMap<String, String> userProperty = new HashMap<>();
|
HashMap<String, String> userProperty = new HashMap<>();
|
||||||
userProperty.put("name",name);
|
userProperty.put("name", name);
|
||||||
userProperty.put("username",username);
|
userProperty.put("username", username);
|
||||||
userNames.put(username,userProperty);//添加进入人员属性中
|
userNames.put(username, userProperty);//添加进入人员属性中
|
||||||
userNamesNow.add(userPk);//添加进入当前人员主键集合
|
userNamesNow.add(userPk);//添加进入当前人员主键集合
|
||||||
userDys.add(bos_user);//添加进入当前人员对象集合
|
userDys.add(bos_user);//添加进入当前人员对象集合
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
QFilter myexam_QF = new QFilter("evaltask.id",QCP.equals,evaltask_lPk);//考察任务id
|
QFilter myexam_QF = new QFilter("evaltask.id", QCP.equals, evaltask_lPk);//考察任务id
|
||||||
myexam_QF.and("creator.id",QCP.in,userNamesNow);//当前考察人
|
myexam_QF.and("creator.id", QCP.in, userNamesNow);//当前考察人
|
||||||
if ("resm_regsupplier".equals(suppliersource)){//潜在供应商
|
if ("resm_regsupplier".equals(suppliersource)) {//潜在供应商
|
||||||
myexam_QF.and("evalsupplier.id",QCP.equals,sup_pkValue);
|
myexam_QF.and("evalsupplier.id", QCP.equals, sup_pkValue);
|
||||||
}else {//正式供应商
|
} else {//正式供应商
|
||||||
myexam_QF.and("evaloffsupplier.id",QCP.equals,sup_pkValue);
|
myexam_QF.and("evaloffsupplier.id", QCP.equals, sup_pkValue);
|
||||||
}
|
}
|
||||||
//查询出该考察任务关联的我的考察
|
//查询出该考察任务关联的我的考察
|
||||||
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);
|
||||||
}
|
}
|
||||||
}else {
|
//平均分
|
||||||
|
BigDecimal divide = allGrade.divide(BigDecimal.valueOf(resm_myexams.length));
|
||||||
|
userGrades.put("avg", divide);
|
||||||
|
|
||||||
|
} else {
|
||||||
//我的考察还未下达时,先赋值0;
|
//我的考察还未下达时,先赋值0;
|
||||||
for (DynamicObject userDy : userDys) {
|
for (DynamicObject userDy : userDys) {
|
||||||
String username = userDy.getString("username");
|
String username = userDy.getString("username");
|
||||||
userGrades.put(username,BigDecimal.ZERO);
|
userGrades.put(username, BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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();
|
||||||
formShowParameter.setFormId("qeug_dynamicexampage");
|
formShowParameter.setFormId("qeug_dynamicexampage");
|
||||||
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");
|
||||||
// inlineStyleCss.setWidth("1000");
|
// inlineStyleCss.setWidth("1000");
|
||||||
// formShowParameter.getOpenStyle().setInlineStyleCss(inlineStyleCss);
|
// formShowParameter.getOpenStyle().setInlineStyleCss(inlineStyleCss);
|
||||||
getView().showForm(formShowParameter);
|
getView().showForm(formShowParameter);
|
||||||
}else {
|
} else {
|
||||||
this.getView().showTipNotification("对应考察计划数据异常,请联系管理员");
|
this.getView().showTipNotification("对应考察计划数据异常,请联系管理员");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue