YearPlanFileService.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. package com.kingdee.shr.ats.web.handler.util;
  2. import com.kingdee.bos.BOSException;
  3. import com.kingdee.bos.Context;
  4. import com.kingdee.bos.ICommonBOSType;
  5. import com.kingdee.bos.metadata.MetaDataLoaderFactory;
  6. import com.kingdee.bos.metadata.MetaDataPK;
  7. import com.kingdee.bos.metadata.entity.EntityObjectInfo;
  8. import com.kingdee.eas.base.codingrule.CodingRuleManagerFactory;
  9. import com.kingdee.eas.base.codingrule.ICodingRuleManager;
  10. import com.kingdee.eas.basedata.org.*;
  11. import com.kingdee.eas.basedata.person.IPerson;
  12. import com.kingdee.eas.basedata.person.PersonCollection;
  13. import com.kingdee.eas.basedata.person.PersonFactory;
  14. import com.kingdee.eas.basedata.person.PersonInfo;
  15. import com.kingdee.eas.common.EASBizException;
  16. import com.kingdee.eas.framework.*;
  17. import com.kingdee.eas.hr.base.HRBillStateEnum;
  18. import com.kingdee.eas.hr.emp.PersonPositionCollection;
  19. import com.kingdee.eas.hr.emp.PersonPositionFactory;
  20. import com.kingdee.eas.hr.emp.PersonPositionInfo;
  21. import com.kingdee.shr.base.syssetting.app.io.fileImport.BaseImportService;
  22. import com.kingdee.shr.base.syssetting.app.io.fileImport.BaseResultInfo;
  23. import com.kingdee.shr.base.syssetting.app.io.fileImport.BaseRowInfo;
  24. import com.kingdee.shr.base.syssetting.app.io.fileImport.ImportException;
  25. import com.kingdee.shr.base.syssetting.util.MetaDataUtil;
  26. import com.kingdee.shr.shrimport.SHRFileTemplateInfo;
  27. import org.apache.commons.lang3.StringUtils;
  28. import org.apache.log4j.Logger;
  29. import java.util.*;
  30. import static com.kingdee.shr.ats.web.util.file.Constants.hrOrg;
  31. /**
  32. * 年假计划批量导入
  33. * @author kkuan
  34. *
  35. */
  36. public class YearPlanFileService extends BaseImportService {
  37. private static Logger logger = Logger.getLogger(YearPlanFileService.class);
  38. private static final String PERSONNUM = "Person.number";
  39. private static final String HRORG = "hrOrg";
  40. @Override
  41. public boolean isBatch(SHRFileTemplateInfo templateInfo) {
  42. return true;
  43. }
  44. @Override
  45. public boolean startBatchImport(Iterator<BaseRowInfo> rowIterator) {
  46. Context ctx = getContext();
  47. List<BaseRowInfo> list = new ArrayList<BaseRowInfo>(); //保存通过标准校验的数据
  48. while (rowIterator.hasNext()) {
  49. BaseRowInfo rowInfo = rowIterator.next();
  50. try {
  51. // 标准模板校验
  52. super.verifyRow(rowInfo);
  53. } catch (ImportException e) {
  54. // 有异常说明校验不通过
  55. BaseResultInfo resultInfo = new BaseResultInfo(rowInfo);
  56. resultInfo.setSuccess(false);
  57. resultInfo.setMessage(e.getMessage());
  58. resultInfo.setE(e);
  59. super.getMonitor().completeRow(resultInfo);
  60. continue;
  61. }
  62. list.add(rowInfo);
  63. }
  64. //根据业务组织分组; 同一业务组织的放在一张单上;
  65. LinkedHashMap<String, List<BaseRowInfo>> rowMap = new LinkedHashMap ();
  66. try {
  67. IPerson perIns = PersonFactory.getLocalInstance(ctx);
  68. for (int i = 0; i < list.size(); i++) {
  69. BaseRowInfo row = list.get(i);
  70. String personNum = row.getValueOfString(PERSONNUM);
  71. PersonCollection personCollection = null;
  72. try {
  73. personCollection = perIns.getPersonCollection("where number = '" + personNum + "' or name = '" + personNum + "'");
  74. } catch (BOSException e) {
  75. throw new RuntimeException(e);
  76. }
  77. PersonInfo personInfo = personCollection.get(0);
  78. PersonPositionInfo positionInfo = this.getAdminOrgUnit(ctx, personInfo.getId().toString());
  79. HROrgUnitInfo hrOrgUnit = positionInfo.getHrOrgUnit();
  80. if(null == hrOrgUnit){
  81. throw new RuntimeException("人员业务组织信息为空,请检查!");
  82. }
  83. String hrOrg = hrOrgUnit.getNumber().toString();
  84. if(rowMap.containsKey(hrOrg)){
  85. List<BaseRowInfo> dataList = rowMap.get(hrOrg);
  86. dataList.add(row);
  87. }else{
  88. List<BaseRowInfo> dataList = new ArrayList();
  89. dataList.add(row);
  90. rowMap.put(hrOrg,dataList);
  91. }
  92. }
  93. } catch (BOSException e) {
  94. throw new RuntimeException(e);
  95. }
  96. int sucessCount = 0; //成功数量,通过业务校验即认为是成功。
  97. int count = super.getMonitor().getProgress().getCount(); // 导入的总数量
  98. CoreBaseCollection billCol = new CoreBaseCollection(); //分录
  99. String entityName = "com.kingdee.eas.jiaotou.app.NJJH";
  100. for (Map.Entry<String, List<BaseRowInfo>> entry : rowMap.entrySet()) {
  101. List<BaseRowInfo> rowList = entry.getValue();
  102. String hrOrg = entry.getKey();
  103. CoreBaseInfo billInfo = null;
  104. try {
  105. billInfo = createInfo(entityName);
  106. } catch (Exception e1) {
  107. e1.printStackTrace();
  108. }
  109. CoreBaseCollection coll = new CoreBaseCollection(); //分录
  110. try {
  111. IHROrgUnit orgIns = HROrgUnitFactory.getLocalInstance(ctx);
  112. HROrgUnitCollection hrOrgCol = orgIns.getHROrgUnitCollection("where number = '" + hrOrg + "' or name = '" + hrOrg + "'");
  113. HROrgUnitInfo hrOrgUnitInfo = hrOrgCol.get(0);
  114. billInfo.put("hrOrgUnit",hrOrgUnitInfo);
  115. String newNumber = getNewNumber(ctx, billInfo);
  116. billInfo.put("number",newNumber);
  117. billInfo.put("billState", HRBillStateEnum.SAVED_VALUE);
  118. } catch (BOSException e) {
  119. throw new RuntimeException(e);
  120. }
  121. for (int i = 0; i < rowList.size(); i++) {
  122. BaseRowInfo row = rowList.get(i);
  123. try {
  124. String personNum = row.getValueOfString(PERSONNUM);
  125. IPerson perIns = PersonFactory.getLocalInstance(ctx);
  126. PersonCollection personCollection = perIns.getPersonCollection("where number = '" + personNum + "' or name = '" + personNum + "'");
  127. PersonInfo personInfo = personCollection.get(0);
  128. CoreBaseInfo transRowToObejct = super.transRowToObejct(row);
  129. doCustomVerifyRow(transRowToObejct); //业务校验
  130. PersonPositionInfo positionInfo = this.getAdminOrgUnit(ctx, personInfo.getId().toString());
  131. AdminOrgUnitInfo personDep = positionInfo.getPersonDep();
  132. PositionInfo primaryPosition = positionInfo.getPrimaryPosition();
  133. transRowToObejct.put("person",personInfo);
  134. transRowToObejct.put("position",primaryPosition);
  135. transRowToObejct.put("adminOrg",personDep);
  136. coll.add(transRowToObejct); // 将每一行数据存入coll中,可以最后做批量保存
  137. sucessCount++;
  138. } catch (ImportException e) {
  139. BaseResultInfo resultInfo = new BaseResultInfo(row);
  140. resultInfo.setSuccess(false);
  141. resultInfo.setMessage(e.getMessage());
  142. resultInfo.setE(e);
  143. super.getMonitor().completeRow(resultInfo);
  144. } catch (BOSException e) {
  145. throw new RuntimeException(e);
  146. }
  147. }
  148. billInfo.put("entrys", coll);
  149. billCol.add(billInfo);
  150. }
  151. if (billCol.size() > 0) {
  152. try {
  153. ICoreBase iCoreBase = MetaDataUtil.getBizInterface(entityName);
  154. iCoreBase.save(billCol);
  155. // iCoreBase.submit(billCol);
  156. } catch (Exception e) {
  157. //批量操作异常后,直接将成功数量设置为0
  158. super.getMonitor().getProgress().setFinish(count); // 完成数
  159. super.getMonitor().getProgress().setSuccess(0); // 设置成功数为0
  160. e.printStackTrace(); //打出日志,无法在导入报告中看到,只能查看apusic日志
  161. return true;
  162. }
  163. }
  164. // 最后设置成功的数量和完成数量
  165. super.getMonitor().getProgress().setFinish(count); // 完成数
  166. super.getMonitor().getProgress().setSuccess(sucessCount); // 成功数量 ,最终保证:失败的数量+成功的数量 = 导入的总数量
  167. return true;
  168. }
  169. /**
  170. * 业务校验,自行实现,如果校验不通过请抛出ImportException
  171. * @return
  172. */
  173. private void doCustomVerifyRow(CoreBaseInfo transRowToObejct) throws ImportException {
  174. }
  175. protected void verifyRowBiz(BaseRowInfo row) throws ImportException {
  176. Context ctx = getContext();
  177. try {
  178. IHROrgUnit orgIns = null;
  179. // String hrOrg = row.getValueOfString(HRORG);
  180. // orgIns = HROrgUnitFactory.getLocalInstance(ctx);
  181. // boolean exists= orgIns.exists("where number = '" + hrOrg + "' or name = '" + hrOrg + "'");
  182. // if (!exists ) {
  183. // throw new ImportException("业务组织填写错误,"+hrOrg+"未找到对应数据");
  184. // }
  185. String personNum = row.getValueOfString(PERSONNUM);
  186. IPerson perIns = PersonFactory.getLocalInstance(ctx);
  187. boolean exists2= perIns.exists("where number = '" + personNum + "' or name = '" + personNum + "'");
  188. if (!exists2 ) {
  189. throw new ImportException("人员填写错误,"+personNum+"未找到对应数据");
  190. }
  191. } catch (BOSException e) {
  192. throw new RuntimeException(e);
  193. } catch (EASBizException e) {
  194. throw new RuntimeException(e);
  195. }
  196. }
  197. private CoreBaseInfo createInfo(String entityName) throws Exception {
  198. String clazz = MetaDataLoaderFactory.getRemoteMetaDataLoader().getEntity(new MetaDataPK(entityName))
  199. .getObjectValueClass();
  200. Class modelClass = Class.forName(clazz);
  201. CoreBaseInfo model = (CoreBaseInfo) modelClass.newInstance();
  202. if (!StringUtils.isEmpty(entityName)) {
  203. MetaDataPK metaDataPK = new MetaDataPK(entityName);
  204. EntityObjectInfo entityInfo = MetaDataLoaderFactory.getRemoteMetaDataLoader().getEntity(metaDataPK);
  205. if (entityInfo.isDynamic() && model instanceof ICommonBOSType) {
  206. ICommonBOSType commonObject = (ICommonBOSType) model;
  207. commonObject.setBOSType(entityInfo.getType());
  208. commonObject.setPK(metaDataPK);
  209. }
  210. }
  211. return model;
  212. }
  213. /**
  214. * 根据编码规则获取单据编码
  215. *
  216. * @param ctx
  217. * @param info
  218. * @return
  219. */
  220. public static String getNewNumber(Context ctx, CoreBaseInfo info) {
  221. String number = "";
  222. ICodingRuleManager iCodingRuleManager = null;
  223. OrgUnitInfo orgUnit = (OrgUnitInfo) info.get("hrOrgUnit");
  224. if (orgUnit == null) {
  225. return null;
  226. }
  227. try {
  228. iCodingRuleManager = CodingRuleManagerFactory.getLocalInstance(ctx);
  229. if (iCodingRuleManager.isExist(info, orgUnit.getId().toString())) {
  230. number = iCodingRuleManager.getNumber(info, orgUnit.getId().toString());
  231. } else {
  232. return null;
  233. }
  234. } catch (EASBizException e) {
  235. e.printStackTrace();
  236. } catch (BOSException e) {
  237. e.printStackTrace();
  238. }
  239. return number;
  240. }
  241. public PersonPositionInfo getAdminOrgUnit(Context ctx, String personID) {
  242. if (personID == null) {
  243. return null;
  244. } else {
  245. PersonPositionInfo personPositionInfo = null;
  246. StringBuffer oqlb = new StringBuffer();
  247. oqlb.append("select ");
  248. oqlb.append("id,");
  249. oqlb.append("enterDate,");
  250. oqlb.append("jobGrade.id,");
  251. oqlb.append("tryoutMonth,");
  252. oqlb.append("jobGrade.name,");
  253. oqlb.append("jobLevel.id,");
  254. oqlb.append("jobLevel.name,");
  255. oqlb.append("hrOrgUnit.id,");
  256. oqlb.append("hrOrgUnit.number,");
  257. oqlb.append("person.number,");
  258. oqlb.append("person.name,");
  259. oqlb.append("person.employeeType.name,");
  260. oqlb.append("personDep.id,");
  261. oqlb.append("personDep.name,");
  262. oqlb.append("personDep.number,");
  263. oqlb.append("personDep.longnumber,");
  264. oqlb.append("personDep.displayName,");
  265. oqlb.append("primaryPosition.id,");
  266. oqlb.append("primaryPosition.name,");
  267. oqlb.append("primaryPosition.number,");
  268. oqlb.append("primaryPosition.job.id,");
  269. oqlb.append("primaryPosition.job.name");
  270. oqlb.append(" where person.id='");
  271. oqlb.append(personID);
  272. oqlb.append("'");
  273. PersonPositionCollection c = null;
  274. try {
  275. c = PersonPositionFactory.getLocalInstance(ctx).getPersonPositionCollection(oqlb.toString());
  276. } catch (BOSException var7) {
  277. var7.printStackTrace();
  278. }
  279. if (c != null && c.size() > 0) {
  280. personPositionInfo = c.get(0);
  281. }
  282. return personPositionInfo;
  283. }
  284. }
  285. }