package com.kingdee.eas.custom.esign.service; import com.alibaba.fastjson.JSONObject; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.bos.bsf.service.app.IHRMsfService; import com.kingdee.bos.metadata.access.Simple; import com.kingdee.bos.metadata.entity.EntityViewInfo; import com.kingdee.bos.metadata.entity.FilterInfo; import com.kingdee.bos.metadata.entity.FilterItemInfo; import com.kingdee.bos.metadata.entity.SelectorItemCollection; import com.kingdee.bos.metadata.query.util.CompareType; import com.kingdee.bos.sql.ParserException; import com.kingdee.bos.util.BOSUuid; import com.kingdee.eas.common.EASBizException; import com.kingdee.eas.custom.dataconfig.utils.SqlUtils; import com.kingdee.eas.custom.entryconfig.DataConfigInfo; import com.kingdee.eas.custom.entryconfig.DataConfigSelectFieldEntryCollection; import com.kingdee.eas.custom.entryconfig.DataConfigSelectFieldEntryInfo; import com.kingdee.eas.custom.esign.*; import com.kingdee.eas.custom.esign.bizEnum.ComponentTypeEnum; import com.kingdee.eas.custom.esign.utils.ESignFieldMappingUtils; import com.kingdee.eas.fi.arap.util.DBUtil; import com.kingdee.jdbc.rowset.IRowSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Map; import java.util.logging.SimpleFormatter; /** * 获取电子签配置数据的服务类 * 实现IHRMsfService接口,用于处理电子签配置数据的查询与封装 */ public class GetESignConfigDataService implements IHRMsfService { /** * 处理请求的核心方法 * @param context 上下文对象,包含环境信息 * @param map 参数映射,包含请求的参数 * @return 处理后的电子签配置数据,以JSONObject形式返回 * @throws EASBizException EAS业务异常 * @throws BOSException BOS框架异常 */ @Override public Object process(Context context, Map map) throws EASBizException, BOSException { // 从参数映射中获取"number"参数值,用于定位配置信息 Object o = map.get("number"); // 从参数映射中获取"filter"参数值,用于构建查询过滤条件 Object o1 = map.get("filter"); // 若"number"参数为null,返回空字符串(无效请求) if(o==null){ return ""; } // 将"number"参数转换为字符串类型 String number = o.toString(); // 将"filter"参数转换为字符串类型(若为null则转换为"null"字符串) String filter = o1.toString(); // 声明实体视图信息对象,用于查询时的字段映射配置 EntityViewInfo entityViewInfo= null; try { // 调用方法获取实体视图信息,该视图包含查询所需的字段映射配置 entityViewInfo = this.getEntityViewInfo(number); } catch (ParserException e) { // 解析异常时,封装为运行时异常抛出 throw new RuntimeException(e); } // 通过字段映射工厂,根据实体视图信息查询对应的字段映射集合 FieldMappingCollection fieldMappingCollection = FieldMappingFactory. getLocalInstance(context).getFieldMappingCollection(entityViewInfo); // 创建SQL工具类实例,用于SQL语句的构建辅助 SqlUtils sqlUtils = new SqlUtils(); // 创建电子签字段映射工具类实例,用于字段映射的核心处理 ESignFieldMappingUtils utils = new ESignFieldMappingUtils(); // 获取字段映射集合中的第一个映射信息(默认取第一个配置项) FieldMappingInfo fieldMappingInfo = fieldMappingCollection.get(0); // 获取当前字段映射信息中的明细项集合(包含具体的字段映射关系) FieldMappingEntryCollection entrys = fieldMappingInfo.getEntrys(); // 获取当前字段映射信息对应的数据源配置 DataConfigInfo dataSource = fieldMappingInfo.getDataSource(); // 验证数据源配置是否有效(非空且编号存在) if (dataSource!=null&&dataSource.getNumber()!=null&&!dataSource.getNumber().equals("")){ // 通过工具类从字段映射明细中获取电子签SQL所需的字段集合 DataConfigSelectFieldEntryCollection eSignSqlField = utils.getESignSqlField(entrys); // 创建字符串构建器,用于拼接SQL查询的字段部分 StringBuilder sqlField = new StringBuilder(); // 调用SQL工具类,将电子签字段集合拼接为SQL的SELECT子句 sqlUtils.getSelectField(eSignSqlField, sqlField); // 获取数据源配置的编号 String number1 = dataSource.getNumber(); // 获取当前字段映射信息对应的电子签模板信息 ESignTemplateInfo eSignFile = fieldMappingInfo.getESignFile(); if(sqlField.toString().equals("")){ JSONObject jsonObject = this.reassembleData(eSignFile, context); return jsonObject; } // 通过工具类根据数据源编号和上下文获取电子签基础查询SQL String eSignSql = utils.getESignSql(number1, context); // 替换SQL中的{{filed}}占位符为实际拼接的查询字段 eSignSql = eSignSql.replace("{{filed}}",sqlField.toString()); // 在SQL末尾添加过滤条件(换行分隔,便于阅读) eSignSql += "\n"+filter; // 执行SQL查询并将结果封装为JSON对象(包含字段映射关系) JSONObject data = this.getData(eSignSql, context, entrys); // 重新组装电子签模板数据为JSON对象 JSONObject jsonObject = this.reassembleData(eSignFile, context); // 合并查询数据与模板数据,返回合并后的JSON对象 JSONObject newJSONObject = utils.mergeAgreements(data, jsonObject); return newJSONObject; }else { // 若数据源无效,直接获取电子签模板信息 ESignTemplateInfo eSignFile = fieldMappingInfo.getESignFile(); // 重新组装模板数据并返回 JSONObject jsonObject = this.reassembleData(eSignFile, context); return jsonObject; } } /** * 执行SQL查询并将结果封装为JSON对象 * @param sql 要执行的查询SQL * @param context 上下文对象 * @param entrys 字段映射明细集合 * @return 封装后的JSON对象,包含电子签模板各字段信息 */ public JSONObject getData(String sql,Context context,FieldMappingEntryCollection entrys){ // 创建JSON对象用于存储最终封装的数据 JSONObject jsonObject = new JSONObject(); try { // 执行SQL查询,获取结果集 IRowSet iRowSet1 = DBUtil.executeQuery(context, sql); // 遍历结果集中的每一行数据 while (iRowSet1.next()){ // 遍历每个字段映射明细项 for (int i = 0; i