修改人:邹江涛

修改内容:API映射公共单据
修改时间:2024/11/20
This commit is contained in:
zoujiangtao 2024-11-20 15:44:32 +08:00
parent febb8f8fa0
commit 8824c71002
1 changed files with 231 additions and 0 deletions

View File

@ -0,0 +1,231 @@
package shkd.sys.sys.plugin.form;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.form.control.CodeEdit;
import kd.bos.form.control.Toolbar;
import kd.bos.form.control.events.ItemClickEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.sdk.plugin.Plugin;
import java.math.BigDecimal;
import java.util.*;
/**
* 动态表单插件
*/
public class ApiMappingBillPlugin extends AbstractFormPlugin implements Plugin {
@Override
public void registerListener(EventObject e) {
Toolbar tbmain = this.getView().getControl("tbmain");
Toolbar advcontoolbarap = this.getView().getControl("advcontoolbarap");
tbmain.addItemClickListener(this);
advcontoolbarap.addItemClickListener(this);
}
@Override
public void propertyChanged(PropertyChangedArgs e) {
}
@Override
public void itemClick(ItemClickEvent evt) {
String itemKey = evt.getItemKey();
if ("shkd_generatejson".equals(itemKey)) {
DynamicObject dataEntity = this.getModel().getDataEntity(true);
// 生成JSON
DynamicObjectCollection dynamicObjectCollection = dataEntity.getDynamicObjectCollection("entryentity");
// 提取所有层级并存储在 Set
Set<Integer> tiers = new HashSet<>();
dynamicObjectCollection.forEach(dynamicObject -> {
String shkd_tartier = dynamicObject.getString("shkd_tartier");
if (shkd_tartier != null && !shkd_tartier.isEmpty()) {
tiers.add(Integer.parseInt(shkd_tartier));
}
});
List<List<DynamicObject>> floors = new ArrayList<>();
for (int i = 1; i <= tiers.size(); i++) {
floors.add(new ArrayList<>());
}
// 分层
for (DynamicObject dynamicObject : dynamicObjectCollection) {
int tier = Integer.parseInt(dynamicObject.getString("shkd_tartier"));
floors.get(tier - 1).add(dynamicObject);
}
// 获取代码编辑器控件
CodeEdit codeEdit = this.getView().getControl("shkd_codeeditap");
// 获取组装body类型
String shkd_bodytype = dataEntity.getString("shkd_bodytype");
if ("数组".equals(shkd_bodytype)) {
JSONArray jsonArray = new JSONArray();
JSONObject json = new JSONObject();
for (DynamicObject dynamicObject : dynamicObjectCollection) {
String key = dynamicObject.getString("shkd_tarfield");
Object value = dynamicObject.get("shkd_defaultdata");
String tartype = dynamicObject.getString("shkd_tartype");
if ("String".equals(tartype) || "Date".equals(tartype)) {
json.put(key, value);
} else if ("Integer".equals(tartype)) {
json.put(key, Integer.parseInt(value.toString()));
} else if ("BigDecimal".equals(tartype)) {
json.put(key, new BigDecimal(value.toString()));
} else if ("对象".equals(tartype)) {
JSONObject childJson = new JSONObject();
processFloor(childJson, key, getChildren(floors, dynamicObject.getString("shkd_tarfield")), floors);
json.put(key, childJson);
} else if ("数组".equals(tartype)) {
JSONArray childJsonArray = new JSONArray();
for (DynamicObject childDynamicObject : getChildren(floors, dynamicObject.getString("shkd_tarfield"))) {
JSONObject childJson = new JSONObject();
processFloor(childJson, key, Collections.singletonList(childDynamicObject), floors);
childJsonArray.add(childJson);
}
json.put(key, childJsonArray);
}
}
jsonArray.add(json);
codeEdit.setText(jsonArray.toJSONString());
} else {
JSONObject resultJson = new JSONObject();
processFloor(resultJson, "data", floors.get(0), floors);
codeEdit.setText(resultJson.toJSONString());
}
}
if ("shkd_analyzejson".equals(itemKey)) {
CodeEdit codeEdit = this.getView().getControl("shkd_codeeditap");
String text = codeEdit.getText();
Object obj = JSON.parse(text);
if (obj instanceof JSONObject) {
JSONObject jsonObject = JSON.parseObject(text);
parseJson(jsonObject, 1, null);
} else if (obj instanceof JSONArray) {
JSONArray jsonArray = JSON.parseArray(text);
parseJson(jsonArray, 1, null);
}
}
}
private void processFloor(JSONObject parentJson, String parentKey, List<DynamicObject> currentFloor, List<List<DynamicObject>> floors) {
if (currentFloor.isEmpty()) {
return;
}
if (currentFloor.size() == 1 && "对象".equals(currentFloor.get(0).getString("shkd_tartype"))) {
parentJson.put(parentKey, new JSONObject());
processFloor(parentJson.getJSONObject(parentKey), parentKey, getChildren(floors, currentFloor.get(0).getString("shkd_tarfield")), floors);
return;
}
if ("数组".equals(currentFloor.get(0).getString("shkd_tartype"))) {
JSONArray jsonArray = new JSONArray();
//目前JSONArray都是一层
JSONObject json = new JSONObject();
for (DynamicObject dynamicObject : currentFloor) {
String key = dynamicObject.getString("shkd_tarfield");
Object value = dynamicObject.get("shkd_defaultdata");
String tartype = dynamicObject.getString("shkd_tartype");
if ("String".equals(tartype) || "Date".equals(tartype)) {
json.put(key, value);
} else if ("Integer".equals(tartype)) {
json.put(key, Integer.parseInt(value.toString()));
} else if ("BigDecimal".equals(tartype)) {
json.put(key, new BigDecimal(value.toString()));
} else if ("对象".equals(tartype)) {
JSONObject childJson = new JSONObject();
processFloor(childJson, key, getChildren(floors, dynamicObject.getString("shkd_tarfield")), floors);
json.put(key, childJson);
} else if ("数组".equals(tartype)) {
JSONArray childJsonArray = new JSONArray();
for (DynamicObject childDynamicObject : getChildren(floors, dynamicObject.getString("shkd_tarfield"))) {
JSONObject childJson = new JSONObject();
processFloor(childJson, key, Collections.singletonList(childDynamicObject), floors);
childJsonArray.add(childJson);
}
json.put(key, childJsonArray);
}
}
jsonArray.add(json);
parentJson.put(parentKey, jsonArray);
} else {
for (DynamicObject dynamicObject : currentFloor) {
String key = dynamicObject.getString("shkd_tarfield");
Object value = dynamicObject.get("shkd_defaultdata");
String tartype = dynamicObject.getString("shkd_tartype");
if ("String".equals(tartype) || "Date".equals(tartype)) {
parentJson.put(key, value);
} else if ("Integer".equals(tartype)) {
parentJson.put(key, Integer.parseInt(value.toString()));
} else if ("BigDecimal".equals(tartype)) {
parentJson.put(key, new BigDecimal(value.toString()));
} else if ("对象".equals(tartype)) {
JSONObject childJson = new JSONObject();
processFloor(childJson, key, getChildren(floors, dynamicObject.getString("shkd_tarfield")), floors);
parentJson.put(key, childJson);
} else if ("数组".equals(tartype)) {
JSONArray childJsonArray = new JSONArray();
JSONObject childJson = new JSONObject();
processFloor(childJson, key, getChildren(floors, dynamicObject.getString("shkd_tarfield")), floors);
childJsonArray.add(childJson);
parentJson.put(key, childJsonArray);
}
}
}
}
private List<DynamicObject> getChildren(List<List<DynamicObject>> floors, String parentKey) {
List<DynamicObject> children = new ArrayList<>();
for (List<DynamicObject> floor : floors) {
for (DynamicObject dynamicObject : floor) {
if (parentKey.equals(dynamicObject.getString("shkd_parentfield"))) {
children.add(dynamicObject);
}
}
}
return children;
}
private void parseJson(Object obj, int level, String parentKey) {
if (obj instanceof JSONObject) {
JSONObject json = (JSONObject) obj;
for (String key : json.keySet()) {
Object value = json.get(key);
String type = value instanceof JSONObject ? "对象" : value instanceof JSONArray ? "数组" : value.getClass().getSimpleName();
String defaultValue = value instanceof JSONObject || value instanceof JSONArray ? "" : value.toString();
setEntryEntity(key, level, type, defaultValue, parentKey);
if (value instanceof JSONObject) {
parseJson(value, level + 1, key);
} else if (value instanceof JSONArray) {
parseJson(value, level + 1, key);
}
}
} else if (obj instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) obj;
for (Object value : jsonArray) {
parseJson(value, level, parentKey);
}
}
}
private void setEntryEntity(String key, int level, String type, String def, String pKey) {
this.getModel().batchCreateNewEntryRow("entryentity", 1);
DynamicObjectCollection dynamicObjectCollection = this.getModel().getEntryEntity("entryentity");
this.getModel().setValue("shkd_tarfield", key, dynamicObjectCollection.size() - 1);//
this.getModel().setValue("shkd_tartier", level, dynamicObjectCollection.size() - 1);
this.getModel().setValue("shkd_tartype", type, dynamicObjectCollection.size() - 1);
this.getModel().setValue("shkd_defaultdata", def, dynamicObjectCollection.size() - 1);
this.getModel().setValue("shkd_parentfield", pKey, dynamicObjectCollection.size() - 1);
}
}