(云苍穹)树的构建

package zb.pc.formplugin.pcctm.basedata.ingredientslist;

import kd.bos.bill.BillShowParameter;
import kd.bos.bill.OperationStatus;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.dataentity.utils.ObjectUtils;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.BasedataEntityType;
import kd.bos.entity.EntityMetadataCache;
import kd.bos.entity.datamodel.ITreeModel;
import kd.bos.entity.property.GroupProp;
import kd.bos.entity.property.ParentBasedataProp;
import kd.bos.entity.tree.TreeNode;
import kd.bos.exception.KDBizException;
import kd.bos.form.*;
import kd.bos.form.control.Control;
import kd.bos.form.control.TreeView;
import kd.bos.form.control.events.RefreshNodeEvent;
import kd.bos.form.control.events.TreeNodeEvent;
import kd.bos.form.control.events.TreeNodeQueryListener;
import kd.bos.form.events.ClosedCallBackEvent;
import kd.bos.form.events.MessageBoxClosedEvent;
import kd.bos.form.events.SetFilterEvent;
import kd.bos.list.BillList;
import kd.bos.list.plugin.StandardTreeListPlugin;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.DeleteServiceHelper;
import org.springframework.util.CollectionUtils;
import zb.common.constant.BaseConstant;
import zb.common.constant.ManageOrgConstant;
import zb.pc.common.constant.pcctm.basedata.ingredientslist.IngredientsListConstant;
import zb.pc.common.constant.pcctm.basedata.ingredientstype.IngredientsTypeConstant;

import java.util.*;

import static zb.pc.common.constant.pceetm.PigletWearTagConstant.ZB_PIGEARTAG_ADD;

/**
 * @Module : 公共业务云--食堂管理模块--食材清单
 * @Description : 食材清单类别列表数结构插件
 * @Date : 2021-05-05
 * @Author : xxx
 * @Version : 1.0
 **/
public class IngredientsTreePlugin extends StandardTreeListPlugin implements TreeNodeQueryListener {
    private static Log log = LogFactory.getLog(IngredientsTreePlugin.class);
    private static final String KEY_TREEVIEW = "treeview";
    private static final String KEY_PARENT = "parent";
    private static final String KEY_ORGUNIT = "zb_orgunit";
    private static final String KEY_STOCKORG = "zb_stockorg";
    private static final String KEY_LONGNUMBER = "longnumber";
    private static final String KEY_ISLEAF = "isleaf";
    private static final String KEY_ISPARENT = "isParent";
    private static final String KEY_ROOT_PARENT_ID = "0";
    private static final String KEY_ROOT_TEXT = "全部";
    private static final String KEY_FLEXPANEL_TREEBTN = "flexpanel_treebtn";
    private static final String KEY_ISCONTAINNOW = "iscontainnow";
    private static final String KEY_ISCONTAINLOWER = "iscontainlower";
    private static final String STR_EMPTY = "";
    private static final String SPLIT_POINT = "[.]";
    private static final String STATUS_AUDITED = "C"; //已审核状态
    private static final String WIDTH = "800";
    private static final String HEIGHT = "500";

    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        TreeView treeView = this.getView().getControl(KEY_TREEVIEW);
        if (treeView != null) {
            //侦听树节点懒加载事件
            treeView.addTreeNodeQueryListener(this);
        }
    }


    @Override
    public void queryTreeNodeChildren(TreeNodeEvent treeNodeEvent) {
        //根据父级ID查询子节点数据
        List<TreeNode> childNodes = loadChildNode((String) treeNodeEvent.getNodeId());
        TreeView treeView = this.getView().getControl(KEY_TREEVIEW);
        treeView.addNodes(childNodes);
    }

    @Override
    public void afterCreateNewData(EventObject e) {
        super.afterCreateNewData(e);
        //初始化树形控件
        initTreeView();
        //隐藏控件
        //hideControl();
    }

    /**
     * 初始化树形控件
     */
    private void initTreeView() {
        //初始化树形控件的属性与第一层节点
        TreeView treeView = this.getView().getControl(KEY_TREEVIEW);
        if (treeView == null) {
            return;
        }
        //清空所有节点
        treeView.deleteAllNodes();
        //根节点
        TreeNode root = new TreeNode(STR_EMPTY, KEY_ROOT_PARENT_ID, KEY_ROOT_TEXT);
        //添加到控件中
        treeView.addNode(root);
        //查询根节点
        List<TreeNode> childNodes = loadChildNode(root.getId());
        if (CollectionUtils.isEmpty(childNodes)) {
            return;
        }
        //将根节点数据添加到控件中
        treeView.addNodes(childNodes);
        treeView.focusNode(childNodes.get(0));
        root.setIsOpened(true);
        //初始化当前用户的子节点
        initChildNode(childNodes, treeView);
    }

    /**
     * 根据父节点ID查询子节点数据
     *
     * @param parentId 父节点ID
     */
    private List<TreeNode> loadChildNode(String parentId) {
        //根据父节点ID查询子节点数据
        DynamicObject[] objects = queryIngredients(parentId);
        List<TreeNode> childNodes = new ArrayList<>();
        if (!ObjectUtils.isEmpty(objects) && objects.length > 0) {
            for (int i = 0; i < objects.length; i++) {
                DynamicObject object = objects[i];
                TreeNode treeNode = new TreeNode(parentId, object.getPkValue().toString(),
                        object.getLocaleString(BaseConstant.NAME).getLocaleValue());
                treeNode.setLongNumber(object.getString(KEY_LONGNUMBER));
                //叶子处理
                Object isLeaf = object.get(KEY_ISLEAF);
                if (isLeaf != null && !(Boolean) isLeaf) {
                    treeNode.setChildren(new ArrayList());
                }
                childNodes.add(treeNode);
            }
        }
        return childNodes;
    }

    /**
     * 根据过滤器查询食材清单类别数据
     *
     * @param parentId 父级ID
     * @return DynamicObject[]
     */
    private DynamicObject[] queryIngredients(String parentId) {
        QFilter statusFilter = new QFilter(BaseConstant.STATUS, QCP.equals, STATUS_AUDITED);
        QFilter enableFilter = new QFilter(BaseConstant.ENABLE, QCP.equals, Boolean.TRUE);
        QFilter filter = new QFilter(KEY_PARENT, QCP.equals, parentId);
        QFilter[] qFilters = new QFilter[]{statusFilter, enableFilter, filter};
        String orderBy = "createtime asc";
        String fields = "id, number, name, longnumber, level, fullname, isleaf, parent";
        DynamicObject[] objects = BusinessDataServiceHelper.load(IngredientsTypeConstant.FORMBILLID, fields, qFilters, orderBy);
        return objects;
    }


    /**
     * 初始化子节点
     */
    private void initChildNode(List<TreeNode> childNodes, TreeView treeView) {
        List<TreeNode> tempNodes = childNodes;
        for (int j = 0; j < tempNodes.size(); j++) {
            //找到对应的食材目录的父级,就继续往下找
            List<TreeNode> listNodes = loadChildNode(tempNodes.get(j).getId());
            if (listNodes.size() > 0 && !CollectionUtils.isEmpty(listNodes)) {
                tempNodes.get(j).setIsOpened(true);
                treeView.addNodes(listNodes);
                tempNodes = listNodes;
                break;
            }
        }
    }

    private void hideControl() {
        //隐藏树形列表默认的搜索框和包含下级这些按钮
        String[] hideBtn = new String[]{KEY_FLEXPANEL_TREEBTN, KEY_ISCONTAINNOW, KEY_ISCONTAINLOWER};
        this.getView().setVisible(Boolean.FALSE, hideBtn);
    }

    @Override
    public void setFilter(SetFilterEvent e) {
        TreeView treeView = this.getView().getControl(KEY_TREEVIEW);
        //如果非树型结构页面,不设置过滤条件
        if (treeView == null) {
            super.setFilter(e);
            return;
        }
        //根据光标选中的节点获取对应的食材清单类别id
        String focusNodeId = treeView.getTreeState().getFocusNodeId();
        if (StringUtils.isNotBlank(focusNodeId)) {
            DynamicObject object = BusinessDataServiceHelper.loadSingle(focusNodeId, IngredientsTypeConstant.FORMBILLID);
            String typeId = object.getPkValue().toString();
            QFilter qfilter = new QFilter(IngredientsListConstant.ZB_UPTYPE, QCP.equals, typeId);
            List<QFilter> filters = e.getQFilters();
            filters.add(qfilter);
        }
        super.setFilter(e);
    }

    /**i
     * 树节点工具栏功能实现
     *
     * @param e
     */
    public void treeToolbarClick(EventObject e) {
        ITreeModel treeModel = this.getTreeModel();
        Control ctl = (Control) e.getSource();
        GroupProp prop = this.getTreeModel().getGroupProp();
        String currentNodeId = (String)treeModel.getCurrentNodeId();
        TreeView treeView = this.getView().getControl(KEY_TREEVIEW);
        if (ctl.getKey().equals("btnnew")) {
            //跳转到食材清单类别界面新增
            this.addTreeNode(currentNodeId);

        } else if (ctl.getKey().equals("btnedit")) {
            //修改树节点 (跳转到食材清单类别修改界面)
            editTreeNode(currentNodeId);

        } else if (ctl.getKey().equals("btndel")) {
            //删除树节点
            deleteTreeNode(currentNodeId);

        }

        //重新加载节点信息
//        TreeNode currentNode = this.getTreeModel().getRoot().getTreeNode(currentNodeId, 10);
//        List<TreeNode> childNodes = loadChildNode(currentNode.getId());
//        initChildNode(childNodes, treeView);
        }

    /**
     * 新增树节点
     * @param currentNodeId
     *
     */
    private void addTreeNode(String currentNodeId) {
        String entityId = IngredientsTypeConstant.FORMBILLID;
        BillShowParameter formShowParameter = new BillShowParameter();
        StyleCss css = new StyleCss();
        css.setWidth(WIDTH);
        css.setHeight(HEIGHT);
        formShowParameter.getOpenStyle().setInlineStyleCss(css);

        formShowParameter.setFormId(entityId);
        formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
        CloseCallBack callBack = new CloseCallBack(this, "addTreeNode");
        formShowParameter.setCloseCallBack(callBack);
        formShowParameter.setCustomParam("id", currentNodeId);
        formShowParameter.setCustomParam("operate", "addnew");
        if (!currentNodeId.equals(this.getTreeModel().getRoot().getId())) {
            BasedataEntityType basedataEntityType = (BasedataEntityType) EntityMetadataCache.getDataEntityType(entityId);
            if (basedataEntityType != null) {
                Map<String, Object> parentInfo = new HashMap();
                Iterator var7 = basedataEntityType.getProperties().iterator();

                while(var7.hasNext()) {
                    IDataEntityProperty pro = (IDataEntityProperty)var7.next();
                    if (pro instanceof ParentBasedataProp) {
                        parentInfo.put("key", pro.getName());
                        parentInfo.put("value", currentNodeId);
                        formShowParameter.setCustomParam("tree_parent_id", parentInfo);
                        break;
                    }
                }
            }
        }
        this.getView().showForm(formShowParameter);
    }

    /**
     * 修改节树点
     * @param currentNodeId
     */
    private void editTreeNode(String currentNodeId) {
        BillShowParameter formShowParameter = new BillShowParameter();
        StyleCss css = new StyleCss();
        css.setWidth(WIDTH);
        css.setHeight(HEIGHT);
        formShowParameter.getOpenStyle().setInlineStyleCss(css);

        formShowParameter.setFormId(IngredientsTypeConstant.FORMBILLID);
        formShowParameter.getOpenStyle().setShowType(ShowType.Modal);
        formShowParameter.setPkId(this.getTreeModel().getCurrentNodeId());
        formShowParameter.setStatus(OperationStatus.EDIT);
        CloseCallBack callBack = new CloseCallBack(this, "editTreeNode");
        formShowParameter.setCloseCallBack(callBack);
        formShowParameter.setCustomParam("operate", "edit");
        Map<String, Object> parentInfo = new HashMap();
        parentInfo.put("value", currentNodeId);
        formShowParameter.setCustomParam("tree_curr_id", parentInfo);

        this.getView().showForm(formShowParameter);
    }

    /**
     * 删除树节点
     * @param currentNodeId
     */
    private void deleteTreeNode(String currentNodeId) {
        TreeNode currentNode = this.getTreeModel().getRoot().getTreeNode(currentNodeId, 10);
        //String text = currentNode.getText();
        ConfirmCallBackListener confirmCallBacks = new ConfirmCallBackListener("deleteTreeNode", this);
        this.getView().showConfirm("您确认删除食材清单类别", MessageBoxOptions.YesNo, confirmCallBacks);
        QFilter qfilter = new QFilter(IngredientsTypeConstant.ID, QCP.equals, currentNodeId);
        DeleteServiceHelper.delete(IngredientsTypeConstant.FORMBILLID, qfilter.toArray());
    }

    /**
     * 子界面关闭时,会触发父界面的closedCallBack事件
     * @param e
     */
    @Override
    public void closedCallBack(ClosedCallBackEvent e) {
        String key = e.getActionId();
        if (StringUtils.equals("addTreeNode", key) || StringUtils.equals("editTreeNode", key)){
            String refreshNodeId = this.getTreeModel().getRoot().getId();
            this.treeListView.getTreeModel().refreshNode(refreshNodeId);
        }
    }

    /**
     * 刷新树节点
     * @param e
     */
    @Override
    public void refreshNode(RefreshNodeEvent e) {
        initTreeView();
    }

    /**
     * 用户确认了交互提示信息后,触发此事件
     * @param event
     */
    @Override
    public void confirmCallBack(MessageBoxClosedEvent event) {
        super.confirmCallBack(event);
        String key = event.getCallBackId();
        if (StringUtils.equals("deleteTreeNode", key) && event.getResult() == MessageBoxResult.Yes){
            String refreshNodeId = this.getTreeModel().getRoot().getId();
            this.treeListView.getTreeModel().refreshNode(refreshNodeId);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值