CmpCalDynamicListHandlerExExEx.java 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068
  1. package com.kingdee.eas.custom.compensation.handler;
  2. import cn.com.servyou.dto.ApiResponse;
  3. import cn.com.servyou.dto.AsyncResult;
  4. import cn.com.servyou.dto.tax.*;
  5. import cn.com.servyou.rmi.client.ClientProxyFactory;
  6. import cn.com.servyou.service.TaxRequest;
  7. import com.alibaba.fastjson.JSON;
  8. import com.alibaba.fastjson.JSONObject;
  9. import com.fasterxml.jackson.core.JsonProcessingException;
  10. import com.fasterxml.jackson.databind.ObjectMapper;
  11. import com.kingdee.bos.BOSException;
  12. import com.kingdee.bos.Context;
  13. import com.kingdee.bos.dao.IObjectPK;
  14. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  15. import com.kingdee.bos.metadata.entity.EntityViewInfo;
  16. import com.kingdee.bos.metadata.entity.FilterInfo;
  17. import com.kingdee.bos.metadata.entity.FilterItemInfo;
  18. import com.kingdee.bos.metadata.entity.SelectorItemCollection;
  19. import com.kingdee.bos.metadata.query.util.CompareType;
  20. import com.kingdee.eas.basedata.hraux.NationalityInfo;
  21. import com.kingdee.eas.basedata.person.IPerson;
  22. import com.kingdee.eas.basedata.person.PersonFactory;
  23. import com.kingdee.eas.basedata.person.PersonInfo;
  24. import com.kingdee.eas.common.EASBizException;
  25. import com.kingdee.eas.custom.compensation.vo.TaxUnitAndPerson;
  26. import com.kingdee.eas.custom.individualback.ITaxPaymentBackCalculate;
  27. import com.kingdee.eas.custom.individualback.TaxPaymentBackCalculateCollection;
  28. import com.kingdee.eas.custom.individualback.TaxPaymentBackCalculateFactory;
  29. import com.kingdee.eas.custom.individualback.TaxPaymentBackCalculateInfo;
  30. import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoFactory;
  31. import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoInfo;
  32. import com.kingdee.eas.custom.shuiyou.six.osf.vo.SixTConfirmInfo;
  33. import com.kingdee.eas.custom.shuiyou.task.TaskCatalogEnum;
  34. import com.kingdee.eas.custom.shuiyou.uitls.ISYUtilsFacade;
  35. import com.kingdee.eas.custom.shuiyou.uitls.SYUtilsFacadeFactory;
  36. import com.kingdee.eas.custom.shuiyou.utils.ClientProxyFactoryUtils;
  37. import com.kingdee.eas.hr.emp.IPersonPosition;
  38. import com.kingdee.eas.hr.emp.PersonPositionCollection;
  39. import com.kingdee.eas.hr.emp.PersonPositionFactory;
  40. import com.kingdee.eas.hr.emp.PersonPositionInfo;
  41. import com.kingdee.eas.util.app.DbUtil;
  42. import com.kingdee.jdbc.rowset.IRowSet;
  43. import com.kingdee.shr.base.syssetting.context.SHRContext;
  44. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  45. import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
  46. import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
  47. import com.kingdee.shr.compensation.*;
  48. import com.kingdee.shr.compensation.app.incomeTax.*;
  49. import com.kingdee.shr.compensation.app.tax.ITaxUnit;
  50. import com.kingdee.shr.compensation.app.tax.TaxItemPlanInfo;
  51. import com.kingdee.shr.compensation.app.tax.TaxUnitFactory;
  52. import com.kingdee.shr.compensation.app.tax.TaxUnitInfo;
  53. import com.kingdee.shr.custom.compensation.accrue.handler.CmpCalDynamicListHandlerExEx;
  54. import com.kingdee.util.StringUtils;
  55. import org.apache.log4j.Logger;
  56. import org.springframework.ui.ModelMap;
  57. import javax.servlet.http.HttpServletRequest;
  58. import javax.servlet.http.HttpServletResponse;
  59. import java.math.BigDecimal;
  60. import java.sql.SQLException;
  61. import java.text.SimpleDateFormat;
  62. import java.time.LocalDateTime;
  63. import java.time.format.DateTimeFormatter;
  64. import java.util.*;
  65. /**
  66. * @author qingwu
  67. * @date 2024/8/30
  68. * @apiNote BackCalculateService 反算服务 TaxPaymentBackCalculate
  69. */
  70. public class CmpCalDynamicListHandlerExExEx extends CmpCalDynamicListHandlerExEx {
  71. private Context ctx = SHRContext.getInstance().getContext();
  72. Logger logger = Logger.getLogger("com.kingdee.eas.custom.compensation.handler.CmpCalDynamicListHandlerExExEx");
  73. /**
  74. * 税款反算
  75. *
  76. * @param request
  77. * @param response
  78. * @param modelMap
  79. * @throws ShrWebBizException
  80. * @throws BOSException
  81. */
  82. public void taxPaymentBackCalculateAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException, BOSException, EASBizException {
  83. //计算规则ID
  84. String cmpschemeid = request.getParameter("cmpschemeid");
  85. if (StringUtils.isEmpty(cmpschemeid)) {
  86. throw new ShrWebBizException("计算规则ID不可为空!!");
  87. }
  88. Map rseMap = new HashMap();
  89. List resList = new ArrayList();
  90. //接口日志实体
  91. LogInfoInfo logInfo = new LogInfoInfo();
  92. //入口
  93. logInfo.setEntrance(this.getClass().getName());
  94. logInfo.setBizDate(new Date());
  95. try {
  96. //计算规则
  97. ICalScheme iCalScheme = CalSchemeFactory.getLocalInstance(ctx);
  98. ITaxUnit iTaxUnit = TaxUnitFactory.getLocalInstance(ctx);
  99. IPerson iPerson = PersonFactory.getLocalInstance(ctx);
  100. SelectorItemCollection sic = new SelectorItemCollection();
  101. sic.add("taxItemPlanList.taxItemPlan.name");
  102. sic.add("taxItemPlanList.taxItemPlan.number");
  103. sic.add("*");
  104. FilterInfo filterInfo = new FilterInfo();
  105. filterInfo.getFilterItems().add(new FilterItemInfo("id", cmpschemeid, CompareType.EQUALS));
  106. EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  107. CalSchemeInfo calSchemeInfo = iCalScheme.getCalSchemeCollection(entityViewInfo).get(0);
  108. //获取当前的薪酬核算
  109. CmpCalTableCollection cmpCalTableCollection = getCalSchemeColl(calSchemeInfo.getId().toString(), calSchemeInfo.getPeriodYear(), calSchemeInfo.getPeriodMonth());
  110. logger.error("cmpCalTableCollection--------" + cmpCalTableCollection.size());
  111. //获取所有人和纳税单位
  112. List<TaxUnitAndPerson> taxUnitAndPeople = new ArrayList();
  113. if (cmpCalTableCollection.size() > 0) {
  114. for (int i = 0; i < cmpCalTableCollection.size(); i++) {
  115. String personId = cmpCalTableCollection.get(i).getPerson().getId().toString();
  116. //查询是否存在税后保实发
  117. Integer abroadIncome = getAbroadIncome(personId, cmpschemeid);
  118. logger.error("abroadIncome-----------" + personId + "--------------" + cmpschemeid);
  119. if (abroadIncome != null) {
  120. //获取纳税单位
  121. String sql = getSalaryOrgMappingByPersonId(personId);
  122. logger.error("getSalaryOrgMappingByPersonId--------" + sql);
  123. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  124. String taxUnitId = null;
  125. while (iRowSet.next()) {
  126. taxUnitId = iRowSet.getString("taxunit");
  127. }
  128. if (!StringUtils.isEmpty(taxUnitId)) {
  129. //throw new ShrWebBizException("员工ID:" + personId + "未获取到纳税单位!!");
  130. TaxUnitAndPerson taxUnitAndPerson = new TaxUnitAndPerson(taxUnitId, personId);
  131. taxUnitAndPeople.add(taxUnitAndPerson);
  132. }
  133. }
  134. }
  135. }
  136. logger.error("taxUnitAndPeople-----------" + taxUnitAndPeople);
  137. // 通过纳税单位分组
  138. Map<String, List<TaxUnitAndPerson>> groupedPeople = new HashMap<>();
  139. for (TaxUnitAndPerson taxUnitAndPerson : taxUnitAndPeople) {
  140. String taxunitId = taxUnitAndPerson.getTaxunitId();
  141. if (!groupedPeople.containsKey(taxunitId)) {
  142. groupedPeople.put(taxunitId, new ArrayList<>());
  143. }
  144. groupedPeople.get(taxunitId).add(taxUnitAndPerson);
  145. }
  146. logger.error("groupedPeople-----------" + groupedPeople);
  147. // 输出分组结果
  148. for (Map.Entry<String, List<TaxUnitAndPerson>> entry : groupedPeople.entrySet()) {
  149. logger.error("输出分组结果------------start");
  150. logger.error("taxunitId: " + entry.getKey());
  151. //自定义类 反算服务
  152. SixTConfirmInfo sixTConfirmInfo = new SixTConfirmInfo();
  153. //外部业务编号
  154. sixTConfirmInfo.setBizNo(UUID.randomUUID().toString().replace("-", ""));
  155. //纳税单位
  156. String taxunitId = entry.getKey();
  157. TaxUnitInfo taxUnitInfo = iTaxUnit.getTaxUnitInfo("where id = '" + taxunitId + "'");
  158. //个税方案
  159. TaxItemPlanInfo taxItemPlan = calSchemeInfo.getTaxItemPlanList().get(0).getTaxItemPlan();
  160. String taxItemPlanNumber = taxItemPlan.getNumber();
  161. String taxItemPlanName = taxItemPlan.getName();
  162. JSONObject jsonObject = new JSONObject();
  163. jsonObject.put("periodYear", calSchemeInfo.getPeriodYear());
  164. jsonObject.put("periodMonth", calSchemeInfo.getPeriodMonth());
  165. jsonObject.put("cmpschemeid", cmpschemeid);
  166. jsonObject.put("taxItemPlanName", taxItemPlanName);
  167. jsonObject.put("taxItemPlanNumber", taxItemPlanNumber);
  168. logger.error("jsonObject-------------" + jsonObject);
  169. //反算服务
  170. ClientProxyFactory clientProxyFactory = ClientProxyFactoryUtils.getClientProxyFactory();
  171. //算税请求接口
  172. TaxRequest taxRequest = clientProxyFactory.getTaxRequest();
  173. //获取请求参数
  174. CalculateIndividualIncomeTaxRequest calculateIndividualIncomeTaxRequest = getCalculateIndividualIncomeTaxRequest(entry, taxUnitInfo, taxItemPlanNumber, taxItemPlanName, cmpschemeid, logInfo);
  175. //调用反算服务接口
  176. ApiResponse<AsyncResult> asyncResultApiResponse = clientProxyFactory.getTaxRequest().reverseCalculateASynIndividualIncomeTax(calculateIndividualIncomeTaxRequest);
  177. logger.error("asyncResultApiResponse-----getCode-------" + asyncResultApiResponse.getHead().getCode());
  178. logger.error("asyncResultApiResponse-----getMsg--------" + asyncResultApiResponse.getHead().getMsg());
  179. if (asyncResultApiResponse.getHead().getCode().equals("00000000")) {
  180. AsyncResult body = asyncResultApiResponse.getBody();
  181. String requestId = body.getRequestId();
  182. logger.error("requestId-----" + requestId);
  183. //查询反算反馈结果
  184. ISYUtilsFacade isyUtilsFacade = SYUtilsFacadeFactory.getLocalInstance(ctx);
  185. //backTask(url,requestId,回调osf服务,自定义参数,任务类型)
  186. //isyUtilsFacade.backTask(isyUtilsFacade.getConfig().get("ip") + "/gateway/iit/reverseCalculateTax/getASynIndividualIncomeTaxFeedback", requestId, "synIndividualIncomeTaxService", jsonObject.toString(), TaskCatalogEnum.CAL_GET);
  187. JSONObject json = new JSONObject();
  188. json.put("requestId", requestId);
  189. json.put("param", jsonObject.toString());
  190. isyUtilsFacade.addTask("synIndividualIncomeTaxService", json.toJSONString(), TaskCatalogEnum.UN_CAL_GET, "");
  191. //isyUtilsFacade.backTask("https://test-openapi.17win.com/gateway/iit/reverseCalculateTax/getASynIndividualIncomeTaxFeedback", requestId, "synIndividualIncomeTaxService", jsonObject.toString(), TaskCatalogEnum.CAL_GET);
  192. //查询反算反馈结果
  193. //ISYUtilsFacade isyUtilsFacade = SYUtilsFacadeFactory.getLocalInstance(ctx);
  194. //backTask(url,requestId,回调osf服务,自定义参数,任务类型)
  195. //isyUtilsFacade.backTask(isyUtilsFacade.getConfig().get("ip") + "/gateway/iit/reverseCalculateTax/getASynIndividualIncomeTaxFeedback", requestId, "synIndividualIncomeTaxService", "", TaskCatalogEnum.CAL_GET);
  196. //isyUtilsFacade.backTask("https://test-openapi.17win.com/gateway/iit/reverseCalculateTax/getASynIndividualIncomeTaxFeedback", requestId, "synIndividualIncomeTaxService", jsonObject.toString(), TaskCatalogEnum.CAL_GET);
  197. //ApiResponse<CalculateTaxResultRequest> aSynIndividualIncomeTaxFeedback = null;
  198. //boolean istrue = true;
  199. //while (istrue) {
  200. // //ApiResponse<CalculateTaxResultRequest> aSynIndividualIncomeTaxFeedback = taxRequest.getReverseASynIndividualIncomeTaxFeedback(requestId);
  201. // aSynIndividualIncomeTaxFeedback = taxRequest.getReverseASynIndividualIncomeTaxFeedback(requestId);
  202. // //ApiResponse<CalculateTaxResultRequest> aSynIndividualIncomeTaxFeedback =taxRequest.getReverseASynIndividualIncomeTaxFeedback("9a538f46af784ec6b78fa6e2e10e7037");
  203. // String code = aSynIndividualIncomeTaxFeedback.getHead().getCode();
  204. // if (!"100004".equals(code)) {
  205. // istrue = false;
  206. // }
  207. // logger.error("getCode---" + aSynIndividualIncomeTaxFeedback.getHead().getCode());
  208. // logger.error("getMsg---" + aSynIndividualIncomeTaxFeedback.getHead().getMsg());
  209. // // 等待一段时间再进行下一次轮询,这里设置为 5 秒(5000 毫秒)
  210. // Thread.sleep(3000);
  211. //}
  212. //CalculateTaxResultRequest resBody = aSynIndividualIncomeTaxFeedback.getBody();
  213. ////个税反算保存方法
  214. //String saveId = addTaxPaymentBackCalculate(resBody, jsonObject);
  215. //resList.add(saveId);
  216. }
  217. }
  218. rseMap.put("msg", "已增加至后台事务中执行!");
  219. } catch (Exception e) {
  220. e.printStackTrace();
  221. logInfo.setErrorInfo(e.getMessage());//错误信息
  222. LogInfoFactory.getLocalInstance(ctx).save(logInfo);
  223. rseMap.put("msg", e.getMessage());
  224. throw new SHRWebException(e);
  225. }
  226. JSONUtils.SUCCESS(rseMap);
  227. }
  228. /**
  229. * 获取请求参数
  230. *
  231. * @param entry
  232. * @param taxUnitInfo
  233. * @param taxItemPlanNumber
  234. * @param taxItemPlanName
  235. * @param cmpschemeid
  236. * @param logInfo
  237. * @throws BOSException
  238. * @throws EASBizException
  239. * @throws SQLException
  240. * @throws JsonProcessingException
  241. */
  242. private CalculateIndividualIncomeTaxRequest getCalculateIndividualIncomeTaxRequest(Map.Entry<String, List<TaxUnitAndPerson>> entry, TaxUnitInfo taxUnitInfo, String taxItemPlanNumber, String taxItemPlanName, String cmpschemeid, LogInfoInfo logInfo) throws BOSException, EASBizException, SQLException, JsonProcessingException {
  243. CalculateIndividualIncomeTaxRequest calculateIndividualIncomeTaxRequest = new CalculateIndividualIncomeTaxRequest();
  244. //外部业务编号
  245. String replace = UUID.randomUUID().toString().replace("-", "");
  246. logger.error("BizNo" + replace);
  247. calculateIndividualIncomeTaxRequest.setBizNo(replace);
  248. //企业名称(纳税单位)
  249. calculateIndividualIncomeTaxRequest.setName(taxUnitInfo.getName());
  250. //calculateIndividualIncomeTaxRequest.setName("荆州九州通医药有限公司00");
  251. //申报密码
  252. logger.error("taxUnitInfo----" + taxUnitInfo);
  253. logger.error("declPassword----" + taxUnitInfo.getDeclPassword());
  254. String sbmm = new String(Base64.getDecoder().decode(taxUnitInfo.getDeclPassword()));
  255. //String sbmm = new String(Base64.getDecoder().decode("QWExMjM0NTY="));
  256. logger.error("sbmm----" + sbmm);
  257. calculateIndividualIncomeTaxRequest.setDeclarePassword(sbmm);
  258. //密码类型
  259. calculateIndividualIncomeTaxRequest.setPasswordType(null);
  260. //实名账号
  261. calculateIndividualIncomeTaxRequest.setRealNameAccount(null);
  262. //实名密码
  263. calculateIndividualIncomeTaxRequest.setRealNamePassword(null);
  264. //加密实名密码
  265. calculateIndividualIncomeTaxRequest.setEncryptedRealNamePassword(null);
  266. //登记序号
  267. calculateIndividualIncomeTaxRequest.setRegistrationNumber(taxUnitInfo.getRegNumber());
  268. //calculateIndividualIncomeTaxRequest.setRegistrationNumber("10117310124834931897");
  269. //税号
  270. calculateIndividualIncomeTaxRequest.setTaxNo(taxUnitInfo.getTaxNumber());
  271. //calculateIndividualIncomeTaxRequest.setTaxNo("91310124834931897I");
  272. //地区编号
  273. calculateIndividualIncomeTaxRequest.setArea(taxUnitInfo.getAreaCode());
  274. //calculateIndividualIncomeTaxRequest.setArea("310101");
  275. //部门编号
  276. calculateIndividualIncomeTaxRequest.setDeptNo(null);
  277. //部门名称
  278. calculateIndividualIncomeTaxRequest.setDeptName(null);
  279. //税款所属期
  280. //获取当前年月
  281. LocalDateTime now = LocalDateTime.now();
  282. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
  283. String formattedDate = now.format(formatter);
  284. calculateIndividualIncomeTaxRequest.setMonth(formattedDate);
  285. //获取员工数据
  286. IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
  287. Set personIds = new HashSet();
  288. for (TaxUnitAndPerson taxUnitAndPerson : entry.getValue()) {
  289. logger.error("personId" + taxUnitAndPerson.getPersonId());
  290. String personId = taxUnitAndPerson.getPersonId();
  291. personIds.add(personId);
  292. }
  293. FilterInfo personFilterInfo = new FilterInfo();
  294. personFilterInfo.getFilterItems().add(new FilterItemInfo("person.id", personIds, CompareType.INCLUDE));
  295. SelectorItemCollection personSic = new SelectorItemCollection();
  296. personSic.add("*");
  297. personSic.add("person.*");
  298. personSic.add("person.employeeType.*");
  299. personSic.add("person.nationality.*");
  300. EntityViewInfo personEntityViewInfo = EntityViewInfo.getInstance(personFilterInfo, personSic, null);
  301. PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(personEntityViewInfo);
  302. logger.error("personPositionCollection------------size" + personPositionCollection.size());
  303. //综合所得对象
  304. ComplexIncomeRequest complexIncomeRequest = getComplexIncomeRequest(taxItemPlanNumber, taxItemPlanName, personPositionCollection, cmpschemeid);
  305. logger.error("complexIncomeRequest------------" + complexIncomeRequest);
  306. //综合所得
  307. calculateIndividualIncomeTaxRequest.setComplexIncomeRequest(complexIncomeRequest);
  308. //非居民所得
  309. //NonResidentsIncomeRequest nonResidentsIncomeRequest = getNonResidentsIncomeRequest(taxItemPlanName, personInfo, cmpschemeid);
  310. logger.error("输出分组结果------------end");
  311. logInfo.setInterfaceAddress("gateway/iit/reverseCalculateTax/calculateASynIndividualIncomeTax");//接口地址
  312. logInfo.setInterfaceName("calculateASynIndividualIncomeTax");//接口名
  313. ObjectMapper mapper = new ObjectMapper();
  314. logInfo.setInParameter(mapper.writeValueAsString(calculateIndividualIncomeTaxRequest));//入参
  315. return calculateIndividualIncomeTaxRequest;
  316. }
  317. ///**
  318. // * 税款反算
  319. // *
  320. // * @param request
  321. // * @param response
  322. // * @param modelMap
  323. // * @throws ShrWebBizException
  324. // * @throws BOSException
  325. // */
  326. //public void taxPaymentBackCalculateAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException, BOSException, SQLException, EASBizException, InterruptedException {
  327. // //计算规则ID
  328. // String cmpschemeid = request.getParameter("cmpschemeid");
  329. // if (StringUtils.isEmpty(cmpschemeid)) {
  330. // throw new ShrWebBizException("计算规则ID不可为空!!");
  331. // }
  332. // //计算规则
  333. // ICalScheme iCalScheme = CalSchemeFactory.getLocalInstance(ctx);
  334. // ITaxUnit iTaxUnit = TaxUnitFactory.getLocalInstance(ctx);
  335. // IPerson iPerson = PersonFactory.getLocalInstance(ctx);
  336. // SelectorItemCollection sic = new SelectorItemCollection();
  337. // sic.add("taxItemPlanList.taxItemPlan.name");
  338. // sic.add("taxItemPlanList.taxItemPlan.number");
  339. // sic.add("*");
  340. // FilterInfo filterInfo = new FilterInfo();
  341. // filterInfo.getFilterItems().add(new FilterItemInfo("id", cmpschemeid, CompareType.EQUALS));
  342. // EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  343. // CalSchemeInfo calSchemeInfo = iCalScheme.getCalSchemeCollection(entityViewInfo).get(0);
  344. // //获取当前的薪酬核算
  345. // CmpCalTableCollection cmpCalTableCollection = getCalSchemeColl(calSchemeInfo.getId().toString(), calSchemeInfo.getPeriodYear(), calSchemeInfo.getPeriodMonth());
  346. // logger.error("cmpCalTableCollection--------" + cmpCalTableCollection.size());
  347. // Map rseMap = new HashMap();
  348. // List resList = new ArrayList();
  349. // if (cmpCalTableCollection.size() > 0) {
  350. // for (int i = 0; i < cmpCalTableCollection.size(); i++) {
  351. // String personId = cmpCalTableCollection.get(i).getPerson().getId().toString();
  352. // //自定义类 反算服务
  353. // SixTConfirmInfo sixTConfirmInfo = new SixTConfirmInfo();
  354. // //外部业务编号
  355. // sixTConfirmInfo.setBizNo(UUID.randomUUID().toString().replace("-", ""));
  356. // //获取纳税单位
  357. // String sql = getSalaryOrgMappingByPersonId(personId);
  358. // logger.error("getSalaryOrgMappingByPersonId--------" + sql);
  359. // IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  360. // if (iRowSet.size() <= 0) {
  361. // throw new ShrWebBizException("员工ID:" + personId + "未获取到纳税单位!!");
  362. // }
  363. // TaxUnitInfo taxUnitInfo = null;
  364. // while (iRowSet.next()) {
  365. // taxUnitInfo = iTaxUnit.getTaxUnitInfo("where id = '" + iRowSet.getString("taxunit") + "'");
  366. // }
  367. // //个税方案
  368. // TaxItemPlanInfo taxItemPlan = calSchemeInfo.getTaxItemPlanList().get(0).getTaxItemPlan();
  369. // String taxItemPlanNumber = taxItemPlan.getNumber();
  370. // String taxItemPlanName = taxItemPlan.getName();
  371. // //String taxItemPlanNumber = "2024083001";
  372. // JSONObject jsonObject = new JSONObject();
  373. // jsonObject.put("personId", personId);
  374. // jsonObject.put("periodYear", calSchemeInfo.getPeriodYear());
  375. // jsonObject.put("periodMonth", calSchemeInfo.getPeriodMonth());
  376. // jsonObject.put("cmpschemeid", cmpschemeid);
  377. // jsonObject.put("taxItemPlanName", taxItemPlanName);
  378. // jsonObject.put("taxItemPlanNumber", taxItemPlanNumber);
  379. // logger.error("jsonObject-------------" + jsonObject);
  380. // ClientProxyFactory clientProxyFactory = new ClientProxyFactory(
  381. // "46639607259987202405271637080",
  382. // "oTmd/QGL2xOfIKItqFGKnw==",
  383. // "https://test-openapi.17win.com");
  384. // //反算服务
  385. // //算税请求接口
  386. // TaxRequest taxRequest = clientProxyFactory.getTaxRequest();
  387. // CalculateIndividualIncomeTaxRequest calculateIndividualIncomeTaxRequest = new CalculateIndividualIncomeTaxRequest();
  388. // //外部业务编号
  389. // String replace = UUID.randomUUID().toString().replace("-", "");
  390. // logger.error("BizNo" + replace);
  391. // calculateIndividualIncomeTaxRequest.setBizNo(replace);
  392. // //企业名称(纳税单位)
  393. // calculateIndividualIncomeTaxRequest.setName(taxUnitInfo.getName());
  394. // //calculateIndividualIncomeTaxRequest.setName("荆州九州通医药有限公司00");
  395. // //申报密码
  396. // String sbmm = new String(Base64.getDecoder().decode(taxUnitInfo.getDeclPassword()));
  397. // //String sbmm = new String(Base64.getDecoder().decode("QWExMjM0NTY="));
  398. // logger.error("sbmm----" + sbmm);
  399. // calculateIndividualIncomeTaxRequest.setDeclarePassword(sbmm);
  400. // //密码类型
  401. // calculateIndividualIncomeTaxRequest.setPasswordType(null);
  402. // //实名账号
  403. // calculateIndividualIncomeTaxRequest.setRealNameAccount(null);
  404. // //实名密码
  405. // calculateIndividualIncomeTaxRequest.setRealNamePassword(null);
  406. // //加密实名密码
  407. // calculateIndividualIncomeTaxRequest.setEncryptedRealNamePassword(null);
  408. // //登记序号
  409. // calculateIndividualIncomeTaxRequest.setRegistrationNumber(taxUnitInfo.getRegNumber());
  410. // //calculateIndividualIncomeTaxRequest.setRegistrationNumber("10117310124834931897");
  411. // //税号
  412. // calculateIndividualIncomeTaxRequest.setTaxNo(taxUnitInfo.getTaxNumber());
  413. // //calculateIndividualIncomeTaxRequest.setTaxNo("91310124834931897I");
  414. // //地区编号
  415. // calculateIndividualIncomeTaxRequest.setArea(taxUnitInfo.getAreaCode());
  416. // //calculateIndividualIncomeTaxRequest.setArea("310101");
  417. // //部门编号
  418. // calculateIndividualIncomeTaxRequest.setDeptNo(null);
  419. // //部门名称
  420. // calculateIndividualIncomeTaxRequest.setDeptName(null);
  421. // //税款所属期
  422. // //获取当前年月
  423. // LocalDateTime now = LocalDateTime.now();
  424. // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
  425. // String formattedDate = now.format(formatter);
  426. // calculateIndividualIncomeTaxRequest.setMonth(formattedDate);
  427. // //获取员工数据
  428. // IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx);
  429. // PersonPositionInfo personPositionInfo = iPersonPosition.getPersonPositionInfo("select *,person.*,person.employeeType.* ,person.nationality.* where person.id = '" + personId + "'");
  430. // //PersonInfo personInfo = iPerson.getPersonInfo(new ObjectUuidPK(personId));
  431. // PersonInfo personInfo = personPositionInfo.getPerson();
  432. // //综合所得对象
  433. // ComplexIncomeRequest complexIncomeRequest = getComplexIncomeRequest(taxItemPlanNumber, taxItemPlanName, personInfo, cmpschemeid);
  434. // //综合所得
  435. // calculateIndividualIncomeTaxRequest.setComplexIncomeRequest(complexIncomeRequest);
  436. // //非居民所得
  437. // NonResidentsIncomeRequest nonResidentsIncomeRequest = getNonResidentsIncomeRequest(taxItemPlanName, personInfo, cmpschemeid);
  438. // calculateIndividualIncomeTaxRequest.setNonResidentsIncomeRequest(nonResidentsIncomeRequest);
  439. //
  440. // ApiResponse<AsyncResult> asyncResultApiResponse = clientProxyFactory.getTaxRequest().reverseCalculateASynIndividualIncomeTax(calculateIndividualIncomeTaxRequest);
  441. // logger.error("asyncResultApiResponse-----getCode-------" + asyncResultApiResponse.getHead().getCode());
  442. // logger.error("asyncResultApiResponse-----getMsg--------" + asyncResultApiResponse.getHead().getMsg());
  443. // if (asyncResultApiResponse.getHead().getCode().equals("00000000")) {
  444. // AsyncResult body = asyncResultApiResponse.getBody();
  445. // String requestId = body.getRequestId();
  446. // logger.error("requestId-----" + requestId);
  447. // //查询反算反馈结果
  448. // //ISYUtilsFacade isyUtilsFacade = SYUtilsFacadeFactory.getLocalInstance(ctx);
  449. // //backTask(url,requestId,回调osf服务,自定义参数,任务类型)
  450. // //isyUtilsFacade.backTask(isyUtilsFacade.getConfig().get("ip") + "/gateway/iit/reverseCalculateTax/getASynIndividualIncomeTaxFeedback", requestId, "synIndividualIncomeTaxService", "", TaskCatalogEnum.CAL_GET);
  451. // //isyUtilsFacade.backTask("https://test-openapi.17win.com/gateway/iit/reverseCalculateTax/getASynIndividualIncomeTaxFeedback", requestId, "synIndividualIncomeTaxService", jsonObject.toString(), TaskCatalogEnum.CAL_GET);
  452. // ApiResponse<CalculateTaxResultRequest> aSynIndividualIncomeTaxFeedback = null;
  453. // boolean istrue = true;
  454. // while (istrue) {
  455. // //ApiResponse<CalculateTaxResultRequest> aSynIndividualIncomeTaxFeedback = taxRequest.getReverseASynIndividualIncomeTaxFeedback(requestId);
  456. // aSynIndividualIncomeTaxFeedback = taxRequest.getReverseASynIndividualIncomeTaxFeedback(requestId);
  457. // //ApiResponse<CalculateTaxResultRequest> aSynIndividualIncomeTaxFeedback =taxRequest.getReverseASynIndividualIncomeTaxFeedback("9a538f46af784ec6b78fa6e2e10e7037");
  458. // String code = aSynIndividualIncomeTaxFeedback.getHead().getCode();
  459. // if (!"100004".equals(code)) {
  460. // istrue = false;
  461. // }
  462. // logger.error("getCode---" + aSynIndividualIncomeTaxFeedback.getHead().getCode());
  463. // logger.error("getMsg---" + aSynIndividualIncomeTaxFeedback.getHead().getMsg());
  464. // // 等待一段时间再进行下一次轮询,这里设置为 5 秒(5000 毫秒)
  465. // Thread.sleep(3000);
  466. // }
  467. // CalculateTaxResultRequest resBody = aSynIndividualIncomeTaxFeedback.getBody();
  468. // //个税反算保存方法
  469. // String saveId = addTaxPaymentBackCalculate(resBody, jsonObject);
  470. // resList.add(saveId);
  471. // }
  472. // }
  473. // rseMap.put("resListSize", resList.size());
  474. // rseMap.put("resList", resList);
  475. // JSONUtils.writeJson(response, rseMap);
  476. // }
  477. //}
  478. /**
  479. * 添加个税反算数据
  480. *
  481. * @param resBody 查询反算反馈结果接口返回结果
  482. * @param param 员工ID
  483. * @return
  484. */
  485. public String addTaxPaymentBackCalculate(CalculateTaxResultRequest resBody, com.alibaba.fastjson.JSONObject param) throws BOSException, EASBizException {
  486. logger.error("addTaxPaymentBackCalculate============Start===============");
  487. String personId = param.getString("personId");//员工ID
  488. String periodYear = param.getString("periodYear");//统计年
  489. String periodMonth = param.getString("periodMonth");//统计月
  490. String cmpschemeid = param.getString("cmpschemeid");//计算规则ID
  491. String taxItemPlanName = param.getString("taxItemPlanName");//个税项目方案
  492. String taxItemPlanNumber = param.getString("taxItemPlanNumber");//个税项目方案
  493. //查询税款反算表是否存在该数据
  494. ITaxPaymentBackCalculate iTaxPaymentBackCalculate = TaxPaymentBackCalculateFactory.getLocalInstance(ctx);
  495. FilterInfo filterInfo = new FilterInfo();
  496. filterInfo.getFilterItems().add(new FilterItemInfo("person", personId, CompareType.EQUALS));
  497. filterInfo.getFilterItems().add(new FilterItemInfo("periodMonth", periodMonth, CompareType.EQUALS));
  498. filterInfo.getFilterItems().add(new FilterItemInfo("periodYear", periodYear, CompareType.EQUALS));
  499. filterInfo.getFilterItems().add(new FilterItemInfo("cmpscheme", cmpschemeid, CompareType.EQUALS));
  500. EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, null, null);
  501. TaxPaymentBackCalculateCollection taxPaymentBackCalculateCollection = iTaxPaymentBackCalculate.getTaxPaymentBackCalculateCollection(entityViewInfo);
  502. TaxPaymentBackCalculateInfo taxPaymentBackCalculateInfo = new TaxPaymentBackCalculateInfo();
  503. if (taxPaymentBackCalculateCollection.size() > 0) {
  504. taxPaymentBackCalculateInfo = taxPaymentBackCalculateCollection.get(0);
  505. taxPaymentBackCalculateInfo.setId(taxPaymentBackCalculateCollection.get(0).getId());
  506. }
  507. //员工
  508. taxPaymentBackCalculateInfo.setPerson(PersonFactory.getLocalInstance(ctx).getPersonInfo(new ObjectUuidPK(personId)));
  509. //统计年
  510. taxPaymentBackCalculateInfo.setPeriodYear(periodYear);
  511. //统计月
  512. taxPaymentBackCalculateInfo.setPeriodMonth(periodMonth);
  513. //计算规则
  514. taxPaymentBackCalculateInfo.setCmpscheme(CalSchemeFactory.getLocalInstance(ctx).getCalSchemeInfo(new ObjectUuidPK(cmpschemeid)));
  515. //个税项目方案
  516. taxPaymentBackCalculateInfo.setTaxItemPlan(taxItemPlanName);
  517. ComplexTaxCalculateResult complexTaxCalculateResult = null;
  518. //zhsd 综合所得
  519. ComplexIncomeResultRequest complexIncomeResultRequest = resBody.getComplexIncomeResultRequest();
  520. //全年一次性奖金
  521. if ("2024083001".equals(taxItemPlanNumber)) {
  522. //qnycxjjsslb 全年一次性奖金
  523. complexTaxCalculateResult = complexIncomeResultRequest.getAnnualOneTimeBonusIncome();
  524. }
  525. //一般劳务报酬所得列表
  526. if ("2024083003".equals(taxItemPlanNumber)) {
  527. //lwbclb 一般劳务报酬所得列表
  528. complexTaxCalculateResult = complexIncomeResultRequest.getLaborRemunerationIncome();
  529. }
  530. //正常工资薪金对象
  531. if ("2024083004".equals(taxItemPlanNumber)) {
  532. //zcgzxj 正常工资薪金对象
  533. complexTaxCalculateResult = complexIncomeResultRequest.getNormalSalarySpecIncome();
  534. }
  535. List<ComplexIncome> successComplexIncomes = complexTaxCalculateResult.getSuccessComplexIncomes();
  536. ComplexIncome complexIncome = successComplexIncomes.get(0);
  537. //sre 收入额
  538. BigDecimal income = complexIncome.getIncome();
  539. taxPaymentBackCalculateInfo.setSalarySum(income);
  540. //ybtse refundTax 应补退税额
  541. BigDecimal refundTax = complexIncome.getRefundTax();
  542. taxPaymentBackCalculateInfo.setIndividual(refundTax);
  543. IObjectPK save = iTaxPaymentBackCalculate.save(taxPaymentBackCalculateInfo);
  544. logger.error("addTaxPaymentBackCalculate============end===============");
  545. return save.toString();
  546. }
  547. /**
  548. * 获取非居民所得 对象
  549. *
  550. * @return
  551. */
  552. public NonResidentsIncomeRequest getNonResidentsIncomeRequest(String taxItemPlanName, PersonInfo personInfo, String cmpschemeid) throws SQLException, BOSException {
  553. NonResidentsIncomeRequest nonResidentsIncomeRequest = new NonResidentsIncomeRequest();
  554. List<NonResidentsIncome> foreignerWagesSalaryIncomes = new ArrayList();
  555. NonResidentsIncome nonResidentsIncome = getNonResidentsIncome(taxItemPlanName, personInfo, cmpschemeid);
  556. foreignerWagesSalaryIncomes.add(nonResidentsIncome);
  557. nonResidentsIncomeRequest.setForeignerWagesSalaryIncomes(foreignerWagesSalaryIncomes);
  558. return nonResidentsIncomeRequest;
  559. }
  560. /**
  561. * 非居民所得-无住所个人正常工资薪金
  562. * * taxItemPlanName 个税项目名称
  563. * * personInfo 员工信息
  564. * * cmpschemeid 计算规则ID
  565. */
  566. public NonResidentsIncome getNonResidentsIncome(String taxItemPlanName, PersonInfo personInfo, String cmpschemeid) throws SQLException, BOSException {
  567. NonResidentsIncome nonResidentsIncome = new NonResidentsIncome();
  568. //nonResidentsIncome.setName("何云");
  569. //nonResidentsIncome.setLicenseType("居民身份证");
  570. //nonResidentsIncome.setLicenseNumber("429004198601085125");
  571. //nonResidentsIncome.setAbroadIncome(new BigDecimal("8000"));
  572. //nonResidentsIncome.setIncomeItemName("无住所个人正常工资薪金");
  573. //姓名
  574. nonResidentsIncome.setName(personInfo.getName());
  575. //complexIncome.setName("何云");
  576. //居民身份证
  577. if (personInfo.getIdCardNO() != null) {
  578. //证照号码
  579. nonResidentsIncome.setLicenseNumber(personInfo.getIdCardNO());
  580. //证照类型
  581. nonResidentsIncome.setLicenseType("居民身份证");
  582. }
  583. //中国护照不
  584. if (personInfo.getPassportNO() != null) {
  585. //证照类型
  586. nonResidentsIncome.setLicenseType("中国护照");
  587. //证照号码
  588. nonResidentsIncome.setLicenseNumber(personInfo.getPassportNO());
  589. }
  590. Integer abroadIncome = getAbroadIncome(personInfo.getId().toString(), cmpschemeid);
  591. //complexIncome.setLicenseNumber("429004198601085125");
  592. //税后收入额
  593. //nonResidentsIncome.setAbroadIncome(new BigDecimal(abroadIncome));
  594. nonResidentsIncome.setIncomeItemName(taxItemPlanName);
  595. return nonResidentsIncome;
  596. }
  597. /**
  598. * 获取综合所得
  599. * taxItemPlanNumber 个税项目编码
  600. * taxItemPlanName 个税项目名称
  601. * personInfo 员工信息
  602. * cmpschemeid 计算规则ID
  603. *
  604. * @return
  605. */
  606. public ComplexIncomeRequest getComplexIncomeRequest(String taxItemPlanNumber, String taxItemPlanName, PersonPositionCollection personPositionCollection, String cmpschemeid) throws BOSException, EASBizException, SQLException {
  607. logger.error("getComplexIncomeRequest-----" + taxItemPlanNumber + "---" + taxItemPlanName + "---" + personPositionCollection + "---" + cmpschemeid);
  608. ComplexIncomeRequest complexIncomeRequest = new ComplexIncomeRequest();
  609. //全年一次性奖金
  610. if (taxItemPlanNumber.equals("2024083001")) {
  611. List<ComplexIncome> aOneBonusIncomeList = new ArrayList();
  612. for (int i = 0; i < personPositionCollection.size(); i++) {
  613. PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
  614. PersonInfo personInfo = personPositionInfo.getPerson();
  615. logger.error("getAbroadIncome-----" + personInfo.getName() + "-----------" + getAbroadIncome(personInfo.getId().toString(), cmpschemeid));
  616. if (getAbroadIncome(personInfo.getId().toString(), cmpschemeid) != null || getAbroadIncome(personInfo.getId().toString(), cmpschemeid) != 0) {
  617. ComplexIncome annualOneTimeBonusIncome = getAnnualOneTimeBonusIncome(personInfo, taxItemPlanName, cmpschemeid);
  618. aOneBonusIncomeList.add(annualOneTimeBonusIncome);
  619. complexIncomeRequest.setAnnualOneTimeBonusIncome(aOneBonusIncomeList);
  620. }
  621. }
  622. }
  623. //一般劳务报酬所得列表
  624. if (taxItemPlanNumber.equals("2024083003")) {
  625. List<ComplexIncome> complexIncomeList = new ArrayList();
  626. for (int i = 0; i < personPositionCollection.size(); i++) {
  627. PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
  628. PersonInfo personInfo = personPositionInfo.getPerson();
  629. logger.error("getAbroadIncome-----" + personInfo.getName() + "-----------" + +getAbroadIncome(personInfo.getId().toString(), cmpschemeid));
  630. if (getAbroadIncome(personInfo.getId().toString(), cmpschemeid) != null || getAbroadIncome(personInfo.getId().toString(), cmpschemeid) != 0) {
  631. ComplexIncome laborRemunerationIncome = getLaborRemunerationIncome(personInfo, taxItemPlanName, cmpschemeid);
  632. complexIncomeList.add(laborRemunerationIncome);
  633. complexIncomeRequest.setLaborRemunerationIncome(complexIncomeList);
  634. }
  635. }
  636. }
  637. //正常工资薪金对象
  638. if (taxItemPlanNumber.equals("2024083004")) {
  639. NormalSalarySpecIncome normalSalarySpecIncome = getNormalSalarySpecIncome(personPositionCollection);
  640. complexIncomeRequest.setNormalSalarySpecIncome(normalSalarySpecIncome);
  641. }
  642. return complexIncomeRequest;
  643. }
  644. /**
  645. * 获取全年一次性奖金
  646. * taxItemPlanName 个税项目名称
  647. * cmpschemeid 计算规则ID
  648. *
  649. * @return
  650. */
  651. public ComplexIncome getAnnualOneTimeBonusIncome(PersonInfo personInfo, String taxItemPlanName, String cmpschemeid) throws SQLException, BOSException {
  652. ComplexIncome complexIncome = new ComplexIncome();
  653. //姓名
  654. complexIncome.setName(personInfo.getName());
  655. //complexIncome.setName("何云");
  656. //居民身份证
  657. if (personInfo.getIdCardNO() != null) {
  658. //证照号码
  659. complexIncome.setLicenseNumber(personInfo.getIdCardNO());
  660. //证照类型
  661. complexIncome.setLicenseType("居民身份证");
  662. }
  663. //中国护照不
  664. if (personInfo.getPassportNO() != null) {
  665. //证照类型
  666. complexIncome.setLicenseType("中国护照");
  667. //证照号码
  668. complexIncome.setLicenseNumber(personInfo.getPassportNO());
  669. }
  670. Integer abroadIncome = getAbroadIncome(personInfo.getId().toString(), cmpschemeid);
  671. //complexIncome.setLicenseNumber("429004198601085125");
  672. //税后收入额
  673. complexIncome.setAfterTaxIncome(new BigDecimal(abroadIncome));
  674. complexIncome.setIncomeItemName(taxItemPlanName);
  675. return complexIncome;
  676. }
  677. /**
  678. * 获取一般劳务报酬所得
  679. * taxItemPlanName 个税项目名称
  680. * cmpschemeid 计算规则ID
  681. *
  682. * @return
  683. */
  684. public ComplexIncome getLaborRemunerationIncome(PersonInfo personInfo, String taxItemPlanName, String cmpschemeid) throws SQLException, BOSException {
  685. ComplexIncome complexIncome = new ComplexIncome();
  686. //姓名
  687. complexIncome.setName(personInfo.getName());
  688. //complexIncome.setName("何云");
  689. //居民身份证
  690. if (personInfo.getIdCardNO() != null) {
  691. //证照号码
  692. complexIncome.setLicenseNumber(personInfo.getIdCardNO());
  693. //证照类型
  694. complexIncome.setLicenseType("居民身份证");
  695. }
  696. //中国护照不
  697. if (personInfo.getPassportNO() != null) {
  698. //证照类型
  699. complexIncome.setLicenseType("中国护照");
  700. //证照号码
  701. complexIncome.setLicenseNumber(personInfo.getPassportNO());
  702. }
  703. Integer abroadIncome = getAbroadIncome(personInfo.getId().toString(), cmpschemeid);
  704. //complexIncome.setLicenseNumber("429004198601085125");
  705. //税后收入额
  706. complexIncome.setAfterTaxIncome(new BigDecimal(abroadIncome));
  707. complexIncome.setIncomeItemName(taxItemPlanName);
  708. return complexIncome;
  709. }
  710. /**
  711. * 获取正常工资薪金对象
  712. *
  713. * @return
  714. */
  715. public NormalSalarySpecIncome getNormalSalarySpecIncome(PersonPositionCollection personPositionCollection) throws BOSException, EASBizException {
  716. //正常工资薪金对象
  717. NormalSalarySpecIncome normalSalarySpecIncome = new NormalSalarySpecIncome();
  718. //人员列表
  719. List<DetailCompanyEmployee> companyEmployeeList = new ArrayList();
  720. for (int i = 0; i < personPositionCollection.size(); i++) {
  721. PersonPositionInfo personPositionInfo = personPositionCollection.get(i);
  722. PersonInfo personInfo = personPositionInfo.getPerson();
  723. //获取人员数据
  724. DetailCompanyEmployee detailCompanyEmployee = getDetailCompanyEmployee(personInfo);
  725. companyEmployeeList.add(detailCompanyEmployee);
  726. }
  727. normalSalarySpecIncome.setCompanyEmployeeList(companyEmployeeList);
  728. return normalSalarySpecIncome;
  729. }
  730. /**
  731. * 人员
  732. *
  733. * @return
  734. */
  735. public DetailCompanyEmployee getDetailCompanyEmployee(PersonInfo personInfo) throws BOSException, EASBizException {
  736. //人员对象
  737. DetailCompanyEmployee detailCompanyEmployee = new DetailCompanyEmployee();
  738. ////姓名
  739. //detailCompanyEmployee.setName("何云");
  740. ////证件类型
  741. //detailCompanyEmployee.setLicenseType("居民身份证");
  742. ////证照号码
  743. //detailCompanyEmployee.setLicenseNumber("429004198601085125");
  744. //姓名
  745. detailCompanyEmployee.setName(personInfo.getName());
  746. //complexIncome.setName("何云");
  747. //居民身份证
  748. if (personInfo.getIdCardNO() != null) {
  749. //证照号码
  750. detailCompanyEmployee.setLicenseNumber(personInfo.getIdCardNO());
  751. //证照类型
  752. detailCompanyEmployee.setLicenseType("居民身份证");
  753. //人员地区
  754. detailCompanyEmployee.setArea("境内");
  755. }
  756. //中国护照
  757. if (personInfo.getPassportNO() != null) {
  758. //证照类型
  759. detailCompanyEmployee.setLicenseType("中国护照");
  760. //证照号码
  761. detailCompanyEmployee.setLicenseNumber(personInfo.getPassportNO());
  762. //人员地区
  763. detailCompanyEmployee.setArea("境外");
  764. }
  765. //电话号码
  766. detailCompanyEmployee.setPhone(personInfo.getCell());
  767. //人员状态
  768. detailCompanyEmployee.setState(personInfo.getEmployeeType().getName());
  769. //人员报税信息->任职受雇从业信息
  770. ITaxPersonRecordEntry iTaxPersonRecordEntry = TaxPersonRecordEntryFactory.getLocalInstance(ctx);
  771. TaxPersonRecordEntryCollection taxPersonRecordEntryCollection = iTaxPersonRecordEntry.getTaxPersonRecordEntryCollection("where person.id = '" + personInfo.getId() + "'");
  772. TaxPersonRecordEntryInfo taxPersonRecordEntryInfo = taxPersonRecordEntryCollection.get(0);
  773. //任职受雇类型 可选择雇员、保险营销员、证券经纪人、其他、实习学生(全日制学历教育)
  774. //detailCompanyEmployee.setIsEmployee("其他");
  775. detailCompanyEmployee.setIsEmployee(taxPersonRecordEntryInfo.getEmployedType().getAlias());
  776. //受雇日期 YYYY-MM-DD,不能大于当前时间,任职受雇类型选择雇员、保险营销员、证券经纪人时必录
  777. SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
  778. detailCompanyEmployee.setEmployedDate(inputFormat.format(taxPersonRecordEntryInfo.getEmployedDate()));
  779. //性别
  780. detailCompanyEmployee.setGender(personInfo.getGender().getAlias());
  781. //出生日期
  782. detailCompanyEmployee.setBirthday(inputFormat.format(personInfo.getBirthday()));
  783. //国籍 nationality
  784. NationalityInfo nationality = personInfo.getNationality();
  785. detailCompanyEmployee.setNationality(nationality.getName());
  786. return detailCompanyEmployee;
  787. }
  788. /**
  789. * 获取税后收入额 系统字段=税后保实发
  790. *
  791. * @param perosnId
  792. * @param cmpschemeid
  793. * @return
  794. */
  795. public Integer getAbroadIncome(String perosnId, String cmpschemeid) throws BOSException, SQLException {
  796. String sql = String.format("select S336 from T_HR_SCmpCalTable where FPERSONID = '%s' and FCALSCHEMEID = '%s'", perosnId, cmpschemeid);
  797. logger.error("getAbroadIncomeSql---------------" + sql);
  798. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  799. Integer abroadIncome = null;
  800. while (iRowSet.next()) {
  801. abroadIncome = iRowSet.getInt("S336");
  802. }
  803. return abroadIncome;
  804. }
  805. /**
  806. * 获取纳税单元
  807. *
  808. * @param personId
  809. * @return
  810. */
  811. public String getSalaryOrgMappingByPersonId(String personId) {
  812. StringBuilder sb = new StringBuilder();
  813. sb.append("select top 1 ").append("\n");
  814. sb.append("cmpOrgUnitCus.FTAXUNITID as taxunit").append("\n");
  815. sb.append("from CT_COM_CmpOrgUnitCus cmpOrgUnitCus").append("\n");
  816. sb.append("left join T_HR_SPersonCmp personCmp on personCmp.Fid = cmpOrgUnitCus.FPERSONCMPID").append("\n");
  817. sb.append("left join T_bd_person person on person.Fid = personCmp.FPERSONID").append("\n");
  818. sb.append("where").append("\n");
  819. sb.append("person.Fid = '").append(personId).append("'").append("\n");
  820. sb.append("order by cmpOrgUnitCus.FLEFFECTTIME desc ").append("\n");
  821. return sb.toString();
  822. }
  823. ///**
  824. // * 同步人员纳税信息
  825. // *
  826. // * @param request
  827. // * @param response
  828. // * @param modelMap
  829. // * @throws ShrWebBizException
  830. // * @throws BOSException
  831. // */
  832. //public void synTaxPersonRecordAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws ShrWebBizException, BOSException {
  833. // //计算规则ID
  834. // String cmpschemeid = request.getParameter("cmpschemeid");
  835. // if (StringUtils.isEmpty(cmpschemeid)) {
  836. // throw new ShrWebBizException("计算规则ID不可为空!!");
  837. // }
  838. // //计算规则
  839. // ICalScheme iCalScheme = CalSchemeFactory.getLocalInstance(ctx);
  840. // try {
  841. // CalSchemeInfo calSchemeInfo = iCalScheme.getCalSchemeInfo(new ObjectUuidPK(cmpschemeid));
  842. // //获取上一个月的计算规则 统计年:periodYear 统计月:periodMonth
  843. // LocalDate date = LocalDate.of(calSchemeInfo.getPeriodYear(), calSchemeInfo.getPeriodMonth(), 1);
  844. // LocalDate previousMonthDate = date.minusMonths(1);
  845. // //获取上个月的薪酬核算
  846. // //CalSchemeInfo calSchemeUp = iCalScheme.getCalSchemeInfo("where periodYear = '" + previousMonthDate.getYear() + "' and periodMonth = '" + previousMonthDate.getMonthValue() + "'");
  847. // CmpCalTableCollection cmpCalTableCollectionUp = getCalSchemeColl(calSchemeInfo.getId().toString(), previousMonthDate.getYear(), previousMonthDate.getMonthValue());
  848. // logger.error("cmpCalTableCollectionUp--------" + cmpCalTableCollectionUp.size());
  849. //
  850. // //获取当前的薪酬核算
  851. // CmpCalTableCollection cmpCalTableCollection = getCalSchemeColl(calSchemeInfo.getId().toString(), calSchemeInfo.getPeriodYear(), calSchemeInfo.getPeriodMonth());
  852. // logger.error("cmpCalTableCollection--------" + cmpCalTableCollection.size());
  853. //
  854. // //保存上个月的核算人员
  855. // List<String> listUp = new ArrayList<>();
  856. // for (int i = 0; i < cmpCalTableCollectionUp.size(); i++) {
  857. // listUp.add(cmpCalTableCollectionUp.get(i).getPerson().getId().toString());
  858. // }
  859. //
  860. // //保存当前月的核算人员
  861. // List<String> list = new ArrayList<>();
  862. // for (int i = 0; i < cmpCalTableCollection.size(); i++) {
  863. // list.add(cmpCalTableCollection.get(i).getPerson().getId().toString());
  864. // }
  865. //
  866. // Set<String> setUp = new HashSet<>(listUp);
  867. // Set<String> set = new HashSet<>(list);
  868. //
  869. // // 找出 上个月核算人员 中比 当前月核算人员 多的数据 为离职人员 修改人员纳税信息的 人员状态为非正常 离职日期为当前月最后一天
  870. // Set<String> pseronIdsUp = new HashSet<>(setUp);
  871. // pseronIdsUp.removeAll(set);
  872. //
  873. // // 找出 当前月核算人员 中比 上个月核算人员 多的数据 为新增人员 创建人员纳税信息和任职受雇从业信息 人员状态为正常 任职受雇从业日期为当前月1号
  874. // Set<String> pseronIds = new HashSet<>(set);
  875. // pseronIds.removeAll(setUp);
  876. //
  877. // SelectorItemCollection updateSic = new SelectorItemCollection();
  878. // updateSic.add("personStatus");
  879. // updateSic.add("departureDate");
  880. // //处理修改的人员纳税信息
  881. // ITaxPersonRecordEntry iTaxPersonRecordEntry = TaxPersonRecordEntryFactory.getLocalInstance(ctx);
  882. // //判断修改人员ID大于0 则修改人员纳税信息
  883. // if (pseronIdsUp.size() > 0) {
  884. // //获取任职受雇从业信息 修改人员纳税信息的 人员状态为非正常 离职日期为当前月最后一天
  885. // TaxPersonRecordEntryCollection taxPersonRecordEntryCollUp = getTaxPersonRecordEntryColl(pseronIdsUp, iTaxPersonRecordEntry);
  886. // if (taxPersonRecordEntryCollUp.size() > 0) {
  887. // for (int i = 0; i < taxPersonRecordEntryCollUp.size(); i++) {
  888. // TaxPersonRecordEntryInfo taxPersonRecordEntryInfo = taxPersonRecordEntryCollUp.get(i);
  889. // //人员状态
  890. // taxPersonRecordEntryInfo.setPersonStatus(PersonStatusEnum.NotNormal);
  891. // //获取当前月的最后一天转成Date类型
  892. // Date departureDate = Date.from(date.withDayOfMonth(date.lengthOfMonth()).atStartOfDay(ZoneId.systemDefault()).toInstant());
  893. // //离职日期为当前月最后一天
  894. // taxPersonRecordEntryInfo.setDepartureDate(departureDate);
  895. // iTaxPersonRecordEntry.updatePartial(taxPersonRecordEntryInfo, updateSic);
  896. // }
  897. // }
  898. // }
  899. // //调用新增人员纳税信息方法
  900. // if (pseronIds.size() > 0) {
  901. // //Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()) 当前月第一天
  902. // addTaxPersonRecord(pseronIds, Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()));
  903. // }
  904. // Map res = new HashMap();
  905. // res.put("update", pseronIdsUp.size());
  906. // res.put("add", pseronIds.size());
  907. // JSONUtils.writeJson(response, res);
  908. // } catch (EASBizException e) {
  909. // e.printStackTrace();
  910. // throw new ShrWebBizException("计算规则ID【" + cmpschemeid + "】未获取到,请联系管理员!!");
  911. // } catch (SQLException e) {
  912. // throw new ShrWebBizException(e);
  913. // } catch (SHRWebException e) {
  914. // throw new ShrWebBizException(e);
  915. // }
  916. //
  917. //}
  918. ///**
  919. // * 新增人员纳税信息
  920. // *
  921. // * @param pseronIds
  922. // */
  923. //public void addTaxPersonRecord(Set<String> pseronIds, Date oneDay) throws BOSException, EASBizException, SQLException {
  924. // logger.error("addTaxPersonRecord--------新增开始");
  925. // //pseronIds.forEach(id -> {});
  926. // ITaxPersonRecord iTaxPersonRecord = TaxPersonRecordFactory.getLocalInstance(ctx);
  927. // IPerson iPerson = PersonFactory.getLocalInstance(ctx);
  928. // ITaxPersonRecordEntry iTaxPersonRecordEntry = TaxPersonRecordEntryFactory.getLocalInstance(ctx);
  929. // //人员纳税分录对象
  930. // TaxPersonRecordEntryInfo taxPersonRecordEntryInfo = new TaxPersonRecordEntryInfo();
  931. // SelectorItemCollection sic = new SelectorItemCollection();
  932. // sic.add("*");
  933. // FilterInfo filterInfo = new FilterInfo();
  934. // filterInfo.getFilterItems().add(new FilterItemInfo("id", pseronIds, CompareType.INCLUDE));
  935. // EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  936. // PersonCollection personCollection = iPerson.getPersonCollection(entityViewInfo);
  937. // if (personCollection.size() > 0) {
  938. // for (int i = 0; i < personCollection.size(); i++) {
  939. // PersonInfo personInfo = personCollection.get(i);
  940. // boolean exists = iTaxPersonRecordEntry.exists("where person = '" + personInfo.getId().toString() + "'");
  941. // if (!exists) {
  942. //
  943. // TaxPersonRecordInfo taxPersonRecordInfo = new TaxPersonRecordInfo();
  944. // //人员
  945. // taxPersonRecordInfo.setPerson(personInfo);
  946. // //证件类型
  947. // if (personInfo.getIdCardNO() != null || personInfo.getPassportNO() != null) {
  948. // if (null == personInfo.getIdCardNO()) {
  949. // //护照
  950. // taxPersonRecordInfo.setCardType(CardTypeEnum.Passport);
  951. // taxPersonRecordInfo.setCardNumber(personInfo.getPassportNO());
  952. // //纳税人类型
  953. // taxPersonRecordEntryInfo.setPayerType(PayerTypeEnum.NotResident);
  954. // }
  955. // if (null == personInfo.getPassportNO()) {
  956. // //证件号
  957. // taxPersonRecordInfo.setCardType(CardTypeEnum.IdCard);
  958. // taxPersonRecordInfo.setCardNumber(personInfo.getIdCardNO());
  959. // //纳税人类型
  960. // taxPersonRecordEntryInfo.setPayerType(PayerTypeEnum.Resident);
  961. //
  962. // }
  963. // } else {
  964. // logger.error(personInfo.getName() + "护照和身份证为空,证件类型保存失败!");
  965. // }
  966. // //性别
  967. // taxPersonRecordInfo.setGender(personInfo.getGender());
  968. // //出生日期
  969. // taxPersonRecordInfo.setBirthday(personInfo.getBirthday());
  970. // //国籍
  971. // taxPersonRecordInfo.setNationality(personInfo.getNationality());
  972. // //是否境外人员
  973. // taxPersonRecordInfo.setIsOversea(IsOverseaEnum.NotOversea);
  974. // //手机号码
  975. // taxPersonRecordInfo.setPhoneNumber(personInfo.getCell());
  976. // iTaxPersonRecord.save(taxPersonRecordInfo);
  977. // //保存分录数据
  978. // taxPersonRecordEntryInfo.setPerson(personInfo);
  979. // taxPersonRecordEntryInfo.setBill(taxPersonRecordInfo);
  980. // //获取纳税单位
  981. // String sql = getSalaryOrgMappingByPersonId(personInfo.getId().toString());
  982. // IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  983. // ITaxUnit iTaxUnit = TaxUnitFactory.getLocalInstance(ctx);
  984. // if (iRowSet.size() > 0) {
  985. // while (iRowSet.next()) {
  986. // TaxUnitInfo taxUnitInfo = iTaxUnit.getTaxUnitInfo("where number = '" + iRowSet.getString("nsdwmc") + "'");
  987. // taxPersonRecordEntryInfo.setTaxUnit(taxUnitInfo);
  988. // //人员状态
  989. // taxPersonRecordEntryInfo.setPersonStatus(PersonStatusEnum.Normal);
  990. // //获取当前月的最后一天转成Date类型 //任职受雇从业日期为当前月第一天
  991. // taxPersonRecordEntryInfo.setEmployedDate(oneDay);
  992. // //报送状态
  993. // taxPersonRecordEntryInfo.setSubmitStatus(SubmitStatusEnum.NotSubmit);
  994. // iTaxPersonRecordEntry.save(taxPersonRecordEntryInfo);
  995. // }
  996. // } else {
  997. // logger.error("iRowSet-----Sql---" + sql);
  998. // logger.error("iRowSet--------" + personInfo.getName() + "未获取到纳税单位,字段保存失败!!");
  999. // }
  1000. // }
  1001. // }
  1002. // }
  1003. // logger.error("addTaxPersonRecord--------新增结束");
  1004. //}
  1005. ///**
  1006. // * 获取任职受雇从业信息
  1007. // *
  1008. // * @param pseronIds 员工ID集合
  1009. // * @return
  1010. // * @throws BOSException
  1011. // */
  1012. //public TaxPersonRecordEntryCollection getTaxPersonRecordEntryColl(Set<String> pseronIds, ITaxPersonRecordEntry iTaxPersonRecordEntry) throws BOSException {
  1013. // //获取当前月的薪酬计算
  1014. // FilterInfo filterInfo = new FilterInfo();
  1015. // filterInfo.getFilterItems().add(new FilterItemInfo("bill.person", pseronIds, CompareType.INCLUDE));
  1016. // EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, null, null);
  1017. // return iTaxPersonRecordEntry.getTaxPersonRecordEntryCollection(entityViewInfo);
  1018. //}
  1019. /**
  1020. * 通过计算规则id获取薪酬核算数据
  1021. *
  1022. * @param cmpschemeid
  1023. * @throws BOSException
  1024. */
  1025. public CmpCalTableCollection getCalSchemeColl(String cmpschemeid, int year, int month) throws BOSException {
  1026. ICmpCalTable iCmpCalTable = CmpCalTableFactory.getLocalInstance(ctx);
  1027. SelectorItemCollection sic = new SelectorItemCollection();
  1028. sic.add("*");
  1029. sic.add("calScheme.*");
  1030. sic.add("person.*");
  1031. //获取当前月的薪酬计算
  1032. FilterInfo filterInfo = new FilterInfo();
  1033. filterInfo.getFilterItems().add(new FilterItemInfo("calScheme", cmpschemeid, CompareType.EQUALS));
  1034. filterInfo.getFilterItems().add(new FilterItemInfo("periodYear", year, CompareType.EQUALS));
  1035. filterInfo.getFilterItems().add(new FilterItemInfo("periodMonth", month, CompareType.EQUALS));
  1036. EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  1037. CmpCalTableCollection cmpCalTableCollection = iCmpCalTable.getCmpCalTableCollection(entityViewInfo);
  1038. return cmpCalTableCollection;
  1039. }
  1040. }