考察汇总动态表功能

This commit is contained in:
zengweihai 2024-11-30 14:33:10 +08:00
parent 2fc35ed948
commit 864353f230
2 changed files with 399 additions and 0 deletions

View File

@ -0,0 +1,262 @@
package shkd.repc.resm.formplugin;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.entity.LocaleString;
import kd.bos.entity.EntryType;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.datamodel.events.GetEntityTypeEventArgs;
import kd.bos.entity.property.IntegerProp;
import kd.bos.entity.property.TextProp;
import kd.bos.exception.ErrorCode;
import kd.bos.exception.KDException;
import kd.bos.form.FormShowParameter;
import kd.bos.form.control.Control;
import kd.bos.form.control.EntryGrid;
import kd.bos.form.events.LoadCustomControlMetasArgs;
import kd.bos.form.events.OnGetControlArgs;
import kd.bos.form.field.IntegerEdit;
import kd.bos.form.field.TextEdit;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.isc.util.misc.Hash;
import kd.bos.metadata.entity.commonfield.IntegerField;
import kd.bos.metadata.entity.commonfield.TextField;
import kd.bos.metadata.form.control.EntryAp;
import kd.bos.metadata.form.control.EntryFieldAp;
import kd.sdk.plugin.Plugin;
import java.math.BigDecimal;
import java.util.*;
/**
* 动态考察汇总表单插件
*/
public class DynamicExamPageFormPlugin extends AbstractFormPlugin implements Plugin {
HashMap<Object,Object> supOfUserGrade;//供应商对应人员评分
HashMap<Object,Object> userNames;//人员及属性集合
/**
* todo 1:
* 向前端浏览器界面发送指令输出动态控件的元数据从而实现控件能展示的效果
* 加载显示单据控件能显示元数据对应的数据模型没有与之进行绑定
*
* @param e
*/
@Override
public void loadCustomControlMetas(LoadCustomControlMetasArgs e) {
super.loadCustomControlMetas(e);
//获取单据传参
FormShowParameter formShowParameter = (FormShowParameter) e.getSource();
if (null != formShowParameter) {
Map<String, Object> customParams = formShowParameter.getCustomParams();
supOfUserGrade = (HashMap<Object, Object>) customParams.get("supOfUserGrade");
userNames = (HashMap<Object, Object>) customParams.get("userNames");
}
EntryAp dynamicEntryAp = this.createDynamicEntryAp();
Map<String, Object> mapEntry = new HashMap();
mapEntry.put("id", "qeug_entryentity");//映射单据中的单据体
mapEntry.put("columns", dynamicEntryAp.createControl().get("columns"));
e.getItems().add(mapEntry);
}
/**
* todo 2:
* 向界面主实体模型动态注册新的属性对象存储动态添加的字段值从而达到控件能赋值的目的能根据标识来进行赋值了而不会报空指针的错误
*
* @param e
*/
@Override
public void getEntityType(GetEntityTypeEventArgs e) {
super.getEntityType(e);
MainEntityType oldMainType = e.getOriginalEntityType();//取原始的主实体
//复制主实体
MainEntityType newMainType = null;
try {
newMainType = (MainEntityType) oldMainType.clone();
} catch (CloneNotSupportedException exp) {
throw new KDException(exp, new ErrorCode("LoadCustomControlMetasSample", exp.getMessage()));
}
//获取单据传参
FormShowParameter formShowParameter = this.getView().getFormShowParameter();
if (null != formShowParameter) {
supOfUserGrade = new HashMap<Object,Object>();
userNames = new HashMap<Object,Object>();
Map<String, Object> customParams = formShowParameter.getCustomParams();
JSONObject supOfUserGrade_json = (JSONObject) customParams.get("supOfUserGrade");
for (String key : supOfUserGrade_json.keySet()) {
JSONObject userByGrade = (JSONObject) supOfUserGrade_json.get(key);//获取人员对应成绩集合
HashMap<String, BigDecimal> userGraderMap = new HashMap<>();
for (String userName : userByGrade.keySet()) {
BigDecimal grade = (BigDecimal) userByGrade.get(userName);
userGraderMap.put(userName,grade);
}
supOfUserGrade.put(key,userGraderMap);
}
JSONObject userNameColl = (JSONObject) customParams.get("userNames");
for (String userName : userNameColl.keySet()) {
HashMap<String, String> userPropertyMap = new HashMap<>();
JSONObject userProperty = (JSONObject) userNameColl.get(userName);
for (String propertyName : userProperty.keySet()) {
String content = (String) userProperty.get(propertyName);
userPropertyMap.put(propertyName,content);
}
userNames.put(userName,userPropertyMap);
}
}
//为自定义的单据体字段向主实体注册相应数据
this.registerDynamicProps(newMainType);
//回传给主实体
e.setNewEntityType(newMainType);
}
/**
* todo 3:向后台视图模型输出动态控件的编程模型实例并侦听控件的事件
*
* @param e
*/
@Override
public void onGetControl(OnGetControlArgs e) {
super.onGetControl(e);
String key = e.getKey();
if (key.startsWith("qeug_supplier")){
TextEdit textEdit = new TextEdit();
textEdit.setKey(key);//设置字段标识
textEdit.setEntryKey("qeug_entryentity");//设置分录标识
textEdit.setView(this.getView());//设置视图
e.setControl(textEdit);
} else if (key.startsWith("grade_")) {
IntegerEdit decimalEdit = new IntegerEdit();
decimalEdit.setKey(key);
decimalEdit.setEntryKey("qeug_entryentity");
decimalEdit.setView(this.getView());//设置视图
e.setControl(decimalEdit);
}
}
/**
* todo 4:是向后台视图模型添加动态字段的控件编辑模型后台赋值后需要展示到前端表单上目的是控件值能显示
*
* @param e
*/
@Override
public void beforeBindData(EventObject e) {
super.beforeBindData(e);
EntryAp dynamicEntryAp = this.createDynamicEntryAp();
EntryGrid qeug_entryentity = this.getView().getControl("qeug_entryentity");
List<Control> items = dynamicEntryAp.buildRuntimeControl().getItems();
for (Control item : items) {
item.setView(this.getView());
qeug_entryentity.getItems().add(item);
}
}
/**
* 页面加载完毕后渲染页面数据
* @param e
*/
@Override
public void afterBindData(EventObject e) {
super.afterBindData(e);
DynamicObjectCollection qeug_entryentity = this.getModel().getEntryEntity("qeug_entryentity");
for (Object key : supOfUserGrade.keySet()) {
DynamicObject addNew = qeug_entryentity.addNew();
//供应商名称赋值
addNew.set("qeug_supplier",key);
HashMap<String, BigDecimal> userGrades = (HashMap<String, BigDecimal>) supOfUserGrade.get(key);//人员对象对应考察得分
for (String userName : userGrades.keySet()) {
BigDecimal grade = userGrades.get(userName);
addNew.set("grade_"+userName,grade);
}
}
this.getView().updateView("qeug_entryentity");
}
/**
* 动态加载考察汇总单据体控件
* @return
*/
public EntryAp createDynamicEntryAp() {
EntryAp entryAp = new EntryAp();
entryAp.setKey("entryAp");
entryAp.setShowSeq(true);
this.createSupplierNameFileAp(entryAp);
this.createUserNamesFileAp(entryAp);
return entryAp;
}
/**
*加载该供应商名称单据体字段控件
* @param entryAp
*/
public void createSupplierNameFileAp(EntryAp entryAp) {
EntryFieldAp apMat = new EntryFieldAp();
apMat.setId("qeug_supplier");
apMat.setKey("qeug_supplier");
apMat.setName(new LocaleString("供应商"));
apMat.setLock("new,edit,view,submit,audit");//设置锁定性
TextField textField = new TextField();
textField.setId("qeug_supplier");
textField.setKey("qeug_supplier");
apMat.setField(textField);
entryAp.getItems().add(apMat);
}
public void createUserNamesFileAp(EntryAp entryAp) {
for (Object key : userNames.keySet()) {
HashMap<String,String> value = (HashMap<String, String>) userNames.get(key);
EntryFieldAp apMat = new EntryFieldAp();
String username = value.get("username");
String name = value.get("name");
apMat.setId("grade_"+username);
apMat.setKey("grade_"+username);
apMat.setName(new LocaleString(name));
apMat.setLock("new,edit,view,submit,audit");//设置锁定性
IntegerField integerField = new IntegerField();
integerField.setScale(2);
integerField.setZeroShow(true);
apMat.setField(integerField);
entryAp.getItems().add(apMat);
}
}
public void registerDynamicProps(MainEntityType newMainType){
//获取当前单据体实体
EntryType entryType = (EntryType) newMainType.getAllEntities().get("qeug_entryentity");//单据体标识
this.createSupplierNameProps(entryType);
this.createUserNamesProps(entryType);
}
public void createSupplierNameProps(EntryType entryType) {
TextProp textProp = new TextProp();
textProp.setName("qeug_supplier");//字段标识
textProp.setDisplayName(new LocaleString("供应商"));
textProp.setDbIgnore(true);
entryType.registerSimpleProperty(textProp);
}
public void createUserNamesProps(EntryType entryType) {
for (Object key : userNames.keySet()) {
HashMap<String,String> value = (HashMap<String, String>)userNames.get(key);
String username = value.get("username");
String name = value.get("name");
IntegerProp integerProp = new IntegerProp();
integerProp.setName("grade_"+username);
integerProp.setDisplayName(new LocaleString(name));//标题
integerProp.setScale(2);
integerProp.setZeroShow(true);
entryType.registerSimpleProperty(integerProp);
}
}
}

View File

@ -0,0 +1,137 @@
package shkd.repc.resm.listplugin;
import com.alibaba.fastjson.JSONArray;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.datamodel.ListSelectedRowCollection;
import kd.bos.form.FormShowParameter;
import kd.bos.form.ShowType;
import kd.bos.form.StyleCss;
import kd.bos.form.events.AfterDoOperationEventArgs;
import kd.bos.isc.util.misc.Hash;
import kd.bos.list.plugin.AbstractListPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.botp.BFTrackerServiceHelper;
import kd.sdk.plugin.Plugin;
import kd.tmc.tm.business.validate.business.BusinessUnauditOpValidator;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
/**
* 标准单据列表插件
*/
public class ExamTaskSummaryListPlugin extends AbstractListPlugin implements Plugin {
@Override
public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
super.afterDoOperation(afterDoOperationEventArgs);
String operateKey = afterDoOperationEventArgs.getOperateKey();
if ("viewsummary".equals(operateKey)){
ListSelectedRowCollection selectedRows = getSelectedRows();
if (selectedRows.size() > 1){
this.getView().showTipNotification("只能选择一条数据查看项目汇总");
}else {
String projectName = "";
Object primaryKeyValue = selectedRows.get(0).getPrimaryKeyValue();//获取当前考察结果主键
DynamicObject resm_examtask_summary = BusinessDataServiceHelper.loadSingle(primaryKeyValue, "resm_examtask_summary");
DynamicObject evaltask = resm_examtask_summary.getDynamicObject("evaltask");
long evalTaskId = evaltask.getLong("id");
QFilter qFilter = new QFilter("plandetails.evaltask.id", QCP.equals, evalTaskId);
DynamicObject examPlan = BusinessDataServiceHelper.loadSingle("resm_investigationplan", qFilter.toArray());
DynamicObject qeug_project = examPlan.getDynamicObject("qeug_project");//考察计划的项目
if (qeug_project != null){
projectName = qeug_project.getString("name");
}
DynamicObjectCollection plandetails = examPlan.getDynamicObjectCollection("plandetails");//计划详情-分为多个考察任务
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>>();//人员及属性集合用于构建单据字段
for (DynamicObject plandetail : plandetails) {//循环多条考察任务
String suppliersource = plandetail.getString("suppliersource");//供应商来源区分正式供应商和潜在供应商
HashSet<Long> userNamesNow = new HashSet<Long>();//当前任务人员主键集合
ArrayList<DynamicObject> userDys = new ArrayList<>();//当前任务人员对象集合存放当前考察任务对应的考察人员对象
DynamicObject suppliername = plandetail.getDynamicObject("suppliername");//供应商对象
Object sup_pkValue = suppliername.getPkValue();//供应商主键
String supName = suppliername.getString("name");
DynamicObject evaltask_l = plandetail.getDynamicObject("evaltask");//考察任务
long evaltask_lPk = evaltask_l.getLong("id");//考察任务主键
DynamicObject resm_exam_task = BusinessDataServiceHelper.loadSingle(evaltask_lPk, "resm_exam_task");//完整考察任务数据
String evaloObject = resm_exam_task.getString("evalobject");//考察对象区分角色或者人员
boolean isRoleEval = StringUtils.equals("roleeval", evaloObject);
DynamicObjectCollection entry_evaldetail = resm_exam_task.getDynamicObjectCollection("entry_evaldetail");
DynamicObject evalDetailRow = entry_evaldetail.get(0);
//todo:查询对应任务人员权重配置
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) {
DynamicObjectCollection entryentity = myEval.getDynamicObjectCollection("entry_evaluator");
for(int k = 0; k < entryentity.size(); k++) {
DynamicObject evaluatorEntryRow = (DynamicObject)entryentity.get(k);
if (isRoleEval) {
// evaluatorSet.add((Long)evaluatorEntryRow.getDynamicObject("role").getPkValue());
// evaluatorTempSet.add((Long)evaluatorEntryRow.getDynamicObject("role").getPkValue());
} else {
Long userPk = (Long) evaluatorEntryRow.getDynamicObject("user").getPkValue();
DynamicObject bos_user = BusinessDataServiceHelper.loadSingle(userPk, "bos_user");
if (bos_user != null){
String name = bos_user.getString("name");
String username = bos_user.getString("username");
HashMap<String, String> userProperty = new HashMap<>();
userProperty.put("name",name);
userProperty.put("username",username);
userNames.put(username,userProperty);//添加进入人员属性中
userNamesNow.add(userPk);//添加进入当前人员主键集合
userDys.add(bos_user);//添加进入当前人员对象集合
}
}
}
}
QFilter myexam_QF = new QFilter("evaltask.id",QCP.equals,evaltask_lPk);//考察任务id
myexam_QF.and("creator.id",QCP.in,userNamesNow);//当前考察人
if ("resm_regsupplier".equals(suppliersource)){//潜在供应商
myexam_QF.and("evalsupplier.id",QCP.equals,sup_pkValue);
}else {//正式供应商
myexam_QF.and("evaloffsupplier.id",QCP.equals,sup_pkValue);
}
//查询出该考察任务关联的我的考察
DynamicObject[] resm_myexams = BusinessDataServiceHelper.load("resm_myexam", "creator,evalscore", myexam_QF.toArray());
//todo:开始构建供应商对应人员评分
HashMap<String, BigDecimal> userGrades = new HashMap<String, BigDecimal>();//人员成绩key为人员用户名value为人员分数
if (resm_myexams.length > 0){
for (DynamicObject resm_myexam : resm_myexams) {
DynamicObject creator = resm_myexam.getDynamicObject("creator");//当前考察人
BigDecimal evalscore = resm_myexam.getBigDecimal("evalscore");//考察得分
String username = creator.getString("username");//人员用户名
userGrades.put(username,evalscore);
}
}else {
//我的考察还未下达时,先赋值0
for (DynamicObject userDy : userDys) {
String username = userDy.getString("username");
userGrades.put(username,BigDecimal.ZERO);
}
}
supOfUserGrade.put(supName,userGrades);
}
//todo: 构建传参
FormShowParameter formShowParameter = new FormShowParameter();
formShowParameter.setFormId("qeug_dynamicexampage");
formShowParameter.setCaption(projectName+"供应商评分汇总表");
formShowParameter.setCustomParam("supOfUserGrade",supOfUserGrade);
formShowParameter.setCustomParam("userNames",userNames);
formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
// StyleCss inlineStyleCss = new StyleCss();
// inlineStyleCss.setHeight("600");
// inlineStyleCss.setWidth("1000");
// formShowParameter.getOpenStyle().setInlineStyleCss(inlineStyleCss);
getView().showForm(formShowParameter);
}
}
}
}