修复组织的长编码

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:3

修复组织的长编码

一、需求

开发一个功能,修复组织长编码。


组织的长编码出现错误(可能是由于数据同步,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,扩展插件等场景修改了长编码),导致组织列表的...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息