编写示例代码

This commit is contained in:
2025-12-07 17:44:31 +08:00
parent e28496a745
commit 21eb9f3627
3 changed files with 322 additions and 2 deletions

View File

@@ -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<String,Object> mainFormData = (Map<String, Object>) source.get("主表数据");
mainFormData.get("json映射配置中字段对照键值对的值,如: 身份证号");
//获取明细表数据
List<Map<String,Object>> subFormDatas = (List<Map<String,Object>>) source.get("从表数据");
//遍历每一个明细表
for (Map<String, Object> subFormData : subFormDatas) {
List<Map<String,Object>> subTableDatas = (List<Map<String, Object>>) subFormData.get("subTable1"); //获取某个明细表的多行数据
//对多列数据进行遍历
for (Map<String, Object> 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<String, Object> 类型的键值对key为主数据表单显示名称
List<ValueExport> valueExport = formExportUtil.setFormValue(mainFormData);
formExport.setValues(valueExport);
//设置明细表数据
formExport.setSubordinateForms(formExportUtil.setAllSubordinateFormValue(subFormDatas));
//从主表中获取显示名称与附件地址的键值对
Map<String, List<Object>> mainFormTableAttachments = formDataOperator.getMainFormTableAttachments(formCode,mainFormData);
//新增档案表数据
getFormFactory().importBusinessFormData(loginName, formCode,
formExport, new String[] {});
//处理附件思路就是先新增档案表记录然后想办法获取倒新增的记录的id然后根据id去更新附件引用
bindAttachmentInfo(mainFormTableAttachments,formCode,(String)source.get("泛微请求ID"));
//更新档案表单操作;
//实例化更新字段数组
List<FormUpdateField> 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<FormWhereCondition> whereClause = new ArrayList<>();
//对要匹配的字段赋值并加入到数组中
whereClause.add(FormWhereCondition.build().value(mainFormData.get("姓名")).display("姓名"));
//调用api方法进行更新操作
formDataOperator.updateMasterForm(formCode, updateFields, whereClause);
//如果明细表需要插入什么数据的话
//获取第一个明细表的数据
Map<String, Object> subDataMap = subFormDatas.get(0);
//获取到明细表表名
String subTableName = subDataMap.keySet().iterator().next();
//查询主表记录获取ID
List<FormColumn> formColumns = formDataOperator.queryFormDataCondition(formCode, null, whereClause);
if(formColumns != null && formColumns.size() > 0) {
formDataOperator.addSubTableRecord(subTableName,(List<Object>)subDataMap.get(subTableName),formCode,formColumns.get(0).getId());
}
//关于档案表再新增时要判断数据是否存在的示例
//先根据身份证号查询是否已有
List<FormWhereCondition> condiitonVo = new ArrayList<>();
//构建查询条件
condiitonVo.add(FormWhereCondition.build().display("身份证号码").value(mainFormData.get("身份证号码")));
mainFormData.put("员工状态","试用");
//转换主表
formDataOperator.handleEnumDeptEtc(mainFormData,formCode);
//转换明细表的枚举
for (Map<String, Object> subFormData : subFormDatas) {
formDataOperator.handleSubTableEnumDeptEtc(subFormData,formCode);
}
//查询
List<FormColumn> formColumns2 = formDataOperator.queryFormDataCondition(formCode, null,condiitonVo);
//如果已存在记录则进行更新
if(formColumns2 != null && formColumns2.size() > 0) {
List<FormUpdateField> 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<Object> attachments = (List<Object>) 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<FormWhereCondition> whereClause3 = new ArrayList<>();
whereClause3.add(FormWhereCondition.build().display("ID").value(Long.parseLong(formId)));
//更新操作
formDataOperator.updateMasterForm(formCode,updateFields2,whereClause3);
//追加从表数据(如在人员档案明细表中追加记录)
Map<String, Object> subDataMap3 = subFormDatas.get(0);
String subTableName3 = subDataMap3.keySet().iterator().next();
if(formColumns != null) {
formDataOperator.addSubTableRecord(subTableName3,(List<Object>)subDataMap3.get(subTableName),formCode,formId);
}
}
}
@Override
protected Map buildParamsMap(Map source) throws BusinessException {
Map<String,String> resMap = getReceiveFVFlowDao().getTemplateJsonByFormCode(getFormCode()); //拿客户服务平台表名去查询字段映射json配置
Map<String,Object> templateMap = JSONObject.parseObject(resMap.get("templateJson"),Map.class); //通过json配置格式化入参
Map<String,Object> 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<String, List<Object>> mainFormTableAttachments,String formNo,String requestId) {
FormDataOperator formDataOperator = new FormDataOperator();
List<FormWhereCondition> condiitonVo = new ArrayList<>();
List<FormUpdateField> updateFields = new ArrayList<>();
//根据之前设置的冗余值来查询新增后的记录
condiitonVo.add(FormWhereCondition.build().display("泛微请求ID").value(requestId));
try {
List<FormColumn> 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<Object> 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<FormWhereCondition> 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);
}
}
}

View File

@@ -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");

View File

@@ -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<FormUpdateField> updateFieldVos, List<FormWhereCondition> 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<FormColumn> queryFormDataCondition(String formNo, List<String> queryColumnVos, List<FormWhereCondition> 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<Object> 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<Object> 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<String,Object> 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<String,Object> 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 {