修复组织的长编码
一、需求
开发一个功能,修复组织长编码。
组织的长编码出现错误(可能是由于数据同步,api,扩展插件等场景修改了长编码),导致组织列表的左树展示异常。
如下图,由于行政组织的左树,是通过长编码来编排节点的,而红框内的长编码有误,导致左树的节点下面,没有出现这两个子节点。
二、思路与方案
1.扩展"行政组织"页面。
2.添加一个按钮,添加单据列表插件,监听按钮点击。
3.开发插件中,对选中的行政组织,遍历其上级组织,构造长编码。最后将新的长编码赋值给对应的行政组织,并保存。
4.长编码的结构是:以感叹号"!"为分隔符,将组织编码(包括其全部的上级组织和当前组织),从左到右,依次放置。最左边的编码给根组织的编码,最右边的编码为当前组织编码。因此,有2种方式可以修复该长编码:
4.1相对简单的方案是,获取上级组织的长编码,拼接当前组织的编码即可,前提是上级组织的长编码没有错误。
4.2递归查询全部上级组织的编码,再与当前组织的编码,也可以得到当前组织的正确长编码。
三、实现过程
1.扩展"行政组织"页面
(1)扩展基础服务云,企业建模
(2)扩展"行政组织"页面。
2.在扩展页面中,添加按钮和页面插件
3.编写插件代码,完成修复长编码的业务逻辑
提供2种方案对长编码进行修复
3.1 代码方案1:获取上级组织的长编码,拼接当前组织的编码。
注意:该方案在循环体里面查询,请不要全选数据,手动选择要修改长编码的组织。
关键代码如下:
QFilter qFilter1 = new QFilter("org", QCP.equals, parentPkId); // 1为行政组织视图 QFilter qFilter2 = new QFilter("view", QCP.equals, 1); // 查询组织结构表,获取长编码 DynamicObject dynamicObject = BusinessDataServiceHelper .loadSingle( "bos_org_structure", new QFilter[]{qFilter1, qFilter2});
完整代码如下:
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.entity.datamodel.ListSelectedRowCollection; import kd.bos.entity.operate.result.OperationResult; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.list.BillList; 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.operation.SaveServiceHelper; /** * 标准单据列表插件 */ public class FixLongnumListPlugin extends AbstractListPlugin { /** * 监听按钮点击 */ @Override public void itemClick(ItemClickEvent evt) { super.itemClick(evt); if (evt.getItemKey().equals("kdec_fixlongnum")) { BillList billList = this.getControl("billlistap"); // 获取选中行,对选中行进行修复长编码 ListSelectedRowCollection listSelectedCollection = billList.getSelectedRows(); // 构造准备进行保存的DynamicObject数组 DynamicObject[] saveDynamicObjects = new DynamicObject[listSelectedCollection.size()]; for (int i = 0; i < listSelectedCollection.size(); i++) { Object pkId = listSelectedCollection.get(i).getPrimaryKeyValue(); // 查询选中行数据 DynamicObject currentOrgDObj = BusinessDataServiceHelper.loadSingle(pkId, "bos_adminorg"); // 获取上级组织长编码 String parentLongNumber = getParentLongNumber(currentOrgDObj); // 获取当前组织的组织结构分录 DynamicObjectCollection collectionEn = currentOrgDObj.getDynamicObjectCollection("structure"); if (parentLongNumber != null) { // 设置长编码 for (DynamicObject dynamicObjectEn : collectionEn) { dynamicObjectEn.set("longnumber", parentLongNumber + "!" + currentOrgDObj.get("number")); } } saveDynamicObjects[i] = currentOrgDObj; } // 保存当前组织 OperationResult result = SaveServiceHelper.saveOperate("bos_adminorg", saveDynamicObjects); if (result.isSuccess()) { getView().showSuccessNotification("修复并保存成功"); // 保存后刷新 getView().invokeOperation("refresh"); } else { getView().showSuccessNotification("修复并保存失败"); } } } /** * 获取上级组织长编码 * @param curDObj 当前组织DynamicObject * @return */ private String getParentLongNumber(DynamicObject curDObj) { Object parentPkId = getOrgParentPkId(curDObj); if (parentPkId == null) return null; QFilter qFilter1 = new QFilter("org", QCP.equals, parentPkId); // 1为行政组织视图 QFilter qFilter2 = new QFilter("view", QCP.equals, 1); // 查询组织结构表,获取长编码 DynamicObject dynamicObject = BusinessDataServiceHelper .loadSingle( "bos_org_structure", new QFilter[]{qFilter1, qFilter2}); return dynamicObject.getString("longnumber"); } /** * 获取上级组织id * @param curDObj 当前组织DynamicObject * @return */ private Object getOrgParentPkId(DynamicObject curDObj) { // 查询当前组织数据 DynamicObjectCollection collectionEn = curDObj.getDynamicObjectCollection("structure"); if (collectionEn.size() <= 0) { return null; } DynamicObject dynamicObjectEn = collectionEn.get(0); // 上级组织 DynamicObject parent = dynamicObjectEn.getDynamicObject("viewparent"); return parent.get("id"); } }
3.2 代码方案2:递归查询全部上级组织的编码,拼接当前组织的编码。
注意:该方案在循环体里面递归查询,可能存在性能问题,如果上级组织的id有误,导致向上查询没能查到组织根节点,可能会出现死循环或者抛异常。因此调用前请注意以下几点:
1.确保上级组织id无误。
2.不要全选数据,手动选择要修改长编码的组织。
部分关键代码如下:
获取选中行
BillList billList = this.getControl("billlistap"); ListSelectedRowCollection listSelectedCollection = billList.getSelectedRows();
构造长编码
for (int i = 0; i< listSelectedCollection.size(); i++) { // 构造一个List,存储编码信息 List<String> numList = new ArrayList<String>(); // 获取选中行的pkid Object pkId = listSelectedCollection.get(i).getPrimaryKeyValue(); // 获取全部上级组织的编码 queryParentOrgNumber(pkId, numList); // 构造长编码 StringBuilder stringBuilder = new StringBuilder(); for(int j = numList.size() - 1 ; j >= 0; j--) { stringBuilder.append(numList.get(j)); if (j != 0) { stringBuilder.append("!"); } } }
递归获取上级组织的长编码
private void queryParentOrgNumber(Object pkId, List<String> numList) { DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkId, "bos_adminorg"); numList.add(dynamicObject.getString("number")); DynamicObjectCollection collectionEn = dynamicObject.getDynamicObjectCollection("structure"); if (collectionEn.size() > 0) { DynamicObject dynamicObjectEn = collectionEn.get(0); // 上级组织id DynamicObject parentPkId = dynamicObjectEn.getDynamicObject("viewparent"); if (parentPkId != null) { queryParentOrgNumber(parentPkId.getPkValue(), numList); } } }
整体插件代码如下:
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.entity.datamodel.ListSelectedRowCollection; import kd.bos.entity.operate.result.OperationResult; import kd.bos.form.control.events.ItemClickEvent; import kd.bos.list.BillList; import kd.bos.list.plugin.AbstractListPlugin; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import java.util.ArrayList; import java.util.List; public class FixLongnumListPlugin extends AbstractListPlugin { /** * 监听按钮点击 */ @Override public void itemClick(ItemClickEvent evt) { super.itemClick(evt); // 判断是否点击了“修复长编码并保存”按钮 if (evt.getItemKey().equals("kdec_fixlongnum")) { BillList billList = this.getControl("billlistap"); // 获取选中行,对选中行进行修复长编码 ListSelectedRowCollection listSelectedCollection = billList.getSelectedRows(); // 构造准备进行保存的DynamicObject数组 DynamicObject[] saveDynamicObjects = new DynamicObject[listSelectedCollection.size()]; for (int i = 0; i< listSelectedCollection.size(); i++) { // 构造一个List,存储编码信息 List<String> numList = new ArrayList<String>(); // 获取选中行的pkid Object pkId = listSelectedCollection.get(i).getPrimaryKeyValue(); // 获取全部上级组织的编码 queryParentOrgNumber(pkId, numList); // 构造长编码 StringBuilder stringBuilder = new StringBuilder(); for(int j = numList.size() - 1 ; j >= 0; j--) { stringBuilder.append(numList.get(j)); if (j != 0) { stringBuilder.append("!"); } } // 获取当前组织的DynamicObject,对长编码字段赋值 DynamicObject saveDynamicObject = BusinessDataServiceHelper.loadSingle(pkId, "bos_adminorg"); DynamicObjectCollection collectionEn = saveDynamicObject.getDynamicObjectCollection("structure"); DynamicObject dynamicObjectEn = collectionEn.get(0); dynamicObjectEn.set("longnumber", stringBuilder.toString()); saveDynamicObjects[i] = saveDynamicObject; } // 保存勾选组织 OperationResult result = SaveServiceHelper.saveOperate("bos_adminorg", saveDynamicObjects); if (result.isSuccess()) { getView().showSuccessNotification("修复并保存成功"); } else { getView().showSuccessNotification("修复并保存失败"); } // 保存后刷新 getView().invokeOperation("refresh"); } } /** * 递归查询上级组织,将组织编码放入numList * @param pkId 当前组织id * @param numList 上级组织编码列表 */ private void queryParentOrgNumber(Object pkId, List<String> numList) { DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(pkId, "bos_adminorg"); numList.add(dynamicObject.getString("number")); DynamicObjectCollection collectionEn = dynamicObject.getDynamicObjectCollection("structure"); if (collectionEn.size() > 0) { DynamicObject dynamicObjectEn = collectionEn.get(0); // 上级组织id DynamicObject parentPkId = dynamicObjectEn.getDynamicObject("viewparent"); if (parentPkId != null) { queryParentOrgNumber(parentPkId.getPkValue(), numList); } } } }
四、效果图
1.勾选2个组织,点击“修复长编码并保存”按钮
2.点击后,效果如下,左树展示了叶子节点。长编码也显示正确了。修复成功!
修复组织的长编码
一、需求开发一个功能,修复组织长编码。组织的长编码出现错误(可能是由于数据同步,api,扩展插件等场景修改了长编码),导致组织列表的...
点击下载文档
本文2024-09-23 00:47:29发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-141758.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章