GetPosInfoOsfService.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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.*;
  11. /**
  12. * 获取岗位信息接口
  13. * <p>
  14. * 根据修改日期、岗位名称、岗位编号等条件分页查询岗位基础信息,
  15. * 包含岗位名称、编号、所属组织、上级岗位、是否负责人岗等字段。
  16. * 数据来源于 t_org_position(岗位表),左连 t_org_admin(行政组织表)、
  17. * t_org_position(二次关联,取上级岗位信息),按修改时间降序排列。
  18. * </p>
  19. *
  20. * <h3>关联数据表</h3>
  21. * <ul>
  22. * <li><b>t_org_position</b>(pos)—— 岗位表,主表</li>
  23. * <li><b>t_org_admin</b>(org)—— 行政组织表</li>
  24. * <li><b>t_org_position</b>(ppos)—— 岗位表(二次关联,通过 fparentid 取上级岗位信息)</li>
  25. * </ul>
  26. *
  27. * <h3>入参说明</h3>
  28. * <pre>
  29. * modifyDate - 修改日期(可选,yyyy-MM-dd,范围过滤:岗位或人员职位 >= 该日期)
  30. * name - 岗位名称(可选,左模糊匹配)
  31. * code - 岗位编号(可选,精确匹配)
  32. * size - 每页条数(可选,默认100,最大1000)
  33. * page - 页码(可选,默认1)
  34. * </pre>
  35. *
  36. * <h3>返回值说明</h3>
  37. * <pre>
  38. * code - 状态码(200:成功, 500:异常)
  39. * msg - 提示信息
  40. * page - 当前页码
  41. * size - 每页条数
  42. * data - 岗位列表,每项包含:
  43. * id - 主键
  44. * name - 岗位名称
  45. * code - 岗位编号
  46. * department - 所属组织编号
  47. * parent - 上级岗位编号
  48. * vice - 部门副职(1:是, 0:否)
  49. * disporder - 显示顺序
  50. * description - 备注
  51. * isrespposition - 是否负责人岗(1:是, 0:否)
  52. * </pre>
  53. *
  54. * @author szpgm
  55. * @since 1.0.0
  56. */
  57. public class GetPosInfoOsfService implements IHRMsfService {
  58. /**
  59. * 处理岗位信息查询请求
  60. *
  61. * @param context 上下文对象
  62. * @param map 入参,支持以下 key:
  63. * <ul>
  64. * <li><b>modifyDate</b> - 最后修改日期(可选,yyyy-MM-dd,范围过滤岗位/人员职位 >= 该日期)</li>
  65. * <li><b>name</b> - 岗位名称(可选,左模糊匹配)</li>
  66. * <li><b>code</b> - 岗位编号(可选,精确匹配)</li>
  67. * <li><b>page</b> - 页码(可选,默认1)</li>
  68. * <li><b>size</b> - 每页条数(可选,默认100,最大1000)</li>
  69. * </ul>
  70. * @return Map&lt;String, Object&gt;,包含 code、msg、page、size、data 字段
  71. * @throws EASBizException 业务异常
  72. * @throws BOSException 平台异常
  73. */
  74. @Override
  75. public Object process(Context context, Map map) throws EASBizException, BOSException {
  76. Map<String, Object> result = new HashMap<String, Object>();
  77. List<Map<String, Object>> list = new ArrayList<>();
  78. // ---------- 入参解析 ----------
  79. String modifyDate = (String) map.get("modifyDate");
  80. String name = (String) map.get("name");
  81. String code = (String) map.get("code");
  82. // 每页条数(默认100,上限1000)
  83. int maxSize = 1000;
  84. int size = 100;
  85. if (map.get("size") != null) {
  86. if (map.get("size") instanceof Integer) {
  87. size = (int) map.get("size");
  88. } else if (map.get("size") instanceof String) {
  89. size = Integer.parseInt((String) map.get("size"));
  90. }
  91. size = Math.min(maxSize, size);
  92. }
  93. // 页码(默认1)
  94. int page = 1;
  95. if (map.get("page") != null) {
  96. if (map.get("page") instanceof Integer) {
  97. page = (int) map.get("page");
  98. } else if (map.get("page") instanceof String) {
  99. page = Integer.parseInt((String) map.get("page"));
  100. }
  101. }
  102. // ---------- 查询数据 ----------
  103. try {
  104. result.put("msg", "成功");
  105. result.put("code", "200");
  106. result.put("page", page);
  107. result.put("size", size);
  108. result.put("data", list);
  109. // 构建基础SQL并动态追加过滤条件
  110. StringBuilder sql = getSql();
  111. List<Object> paramArr = new ArrayList<>();
  112. // 修改日期过滤:岗位或人员职位最后修改时间 >= 指定日期
  113. if (StringUtils.isNotBlank(modifyDate)) {
  114. sql.append(" and pos.flastupdatetime >= ? ");
  115. paramArr.add(modifyDate);
  116. //paramArr.add(modifyDate);
  117. }
  118. // 岗位名称左模糊匹配
  119. if (StringUtils.isNotBlank(name)) {
  120. sql.append(" and pos.fname_l2 like ? ");
  121. paramArr.add(name + "%");
  122. }
  123. // 岗位编号精确匹配
  124. if (StringUtils.isNotBlank(code)) {
  125. sql.append(" and pos.fnumber = ? ");
  126. paramArr.add(code);
  127. }
  128. // 分页:LIMIT 条数 OFFSET 偏移量
  129. sql.append(" order by pos.fid desc LIMIT ? OFFSET ? ");
  130. paramArr.add(size);
  131. paramArr.add(((page - 1) * size));
  132. // 执行查询
  133. IRowSet rs = DbUtil.executeQuery(context, sql.toString(), paramArr.toArray());
  134. while (rs.next()) {
  135. String id = rs.getString("id");
  136. Map<String, Object> params = new HashMap<>();
  137. // 是否负责人岗(1:是, 0:否)
  138. params.put("isrespposition", rs.getString("isrespposition"));
  139. // 岗位名称
  140. params.put("name", rs.getString("name"));
  141. // 所属组织编号
  142. params.put("department", rs.getString("department"));
  143. // 岗位编号
  144. params.put("code", rs.getString("code"));
  145. // 上级岗位编号
  146. params.put("parent", rs.getString("parent"));
  147. // 部门副职(1:是, 0:否)
  148. params.put("vice", rs.getString("vice"));
  149. // 显示顺序
  150. params.put("disporder", rs.getString("disporder"));
  151. // 主键ID
  152. params.put("id", rs.getString("id"));
  153. // 备注
  154. params.put("description", rs.getString("description"));
  155. list.add(params);
  156. }
  157. // 以 list 覆盖 result 中的 data(确保引用一致)
  158. result.put("data", list);
  159. } catch (Exception e) {
  160. // 异常时返回错误信息
  161. e.printStackTrace();
  162. result.put("msg", e.getMessage());
  163. result.put("code", "500");
  164. }
  165. return result;
  166. }
  167. /**
  168. * 构建岗位信息查询的基础SQL
  169. * <p>
  170. * 从 t_org_position(岗位表)出发,LEFT JOIN t_org_admin(取所属组织信息)、
  171. * t_org_position(二次关联,取上级岗位信息),查询岗位名称、编号、显示顺序、
  172. * 所属组织、上级岗位、部门副职、备注、是否负责人岗等字段。
  173. * 以 {@code where 1=1} 结尾,便于后续动态追加 AND 条件。
  174. * </p>
  175. * <p>
  176. * 涉及表:
  177. * <ul>
  178. * <li><b>t_org_position</b>(pos)—— 岗位表,主表</li>
  179. * <li><b>t_org_admin</b>(org)—— 行政组织表</li>
  180. * <li><b>t_org_position</b>(ppos)—— 岗位表(二次关联,通过 fparentid 取上级岗位信息)</li>
  181. * </ul>
  182. * </p>
  183. *
  184. * @return 包含占位符的基础SQL(以 {@code where 1=1} 结尾),过滤条件和分页参数由调用方动态追加
  185. */
  186. private static StringBuilder getSql() {
  187. StringBuilder sql = new StringBuilder();
  188. sql.append(" /*dialect*/ select ");
  189. sql.append(" pos.fname_l2 \"name\", "); // 岗位名称
  190. sql.append(" pos.fnumber code, "); // 岗位编号
  191. sql.append(" pos.findex disporder, "); // 显示顺序
  192. sql.append(" org.fnumber department, "); // 所属组织编号
  193. sql.append(" ppos.fnumber parent, "); // 上级岗位编号
  194. sql.append(" pos.cfsffz1 vice, "); // 部门副职(1:是,0:否)
  195. sql.append(" pos.fdescription_l2 description, "); // 备注
  196. sql.append(" pos.fid id, "); // 主键ID
  197. sql.append(" pos.fisrespposition isrespposition "); // 是否负责人岗(1:是,0:否)
  198. sql.append(" from t_org_position pos "); // 岗位表(主表)
  199. sql.append(" left join t_org_admin org on pos.fadminorgunitid=org.fid "); // 行政组织表
  200. sql.append(" left join t_org_position ppos on pos.fparentid=ppos.fid "); // 岗位表(二次关联,取上级岗位信息)
  201. sql.append(" where 1=1 "); // 占位,便于后续动态拼接 AND 条件
  202. return sql;
  203. }
  204. }