CmpCalDynamicListHandlerExExEx.java 58 KB

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