GetOrgInfoOsfService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. package com.kingdee.eas.custom.szpgm.osf.service;
  2. import com.kingdee.bos.BOSException;
  3. import com.kingdee.bos.Context;
  4. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  5. import com.kingdee.eas.common.EASBizException;
  6. import com.kingdee.eas.util.app.DbUtil;
  7. import com.kingdee.jdbc.rowset.IRowSet;
  8. import org.apache.commons.lang3.StringUtils;
  9. import java.text.SimpleDateFormat;
  10. import java.util.ArrayList;
  11. import java.util.Date;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 获取组织信息接口。
  17. * <p>
  18. * 根据组织类型、最后修改日期、组织名称、组织编号等条件分页查询组织基础信息,
  19. * 包含组织名称、编号、上下级关系、状态等字段。
  20. * 数据来源于 t_org_admin(组织管理表),左连 T_Org_admin(取上级组织信息)、
  21. * T_Org_LayerType(组织类型表),按修改时间降序排列。
  22. * </p>
  23. *
  24. * <h3>入参说明</h3>
  25. * <table>
  26. * <tr><th>参数名</th><th>类型</th><th>必填</th><th>说明</th></tr>
  27. * <tr><td>layerType</td> <td>String</td><td>否</td><td>组织类型,支持逗号分隔多个值(如:公司、部门、集团、中心、子中心、公司(新)),精确匹配</td></tr>
  28. * <tr><td>modifyDate</td> <td>String</td><td>否</td><td>最后修改日期(yyyy-MM-dd),查询该日期及之后修改的组织</td></tr>
  29. * <tr><td>name</td> <td>String</td><td>否</td><td>组织名称,左模糊匹配</td></tr>
  30. * <tr><td>code</td> <td>String</td><td>否</td><td>组织编号,精确匹配</td></tr>
  31. * <tr><td>size</td> <td>int</td> <td>否</td><td>每页条数,默认100,最大1000</td></tr>
  32. * <tr><td>page</td> <td>int</td> <td>否</td><td>页码,默认1</td></tr>
  33. * </table>
  34. *
  35. * <h3>返回值说明</h3>
  36. * <table>
  37. * <tr><th>字段</th><th>类型</th><th>说明</th></tr>
  38. * <tr><td>code</td> <td>String</td><td>状态码(200:成功,500:异常)</td></tr>
  39. * <tr><td>msg</td> <td>String</td><td>提示信息</td></tr>
  40. * <tr><td>page</td> <td>int</td> <td>当前页码</td></tr>
  41. * <tr><td>size</td> <td>int</td> <td>每页条数</td></tr>
  42. * <tr><td>data</td> <td>List</td> <td>组织列表,每项字段见下方</td></tr>
  43. * </table>
  44. * <p>data 列表中每项包含以下字段:</p>
  45. * <table>
  46. * <tr><th>字段</th><th>类型</th><th>说明</th></tr>
  47. * <tr><td>id</td> <td>String</td><td>主键ID</td></tr>
  48. * <tr><td>name</td> <td>String</td><td>组织名称</td></tr>
  49. * <tr><td>fullname</td> <td>String</td><td>组织全称(显示名)</td></tr>
  50. * <tr><td>code</td> <td>String</td><td>组织编号</td></tr>
  51. * <tr><td>parent</td> <td>String</td><td>上级组织编号</td></tr>
  52. * <tr><td>fullnumber</td> <td>String</td><td>组织全编码(长编码层级路径)</td></tr>
  53. * <tr><td>disporder</td> <td>String</td><td>显示排序号</td></tr>
  54. * <tr><td>status</td> <td>String</td><td>是否启用("1":有效,"0":封存,与数据库 fissealup 字段取反)</td></tr>
  55. * <tr><td>description</td> <td>String</td><td>备注说明</td></tr>
  56. * <tr><td>modifyDate</td> <td>String</td><td>修改日期(yyyy-MM-dd,当前版本不返回此字段,如需返回请取消注释)</td></tr>
  57. * <tr><td>layerType</td> <td>String</td><td>组织类型名称</td></tr>
  58. * </table>
  59. *
  60. * @author szpgm
  61. * @since 1.0.0
  62. */
  63. public class GetOrgInfoOsfService implements IHRMsfService {
  64. /**
  65. * 查询组织基础信息(分页接口)。
  66. * <p>
  67. * 根据组织类型、修改日期、名称、编号等条件组合查询,支持分页返回。
  68. * 组织类型支持逗号分隔的多个值,名称按左模糊匹配,编号精确匹配。
  69. * </p>
  70. *
  71. * @param context EAS 平台上下文对象
  72. * @param map 入参,支持以下 key(均为可选):
  73. * <ul>
  74. * <li><b>layerType</b> — 组织类型,逗号分隔多个值,精确匹配</li>
  75. * <li><b>modifyDate</b> — 最后修改日期(yyyy-MM-dd),查询该日期及之后的数据</li>
  76. * <li><b>name</b> — 组织名称,左模糊匹配</li>
  77. * <li><b>code</b> — 组织编号,精确匹配</li>
  78. * <li><b>page</b> — 页码,默认1</li>
  79. * <li><b>size</b> — 每页条数,默认100,上限1000</li>
  80. * </ul>
  81. * @return {@code Map<String, Object>},包含以下 key:
  82. * <ul>
  83. * <li><b>code</b> — 状态码("200" 成功,"500" 异常)</li>
  84. * <li><b>msg</b> — 提示信息</li>
  85. * <li><b>page</b> — 当前页码</li>
  86. * <li><b>size</b> — 每页条数</li>
  87. * <li><b>data</b> — 组织信息列表({@code List<Map<String, Object>>})</li>
  88. * </ul>
  89. * @throws EASBizException 业务异常
  90. * @throws BOSException 平台异常
  91. */
  92. @Override
  93. public Object process(Context context, Map map) throws EASBizException, BOSException {
  94. Map<String, Object> result = new HashMap<String, Object>();
  95. List<Map<String, Object>> list = new ArrayList<>();
  96. // ==================== 入参解析 ====================
  97. String layerType = (String) map.get("layerType");
  98. String modifyDate = (String) map.get("modifyDate");
  99. String name = (String) map.get("name");
  100. String code = (String) map.get("code");
  101. // 每页条数:默认100,上限1000,兼容 Integer 和 String 类型
  102. int maxSize = 1000;
  103. int size = 100;
  104. if (map.get("size") != null) {
  105. if (map.get("size") instanceof Integer) {
  106. size = (int) map.get("size");
  107. } else if (map.get("size") instanceof String) {
  108. size = Integer.parseInt((String) map.get("size"));
  109. }
  110. size = Math.min(maxSize, size);
  111. }
  112. // 页码:默认1,兼容 Integer 和 String 类型
  113. int page = 1;
  114. if (map.get("page") != null) {
  115. if (map.get("page") instanceof Integer) {
  116. page = (int) map.get("page");
  117. } else if (map.get("page") instanceof String) {
  118. page = Integer.parseInt((String) map.get("page"));
  119. }
  120. }
  121. // ==================== 构建查询并执行 ====================
  122. try {
  123. result.put("msg", "成功");
  124. result.put("code", "200");
  125. result.put("page", page);
  126. result.put("size", size);
  127. result.put("data", list);
  128. // 获取基础SQL(where 1=1),动态追加过滤条件和分页参数
  129. StringBuilder sql = getSql();
  130. List<Object> paramArr = new ArrayList<>();
  131. // 修改日期过滤:组织最后修改时间 >= 指定日期
  132. if (StringUtils.isNotBlank(modifyDate)) {
  133. sql.append(" and org.flastupdatetime >= ? ");
  134. paramArr.add(modifyDate);
  135. }
  136. // 组织类型精确匹配,支持逗号分隔多个值(IN 查询)
  137. if (StringUtils.isNotBlank(layerType)) {
  138. sql.append(" and lt.fname_l2 in('' ");
  139. String[] layerTypeArr = layerType.split(",");
  140. for (int i = 0; i < layerTypeArr.length; i++) {
  141. sql.append(" ,?");
  142. paramArr.add(layerTypeArr[i]);
  143. }
  144. sql.append(" ) ");
  145. }
  146. // 组织名称左模糊匹配
  147. if (StringUtils.isNotBlank(name)) {
  148. sql.append(" and org.fname_l2 like ? ");
  149. paramArr.add(name + "%");
  150. }
  151. // 组织编号精确匹配
  152. if (StringUtils.isNotBlank(code)) {
  153. sql.append(" and org.fnumber = ? ");
  154. paramArr.add(code);
  155. }
  156. // 分页:LIMIT 条数 OFFSET 偏移量
  157. sql.append(" order by org.fid desc LIMIT ? OFFSET ? ");
  158. paramArr.add(size);
  159. paramArr.add(((page - 1) * size));
  160. // 执行SQL查询
  161. IRowSet rs = DbUtil.executeQuery(context, sql.toString(), paramArr.toArray());
  162. // 遍历结果集,逐行转换为 Map 放入返回列表
  163. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  164. while (rs.next()) {
  165. Map<String, Object> params = new HashMap<String, Object>();
  166. params.put("name", rs.getString("name")); // 组织名称
  167. params.put("fullname", rs.getString("fullname")); // 组织全称(显示名)
  168. params.put("code", rs.getString("code")); // 组织编号
  169. params.put("parent", rs.getString("parent")); // 上级组织编号
  170. params.put("fullnumber", rs.getString("fullnumber")); // 组织全编码(长编码路径)
  171. params.put("disporder", rs.getString("disporder")); // 显示排序号
  172. // 状态取反:DB中 fissealup=1(封存)→接口返回 "0",fissealup=0(有效)→接口返回 "1"
  173. int statusVal = rs.getInt("status");
  174. params.put("status", statusVal == 1 ? "0" : "1");
  175. params.put("id", rs.getString("id")); // 主键ID
  176. params.put("description", rs.getString("description")); // 备注说明
  177. // 修改日期(当前版本不返回,如需返回请取消下行注释)
  178. //Date modifyDateVal = rs.getTimestamp("modifyDate");
  179. //params.put("modifyDate", modifyDateVal != null ? sdf.format(modifyDateVal) : "");
  180. params.put("layerType", rs.getString("layerType")); // 组织类型名称
  181. list.add(params);
  182. }
  183. } catch (Exception e) {
  184. // 捕获所有异常,返回错误码和异常信息
  185. e.printStackTrace();
  186. result.put("msg", e.getMessage());
  187. result.put("code", "500");
  188. }
  189. return result;
  190. }
  191. /**
  192. * 构建组织信息查询的基础 SQL。
  193. * <p>
  194. * 从 t_org_admin(组织管理表)左连 T_Org_admin(取上级组织信息)、
  195. * T_Org_LayerType(组织类型表),查询组织名称、编号、全编码、上级组织编号、
  196. * 显示顺序、封存状态、备注、修改时间、类型等字段。
  197. * 返回的 SQL 以 {@code where 1=1} 结尾,过滤条件和分页参数由调用方通过
  198. * {@link StringBuilder#append} 动态拼接。
  199. * </p>
  200. * <p>
  201. * 涉及表:
  202. * <ul>
  203. * <li><b>t_org_admin</b>(org)—— 组织管理表,主表</li>
  204. * <li><b>T_Org_admin</b>(porg)—— 组织管理表(二次关联,通过 fparentid 取上级组织信息)</li>
  205. * <li><b>T_Org_LayerType</b>(lt)—— 组织类型表</li>
  206. * </ul>
  207. * </p>
  208. *
  209. * @return 包含占位符的基础 SQL(以 {@code where 1=1} 结尾),
  210. * 后续可动态追加 AND 条件和分页参数
  211. */
  212. private static StringBuilder getSql() {
  213. StringBuilder sql = new StringBuilder();
  214. sql.append(" /*dialect*/ select ");
  215. sql.append(" org.fname_l2 \"name\", "); // 组织名称
  216. sql.append(" org.fdisplayname_l2 fullname, "); // 组织全称(显示名)
  217. sql.append(" org.fnumber code, "); // 组织编号
  218. sql.append(" porg.fnumber parent, "); // 上级组织编号
  219. sql.append(" org.flongNumber fullnumber, "); // 组织长编码(层级路径)
  220. sql.append(" org.fsortcode disporder, "); // 显示排序号
  221. sql.append(" org.fissealup status, "); // 封存状态(1=封存,0=有效,接口层取反)
  222. sql.append(" org.fid id, "); // 主键ID
  223. sql.append(" org.fdescription_l2 description, "); // 备注说明
  224. sql.append(" org.flastupdatetime modifyDate, "); // 最后修改时间
  225. sql.append(" lt.fname_l2 layerType "); // 组织类型名称
  226. sql.append(" from t_org_admin org "); // 组织管理表
  227. sql.append(" left join T_Org_admin porg on porg.fid = org.fparentid "); // 左连组织管理表(取上级组织信息)
  228. sql.append(" left join T_Org_LayerType lt on lt.fid = org.flayertypeid "); // 左连组织类型表
  229. sql.append(" where 1=1 "); // 占位,便于后续动态拼接 AND 条件
  230. return sql;
  231. }
  232. }