From 21eb9f362753e7aa892d192dea2642fc149dfdf4 Mon Sep 17 00:00:00 2001 From: RuicyWu <1063154311@qq.com> Date: Sun, 7 Dec 2025 17:44:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E5=86=99=E7=A4=BA=E4=BE=8B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/BatchTransferDemoHandler.java | 272 ++++++++++++++++++ .../handler/FlowDataSyncHandler.java | 4 +- .../util/FormDataOperator.java | 48 +++- 3 files changed, 322 insertions(+), 2 deletions(-) create mode 100644 v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchTransferDemoHandler.java diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchTransferDemoHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchTransferDemoHandler.java new file mode 100644 index 0000000..28c2275 --- /dev/null +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/BatchTransferDemoHandler.java @@ -0,0 +1,272 @@ +package com.seeyon.apps.src_receiveFVFlow.handler; + +import com.alibaba.fastjson.JSONObject; +import com.seeyon.apps.src_receiveFVFlow.constans.ReceiveFVFlowConstans; +import com.seeyon.apps.src_receiveFVFlow.org.OrgManagerDirectFacade; +import com.seeyon.apps.src_receiveFVFlow.util.*; +import com.seeyon.cap4.form.api.FormApi4Cap4; +import com.seeyon.cap4.form.bean.FormBean; +import com.seeyon.cap4.form.bean.FormFieldBean; +import com.seeyon.cap4.form.bean.FormTableBean; +import com.seeyon.ctp.common.AppContext; +import com.seeyon.ctp.common.exceptions.BusinessException; +import com.seeyon.ctp.organization.bo.V3xOrgDepartment; +import com.seeyon.ctp.organization.bo.V3xOrgMember; +import com.seeyon.ctp.organization.bo.V3xOrgPrincipal; +import com.seeyon.ctp.organization.manager.OrgManager; +import com.seeyon.v3x.services.form.bean.FormExport; +import com.seeyon.v3x.services.form.bean.ValueExport; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BatchTransferDemoHandler extends FlowDataSyncHandler{ + + @Autowired + private OrgManager orgManager; //用于查询组织架构信息的api + @Autowired + private OrgManagerDirectFacade orgManagerDirect; //用于对组织架构信息进行crud的api + private String updateLoginName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateLoginName); + private String updateAccountName = configProvider.getBizConfigByKey(ReceiveFVFlowConstans.updateAccountName); + + @Override + public void process(Map source) throws Exception { + Map map = buildParamsMap(source); //获取格式化后的参数 + //具体要执行的逻辑 + //获取格式化后的主表入参 + Map mainFormData = (Map) source.get("主表数据"); + mainFormData.get("json映射配置中字段对照键值对的值,如: 身份证号"); + //获取明细表数据 + List> subFormDatas = (List>) source.get("从表数据"); + //遍历每一个明细表 + for (Map subFormData : subFormDatas) { + List> subTableDatas = (List>) subFormData.get("subTable1"); //获取某个明细表的多行数据 + //对多列数据进行遍历 + for (Map rowData : subTableDatas) { + //获取某一行的某哥字段的值 + rowData.get("json映射配置中从表映射配置键值对的值,如: 父母离职日期"); + } + } + + //新增组织架构账号信息,步骤为获取参数,构建V3xOrgMember,构建V3xOrgPrincipal对象并进行赋值,最后调用orgManagerDirect.addMember方法完成人员账号的添加 + //从主表中获取数据 + String uName = (String) mainFormData.get("姓名") ; + Long dept = getLong(mainFormData.get("部门")) ; + Long orgLevel = getLong(mainFormData.get("职务级别")); + Long unit = getLong(mainFormData.get("单位")); + Long post = getLong(mainFormData.get("岗位")); + String telNumber = (String)mainFormData.get("手机号"); + String loginAccount = (String)mainFormData.get("登录账号"); + String emNo = (String)mainFormData.get("员工编号"); + String pwd = (String)mainFormData.get("初始密码"); + //新建OA人员对象,根据登录名查询 + V3xOrgMember member = orgManager.getMemberByLoginName(loginAccount); + if(member != null){ + mainFormData.put("姓名",member.getId()); + log.warn("该人员账号已存在 :" + uName + "_" + telNumber); + return; + } + V3xOrgMember orgMember = new V3xOrgMember(); + orgMember.setState(1); + orgMember.setOrgLevelId(orgLevel); //设置职务级别 + orgMember.setOrgDepartmentId(dept); //设置部门 + orgMember.setName(uName); //设置姓名 + orgMember.setOrgPostId(post); //设置岗位 + orgMember.setIdIfNew(); //设置ID + orgMember.setEnabled(true); //设置是否启用 + orgMember.setTelNumber(telNumber); //设置手机号 + orgMember.setSortId(1L); //设置排序号 + orgMember.setCode(emNo); //设置员工编号 + orgMember.setIsValid(true); //设置是否有效 + orgMember.setOrgAccountId(unit); //设置单位 + V3xOrgPrincipal v3xOrgPrincipal = new V3xOrgPrincipal(); + v3xOrgPrincipal.setLoginName(loginAccount); //设置登录名 + v3xOrgPrincipal.setMemberId(orgMember.getId()); //设置人员ID + v3xOrgPrincipal.setPassword(pwd); //设置密码 + orgMember.setV3xOrgPrincipal(v3xOrgPrincipal); + orgManagerDirect.addMember(orgMember); + mainFormData.put("姓名",orgMember.getId()); //将人员ID作为入参向后传递 + + //以下是修改组织架构信息的示例,步骤为获取参数,然后根据人员ID去查询,查询到后进行赋值,最后调用 orgManagerDirect.updateMember进行更新 + String uid = (String) mainFormData.get("姓名"); //人员ID + Long dept2 = getLong(mainFormData.get("部门")) ; + Long orgLevel2 = getLong(mainFormData.get("职务级别")); + Long unit2 = getLong(mainFormData.get("单位")); + Long post2 = getLong(mainFormData.get("岗位")); + //根据人员ID获取账号信息 + V3xOrgMember member2 = orgManager.getMemberById(Long.parseLong(uid)); + if(member2 == null) { + throw new RuntimeException("组织架构人员信息不存在"); + } + member2.setOrgDepartmentId(dept); + if(orgLevel != null) { + member.setOrgLevelId(orgLevel); + } + member2.setOrgAccountId(unit); + member2.setOrgPostId(post); + orgManagerDirect.updateMember(member2); + + //进行表单操作的api + FormDataOperator formDataOperator = new FormDataOperator(); + //对某档案底表主表进行新增操作(客户服务平台主表数据对主数据表单主表数据) + String formCode = (String) source.get("formNo"); //获取表单编码 + String loginName = getConfigProvider().getBizConfigByKey(ReceiveFVFlowConstans.formDataLoginName); + //塞入一个冗余值为了之后处理附件 + mainFormData.put("泛微请求ID",source.get("泛微请求ID")); + //实例化FormExport对象 + FormExport formExport = new FormExport(); + //实例化 FormExportUtil对象 + FormExportUtil formExportUtil = new FormExportUtil(); + //设置主表数据,参数必须是Map 类型的键值对,key为主数据表单显示名称 + List valueExport = formExportUtil.setFormValue(mainFormData); + formExport.setValues(valueExport); + //设置明细表数据 + formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas)); + //从主表中获取显示名称与附件地址的键值对 + Map> mainFormTableAttachments = formDataOperator.getMainFormTableAttachments(formCode,mainFormData); + //新增档案表数据 + getFormFactory().importBusinessFormData(loginName, formCode, + formExport, new String[] {}); + //处理附件,思路就是先新增档案表记录,然后想办法获取倒新增的记录的id,然后根据id去更新附件引用 + bindAttachmentInfo(mainFormTableAttachments,formCode,(String)source.get("泛微请求ID")); + + //更新档案表单操作; + //实例化更新字段数组 + List updateFields = new ArrayList<>(); + //前置处理枚举值 + formDataOperator.handleEnumDeptEtc(mainFormData,formCode); + //对要更新的字段赋值并加入到数组中 + updateFields.add(FormUpdateField.build().value(mainFormData.get("部门")).display("部门")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("岗位")).display("岗位")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("单位")).display("单位")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("服务客户")).display("服务客户")); + updateFields.add(FormUpdateField.build().value(mainFormData.get("所属区域")).display("所属区域")); + if(mainFormData.get("职务级别") != null) { + updateFields.add(FormUpdateField.build().value(mainFormData.get("职务级别")).display("职务级别")); + } + //实例化条件匹配字段数组 + List whereClause = new ArrayList<>(); + //对要匹配的字段赋值并加入到数组中 + whereClause.add(FormWhereCondition.build().value(mainFormData.get("姓名")).display("姓名")); + //调用api方法进行更新操作 + formDataOperator.updateMasterForm(formCode, updateFields, whereClause); + //如果明细表需要插入什么数据的话 + //获取第一个明细表的数据 + Map subDataMap = subFormDatas.get(0); + //获取到明细表表名 + String subTableName = subDataMap.keySet().iterator().next(); + //查询主表记录获取ID + List formColumns = formDataOperator.queryFormDataCondition(formCode, null, whereClause); + if(formColumns != null && formColumns.size() > 0) { + formDataOperator.addSubTableRecord(subTableName,(List)subDataMap.get(subTableName),formCode,formColumns.get(0).getId()); + } + + + //关于档案表再新增时要判断数据是否存在的示例 + + //先根据身份证号查询是否已有 + List condiitonVo = new ArrayList<>(); + //构建查询条件 + condiitonVo.add(FormWhereCondition.build().display("身份证号码").value(mainFormData.get("身份证号码"))); + mainFormData.put("员工状态","试用"); + //转换主表 + formDataOperator.handleEnumDeptEtc(mainFormData,formCode); + //转换明细表的枚举 + for (Map subFormData : subFormDatas) { + formDataOperator.handleSubTableEnumDeptEtc(subFormData,formCode); + } + //查询 + List formColumns2 = formDataOperator.queryFormDataCondition(formCode, null,condiitonVo); + //如果已存在记录则进行更新 + if(formColumns2 != null && formColumns2.size() > 0) { + List updateFields2 = new ArrayList<>(); + FormColumn formColumn = formColumns2.get(0); + String formId = formColumn.getId(); + FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); + FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formCode); + FormTableBean masterTableBean = cap4FormBean.getMasterTableBean(); + mainFormData.put("业代人员岗位",null); + //对入参主表数据进行遍历并填入到更新字段数组中 + for (String key : mainFormData.keySet()) { + FormFieldBean beanByDisplay = masterTableBean.getFieldBeanByDisplay(key); + if(beanByDisplay == null) { + continue; + } + if(beanByDisplay.getInputType().equals("image") || beanByDisplay.getInputType().equals("attachment")) { + try { + List attachments = (List) mainFormData.get(key); + //处理附件操作 + String refId = FileUtils.uploadFilesToOA(attachments, formId, updateLoginName, updateAccountName); + if(refId == null) { + continue; + } + updateFields2.add(FormUpdateField.build().value(refId).display(key)); + } catch (Exception e) { + e.printStackTrace(); + log.error("写入附件信息失败,"+e.getMessage()); + } + }else { + updateFields2.add(FormUpdateField.build().value(mainFormData.get(key)).display(key)); + } + } + List whereClause3 = new ArrayList<>(); + whereClause3.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId))); + //更新操作 + formDataOperator.updateMasterForm(formCode,updateFields2,whereClause3); + //追加从表数据(如在人员档案明细表中追加记录) + Map subDataMap3 = subFormDatas.get(0); + String subTableName3 = subDataMap3.keySet().iterator().next(); + if(formColumns != null) { + formDataOperator.addSubTableRecord(subTableName3,(List)subDataMap3.get(subTableName),formCode,formId); + } + } + } + + @Override + protected Map buildParamsMap(Map source) throws BusinessException { + Map resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); //拿客户服务平台表名去查询字段映射json配置 + Map templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); //通过json配置格式化入参 + Map formatMap = WeaverJsonUtils.getDisplayMap(source,templateMap); + String formNo = resMap.get("formCode"); //要操纵的主数据表单的调单编码 + formatMap.put("formNo",formNo); + return formatMap; + } + + @Override + protected String getFormCode() { + return "要映射处理的客户服务平台数据库表名"; + } + + private void bindAttachmentInfo(Map> mainFormTableAttachments,String formNo,String requestId) { + FormDataOperator formDataOperator = new FormDataOperator(); + List condiitonVo = new ArrayList<>(); + List updateFields = new ArrayList<>(); + //根据之前设置的冗余值来查询新增后的记录 + condiitonVo.add(FormWhereCondition.build().display("泛微请求ID").value(requestId)); + try { + List formColumns = formDataOperator.queryFormDataCondition(formNo, null, condiitonVo); + if(formColumns == null || formColumns.size() == 0 ){ + throw new RuntimeException("未查询到员工档案记录"); + } + String formId = formColumns.get(0).getId(); + for (String fieldDisplay : mainFormTableAttachments.keySet()) { + List attachments = mainFormTableAttachments.get(fieldDisplay); + if(attachments == null || attachments.size() == 0) { + continue; + } + String refId = FileUtils.uploadFilesToOA(attachments,formId,updateLoginName,updateAccountName); + if(refId == null) { + continue; + } + updateFields.add(FormUpdateField.build().value(refId).display(fieldDisplay)); + } + List whereClause = new ArrayList<>(); + whereClause.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId))); + formDataOperator.updateMasterForm(formNo,updateFields,whereClause); + } catch (Exception e) { + log.error(e.getMessage(),e); + } + } +} diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java index bf5e410..6468a59 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/handler/FlowDataSyncHandler.java @@ -14,7 +14,9 @@ import java.util.Map; public abstract class FlowDataSyncHandler { protected Log log = Log.get(FlowDataSyncHandler.class); - public abstract boolean support(String flowName); + public boolean support(String flowName){ + return getFormCode().equals(flowName); + } public abstract void process(Map source) throws Exception; protected abstract Map buildParamsMap(Map source) throws BusinessException; protected RfvfPluginConfigProvider configProvider = (RfvfPluginConfigProvider) AppContext.getBean("rfvfPluginConfigProvider"); diff --git a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java index 686f9fb..dd9b590 100644 --- a/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java +++ b/v5/apps-customize/src/main/java/com/seeyon/apps/src_receiveFVFlow/util/FormDataOperator.java @@ -21,6 +21,13 @@ import java.util.stream.Collectors; public class FormDataOperator { + /** + * 更新主表数据 + * @param formNo 主表表单编码 + * @param updateFieldVos 要更新的字段数组 + * @param conditionVos 用于匹配的条件数组 + * @throws BusinessException + */ public void updateMasterForm(String formNo, List updateFieldVos, List conditionVos) throws BusinessException { FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); @@ -61,7 +68,14 @@ public class FormDataOperator { } } - + /** + * 根据条件查询主表数据 + * @param formNo 主表表单编码 + * @param queryColumnVos 查询要返回的字段数组 + * @param conditionVos 匹配条件数组 + * @return + * @throws Exception + */ public List queryFormDataCondition(String formNo, List queryColumnVos, List conditionVos) throws Exception { FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); @@ -245,6 +259,13 @@ public class FormDataOperator { return attachmentTempMap; } + /** + * 插入明细表数据 + * @param subTableName + * @param data + * @param formNo + * @param formId + */ public void addSubTableRecord(String subTableName,List data,String formNo,String formId) { JDBCAgent agent = new JDBCAgent(); try { @@ -279,6 +300,13 @@ public class FormDataOperator { } } + /** + * 清空旧的明细表数据并构建新的后插入 + * @param subTableName + * @param data + * @param formNo + * @param formId + */ public void rebuildSubTableRecord(String subTableName,List data,String formNo,String formId) { String deleteSql = "delete from " + subTableName + " where formmain_id = ? "; JDBCAgent agent = new JDBCAgent(); @@ -315,6 +343,12 @@ public class FormDataOperator { } } + /** + * 处理主表枚举类型的参数 + * @param map + * @param formNo + * @throws BusinessException + */ public void handleEnumDeptEtc(Map map,String formNo) throws BusinessException { FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); @@ -344,6 +378,12 @@ public class FormDataOperator { } } + /** + * 处理明细表枚举类型的参数 + * @param map + * @param formNo + * @throws BusinessException + */ public void handleSubTableEnumDeptEtc(Map map,String formNo) throws BusinessException { FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); FormBean cap4FormBean = formApi4Cap4.getFormByFormCode(formNo); @@ -385,6 +425,12 @@ public class FormDataOperator { } } + /** + * 是否是主表的文件 + * @param displayName + * @param formNo + * @return + */ public boolean isMasterTableFile(String displayName,String formNo) { FormApi4Cap4 formApi4Cap4 = (FormApi4Cap4) AppContext.getBean("formApi4Cap4"); try {