修复组织的长编码

一、需求
开发一个功能,修复组织长编码。
组织的长编码出现错误(可能是由于数据同步,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 dynamicObjec修复组织的长编码
一、需求开发一个功能,修复组织长编码。组织的长编码出现错误(可能是由于数据同步,api,扩展插件等场景修改了长编码),导致组织列表的...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



