|
@@ -0,0 +1,360 @@
|
|
|
|
|
+package com.malk.minglei.service.impl.yida;
|
|
|
|
|
+
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
|
+import com.malk.minglei.config.YidaApplicationsProperties;
|
|
|
|
|
+import com.malk.minglei.dto.ErpYidaPushMainData;
|
|
|
|
|
+import com.malk.minglei.dto.ErpYidaPushRequest;
|
|
|
|
|
+import com.malk.minglei.service.yida.YidaFormPushHandler;
|
|
|
|
|
+import com.malk.minglei.service.yida.YidaProcessOpenApiClient;
|
|
|
|
|
+import com.malk.server.common.McException;
|
|
|
|
|
+import com.malk.server.dingtalk.DDR_New;
|
|
|
|
|
+import com.malk.server.dingtalk.DDConf;
|
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
|
+import java.time.LocalDate;
|
|
|
|
|
+import java.time.ZoneId;
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.Collections;
|
|
|
|
|
+import java.util.LinkedHashMap;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+
|
|
|
|
|
+@Service
|
|
|
|
|
+public class
|
|
|
|
|
+
|
|
|
|
|
+Asft800FormPushHandler implements YidaFormPushHandler {
|
|
|
|
|
+
|
|
|
|
|
+ public static final String TYPE = "asft800";
|
|
|
|
|
+
|
|
|
|
|
+ private static final Logger LOGGER = LoggerFactory.getLogger(Asft800FormPushHandler.class);
|
|
|
|
|
+ private static final String FORM_NAME = "\u5305\u88c5\u5de5\u5355\u53d8\u66f4\u5ba1\u6279\u6d41\u7a0b";
|
|
|
|
|
+ private static final String FORM_UUID = "FORM-40D6FBBBF4A94864A2AF9535AAC7924CRBH2";
|
|
|
|
|
+ private static final String PROCESS_CODE = "TPROC--U2I66F719HF854X6PIGK5A2AP9VC2LODB7YSM1";
|
|
|
|
|
+ private static final String TITLE_FIELD_ID = "textField_msh27unu";
|
|
|
|
|
+ private static final String APPLICANT_FIELD_ID = "employeeField_msh186rr";
|
|
|
|
|
+ private static final String COMPANY_TEXT_FIELD_ID = "textField_mu1z5kaf";
|
|
|
|
|
+ private static final String COMPANY_SELECT_FIELD_ID = "selectField_mso1em48";
|
|
|
|
|
+ private static final String DEPARTMENT_FIELD_ID = "departmentSelectField_msh186ry";
|
|
|
|
|
+ private static final String APPLY_DATE_FIELD_ID = "dateField_msh186rs";
|
|
|
|
|
+ private static final String FORM_TITLE_FIELD_ID = "textField_mspcpz92";
|
|
|
|
|
+ private static final String WORK_ORDER_NO_FIELD_ID = "textField_msy7cb7z";
|
|
|
|
|
+ private static final String CHANGE_SEQUENCE_FIELD_ID = "textField_msy7cb80";
|
|
|
|
|
+ private static final String CHANGE_DATE_FIELD_ID = "dateField_msy7cb81";
|
|
|
|
|
+ private static final String WORK_ORDER_TYPE_FIELD_ID = "textField_msy7cb82";
|
|
|
|
|
+ private static final String PRODUCTION_ITEM_FIELD_ID = "textField_msy7cb86";
|
|
|
|
|
+ private static final String ITEM_NAME_FIELD_ID = "textField_msy7cb87";
|
|
|
|
|
+ private static final String PRODUCTION_QUANTITY_FIELD_ID = "numberField_msy7cb88";
|
|
|
|
|
+ private static final String SPECIFICATION_FIELD_ID = "textField_msy7cb89";
|
|
|
|
|
+ private static final String SOURCE_DOCUMENT_FIELD_ID = "textField_msy7cb8g";
|
|
|
|
|
+ private static final String PRODUCTION_ORDER_FIELD_ID = "textField_msy7cb8h";
|
|
|
|
|
+ private static final String CHANGE_REMARK_FIELD_ID = "textField_msy7cb8i";
|
|
|
|
|
+ private static final String SALES_PERSON_FIELD_ID = "employeeField_msy7cb8j";
|
|
|
|
|
+ private static final String DETAIL_TABLE_FIELD_ID = "tableField_msy7cb8k";
|
|
|
|
|
+ private static final String DETAIL_ENTERPRISE_FIELD_ID = "textField_msy7cb9k";
|
|
|
|
|
+ private static final String DETAIL_WORK_ORDER_FIELD_ID = "textField_msy7cb9l";
|
|
|
|
|
+ private static final String DETAIL_SEQUENCE_FIELD_ID = "textField_msy7cb8l";
|
|
|
|
|
+ private static final String DETAIL_CHANGE_TYPE_FIELD_ID = "textField_msy7cb8m";
|
|
|
|
|
+ private static final String DETAIL_ISSUE_ITEM_FIELD_ID = "textField_msy7cb8n";
|
|
|
|
|
+ private static final String DETAIL_ITEM_NAME_FIELD_ID = "textField_msy7cb8o";
|
|
|
|
|
+ private static final String DETAIL_SPECIFICATION_FIELD_ID = "textField_msy7cb8p";
|
|
|
|
|
+ private static final String DETAIL_REQUIRED_QUANTITY_FIELD_ID = "numberField_msy7cb8q";
|
|
|
|
|
+ private static final String DETAIL_UNIT_FIELD_ID = "textField_msy7cb8r";
|
|
|
|
|
+ private static final String DETAIL_PREVIOUS_ITEM_FIELD_ID = "textField_msy7cb8s";
|
|
|
|
|
+ private static final String DETAIL_PREVIOUS_ITEM_NAME_FIELD_ID = "textField_msy7cb8t";
|
|
|
|
|
+ private static final String DETAIL_PREVIOUS_SPECIFICATION_FIELD_ID = "textField_msy7cb8u";
|
|
|
|
|
+ private static final String DETAIL_PREVIOUS_QUANTITY_FIELD_ID = "numberField_msy7cb8v";
|
|
|
|
|
+ private static final String T100_ID_FIELD_ID = "textField_msy7cb9d";
|
|
|
|
|
+ private static final String ENTERPRISE_FIELD_ID = "textField_msy7cb9e";
|
|
|
|
|
+ private static final String CALLBACK_CHANGE_SEQUENCE_FIELD_ID = "textField_msy7cb9f";
|
|
|
|
|
+
|
|
|
|
|
+ private final YidaProcessOpenApiClient yidaProcessOpenApiClient;
|
|
|
|
|
+ private final DDConf dingTalkConfiguration;
|
|
|
|
|
+ private final YidaApplicationsProperties applications;
|
|
|
|
|
+
|
|
|
|
|
+ public Asft800FormPushHandler(YidaProcessOpenApiClient yidaProcessOpenApiClient,
|
|
|
|
|
+ DDConf dingTalkConfiguration,
|
|
|
|
|
+ YidaApplicationsProperties applications) {
|
|
|
|
|
+ this.yidaProcessOpenApiClient = yidaProcessOpenApiClient;
|
|
|
|
|
+ this.dingTalkConfiguration = dingTalkConfiguration;
|
|
|
|
|
+ this.applications = applications;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<String> getTypes() {
|
|
|
|
|
+ return Collections.singletonList(TYPE);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public String push(ErpYidaPushRequest request) {
|
|
|
|
|
+ validateConfiguration();
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> mainData = toMainDataMap(request.getMainData());
|
|
|
|
|
+ String operatorUserId = requireText(resolveOperatorUserId(request, mainData), "asft800 requires mainData.ooagud004 or mainData.tjr");
|
|
|
|
|
+ Map<String, Object> formData = toYidaFormData(request, mainData, operatorUserId);
|
|
|
|
|
+ String title = requireText(toText(formData.get(TITLE_FIELD_ID)), "asft800 requires mainData.sfkadocno");
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> body = new LinkedHashMap<String, Object>();
|
|
|
|
|
+ body.put("appType", requireText(applications.getCoordinationOffice().getAppType(), "YIDA_COORDINATION_OFFICE_APP_TYPE is not configured"));
|
|
|
|
|
+ body.put("systemToken", requireText(applications.getCoordinationOffice().getSystemToken(), "YIDA_COORDINATION_OFFICE_SYSTEM_TOKEN is not configured"));
|
|
|
|
|
+ body.put("userId", operatorUserId);
|
|
|
|
|
+ body.put("processCode", PROCESS_CODE);
|
|
|
|
|
+ body.put("formUuid", FORM_UUID);
|
|
|
|
|
+ body.put("formDataJson", JSON.toJSONString(formData));
|
|
|
|
|
+ body.put("executeExpression", true);
|
|
|
|
|
+ body.put("noExecuteExpression", false);
|
|
|
|
|
+ body.put("title", title);
|
|
|
|
|
+ body.put("dataTitle", title);
|
|
|
|
|
+
|
|
|
|
|
+ LOGGER.info("Yida process start request formName={} body={}", FORM_NAME, JSON.toJSONString(maskSensitive(body)));
|
|
|
|
|
+ try {
|
|
|
|
|
+ return extractProcessInstanceId(yidaProcessOpenApiClient.startProcess(body));
|
|
|
|
|
+ } catch (McException exception) {
|
|
|
|
|
+ throw exception;
|
|
|
|
|
+ } catch (Exception exception) {
|
|
|
|
|
+ throw new McException("DINGTALK_YIDA_ERROR", "Yida process start failed: " + rootMessage(exception));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Map<String, Object> toYidaFormData(ErpYidaPushRequest request,
|
|
|
|
|
+ Map<String, Object> mainData,
|
|
|
|
|
+ String operatorUserId) {
|
|
|
|
|
+ List<Map<String, Object>> detailRows = toMapRows(objectToMap(request.getDetailData()).get("detailData1"));
|
|
|
|
|
+ Object changeSequence = firstNonBlank(mainData.get("sfka900"), firstValue(detailRows, "sfkg900"));
|
|
|
|
|
+ Object company = toCompanyName(firstNonBlank(mainData.get("gs"), mainData.get("sfkaent")));
|
|
|
|
|
+ String workOrderNo = toText(mainData.get("sfkadocno"));
|
|
|
|
|
+ String title = workOrderNo == null ? null : FORM_NAME + "-" + workOrderNo;
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> formData = new LinkedHashMap<String, Object>();
|
|
|
|
|
+ putIfNotBlank(formData, TITLE_FIELD_ID, title);
|
|
|
|
|
+ putIfNotBlank(formData, APPLICANT_FIELD_ID, Collections.singletonList(operatorUserId));
|
|
|
|
|
+ putIfNotBlank(formData, COMPANY_TEXT_FIELD_ID, company);
|
|
|
|
|
+ putIfNotBlank(formData, COMPANY_SELECT_FIELD_ID, company);
|
|
|
|
|
+ putIfNotBlank(formData, DEPARTMENT_FIELD_ID, toStringList(mainData.get("bm")));
|
|
|
|
|
+ putIfNotBlank(formData, APPLY_DATE_FIELD_ID, toDateMillis(firstNonBlank(mainData.get("rq"), mainData.get("sfka902"))));
|
|
|
|
|
+ putIfNotBlank(formData, FORM_TITLE_FIELD_ID, title);
|
|
|
|
|
+ putIfNotBlank(formData, WORK_ORDER_NO_FIELD_ID, workOrderNo);
|
|
|
|
|
+ putIfNotBlank(formData, CHANGE_SEQUENCE_FIELD_ID, changeSequence);
|
|
|
|
|
+ putIfNotBlank(formData, CHANGE_DATE_FIELD_ID, toDateMillis(mainData.get("sfka902")));
|
|
|
|
|
+ putIfNotBlank(formData, WORK_ORDER_TYPE_FIELD_ID, mainData.get("sfka057"));
|
|
|
|
|
+ putIfNotBlank(formData, PRODUCTION_ITEM_FIELD_ID, mainData.get("sfka010"));
|
|
|
|
|
+ putIfNotBlank(formData, ITEM_NAME_FIELD_ID, mainData.get("imaal003"));
|
|
|
|
|
+ putIfNotBlank(formData, PRODUCTION_QUANTITY_FIELD_ID, toDecimal(mainData.get("sfka012")));
|
|
|
|
|
+ putIfNotBlank(formData, SPECIFICATION_FIELD_ID, mainData.get("imaal004"));
|
|
|
|
|
+ putIfNotBlank(formData, SOURCE_DOCUMENT_FIELD_ID, mainData.get("sfka006"));
|
|
|
|
|
+ putIfNotBlank(formData, PRODUCTION_ORDER_FIELD_ID, mainData.get("sfkaud009"));
|
|
|
|
|
+ putIfNotBlank(formData, CHANGE_REMARK_FIELD_ID, mainData.get("sfka906"));
|
|
|
|
|
+ putIfNotBlank(formData, SALES_PERSON_FIELD_ID, Collections.singletonList(operatorUserId));
|
|
|
|
|
+ putIfNotBlank(formData, T100_ID_FIELD_ID, mainData.get("t100id"));
|
|
|
|
|
+ putIfNotBlank(formData, ENTERPRISE_FIELD_ID, mainData.get("sfkaent"));
|
|
|
|
|
+ putIfNotBlank(formData, CALLBACK_CHANGE_SEQUENCE_FIELD_ID, changeSequence);
|
|
|
|
|
+
|
|
|
|
|
+ List<Map<String, Object>> rows = toYidaDetailRows(detailRows);
|
|
|
|
|
+ if (!rows.isEmpty()) {
|
|
|
|
|
+ formData.put(DETAIL_TABLE_FIELD_ID, rows);
|
|
|
|
|
+ }
|
|
|
|
|
+ return formData;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private List<Map<String, Object>> toYidaDetailRows(List<Map<String, Object>> sourceRows) {
|
|
|
|
|
+ List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
|
|
|
|
|
+ for (Map<String, Object> source : sourceRows) {
|
|
|
|
|
+ Map<String, Object> row = new LinkedHashMap<String, Object>();
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_ENTERPRISE_FIELD_ID, source.get("sfkgent"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_WORK_ORDER_FIELD_ID, source.get("sfkgdocno"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_SEQUENCE_FIELD_ID, source.get("sfkgseq"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_CHANGE_TYPE_FIELD_ID, source.get("sfkg901"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_ISSUE_ITEM_FIELD_ID, source.get("sfkg006"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_ITEM_NAME_FIELD_ID, source.get("imaal003"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_SPECIFICATION_FIELD_ID, source.get("imaal004"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_REQUIRED_QUANTITY_FIELD_ID, toDecimal(source.get("sfkg013")));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_UNIT_FIELD_ID, source.get("sfkg014"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_PREVIOUS_ITEM_FIELD_ID, source.get("sfba006"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_PREVIOUS_ITEM_NAME_FIELD_ID, source.get("o_imaal003"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_PREVIOUS_SPECIFICATION_FIELD_ID, source.get("o_imaal004"));
|
|
|
|
|
+ putIfNotBlank(row, DETAIL_PREVIOUS_QUANTITY_FIELD_ID, toDecimal(source.get("sfba013")));
|
|
|
|
|
+ if (!row.isEmpty()) {
|
|
|
|
|
+ rows.add(row);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return rows;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String resolveOperatorUserId(ErpYidaPushRequest request, Map<String, Object> mainData) {
|
|
|
|
|
+ return toText(firstNonBlank(request.getOriginatorUserId(), mainData.get("ooagud004")));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Map<String, Object> toMainDataMap(ErpYidaPushMainData mainData) {
|
|
|
|
|
+ if (mainData == null) {
|
|
|
|
|
+ return Collections.emptyMap();
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<String, Object> result = new LinkedHashMap<String, Object>();
|
|
|
|
|
+ putIfNotBlank(result, "rq", mainData.getRq());
|
|
|
|
|
+ putIfNotBlank(result, "bm", mainData.getBm());
|
|
|
|
|
+ putIfNotBlank(result, "tjr", mainData.getTjr());
|
|
|
|
|
+ putIfNotBlank(result, "gs", mainData.getGs());
|
|
|
|
|
+ putIfNotBlank(result, "t100id", mainData.getT100id());
|
|
|
|
|
+ putIfNotBlank(result, "ent", mainData.getEnt());
|
|
|
|
|
+ putIfNotBlank(result, "t100bm", mainData.getT100bm());
|
|
|
|
|
+ result.putAll(mainData.getExtraFields());
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Map<String, Object> objectToMap(Object value) {
|
|
|
|
|
+ if (value instanceof Map) {
|
|
|
|
|
+ Map<String, Object> result = new LinkedHashMap<String, Object>();
|
|
|
|
|
+ for (Map.Entry<?, ?> entry : ((Map<?, ?>) value).entrySet()) {
|
|
|
|
|
+ if (entry.getKey() != null) {
|
|
|
|
|
+ result.put(String.valueOf(entry.getKey()), entry.getValue());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+ return Collections.emptyMap();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private List<Map<String, Object>> toMapRows(Object value) {
|
|
|
|
|
+ List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
|
|
|
|
|
+ if (!(value instanceof Iterable)) {
|
|
|
|
|
+ return rows;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (Object item : (Iterable<?>) value) {
|
|
|
|
|
+ Map<String, Object> row = objectToMap(item);
|
|
|
|
|
+ if (!row.isEmpty()) {
|
|
|
|
|
+ rows.add(row);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return rows;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Object firstValue(List<Map<String, Object>> rows, String key) {
|
|
|
|
|
+ for (Map<String, Object> row : rows) {
|
|
|
|
|
+ if (!isBlank(row.get(key))) {
|
|
|
|
|
+ return row.get(key);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Object firstNonBlank(Object first, Object second) {
|
|
|
|
|
+ return isBlank(first) ? second : first;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private List<String> toStringList(Object value) {
|
|
|
|
|
+ if (isBlank(value)) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (value instanceof Iterable) {
|
|
|
|
|
+ List<String> values = new ArrayList<String>();
|
|
|
|
|
+ for (Object item : (Iterable<?>) value) {
|
|
|
|
|
+ if (!isBlank(item)) {
|
|
|
|
|
+ values.add(String.valueOf(item).trim());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return values;
|
|
|
|
|
+ }
|
|
|
|
|
+ return Collections.singletonList(String.valueOf(value).trim());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String toCompanyName(Object value) {
|
|
|
|
|
+ String text = toText(value);
|
|
|
|
|
+ if (text == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ("87".equals(text) || "ML".equalsIgnoreCase(text) || "zh_CN".equalsIgnoreCase(text)) {
|
|
|
|
|
+ return "\u660e\u78ca";
|
|
|
|
|
+ }
|
|
|
|
|
+ if ("VN".equalsIgnoreCase(text) || "vi_VN".equalsIgnoreCase(text)) {
|
|
|
|
|
+ return "\u8d8a\u5357";
|
|
|
|
|
+ }
|
|
|
|
|
+ return text;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Long toDateMillis(Object value) {
|
|
|
|
|
+ String text = toText(value);
|
|
|
|
|
+ if (text == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (text.matches("\\d+")) {
|
|
|
|
|
+ return Long.valueOf(text);
|
|
|
|
|
+ }
|
|
|
|
|
+ return LocalDate.parse(text.replace('/', '-')).atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private BigDecimal toDecimal(Object value) {
|
|
|
|
|
+ String text = toText(value);
|
|
|
|
|
+ return text == null ? null : new BigDecimal(text);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String toText(Object value) {
|
|
|
|
|
+ return isBlank(value) ? null : String.valueOf(value).trim();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private boolean isBlank(Object value) {
|
|
|
|
|
+ if (value == null) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (value instanceof Iterable) {
|
|
|
|
|
+ return !((Iterable<?>) value).iterator().hasNext();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (value instanceof Map) {
|
|
|
|
|
+ return ((Map<?, ?>) value).isEmpty();
|
|
|
|
|
+ }
|
|
|
|
|
+ return String.valueOf(value).trim().isEmpty();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String extractProcessInstanceId(DDR_New response) {
|
|
|
|
|
+ if (response == null) {
|
|
|
|
|
+ throw new McException("YIDA_NULL_RESPONSE", "Yida process start failed: empty response");
|
|
|
|
|
+ }
|
|
|
|
|
+ Object result = firstNonBlank(firstNonBlank(response.getResult(), response.getInstanceId()), response.getFormInstId());
|
|
|
|
|
+ if (!isBlank(result)) {
|
|
|
|
|
+ return String.valueOf(result);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (response.isSuccess()) {
|
|
|
|
|
+ return "SUCCESS";
|
|
|
|
|
+ }
|
|
|
|
|
+ throw new McException(defaultText(response.getCode(), "YIDA_ERROR"),
|
|
|
|
|
+ "Yida process start failed: " + defaultText(response.getMessage(), "no process instance id"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Map<String, Object> maskSensitive(Map<String, Object> source) {
|
|
|
|
|
+ Map<String, Object> body = new LinkedHashMap<String, Object>(source);
|
|
|
|
|
+ body.put("systemToken", "******");
|
|
|
|
|
+ return body;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String rootMessage(Throwable exception) {
|
|
|
|
|
+ Throwable current = exception;
|
|
|
|
|
+ while (current.getCause() != null && current.getCause() != current) {
|
|
|
|
|
+ current = current.getCause();
|
|
|
|
|
+ }
|
|
|
|
|
+ return defaultText(current.getMessage(), current.getClass().getSimpleName());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String defaultText(String value, String fallback) {
|
|
|
|
|
+ return value == null || value.trim().isEmpty() ? fallback : value.trim();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String requireText(String value, String message) {
|
|
|
|
|
+ if (value == null || value.trim().isEmpty()) {
|
|
|
|
|
+ throw new IllegalArgumentException(message);
|
|
|
|
|
+ }
|
|
|
|
|
+ return value.trim();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void putIfNotBlank(Map<String, Object> target, String key, Object value) {
|
|
|
|
|
+ if (!isBlank(value)) {
|
|
|
|
|
+ target.put(key, value);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void validateConfiguration() {
|
|
|
|
|
+ requireText(dingTalkConfiguration.getAppKey(), "DINGTALK_APP_KEY is not configured");
|
|
|
|
|
+ requireText(dingTalkConfiguration.getAppSecret(), "DINGTALK_APP_SECRET is not configured");
|
|
|
|
|
+ requireText(applications.getCoordinationOffice().getAppType(), "YIDA_COORDINATION_OFFICE_APP_TYPE is not configured");
|
|
|
|
|
+ requireText(applications.getCoordinationOffice().getSystemToken(), "YIDA_COORDINATION_OFFICE_SYSTEM_TOKEN is not configured");
|
|
|
|
|
+ }
|
|
|
|
|
+}
|