|
@@ -0,0 +1,269 @@
|
|
|
+package nckd.wnq01.wnq.scm.plugin.form;
|
|
|
+
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
+import kd.bos.dataentity.metadata.IDataEntityProperty;
|
|
|
+import kd.bos.dataentity.metadata.IDataEntityType;
|
|
|
+import kd.bos.dataentity.resource.ResManager;
|
|
|
+import kd.bos.dataentity.serialization.SerializationUtils;
|
|
|
+import kd.bos.dataentity.utils.StringUtils;
|
|
|
+import kd.bos.designer.botp.BillTreeBuildParameter;
|
|
|
+import kd.bos.designer.botp.EntityParseHelper;
|
|
|
+import kd.bos.entity.BillEntityType;
|
|
|
+import kd.bos.entity.EntityMetadataCache;
|
|
|
+import kd.bos.entity.botp.CRCondition;
|
|
|
+import kd.bos.entity.botp.WriteBackType;
|
|
|
+import kd.bos.entity.datamodel.IDataModel;
|
|
|
+import kd.bos.entity.datamodel.events.ChangeData;
|
|
|
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
|
|
|
+import kd.bos.entity.property.AttachmentProp;
|
|
|
+import kd.bos.entity.property.DecimalProp;
|
|
|
+import kd.bos.entity.property.MulBasedataProp;
|
|
|
+import kd.bos.entity.property.PictureProp;
|
|
|
+import kd.bos.entity.tree.TreeNode;
|
|
|
+import kd.bos.form.CloseCallBack;
|
|
|
+import kd.bos.form.FormShowParameter;
|
|
|
+import kd.bos.form.ShowType;
|
|
|
+import kd.bos.form.control.Control;
|
|
|
+import kd.bos.form.events.ClosedCallBackEvent;
|
|
|
+import kd.bos.form.plugin.AbstractFormPlugin;
|
|
|
+import kd.sdk.plugin.Plugin;
|
|
|
+
|
|
|
+import java.util.EventObject;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Tyx 2025-03-07
|
|
|
+ * 通用表达式处理插件
|
|
|
+ */
|
|
|
+public class CommonHandleExpFormPlugin extends AbstractFormPlugin implements Plugin {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化文本按钮监听
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void initialize() {
|
|
|
+ super.initialize();
|
|
|
+ addClickListeners(new String[]{"nckd_exp","nckd_indexexp","nckd_field"});
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 文本按钮点击事件
|
|
|
+ * @param evt
|
|
|
+ */
|
|
|
+ public void click(EventObject evt) {
|
|
|
+ Control ctl = (Control) evt.getSource();
|
|
|
+ // 表达式
|
|
|
+ if (ctl.getKey().equalsIgnoreCase("nckd_exp")) {
|
|
|
+ this.doClickWBItemCondition(ctl.getKey(),"entryentity", "nckd_billentity");
|
|
|
+ }
|
|
|
+ else if (ctl.getKey().equalsIgnoreCase("nckd_indexexp")) {
|
|
|
+ this.doClickWBItemCondition(ctl.getKey(),"nckd_entryentity", "nckd_indexbillentity");
|
|
|
+ }
|
|
|
+ // 字段
|
|
|
+ else if (ctl.getKey().equalsIgnoreCase("nckd_field")) {
|
|
|
+ this.doClickCommitField(ctl.getKey(), "entryentity", "nckd_valueentity");
|
|
|
+ }
|
|
|
+ // 条件成立或不成立
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构造打开页面参数
|
|
|
+ * 单据上配置需满足 :
|
|
|
+ * 文本按钮字段:nckd_xxx;
|
|
|
+ * 返回Json接收大文本字段 : nckd_xxxjson和nckd_xxxjson_tag
|
|
|
+ * @param key 文本按钮字段
|
|
|
+ * @param entryentity 分录实体名
|
|
|
+ * @param billFieldKey 单据实体下拉字段
|
|
|
+ */
|
|
|
+ private void doClickWBItemCondition(String key, String entryentity, String billFieldKey) {
|
|
|
+ BillEntityType mainType = this.getTargetMainType(entryentity, billFieldKey);
|
|
|
+ int row = this.getModel().getEntryCurrentRowIndex(entryentity);
|
|
|
+ String conditionJson = (String) this.getModel().getValue(key+"json_tag", row);
|
|
|
+ BillTreeBuildParameter parameter = new BillTreeBuildParameter(mainType);
|
|
|
+ parameter.getForbidRefPropFieldTypes().add(MulBasedataProp.class);
|
|
|
+ TreeNode billTreeNode = EntityParseHelper.buildBillTreeNodes(parameter);
|
|
|
+ String fldNodes = SerializationUtils.toJsonString(billTreeNode);
|
|
|
+ this.showConditionForm(conditionJson, mainType.getName(), fldNodes, key);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取单据元数据type
|
|
|
+ * @param entryentity
|
|
|
+ * @param billFieldKey
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private BillEntityType getTargetMainType(String entryentity, String billFieldKey) {
|
|
|
+ int row = this.getModel().getEntryCurrentRowIndex(entryentity);
|
|
|
+ String entityNumber = this.getModel().getValue(billFieldKey, row).toString();
|
|
|
+ BillEntityType tgtMainType = (BillEntityType) EntityMetadataCache.getDataEntityType(entityNumber);
|
|
|
+ return tgtMainType;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打开页面
|
|
|
+ * @param conditionJson
|
|
|
+ * @param entityNumber
|
|
|
+ * @param fieldNodes
|
|
|
+ * @param sourceCtrlKey
|
|
|
+ */
|
|
|
+ private void showConditionForm(String conditionJson, String entityNumber, String fieldNodes, String sourceCtrlKey) {
|
|
|
+ FormShowParameter showParameter = new FormShowParameter();
|
|
|
+ showParameter.setFormId("botp_condition");
|
|
|
+ showParameter.getCustomParams().put("formula", conditionJson);
|
|
|
+ showParameter.getCustomParams().put("entitynumber", entityNumber);
|
|
|
+ showParameter.getCustomParams().put("treenodes", fieldNodes);
|
|
|
+ showParameter.setCloseCallBack(new CloseCallBack(this, sourceCtrlKey));
|
|
|
+ showParameter.getOpenStyle().setShowType(ShowType.Modal);
|
|
|
+ this.getView().showForm(showParameter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * callback
|
|
|
+ * @param e
|
|
|
+ */
|
|
|
+ public void closedCallBack(ClosedCallBackEvent e) {
|
|
|
+ if (e.getActionId().equalsIgnoreCase("nckd_exp")) {
|
|
|
+ this.receiveCondition((String) e.getReturnData(), "entryentity", "nckd_expjson", "nckd_exp");
|
|
|
+ }
|
|
|
+ else if (e.getActionId().equalsIgnoreCase("nckd_indexexp")) {
|
|
|
+ this.receiveCondition((String) e.getReturnData(), "nckd_entryentity", "nckd_indexexpjson", "nckd_indexexp");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理子页面返回的信息,组装成json放在nckd_xxxjson_tag字段里面
|
|
|
+ * @param conditionJson
|
|
|
+ * @param entryEntityKey
|
|
|
+ * @param conditionFldKey
|
|
|
+ * @param descFldKey
|
|
|
+ */
|
|
|
+ private void receiveCondition(String conditionJson, String entryEntityKey, String conditionFldKey, String descFldKey) {
|
|
|
+ if (StringUtils.isNotBlank(conditionJson)) {
|
|
|
+ CRCondition condition = (CRCondition)SerializationUtils.fromJsonString(conditionJson, CRCondition.class);
|
|
|
+ String exprTran = condition.getExprDesc();
|
|
|
+ if (StringUtils.isBlank(entryEntityKey)) {
|
|
|
+ this.getModel().setValue(conditionFldKey, conditionJson);
|
|
|
+ this.getModel().setValue(descFldKey, exprTran);
|
|
|
+ } else {
|
|
|
+ int row = this.getModel().getEntryCurrentRowIndex(entryEntityKey);
|
|
|
+ this.getModel().setValue(conditionFldKey, "exists", row);
|
|
|
+ this.getModel().setValue(conditionFldKey+"_tag", conditionJson, row);
|
|
|
+ this.getModel().setValue(descFldKey, exprTran, row);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 值改变事件,单据实体下拉字段改变时候需清空条件字段
|
|
|
+ * @param e
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void propertyChanged(PropertyChangedArgs e) {
|
|
|
+ super.propertyChanged(e);
|
|
|
+ String key = e.getProperty().getName();
|
|
|
+ if(key.equalsIgnoreCase("nckd_billentity")) {
|
|
|
+ doClearFieldValue("nckd_exp", e.getChangeSet());
|
|
|
+ }
|
|
|
+ else if (key.equalsIgnoreCase("nckd_indexbillentity")) {
|
|
|
+ doClearFieldValue("nckd_indexexp", e.getChangeSet());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清空字段具体实现方法
|
|
|
+ * @param key
|
|
|
+ * @param changeDatas
|
|
|
+ */
|
|
|
+ private void doClearFieldValue(String key, ChangeData[] changeDatas) {
|
|
|
+ for(int i = 0; i < changeDatas.length; ++i) {
|
|
|
+ ChangeData changeData = changeDatas[i];
|
|
|
+ this.getModel().setValue(key, (Object)null, changeData.getRowIndex());
|
|
|
+ this.getModel().setValue(key+"json", (Object)null, changeData.getRowIndex());
|
|
|
+ this.getModel().setValue(key+"json_tag", (Object)null, changeData.getRowIndex());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 单据字段点击入口事件
|
|
|
+ */
|
|
|
+ private void doClickCommitField(String key, String entryentity, String billFieldKey) {
|
|
|
+ BillEntityType sourceMainType = this.getTargetMainType(entryentity,billFieldKey);
|
|
|
+ int rowIndex = this.getModel().getEntryCurrentRowIndex(entryentity);
|
|
|
+ HashSet<String> selectEntitys = getSrcCommitEntity(this.getModel(), sourceMainType, true, rowIndex);
|
|
|
+ //if (WBRuleGetHelper.checkWritebackType(this.getView(), this.getModel())) {
|
|
|
+ //Class<?> fldType = getCommitFieldType(this.getModel());
|
|
|
+ Class<?> fldType = null;
|
|
|
+ BillTreeBuildParameter parameter = new BillTreeBuildParameter(sourceMainType, selectEntitys, fldType);
|
|
|
+ parameter.setForbidClassType(getForbidFieldTypes(this.getModel()));
|
|
|
+ parameter.getForbidRefPropFieldTypes().add(MulBasedataProp.class);
|
|
|
+ TreeNode srcBillNode = EntityParseHelper.buildBillTreeNodes(parameter);
|
|
|
+ this.showSelectFieldForm(srcBillNode, "wb_commitfieldname");
|
|
|
+ //}
|
|
|
+ }
|
|
|
+
|
|
|
+ private void showSelectFieldForm(TreeNode srcBillNode, String sourceCtrlKey) {
|
|
|
+ FormShowParameter showParameter = new FormShowParameter();
|
|
|
+ showParameter.setFormId("botp_selectfield");
|
|
|
+ String nodesJson = SerializationUtils.toJsonString(srcBillNode);
|
|
|
+ showParameter.getCustomParams().put("treenodes", nodesJson);
|
|
|
+ showParameter.setCloseCallBack(new CloseCallBack(this, sourceCtrlKey));
|
|
|
+ showParameter.getOpenStyle().setShowType(ShowType.Modal);
|
|
|
+ this.getView().showForm(showParameter);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static HashSet<String> getSrcCommitEntity(IDataModel model, BillEntityType srcMainType, boolean includeParent, int expRowIndex) {
|
|
|
+ HashSet<String> entityKeys = new HashSet();
|
|
|
+ int rowCount = model.getEntryRowCount("entryentity");
|
|
|
+
|
|
|
+ for(int row = 0; row < rowCount; ++row) {
|
|
|
+ if (expRowIndex != row) {
|
|
|
+ String commitFldKey = (String)model.getValue("nckd_fieldkey", row);
|
|
|
+ if (!StringUtils.isBlank(commitFldKey)) {
|
|
|
+ IDataEntityProperty property = srcMainType.findProperty(commitFldKey);
|
|
|
+ if (property != null) {
|
|
|
+ if (!entityKeys.contains(property.getParent().getName())) {
|
|
|
+ entityKeys.add(property.getParent().getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (includeParent) {
|
|
|
+ for(IDataEntityType parent = property.getParent().getParent(); parent != null; parent = parent.getParent()) {
|
|
|
+ if (!entityKeys.contains(parent.getName())) {
|
|
|
+ entityKeys.add(parent.getName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return entityKeys;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static Class<?> getCommitFieldType(IDataModel model) {
|
|
|
+ int row = model.getEntryCurrentRowIndex("entryentity");
|
|
|
+ String wbType = (String)model.getValue("wb_writebacktype", row);
|
|
|
+ WriteBackType type = WriteBackType.valueOf(Integer.parseInt(wbType));
|
|
|
+ Class<?> fldType = null;
|
|
|
+ if (type == WriteBackType.Cover) {
|
|
|
+ fldType = null;
|
|
|
+ } else {
|
|
|
+ fldType = DecimalProp.class;
|
|
|
+ }
|
|
|
+
|
|
|
+ return fldType;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Set<Class<?>> getForbidFieldTypes(IDataModel model) {
|
|
|
+ Set<Class<?>> types = new HashSet();
|
|
|
+ types.add(AttachmentProp.class);
|
|
|
+ types.add(PictureProp.class);
|
|
|
+ return types;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|