如何在后台创建寻源变更单,并自动提交和审核
1. 如何在后台创建寻源变更单,并自动提交和审核
1.1 业务场景简介
寻源变更一般通过业务操作—>发起变更,或者 通过菜单“寻源变更”,新增变更单进行变更处理。但有时候需要后台创建变更单,并自动提交和审核,例如:在“结果公告”节点,如果发布的是流标公告,则自动生成一张项目终止/流标变更单,并自动提交和审核。
1、发布“流标公告”,并提交、审核:
2、自动创建“项目终止/流标变更单”,并自动提交和审核:
1.2 简要实现方案
步骤 | 开发内容 | 备注 |
1 | 后台创建变更单的入口插件,并注册 | 代码开发 |
2 | 后台创建变更单的表头插件,并注册 | 应用配置 |
3 | 后台创建变更单的组件插件,并注册 | 代码开发 |
1.3 详细开发步骤及示例代码
下面以发布“发布流标公告、项目终止/流标变更” 为例。
1.3.1 新增后台创建变更单的入口插件,并注册
插件最主要部分的是初始化变更单所需的数据,代码如下:
package kd.scm.src.opplugin.audithandle;
import java.util.HashMap; import java.util.Map;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.resource.ResManager; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.QueryServiceHelper; import kd.scm.common.constant.BillAssistConstant; import kd.scm.pds.common.constant.PdsMetadataConstant; import kd.scm.pds.common.constant.SrcCommonConstant; import kd.scm.pds.common.constant.SrcMetadataConstant; import kd.scm.pds.common.extplugin.ExtPluginContext; import kd.scm.pds.common.extplugin.IExtPluginHandler; import kd.scm.pds.common.util.PdsCommonUtils; import kd.scm.src.common.util.SrcBidChangeUtil;
/** * 发布流标公告后--自动进行项目流标处理 * * @author rd_fumin_huang * */ public class SrcAutoEndchangeHandler implements IExtPluginHandler { private static final long serialVersionUID = 1L;
@Override public void process(ExtPluginContext args) { // 是否需要变更 if (!isNeedChange(args)) { return; } // 创建变更上下文 ExtPluginContext context = createChangeContext(args);
// 获取已存在的未审核变更单 DynamicObject changeObj = SrcBidChangeUtil.getBidChangeBill(context); if (null == changeObj) { // 创建变更单 changeObj = SrcBidChangeUtil.createBidChangeBill(context); } // 执行 提交 PdsCommonUtils.doOperation(changeObj, BillAssistConstant.OP_SUBMIT); // 执行 审核 PdsCommonUtils.doOperation(changeObj, BillAssistConstant.OP_AUDIT); }
/** * 创建变更上下文 * * @param context * @return */ public ExtPluginContext createChangeContext(ExtPluginContext args) { ExtPluginContext context = new ExtPluginContext(); // 传入 寻源项目对象、id context.setProjectObj(args.getBillObj()); context.setProjectId(args.getProjectId());
// 初始化 valueMap(重要,二开需要修改) initValueMap(context);
// 返回 return context; }
/** * 初始化 valueMap(重要,二开需要修改) * * @param args * @param context */ public void initValueMap(ExtPluginContext context) { Map<String, Object> valueMap = new HashMap<>(8); // 传入 完整的其他参数 // 1 变更来源:1-寻源申请 2-项目立项 3-寻源项目 valueMap.put(SrcCommonConstant.CHANGESOURCE, SrcCommonConstant.CHANGESOURCE_PROJECT); // 2 寻源项目id valueMap.put(SrcCommonConstant.PROJECT, context.getProjectId()); // 3 变更类型id:项目终止/废标模板id (重要) long templateId = PdsCommonUtils.getBasedataIdByNumber(PdsMetadataConstant.PDS_TPLCONFIG, "SYS042"); //通过变更类型编码获取变更类型id valueMap.put(SrcCommonConstant.TEMPLATE, templateId); // 获取 变更类型对象 DynamicObject changeType = BusinessDataServiceHelper.loadSingle(templateId, PdsMetadataConstant.PDS_TPLCONFIG); // 用源单对象 暂存 变更类型对象 context.setSourceObj(changeType);
// 4 变更原因 valueMap.put(SrcCommonConstant.REMARK, ResManager.loadKDString("发布流标公告后自动终止项目。", "SrcAutoEndchangeHandler_0", "scm-src-opplugin")); // 5 业务类型:同主单据 valueMap.put(SrcCommonConstant.BIZTYPE, context.getProjectObj().getLong(SrcCommonConstant.BIZTYPE + '.' + SrcCommonConstant.ID)); // 6 采购组织:同主单据 valueMap.put(SrcCommonConstant.ORG, context.getProjectObj().getLong(SrcCommonConstant.ORG + '.' + SrcCommonConstant.ID)); // 7 变更发起当前节点id valueMap.put(SrcCommonConstant.CURRENTNODE, PdsCommonUtils.getNodeIdByEntityName(context.getProjectObj().getDataEntityType().getName()));
// 暂存到 context--ParamMap2 context.getParamMap2().put(SrcMetadataConstant.SRC_BIDCHANGE, valueMap); }
/** * 是否需要发起变更 * * @param context * @return */ public boolean isNeedChange(ExtPluginContext args) { // 来源单据id = 寻源项目id QFilter qfilter = new QFilter(SrcCommonConstant.SRCBILLID, QCP.equals, args.getProjectId()); // 变更类型 = D-流标公告 qfilter.and(SrcCommonConstant.BIZTYPE, QCP.equals, "D"); // 父单据为 结果公告 qfilter.and(SrcCommonConstant.PENTITYKEY, QCP.equals, args.getBillObj().getDataEntityType().getName()); // 查询结果公告组件 if (QueryServiceHelper.exists(SrcMetadataConstant.SRC_DECISIONNOTICE, qfilter.toArray())) { return true; } return false; } } |
1.3.2 新增后台创建变更单的表头插件,并注册
该插件采用标准插件即可,一般不需要修改或注册:
/** * 后台创建寻源变更单(表头、变更条件、变更逻辑、组件) * * @author rd_fumin_huang * */ public class SrcCreateBidChangeBill implements IExtPluginHandler { private static final long serialVersionUID = 1L;
@Override public void process(ExtPluginContext context) { // 创建变更单表头 SrcBidChangeUtil.createBidChangeHead(context);
// 创建变更单分录(变更条件、变更逻辑) SrcBidChangeUtil.createBidChangeEntry(context);
// 创建模板分录 SrcBidChangeUtil.createBidChangeTplEntry(context);
// 保存 PdsCommonUtils.saveDynamicObjects(context.getBillObj());
// 批量创建组件 SrcBidChangeUtil.createBidChangeComps(context); } } |
1.3.3 后台创建变更单的组件插件,并注册
插件编码:前缀(createChgComp)_变更组件元数据标识,如:createChgComp_src_projectend
不同的变更类型,其组件不一样,实现方式也不一样,一般都需要二开处理。
package kd.scm.src.common.change;
import kd.bos.dataentity.entity.DynamicObject; import kd.scm.pds.common.constant.SrcCommonConstant; import kd.scm.pds.common.extplugin.ExtPluginContext; import kd.scm.pds.common.extplugin.IExtPluginHandler; import kd.scm.pds.common.util.PdsCommonUtils; import kd.scm.src.common.util.SrcBidChangeUtil;
/** * 后台创建 项目终止/废标 组件 * * @author rd_fumin_huang * */ public class SrcCreateProjectEndComp implements IExtPluginHandler { private static final long serialVersionUID = 1L;
@Override public void process(ExtPluginContext context) { // 初始化 valueMap initValueMap(context);
// 创建组件对象 DynamicObject compObj = SrcBidChangeUtil.createBidChangeComp(context);
// 设置组件值 setCompValue(context, compObj);
// 保存 PdsCommonUtils.saveDynamicObjects(compObj); }
/** * 初始化 valueMap * * @param context */ public void initValueMap(ExtPluginContext context) { // 其他二开字段,可以暂存到Map // Map<String, Object> valueMap = new HashMap<>(16); // valueMap.put(SrcCommonConstant.PROJECT, context.getProjectId()); // context.getParamMap2().put(context.getEntityId(), valueMap); }
/** * 设置组件值 * * @param context * @param compObj */ public void setCompValue(ExtPluginContext context, DynamicObject compObj) { // 寻源项目id compObj.set(SrcCommonConstant.PROJECT, context.getProjectId()); // D--进行终止/流标处理 compObj.set(SrcCommonConstant.BIZTYPE, "D"); } } |
1.4 参考开发工作量(人/天)
步骤 | 开发内容 | 估计开发人天 |
1 | 后台创建变更单的入口插件,并注册 |
0.5~2.0
|
2 | 后台创建变更单的表头插件,并注册 | |
3 | 后台创建变更单的组件插件,并注册 |
合计:约0.5~2.0开发人天。
如何在后台创建寻源变更单,并自动提交和审核
本文2024-09-22 23:57:27发表“云星瀚知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-xinghan-136348.html