diff --git a/secondev-ht-njwebservice/src/main/java/com/weaver/seconddev/njwebservice/entity/DataOptions.java b/secondev-ht-njwebservice/src/main/java/com/weaver/seconddev/njwebservice/entity/DataOptions.java index b962982..84cdb9c 100644 --- a/secondev-ht-njwebservice/src/main/java/com/weaver/seconddev/njwebservice/entity/DataOptions.java +++ b/secondev-ht-njwebservice/src/main/java/com/weaver/seconddev/njwebservice/entity/DataOptions.java @@ -32,13 +32,4 @@ public class DataOptions { private Boolean matchByName; - - - - - - - - - } diff --git a/secondev-hx-webservice/src/main/java/com/weaver/seconddev/entity/DataOptions.java b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/entity/DataOptions.java new file mode 100644 index 0000000..415a7d8 --- /dev/null +++ b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/entity/DataOptions.java @@ -0,0 +1,35 @@ +package com.weaver.seconddev.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: calyrex + * @CreateTime: 2025-04-25 + * @Description: + */ + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DataOptions { + + + private String optionId; + + private Long dataKey; + + private String content; + + /** + * 选项类型 + */ + private String type; + + private Boolean matchByName; + + +} \ No newline at end of file diff --git a/secondev-hx-webservice/src/main/java/com/weaver/seconddev/entity/FormDataDuty.java b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/entity/FormDataDuty.java new file mode 100644 index 0000000..0236164 --- /dev/null +++ b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/entity/FormDataDuty.java @@ -0,0 +1,59 @@ +package com.weaver.seconddev.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @Author: calyrex + * @CreateTime: 2025-04-25 + * @Description: + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FormDataDuty { + + private Long fieldId; + + private String dataKey; + + /** + * 字段内容(单行文本、多行文本等) + */ + private String content; + + private List dataOptions; + + /** + * 明细表ID,当传递明细数据且字段传递的dataKey则该值必填 + */ + private Long subFormId; + + /** + * 明细行序号(主表字段该值不用传递)。1:就代表是明细行第一行。 + */ + private Long dataIndex; + + /** + * 普通字段类型1 + */ + private int fieldType; + + @Override + public String toString() { + return "FormDataDuty{" + + "fieldId=" + fieldId + + ", dataKey='" + dataKey + '\'' + + ", content='" + content + '\'' + + ", dataOptions=" + dataOptions + + ", subFormId=" + subFormId + + ", dataIndex=" + dataIndex + + '}'; + } +} + diff --git a/secondev-hx-webservice/src/main/java/com/weaver/seconddev/util/DataOperateUtil.java b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/util/DataOperateUtil.java new file mode 100644 index 0000000..ec8bc25 --- /dev/null +++ b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/util/DataOperateUtil.java @@ -0,0 +1,186 @@ +package com.weaver.seconddev.util; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.weaver.common.hrm.util.Util; +import com.weaver.common.i18n.tool.util.I18nContextUtil; +import com.weaver.ebuilder.datasource.api.entity.ExecuteSqlEntity; +import com.weaver.ebuilder.datasource.api.enums.SourceType; +import com.weaver.ebuilder.datasource.api.service.DataSetService; +import com.weaver.framework.rpc.context.impl.TenantRpcContext; +import com.weaver.seconddev.entity.DataOptions; +import com.weaver.seconddev.entity.FormDataDuty; +import com.weaver.verupgrade.conn.RecordSet; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Author: calyrex + * @CreateTime: 2025-04-25 + * @Description: 数据操作工具 + */ + +@Component +@Slf4j +public class DataOperateUtil { + + @Autowired + private DataSetService dataSetService; + + public List getDetailFormId(String workflowId) { + log.error("getDetailFormId start : " + workflowId ); + List formIdList = new ArrayList(); + String sourceType = String.valueOf(SourceType.LOGIC); + String groupId = "weaver-basic-schedule-service"; + try { + String sql = "select form_id from ecology10.dbo.form_table where form_id in (select id from e10_core_business.dbo.sub_form where form_id in (select relatekey from e10_core_business.dbo.wfp_relateform where workflowid = '"+workflowId+"'))"; + log.info("getConfig sql-->" + sql); + Map datas = executeForQuery(sourceType, groupId, sql); +// log.info("getConfig datas-->" + datas); + if(String.valueOf(datas.get("status")).equals("OK")){ + List> records = (List>)datas.get("records"); + for (int i = 0; i < records.size(); i++) { + Map map = records.get(i); + String formId = map.get("form_id").toString(); + formIdList.add(Long.valueOf(formId)); + } + return formIdList; + }else { + log.error("getConfig status-->"+ datas.get("status")); + return formIdList; + } + }catch (Exception e){ + log.error("getConfig e--> ",e); + return formIdList; + } + } + + public String getConfig(String key,String tenantKey){ + String sourceType = String.valueOf(SourceType.LOGIC); + String groupId = "weaver-basic-schedule-service"; + try { + String sql = "select configvalue from ecology10.dbo.uf_config where configkey = '" + key + "' and zhkey = '"+tenantKey+"'"; + log.info("getConfig sql-->" + sql); + Map datas = executeForQuery(sourceType, groupId, sql); +// log.info("getConfig datas-->" + datas); + if(String.valueOf(datas.get("status")).equals("OK")){ + List> records = (List>)datas.get("records"); + Map map = records.get(0); + return map.get("config_value").toString(); + }else { + log.error("getConfig status-->"+ datas.get("status")); + return ""; + } + }catch (Exception e){ + log.error("getConfig e--> ",e); + return ""; + } + } + public Map executeForQuery(String sourceType, String groupId, String sql) { +// log.info("executeForQuery sourceType-->" + sourceType + ",groupId-->" + groupId + ",sql-->" + sql); + TenantRpcContext.setTargetTenantKey("temkc46eme"); + ExecuteSqlEntity executeSqlEntity = new ExecuteSqlEntity(); + executeSqlEntity.setSql(cn.hutool.core.codec.Base64.encode(sql)); + executeSqlEntity.setGroupId(groupId); //groupid,可以访问 E10地址/api/datasource/ds/group?sourceType=LOGIC 获取 + executeSqlEntity.setSourceType(SourceType.valueOf(sourceType)); +// log.info("executeForQuery executeSqlEntity-->"+executeSqlEntity.getSql()+"-->"+executeSqlEntity.getGroupId()+"-->"+executeSqlEntity.getSourceType()); + Map datas = dataSetService.executeSql(executeSqlEntity); +// log.info("executeForQuery datas-->" + datas); + TenantRpcContext.removeTargetTenantKey(); + return datas; + } + + /** + * 表单字段构建 + * @return + */ + public static JSONObject getFromDataByDataDetails(List formDataDutyList) { + JSONObject formData = new JSONObject(); + formData.put("module","workflow"); + + JSONArray dataDetails = new JSONArray(); + formData.put("dataDetails", dataDetails); + + formDataDutyList.forEach(formDataDuty -> { + if (formDataDuty.getSubFormId() != null) { + //明细表 + if (formDataDuty.getDataOptions() == null) { + //普通字段 + JSONObject inputDataKey = new JSONObject(); + inputDataKey.put("dataKey", formDataDuty.getDataKey()); + inputDataKey.put("dataIndex", formDataDuty.getDataIndex()); + inputDataKey.put("content", formDataDuty.getContent()); + inputDataKey.put("subFormId", formDataDuty.getSubFormId()); + dataDetails.add(inputDataKey); + }else { + JSONObject details = new JSONObject(); + dataDetails.add(details); + + JSONArray dataOptions = new JSONArray(); + details.put("dataKey", formDataDuty.getDataKey()); + details.put("dataIndex", formDataDuty.getDataIndex()); + details.put("subFormId", formDataDuty.getSubFormId()); + + details.put("dataOptions", dataOptions); + List dataOptions1 = formDataDuty.getDataOptions(); + dataOptions1.forEach(e -> { + JSONObject option = new JSONObject(); + option.put("optionId", e.getOptionId()); + dataOptions.add(option); + }); + } + + }else { + //主表 + if (formDataDuty.getDataOptions() == null) { + //普通字段 + JSONObject inputDataKey = new JSONObject(); + inputDataKey.put("dataKey", formDataDuty.getDataKey()); + inputDataKey.put("content", formDataDuty.getContent()); + dataDetails.add(inputDataKey); + }else { + //浏览按钮字段 + // 浏览按钮 + JSONObject details = new JSONObject(); + dataDetails.add(details); + + JSONArray dataOptions = new JSONArray(); + details.put("dataKey", formDataDuty.getDataKey()); + details.put("dataOptions", dataOptions); + + List dataOptions1 = formDataDuty.getDataOptions(); + dataOptions1.forEach(e -> { + JSONObject option = new JSONObject(); + option.put("optionId", e.getOptionId()); + //fieldType 3为附件 + if (formDataDuty.getFieldType() == 3) { + option.put("content", e.getContent()); + } + dataOptions.add(option); + }); + + } + } + }); + + return formData; + } + + public static String null2String(String s){ + return s == null ? "" : s; + } + + public static String null2String(Object o){ + return o == null ? "" : o.toString(); + } + + public static String null2String(String s1,String s2){ + return s1 == null ? (s2 == null ? "" : s2) : s1; + } +} diff --git a/secondev-hx-webservice/src/main/java/com/weaver/seconddev/util/InterInfoAchieveUtil.java b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/util/InterInfoAchieveUtil.java new file mode 100644 index 0000000..bd9ed62 --- /dev/null +++ b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/util/InterInfoAchieveUtil.java @@ -0,0 +1,66 @@ +package com.weaver.seconddev.util; + +import cn.hutool.http.HttpRequest; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +/** + * @Author: calyrex + * @CreateTime: 2025-04-25 + * @Description: 接口信息获取工具 + */ + + +@Component +@Slf4j +public class InterInfoAchieveUtil { + + @Autowired + private DataOperateUtil dataOperateUtil; + + public String getCode(String tenantKey){ + try { + String corpid = dataOperateUtil.null2String(dataOperateUtil.getConfig("corpid",tenantKey)); + String response_type = "code"; + String state = "xxx"; + String url = dataOperateUtil.null2String(dataOperateUtil.getConfig("oa_address",tenantKey)) + "/papi/openapi/oauth2/authorize?corpid=" + + corpid + "&response_type=" + response_type + "&state=" + state; + String body = HttpRequest.get(url).execute().body(); +// log.info("getCode body-->" + body); + return body; + }catch (Exception e){ + log.error("getCode error--> " + e); + return ""; + } + } + + public String getToken(String code,String tenantKey) throws IOException { + String app_key = dataOperateUtil.null2String(dataOperateUtil.getConfig("app_key",tenantKey)); + String app_secret = dataOperateUtil.null2String(dataOperateUtil.getConfig("app_secret",tenantKey)); + String grant_type = "authorization_code"; +// JSONObject params = new JSONObject(); +// params.put("app_key",app_key); +// params.put("app_secret",app_secret); +// params.put("grant_type",grant_type); +// params.put("code",code); + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); + String params = "app_key="+app_key+"&app_secret="+app_secret+"&grant_type="+grant_type+"&code="+code; + String url = dataOperateUtil.null2String(dataOperateUtil.getConfig("oa_address",tenantKey)) + "/papi/openapi/oauth2/access_token"; +// log.info("getToken params-->" + params); + RequestBody body = RequestBody.create(mediaType, params); + Request request = new Request.Builder() + .url(url) + .method("POST", body) + .addHeader("Content-Type", "application/x-www-form-urlencoded") + .build(); + Response response = client.newCall(request).execute(); + return response.body().string(); + } + +} diff --git a/secondev-hx-webservice/src/main/java/com/weaver/seconddev/webservice/DemoService.java b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/webservice/DemoService.java deleted file mode 100644 index 8a4f2cb..0000000 --- a/secondev-hx-webservice/src/main/java/com/weaver/seconddev/webservice/DemoService.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.weaver.seconddev.webservice; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.weaver.verupgrade.workflow.workflow.WorkflowAllComInfo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service("demoService") -public class DemoService { - private final static Logger log = LoggerFactory.getLogger(DemoService.class); - - - @Autowired - private WorkflowAllComInfo workflowAllComInfo; - - public String demo(String detailTables){ - log.error("DemoService start"); - String workcodeId = "100003460000005676"; - - String detailTable = detailTables; - log.error("detailTable" + detailTables); - - log.error("DemoService end"); - return detailTable; - } -} \ No newline at end of file diff --git a/secondev-hx-webservice/src/main/java/com/weaver/seconddev/webservice/DoCreateWorkflowService.java b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/webservice/DoCreateWorkflowService.java new file mode 100644 index 0000000..5a82d94 --- /dev/null +++ b/secondev-hx-webservice/src/main/java/com/weaver/seconddev/webservice/DoCreateWorkflowService.java @@ -0,0 +1,152 @@ +package com.weaver.seconddev.webservice; + +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONArray; +import com.weaver.common.hrm.util.StringUtils; +import com.weaver.seconddev.entity.FormDataDuty; +import com.weaver.seconddev.util.DataOperateUtil; +import com.weaver.seconddev.util.InterInfoAchieveUtil; +import com.weaver.teams.domain.user.SimpleEmployee; +import com.weaver.verupgrade.workflow.workflow.WorkflowAllComInfo; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Service("doCreateWorkflowService") +public class DoCreateWorkflowService { + private final static Logger log = LoggerFactory.getLogger(DoCreateWorkflowService.class); + + @Autowired + private DataOperateUtil dataOperateUtil; + + @Autowired + private InterInfoAchieveUtil interInfoAchieveUtil; + + @Autowired + private WorkflowAllComInfo workflowAllComInfo; + + public String doCreateWorkflowRequest(String creator,String tenantKey,String workflowId,String mainTable,String[] detailTables) throws IOException { + log.info("DoCreateWorkflowService start"); + List detailFormId = dataOperateUtil.getDetailFormId(workflowId); + JSONObject param = new JSONObject(); + param.put("userid", Long.valueOf(creator)); + param.put("workflowId", Long.valueOf(workflowId)); + log.info("主表数据:" + mainTable); + //主表数据 json {"sqr":"sqr1","date":"date1","hrm:zrr":"zrr1"} + //字段名前面加 hrm:表示是人力资源字段 + if (mainTable == null || mainTable.equals("")) { + return "主表数据不能为空"; + } + + JSONObject jsonObject = JSONObject.parseObject(mainTable); + Map mainMap = jsonObject.toJavaObject(Map.class); + log.error("主表集合:" + mainMap); + List formDataDutyList = new ArrayList(); + // 输出 Map 的内容 + for (Map.Entry entry : mainMap.entrySet()) { + FormDataDuty formDataDuty = FormDataDuty.builder().build(); + String key = entry.getKey(); + Object value = entry.getValue(); + formDataDuty.setFieldType(1); + formDataDuty.setDataKey(key); + formDataDuty.setContent(String.valueOf(value)); + formDataDutyList.add(formDataDuty); + } + if(detailTables==null){ + + }else{ +// log.error("处理明细数据"); + if(detailTables.length>0){ + // 遍历外部 JSONArray + for (int i = 0; i < detailTables.length; i++) { + JSONArray innerArray = JSONArray.parseArray(detailTables[i]); // 获取内部的 JSONArray + log.error("innerArray:"+innerArray); + + if(innerArray.size()>0){ + //判断明细表id是否存在 + if (detailFormId.size() < i+1) { + log.error("明细表"+(i+1)+"form_id未找到或不存在"); + return "明细表"+(i+1)+"form_id未找到或不存在"; + } + Long subFormId = detailFormId.get(i); + log.error("明细表"+(i+1)+"form_id"+subFormId); + + // 遍历内部 JSONArray + for (int j = 0; j < innerArray.size(); j++) { + com.alibaba.fastjson.JSONObject jsonDetail = innerArray.getJSONObject(j); + + // 遍历 JSONObject 的键值对 + for (String key : jsonDetail.keySet()) { + FormDataDuty formDataDuty = FormDataDuty.builder().build(); + String value = jsonDetail.getString(key); + if (!"".equals(key)) { +// log.error("明细表普通字段值:"+value); + if(StringUtils.isNotEmpty(value)){ + formDataDuty.setDataKey(key); + formDataDuty.setDataIndex((long) (j + 1)); + formDataDuty.setContent(value); + //目前写死 后续在找方法 + formDataDuty.setSubFormId(subFormId); + }else{ +// log.error("明细表普通字段值为空"); + } + formDataDutyList.add(formDataDuty); + } + + } + + } + } + + } + + log.error("formDataDutyList数据:"+formDataDutyList.size()+"-"+formDataDutyList); + } + } + + if(CollectionUtils.isNotEmpty(formDataDutyList)) { + JSONObject fromDataByDataDetails = dataOperateUtil.getFromDataByDataDetails(formDataDutyList); + param.put("formData", fromDataByDataDetails); + } + + String code = interInfoAchieveUtil.getCode(tenantKey); + String token = interInfoAchieveUtil.getToken(code,tenantKey); + String url = dataOperateUtil.null2String(dataOperateUtil.getConfig("oa_address",tenantKey)) + "/api/workflow/core/paService/v1/doCreateRequest?access_token=" + token; + log.error("url : " + url); + + JSONObject otherParams =new JSONObject(); + otherParams.put("isnextflow",1); + param.put("otherParams",otherParams); + + log.error("表单json:"+param.toJSONString()); + // 远程调用创建流程。 + String response = HttpUtil.post(url, param.toJSONString()); + log.error("自动创建流程结果:"+response); + JSONObject responseObj = JSONObject.parseObject(response); + Object message = responseObj.get("message"); + JSONObject messageObj = JSONObject.parseObject(message.toString()); + String errcode = messageObj.get("errcode").toString(); + + log.error("errcode:"+errcode); + if(StringUtils.isNotEmpty(errcode)){ + if(messageObj.get("errcode").toString().equals("0")){ + log.error("requestId:"+messageObj.get("requestId").toString()); + return Optional.ofNullable(messageObj.get("requestId")).map(Object::toString).orElse(""); + }else{ + log.error("errmsg:"+messageObj.get("errmsg").toString()); + return messageObj.get("errmsg").toString(); + } + }else{ + return "调用泛微流程创建接口失败"; + } + } +} \ No newline at end of file