GetASynIndividualIncomeTaxFeedback.java 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  1. package com.kingdee.eas.custom.shuiyou.taxCal.service;
  2. import cn.com.servyou.dto.ApiResponse;
  3. import cn.com.servyou.dto.Head;
  4. import cn.com.servyou.dto.employee.EmployeeDeclareFeedback;
  5. import cn.com.servyou.dto.tax.*;
  6. import cn.com.servyou.rmi.client.ClientProxyFactory;
  7. import cn.com.servyou.service.TaxRequest;
  8. import com.fasterxml.jackson.core.JsonProcessingException;
  9. import com.fasterxml.jackson.databind.ObjectMapper;
  10. import com.kingdee.bos.BOSException;
  11. import com.kingdee.bos.Context;
  12. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  13. import com.kingdee.bos.metadata.entity.*;
  14. import com.kingdee.bos.metadata.query.util.CompareType;
  15. import com.kingdee.eas.common.EASBizException;
  16. import com.kingdee.eas.custom.shuiyou.interfacelog.ILogInfo;
  17. import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoFactory;
  18. import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoInfo;
  19. import com.kingdee.eas.custom.shuiyou.task.MessageResult;
  20. import com.kingdee.eas.custom.shuiyou.utils.ClientProxyFactoryUtils;
  21. import com.kingdee.eas.hr.ats.AtsUtil;
  22. import com.kingdee.eas.hr.ats.util.AtsDateUtils;
  23. import com.kingdee.eas.util.app.DbUtil;
  24. import com.kingdee.jdbc.rowset.IRowSet;
  25. import com.kingdee.shr.compensation.CardTypeEnum;
  26. import com.kingdee.shr.compensation.app.incomeTax.*;
  27. import com.kingdee.shr.compensation.app.tax.base.*;
  28. import com.kingdee.shr.compensation.app.taxCal.*;
  29. import com.kingdee.util.StringUtils;
  30. import org.apache.log4j.Logger;
  31. import java.math.BigDecimal;
  32. import java.sql.SQLException;
  33. import java.text.ParseException;
  34. import java.text.SimpleDateFormat;
  35. import java.util.*;
  36. /**
  37. * @Description 获取异步算税反馈结果
  38. * @Date 2024/9/10 15:26
  39. * @Created by Heyuan
  40. */
  41. public class GetASynIndividualIncomeTaxFeedback implements IHRMsfService {
  42. private static Logger logger = Logger.getLogger(GetASynIndividualIncomeTaxFeedback.class);
  43. private String taxUnitId = null;//纳税单位id
  44. private String period = null;//税款所属期 yyyy-MM
  45. private String creator = null;//创建人id
  46. private String initIds = null;
  47. private String periodBegin = null;//税款所属期起 yyyy-MM-dd
  48. private String periodEnd = null;//税款所属期止 yyyy-MM-dd
  49. private ObjectMapper objectMapper = new ObjectMapper();
  50. //证件类型map
  51. //private static Map<String, String> cardTypeEnumMap = null;
  52. private Map<String, String> incomeItemMap = null;//所有启用的所得项目
  53. private Map<String, String> taxItemInitMap = null;//初算个税项目
  54. private Map<String, String> taxItemConfigMap = null;//明细个税项目
  55. private static Set<String> detachMap = new HashSet<String>();//非更新个税项目
  56. private Map<String, String> taxPersonRecordMap = null;//报送人员信息 key:证件号码+证件类型,value:员工id
  57. static {
  58. detachMap.add("znjyzc");//累计子女教育支出*
  59. detachMap.add("jxjyzc");//累计继续教育支出*
  60. detachMap.add("ljxljxjyzc");//累计学历继续教育支出*
  61. detachMap.add("ljfxljxjyzc");//累计非学历继续教育支出*
  62. detachMap.add("zfzjzc");//累计住房租金支出*
  63. detachMap.add("zfdklxzc");//累计房屋贷款支出*
  64. detachMap.add("sylrzc");//累计赡养老人支出*
  65. detachMap.add("yyezhfzc");// 累计婴幼儿照护费用*
  66. detachMap.add("dyznjyzc");// 子女教育支出*
  67. detachMap.add("dysylrzc");// 赡养老人支出*
  68. detachMap.add("dyfwdkzc");// 住房贷款利息支出*
  69. detachMap.add("dyzfzjzc");// 住房租金支出*
  70. detachMap.add("dyjxjyzc");// 继续教育支出*
  71. detachMap.add("dyfxljxjyzc");//非学历继续教育支出*
  72. detachMap.add("dyyyrzhzc");// 婴幼儿照护支出*
  73. }
  74. @Override
  75. public MessageResult process(Context ctx, Map paramMap) throws EASBizException, BOSException {
  76. ILogInfo iLogInfo = LogInfoFactory.getLocalInstance(ctx);
  77. //接口日志实体
  78. LogInfoInfo logInfo = new LogInfoInfo();
  79. //入口
  80. logInfo.setEntrance(this.getClass().getName());
  81. logInfo.setBizDate(new Date());
  82. try {
  83. logger.info("调用 GetASynIndividualIncomeTaxFeedback, 参数 " + objectMapper.writeValueAsString(paramMap));
  84. MessageResult messageResult = null;
  85. String this_taskId = (String) paramMap.get("this_taskId");//任务id
  86. String paramData = (String) paramMap.get("paramData");
  87. Map<String, String> paramDataMap = objectMapper.readValue(paramData, Map.class);
  88. taxUnitId = paramDataMap.get("TAXUNITID");//纳税单位id
  89. period = paramDataMap.get("PERIOD");//周期yyyy-MM
  90. creator = paramDataMap.get("creator");//创建人id
  91. initIds = paramDataMap.get("initIds");//初算数据id
  92. String requestId = paramDataMap.get("requestId");
  93. StringBuilder errorMsg = new StringBuilder();
  94. if (StringUtils.isEmpty(taxUnitId)) {
  95. errorMsg.append("纳税单位id不能为空!\n");
  96. }
  97. if (StringUtils.isEmpty(period)) {
  98. errorMsg.append("周期yyyy-MM不能为空!\n");
  99. }
  100. if (StringUtils.isEmpty(requestId)) {
  101. errorMsg.append("requestId不能为空!\n");
  102. }
  103. if (errorMsg.length() > 0) {
  104. throw new BOSException(errorMsg.toString());
  105. }
  106. SimpleDateFormat shortsdf = new SimpleDateFormat("yyyy-MM");
  107. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  108. Date parse = shortsdf.parse(period);
  109. periodBegin = sdf.format(AtsDateUtils.getMonthFirstDay(parse));
  110. periodEnd = sdf.format(AtsDateUtils.getMonthLastDay(parse));
  111. //客户端代理工厂
  112. ClientProxyFactory clientProxyFactory = ClientProxyFactoryUtils.getClientProxyFactory();
  113. logInfo.setInterfaceAddress("/gateway/iit/calculateTax/getASynIndividualIncomeTaxFeedback");//接口地址
  114. logInfo.setInterfaceName("getASynIndividualIncomeTaxFeedback");//接口名
  115. logInfo.setInParameter("{\"requestId\":\"" + requestId + "\"}");//入参
  116. //算税请求接口
  117. TaxRequest taxRequest = clientProxyFactory.getTaxRequest();
  118. //调用异步算税接口
  119. ApiResponse<CalculateTaxResultRequest> apiResponse = taxRequest.getASynIndividualIncomeTaxFeedback(requestId);
  120. ObjectMapper mapper = new ObjectMapper();
  121. logInfo.setOutParameter(mapper.writeValueAsString(apiResponse));//回参
  122. Head head = apiResponse.getHead();
  123. String status = head.getStatus();
  124. String code = head.getCode();
  125. if ("100004".equals(code)) {
  126. //请求处理中
  127. messageResult = MessageResult.AGAIN(head.getMsg());
  128. logInfo.setErrorInfo(head.getMsg());//错误信息
  129. logInfo.setStatus("处理中");
  130. } else if ("000004".equals(code)) {
  131. //请求失败
  132. messageResult = MessageResult.FAILED(head.getMsg());
  133. logInfo.setErrorInfo(head.getMsg());//错误信息
  134. logInfo.setStatus("失败");
  135. } else if ("00000000".equals(code)) {
  136. logger.info("成功");
  137. //获取所有启用的所得项目
  138. incomeItemMap = getIncomeItemMap(ctx);
  139. logger.info("objectMapper.writeValueAsString(incomeItemMap) " + objectMapper.writeValueAsString(incomeItemMap));
  140. //获取个税项目
  141. getTaxItemMap(ctx);
  142. logger.info("objectMapper.writeValueAsString(taxItemInitMap) " + objectMapper.writeValueAsString(taxItemInitMap));
  143. logger.info("objectMapper.writeValueAsString(taxItemConfigMap) " + objectMapper.writeValueAsString(taxItemConfigMap));
  144. //获取报送人员信息
  145. getTaxPersonRecordMap(ctx);
  146. logger.info("objectMapper.writeValueAsString(taxPersonRecordMap) " + objectMapper.writeValueAsString(taxPersonRecordMap));
  147. //请求成功
  148. CalculateTaxResultRequest body = apiResponse.getBody();
  149. //企业名称
  150. // String qymc = body.getName();
  151. // //税号
  152. // String nsrsbh = body.getTaxNo();
  153. // //部门编号
  154. // String bmbh = body.getDeptNo();
  155. // //部门名称
  156. // String bmmc = body.getDeptName();
  157. // //行政区划代码
  158. // String areaid = body.getArea();
  159. // //税款所属期
  160. // String skssq = body.getMonth();
  161. // //外部业务订单号
  162. // String bizNo = body.getBizNo();
  163. //综合所得
  164. ComplexIncomeResultRequest complexIncomeResult = body.getComplexIncomeResultRequest();
  165. //人员申报失败列表
  166. List<EmployeeDeclareFeedback> employeeDeclareFeedbacks = complexIncomeResult.getEmployeeDeclareFeedbacks();
  167. String updateSqlTemp = "/*dialect*/update T_HR_STaxCalInitDetail set FERRORINFO = '%s',FSTATE = '50' " +
  168. "where fpersonId = '%s' and fid in (%s) and FSTATE =30";
  169. for (int i = 0; employeeDeclareFeedbacks != null && i < employeeDeclareFeedbacks.size(); i++) {
  170. EmployeeDeclareFeedback employeeDeclareFeedback = employeeDeclareFeedbacks.get(i);
  171. //失败原因
  172. String message = employeeDeclareFeedback.getMessage();
  173. if (!StringUtils.isEmpty(message)) {
  174. //姓名
  175. String name = employeeDeclareFeedback.getName();
  176. //证件类型名称
  177. String licenseType = employeeDeclareFeedback.getLicenseType();
  178. //证件号码
  179. String licenseNumber = employeeDeclareFeedback.getLicenseNumber();
  180. //员工id
  181. String personId = taxPersonRecordMap.get(licenseNumber + licenseType);
  182. if (StringUtils.isEmpty(personId)) {
  183. logger.error("未匹配到人员 证件号: " + licenseNumber + " 证件类型: " + licenseType);
  184. continue;
  185. }
  186. //报送状态 1 待报送 2 代报中 3 代报失败 4 代报成功
  187. //String submissionState = employeeDeclareFeedback.getSubmissionState();
  188. //人员验证状态 0 若是身份证,状态为验证中;其他证件为暂不验证 1 验证通过 2 验证不通过 4 待验证 9 同代码0处理
  189. //String authenticationState = employeeDeclareFeedback.getAuthenticationState();
  190. //专项报送状态 2 代报成功 3 代报失败
  191. //String deductionSubmissionState = employeeDeclareFeedback.getDeductionSubmissionState();
  192. //专项报送结果原因
  193. //String deductionMessage = employeeDeclareFeedback.getDeductionMessage();
  194. try {
  195. logger.error("报送失败人员 " + name);
  196. logger.error("报送失败原因 " + message);
  197. String updateSql = String.format(updateSqlTemp, message, personId, initIds);
  198. logger.error("报送失败更新sql " + updateSql);
  199. DbUtil.execute(ctx, updateSql);
  200. } catch (Exception e) {
  201. e.printStackTrace();
  202. }
  203. }
  204. }
  205. logger.error("正常工资薪金算税结果对象");
  206. //正常工资薪金算税结果对象
  207. ComplexTaxCalculateResult normalSalarySpecIncome = complexIncomeResult.getNormalSalarySpecIncome();
  208. handleComplexTaxCalculateResult(ctx, normalSalarySpecIncome);
  209. logger.error("全年一次性奖金收入算税结果对象");
  210. //全年一次性奖金收入算税结果对象
  211. ComplexTaxCalculateResult annualOneTimeBonusIncome = complexIncomeResult.getAnnualOneTimeBonusIncome();
  212. handleComplexTaxCalculateResult(ctx, annualOneTimeBonusIncome);
  213. logger.error("一般劳务报酬算税结果对象");
  214. //一般劳务报酬算税结果对象
  215. ComplexTaxCalculateResult laborRemunerationIncome = complexIncomeResult.getLaborRemunerationIncome();
  216. handleComplexTaxCalculateResult(ctx, laborRemunerationIncome);
  217. logger.error("解除劳动合同一次性补偿金算税结果对象");
  218. //解除劳动合同一次性补偿金算税结果对象
  219. ComplexTaxCalculateResult compensateIncome = complexIncomeResult.getCompensateIncome();
  220. handleComplexTaxCalculateResult(ctx, compensateIncome);
  221. messageResult = MessageResult.SUCCESS();
  222. }
  223. logger.error("保存日志对象");
  224. iLogInfo.addnew(logInfo);
  225. logger.error("返回结果");
  226. return messageResult;
  227. } catch (Exception e) {
  228. e.printStackTrace();
  229. logInfo.setErrorInfo(e.getMessage());//错误信息
  230. iLogInfo.addnew(logInfo);
  231. return MessageResult.ERROR(e.getMessage());
  232. }
  233. }
  234. /**
  235. * 处理所得项目算税结果
  236. *
  237. * @param ctx
  238. * @param normalSalarySpecIncome
  239. * @throws BOSException
  240. */
  241. private void handleComplexTaxCalculateResult(
  242. Context ctx,
  243. ComplexTaxCalculateResult normalSalarySpecIncome)
  244. throws BOSException, JsonProcessingException {
  245. logger.info("handleComplexTaxCalculateResult:" + objectMapper.writeValueAsString(normalSalarySpecIncome));
  246. if (normalSalarySpecIncome != null) {
  247. //算税总人数
  248. Integer totalPeople = normalSalarySpecIncome.getTotalPeople();
  249. //算税失败人数
  250. Integer failedPeople = normalSalarySpecIncome.getFailedPeople();
  251. //年金上限
  252. BigDecimal annuityLimit = normalSalarySpecIncome.getAnnuityLimit();
  253. //公积金上限
  254. BigDecimal houseProvidentFundLimit = normalSalarySpecIncome.getHouseProvidentFundLimit();
  255. //年平均工资
  256. BigDecimal averageAnnual = normalSalarySpecIncome.getAverageAnnual();
  257. //企业在电子税务局上月是否已申报(仅正常工资薪金有效) 0:上月未申报 1:上月已申报 2:上上月未申报
  258. String etaxDeclaredLastMonth = normalSalarySpecIncome.getEtaxDeclaredLastMonth();
  259. //综合算税成功列表
  260. List<ComplexIncome> successComplexIncomes = normalSalarySpecIncome.getSuccessComplexIncomes();
  261. handleSuccessComplexIncome(ctx, successComplexIncomes);
  262. //综合算税失败薪资列表
  263. List<ComplexIncome> failedComplexIncomes = normalSalarySpecIncome.getFailedComplexIncomes();
  264. //handleFailedComplexIncome(failedComplexIncomes);
  265. //失败算税原因列表
  266. List<CheckTaxCalResult> failedCheckTaxCalResult = normalSalarySpecIncome.getFailedCheckTaxCalResult();
  267. handleFailedCheckTaxCalResult(ctx, failedCheckTaxCalResult);
  268. }
  269. }
  270. /**
  271. * 处理综合算税成功列表
  272. */
  273. private void handleSuccessComplexIncome(Context ctx, List<ComplexIncome> successComplexIncomes) throws BOSException {
  274. if (successComplexIncomes != null) {
  275. //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  276. StringBuilder updateSql = new StringBuilder();
  277. updateSql.append("/*dialect*/update T_HR_STaxCalInitDetail set FSTATE = '40',FERRORINFO = '成功', ");
  278. for (String key : taxItemInitMap.keySet()) {
  279. //todo
  280. if (!detachMap.contains(key)) {
  281. String tableField = taxItemInitMap.get(key);
  282. updateSql.append(tableField).append("=?, ");
  283. }
  284. }
  285. updateSql.deleteCharAt(updateSql.lastIndexOf(","));
  286. updateSql.append(" where fpersonId = ? ");
  287. updateSql.append(" and FTAXUNITID=? and to_char(FPERIODBEGIN,'yyyy-mm-dd') >= ? and to_char(FPERIODEND,'yyyy-mm-dd') <= ? and FINCOMEITEMID=? and FSTATE =30");
  288. List<Object[]> sqlParams = new ArrayList<>();
  289. Set<String> personIds = new HashSet<>();
  290. Set<String> incomeitemIds = new HashSet<>();
  291. for (int i = 0; successComplexIncomes != null && i < successComplexIncomes.size(); i++) {
  292. ComplexIncome complexIncome = successComplexIncomes.get(i);
  293. Map incomeDataMap = new HashMap();
  294. List updateList = new ArrayList();
  295. //姓名
  296. String name = complexIncome.getName();
  297. //证件类型名称
  298. String licenseType = complexIncome.getLicenseType();
  299. //String cardTypeValue = cardTypeEnumMap.get(licenseType);
  300. //证件号码
  301. String licenseNumber = complexIncome.getLicenseNumber();
  302. //员工id
  303. String personId = taxPersonRecordMap.get(licenseNumber + licenseType);
  304. if (StringUtils.isEmpty(personId)) {
  305. logger.error("未匹配到人员 证件号: " + licenseNumber + " 证件类型: " + licenseType);
  306. continue;
  307. }
  308. //受雇日期
  309. //String employedDate = complexIncome.getEmployedDate();
  310. //离职日期
  311. //String resignDate = complexIncome.getResignDate();
  312. //是否明细申报
  313. //String isDetailedDeclaration = complexIncome.getIsDetailedDeclaration();
  314. //当期收入额
  315. BigDecimal income = complexIncome.getIncome();
  316. incomeDataMap.put("sre", income);
  317. //免税收入
  318. BigDecimal exemptIncome = complexIncome.getExemptIncome();
  319. incomeDataMap.put("mssd", exemptIncome);
  320. //基本养老保险
  321. BigDecimal endowmentInsurance = complexIncome.getEndowmentInsurance();
  322. incomeDataMap.put("jbylaobxf", endowmentInsurance);
  323. //基本医疗保险
  324. BigDecimal medicalInsurance = complexIncome.getMedicalInsurance();
  325. incomeDataMap.put("jbylbxf", medicalInsurance);
  326. //失业保险
  327. BigDecimal unemploymentInsurance = complexIncome.getUnemploymentInsurance();
  328. incomeDataMap.put("sybxf", unemploymentInsurance);
  329. //住房公积金
  330. BigDecimal houseProvidentFund = complexIncome.getHouseProvidentFund();
  331. incomeDataMap.put("zfgjj", houseProvidentFund);
  332. //原始住房公积金
  333. //BigDecimal originalHouseProvidentFund = complexIncome.getOriginalHouseProvidentFund();
  334. //子女教育支出
  335. //BigDecimal childEducationExpenditure = complexIncome.getChildEducationExpenditure();
  336. //incomeDataMap.put("dyznjyzc", childEducationExpenditure);
  337. //赡养老人支出
  338. //BigDecimal supportElderExpenditure = complexIncome.getSupportElderExpenditure();
  339. //incomeDataMap.put("dysylrzc", supportElderExpenditure);
  340. //住房租金支出
  341. //BigDecimal houseRentExpenditure = complexIncome.getHouseRentExpenditure();
  342. //incomeDataMap.put("dyzfzjzc", houseRentExpenditure);
  343. //房屋贷款支出
  344. //BigDecimal houseLoanExpenditure = complexIncome.getHouseLoanExpenditure();
  345. //incomeDataMap.put("dyfwdkzc", houseLoanExpenditure);
  346. //继续教育支出
  347. //BigDecimal continueEducationExpenditure = complexIncome.getContinueEducationExpenditure();
  348. //incomeDataMap.put("dyjxjyzc", continueEducationExpenditure);
  349. //非学历继续教育支出
  350. //BigDecimal unDegreeContinueEducationExpenditure = complexIncome.getUnDegreeContinueEducationExpenditure();
  351. //incomeDataMap.put("dyfxljxjyzc", unDegreeContinueEducationExpenditure);
  352. //婴幼儿照护支出
  353. //BigDecimal babyCareExpenditure = complexIncome.getBabyCareExpenditure();
  354. //incomeDataMap.put("dyyyrzhzc", babyCareExpenditure);
  355. //企业年金/职业年金
  356. BigDecimal annuity = complexIncome.getAnnuity();
  357. incomeDataMap.put("nj", annuity);
  358. //商业健康保险
  359. BigDecimal commercialHealthInsurance = complexIncome.getCommercialHealthInsurance();
  360. incomeDataMap.put("syjkbx", commercialHealthInsurance);
  361. //税延养老保险
  362. BigDecimal extensionEndowmentInsurance = complexIncome.getExtensionEndowmentInsurance();
  363. incomeDataMap.put("syylbx", extensionEndowmentInsurance);
  364. //其他
  365. BigDecimal other = complexIncome.getOther();
  366. incomeDataMap.put("qt", other);
  367. //减免税额
  368. BigDecimal taxDeduction = complexIncome.getTaxDeduction();
  369. incomeDataMap.put("jmse", taxDeduction);
  370. //备注 根据政策要求,填写【其他】项,一定在备注中写明具体扣除项目名称
  371. String remark = complexIncome.getRemark();
  372. incomeDataMap.put("bz", remark);
  373. //减除费用
  374. BigDecimal deductionAmount = complexIncome.getDeductionAmount();
  375. incomeDataMap.put("qzd", deductionAmount);
  376. //其他扣除合计
  377. BigDecimal otherDeductionSum = complexIncome.getOtherDeductionSum();
  378. incomeDataMap.put("qtckhj", otherDeductionSum);
  379. //应纳税所得额
  380. BigDecimal taxableIncome = complexIncome.getTaxableIncome();
  381. incomeDataMap.put("ynssde", taxableIncome);
  382. //应纳税额
  383. BigDecimal payableAmount = complexIncome.getPayableAmount();
  384. //已缴税额
  385. BigDecimal paidAmount = complexIncome.getPaidAmount();
  386. //应扣缴税额
  387. BigDecimal withholdingAmount = complexIncome.getWithholdingAmount();
  388. //税率
  389. BigDecimal taxRate = complexIncome.getTaxRate();
  390. incomeDataMap.put("sl", taxRate);
  391. //速算扣除数
  392. BigDecimal quickDeduction = complexIncome.getQuickDeduction();
  393. incomeDataMap.put("sskcs", quickDeduction);
  394. //所得项目名称
  395. String incomeItemName = complexIncome.getIncomeItemName();
  396. if (!incomeItemMap.containsKey(incomeItemName)) {
  397. logger.error("未匹配到所得项目 名称为: " + incomeItemName);
  398. continue;
  399. }
  400. String incomeItemId = incomeItemMap.get(incomeItemName);
  401. incomeDataMap.put("sdxm", incomeItemId);
  402. //应补退税额 累计应扣缴税额-累计已缴税额
  403. BigDecimal refundTax = complexIncome.getRefundTax();
  404. incomeDataMap.put("bqybtse", refundTax);
  405. //累计收入额 本年累计收入=本期所有的工资薪金所得收入之和+往期工资薪金所得收入之和(见税款计算)
  406. BigDecimal accumulatedIncome = complexIncome.getAccumulatedIncome();
  407. incomeDataMap.put("bqljsre", accumulatedIncome);
  408. //累计免税收入额
  409. BigDecimal accumulatedExemptIncome = complexIncome.getAccumulatedExemptIncome();
  410. incomeDataMap.put("bqljmssr", accumulatedExemptIncome);
  411. //累计专项扣除额
  412. BigDecimal accumulatedSpecDeduction = complexIncome.getAccumulatedSpecDeduction();
  413. incomeDataMap.put("zxkchj", accumulatedSpecDeduction);
  414. //累计专项(附加)扣除额
  415. BigDecimal accumulatedSpecAttachDeduction = complexIncome.getAccumulatedSpecAttachDeduction();
  416. incomeDataMap.put("zxfjkchj", accumulatedSpecAttachDeduction);
  417. //累计其他扣除额
  418. BigDecimal accumulatedOtherDeduction = complexIncome.getAccumulatedOtherDeduction();
  419. incomeDataMap.put("qtckhj", accumulatedOtherDeduction);
  420. //累计减免税额
  421. BigDecimal accumulatedTaxDeduction = complexIncome.getAccumulatedTaxDeduction();
  422. incomeDataMap.put("ljjmse", accumulatedTaxDeduction);
  423. //累计减除费用额
  424. BigDecimal accumulatedDeductionAmount = complexIncome.getAccumulatedDeductionAmount();
  425. incomeDataMap.put("jcfy", accumulatedDeductionAmount);
  426. //todo 累计月减除费用
  427. BigDecimal accumulatedMonthDeduction = complexIncome.getAccumulatedMonthDeduction();
  428. //累计应纳税所得额
  429. BigDecimal accumulatedTaxableIncome = complexIncome.getAccumulatedTaxableIncome();
  430. incomeDataMap.put("ljynssde", accumulatedTaxableIncome);
  431. //累计应纳税额
  432. BigDecimal accumulatedPayableAmount = complexIncome.getAccumulatedPayableAmount();
  433. incomeDataMap.put("ljynse", accumulatedPayableAmount);
  434. //累计应扣缴税额 累计应纳税额 - 累计减免税额
  435. BigDecimal accumulatedWithholdingAmount = complexIncome.getAccumulatedWithholdingAmount();
  436. incomeDataMap.put("ljyingkjse", accumulatedWithholdingAmount);
  437. //累计子女教育支出
  438. //BigDecimal accumulatedChildEducation = complexIncome.getAccumulatedChildEducation();
  439. //incomeDataMap.put("znjyzc", accumulatedChildEducation);
  440. //累计继续教育支出
  441. //BigDecimal accumulatedContinueEducation = complexIncome.getAccumulatedContinueEducation();
  442. //incomeDataMap.put("jxjyzc", accumulatedContinueEducation);
  443. //累计学历继续教育支出
  444. // BigDecimal accumulatedDegreeContinueEducationLimit = complexIncome.getAccumulatedDegreeContinueEducationLimit();
  445. //incomeDataMap.put("ljxljxjyzc", accumulatedDegreeContinueEducationLimit);
  446. //累计非学历继续教育支出
  447. //BigDecimal accumulatedUnDegreeContinueEducationLimit = complexIncome.getAccumulatedUnDegreeContinueEducationLimit();
  448. //incomeDataMap.put("ljfxljxjyzc", accumulatedUnDegreeContinueEducationLimit);
  449. //累计住房租金支出
  450. //BigDecimal accumulatedHouseRent = complexIncome.getAccumulatedHouseRent();
  451. //incomeDataMap.put("zfzjzc", accumulatedHouseRent);
  452. //累计房屋贷款支出
  453. //BigDecimal accumulatedHouseLoan = complexIncome.getAccumulatedHouseLoan();
  454. //incomeDataMap.put("zfdklxzc", accumulatedHouseLoan);
  455. //累计赡养老人支出
  456. //BigDecimal accumulatedSupportElder = complexIncome.getAccumulatedSupportElder();
  457. //incomeDataMap.put("sylrzc", accumulatedSupportElder);
  458. //todo 累计3岁以下婴幼儿照护支出
  459. //BigDecimal accumulatedBabyCare = complexIncome.getAccumulatedBabyCare();
  460. //incomeDataMap.put("yyezhfzc", accumulatedBabyCare);
  461. //累计准予扣除的捐赠额
  462. BigDecimal accumulatedDeductibleDonation = complexIncome.getAccumulatedDeductibleDonation();
  463. incomeDataMap.put("ljzykcdjze", accumulatedDeductibleDonation);
  464. //累计个人养老金
  465. BigDecimal accumulatedPersonalPension = complexIncome.getAccumulatedPersonalPension();
  466. incomeDataMap.put("grylj", accumulatedPersonalPension);
  467. //todo 累计个人养老金校验码
  468. String accumulatedPersonalPensionCheckCode = complexIncome.getAccumulatedPersonalPensionCheckCode();
  469. //准予扣除的捐赠额
  470. BigDecimal deductibleDonation = complexIncome.getDeductibleDonation();
  471. incomeDataMap.put("zykcjze", deductibleDonation);
  472. //累计已缴税额
  473. BigDecimal accumulatedPaidAmount = complexIncome.getAccumulatedPaidAmount();
  474. //incomeDataMap.put("ykjse", accumulatedPaidAmount);
  475. //企业上月是否已申报
  476. String etaxDeclaredLastMonth = complexIncome.getEtaxDeclaredLastMonth();
  477. //员工在税局累计已扣缴的税额
  478. BigDecimal etaxAccumulatedPaidAmount = complexIncome.getEtaxAccumulatedPaidAmount();
  479. //incomeDataMap.put("ykjse", etaxAccumulatedPaidAmount);
  480. //本月已累计扣除税额
  481. BigDecimal monthAccumulatedWithholdingAmount = complexIncome.getMonthAccumulatedWithholdingAmount();
  482. incomeDataMap.put("ykjse", etaxAccumulatedPaidAmount);
  483. //本次应扣缴税额
  484. BigDecimal currentWithholdingAmount = complexIncome.getCurrentWithholdingAmount();
  485. incomeDataMap.put("ykjse", etaxAccumulatedPaidAmount);
  486. //允许扣除的税费
  487. BigDecimal taxDeductible = complexIncome.getTaxDeductible();
  488. incomeDataMap.put("yxkcsf", taxDeductible);
  489. //展业成本
  490. BigDecimal exhibitionCost = complexIncome.getExhibitionCost();
  491. incomeDataMap.put("zycb", exhibitionCost);
  492. //月减除费用
  493. BigDecimal monthDeduction = complexIncome.getMonthDeduction();
  494. incomeDataMap.put("qzd", monthDeduction);
  495. //分摊年度数
  496. Integer apportionYears = complexIncome.getApportionYears();
  497. //年减除费用 默认为60000
  498. BigDecimal yearDeduction = complexIncome.getYearDeduction();
  499. //封装更新参数
  500. for (String key : taxItemInitMap.keySet()) {
  501. if (!detachMap.contains(key)) {
  502. updateList.add(incomeDataMap.get(key));
  503. }
  504. }
  505. updateList.add(personId);
  506. updateList.add(taxUnitId);
  507. updateList.add(periodBegin);
  508. updateList.add(periodEnd);
  509. updateList.add(incomeItemId);
  510. sqlParams.add(updateList.toArray());
  511. if (!personIds.contains(personId)) {
  512. personIds.add(personId);
  513. }
  514. if (!incomeitemIds.contains(incomeItemId)) {
  515. incomeitemIds.add(incomeItemId);
  516. }
  517. }
  518. try {
  519. logger.info("updateSql: " + updateSql);
  520. logger.info("处理综合算税成功列表 sqlParams " + objectMapper.writeValueAsString(sqlParams));
  521. if (!sqlParams.isEmpty()) {
  522. DbUtil.executeBatch(ctx, updateSql.toString(), sqlParams);
  523. }
  524. } catch (Exception e) {
  525. e.printStackTrace();
  526. throw new BOSException("处理处理综合算税成功列表,更新初算数据报错:" + e.getMessage());
  527. }
  528. //生成个税应用+税款计算最终拆分明细表
  529. try {
  530. logger.info("处理综合算税成功列表 personIds " + objectMapper.writeValueAsString(personIds));
  531. logger.info("处理综合算税成功列表 incomeitemIds " + objectMapper.writeValueAsString(incomeitemIds));
  532. if (!personIds.isEmpty() && !incomeitemIds.isEmpty()) {
  533. generateOrUpdateTaxCalConfigDetail(ctx, personIds, incomeitemIds);
  534. }
  535. } catch (Exception e) {
  536. e.printStackTrace();
  537. throw new BOSException("处理处理综合算税成功列表,生成个税应用+税款计算最终拆分明细表报错:" + e.getMessage());
  538. }
  539. }
  540. }
  541. /**
  542. * 处理综合算税失败薪资列表
  543. *
  544. * @param failedComplexIncomes
  545. */
  546. private void handleFailedComplexIncome(List<ComplexIncome> failedComplexIncomes) {
  547. for (int i = 0; failedComplexIncomes != null && i < failedComplexIncomes.size(); i++) {
  548. ComplexIncome complexIncome = failedComplexIncomes.get(i);
  549. //姓名
  550. String name = complexIncome.getName();
  551. //证件类型名称
  552. String licenseType = complexIncome.getLicenseType();
  553. //证件号码
  554. String licenseNumber = complexIncome.getLicenseNumber();
  555. //受雇日期
  556. String employedDate = complexIncome.getEmployedDate();
  557. //离职日期
  558. String resignDate = complexIncome.getResignDate();
  559. //是否明细申报
  560. String isDetailedDeclaration = complexIncome.getIsDetailedDeclaration();
  561. //当期收入额
  562. BigDecimal income = complexIncome.getIncome();
  563. //免税收入
  564. BigDecimal exemptIncome = complexIncome.getExemptIncome();
  565. //基本养老保险
  566. BigDecimal endowmentInsurance = complexIncome.getEndowmentInsurance();
  567. //基本医疗保险
  568. BigDecimal medicalInsurance = complexIncome.getMedicalInsurance();
  569. //失业保险
  570. BigDecimal unemploymentInsurance = complexIncome.getUnemploymentInsurance();
  571. //住房公积金
  572. BigDecimal houseProvidentFund = complexIncome.getHouseProvidentFund();
  573. //原始住房公积金
  574. //BigDecimal originalHouseProvidentFund = complexIncome.getOriginalHouseProvidentFund();
  575. //子女教育支出
  576. BigDecimal childEducationExpenditure = complexIncome.getChildEducationExpenditure();
  577. //赡养老人支出
  578. BigDecimal supportElderExpenditure = complexIncome.getSupportElderExpenditure();
  579. //住房租金支出
  580. BigDecimal houseRentExpenditure = complexIncome.getHouseRentExpenditure();
  581. //房屋贷款支出
  582. BigDecimal houseLoanExpenditure = complexIncome.getHouseLoanExpenditure();
  583. //继续教育支出
  584. BigDecimal continueEducationExpenditure = complexIncome.getContinueEducationExpenditure();
  585. //非学历继续教育支出
  586. BigDecimal unDegreeContinueEducationExpenditure = complexIncome.getUnDegreeContinueEducationExpenditure();
  587. //婴幼儿照护支出
  588. BigDecimal babyCareExpenditure = complexIncome.getBabyCareExpenditure();
  589. //企业年金/职业年金
  590. BigDecimal annuity = complexIncome.getAnnuity();
  591. //商业健康保险
  592. BigDecimal commercialHealthInsurance = complexIncome.getCommercialHealthInsurance();
  593. //税延养老保险
  594. BigDecimal extensionEndowmentInsurance = complexIncome.getExtensionEndowmentInsurance();
  595. //其他
  596. BigDecimal other = complexIncome.getOther();
  597. //减免税额
  598. BigDecimal taxDeduction = complexIncome.getTaxDeduction();
  599. //备注
  600. String remark = complexIncome.getRemark();
  601. //减除费用
  602. BigDecimal deductionAmount = complexIncome.getDeductionAmount();
  603. //其他扣除合计
  604. BigDecimal otherDeductionSum = complexIncome.getOtherDeductionSum();
  605. //应纳税所得额
  606. BigDecimal taxableIncome = complexIncome.getTaxableIncome();
  607. //应纳税额
  608. BigDecimal payableAmount = complexIncome.getPayableAmount();
  609. //已缴税额
  610. BigDecimal paidAmount = complexIncome.getPaidAmount();
  611. //应扣缴税额
  612. BigDecimal withholdingAmount = complexIncome.getWithholdingAmount();
  613. //税率
  614. BigDecimal taxRate = complexIncome.getTaxRate();
  615. //速算扣除数
  616. BigDecimal quickDeduction = complexIncome.getQuickDeduction();
  617. //所得项目名称
  618. String incomeItemName = complexIncome.getIncomeItemName();
  619. //应补退税额
  620. BigDecimal refundTax = complexIncome.getRefundTax();
  621. //累计收入额
  622. BigDecimal accumulatedIncome = complexIncome.getAccumulatedIncome();
  623. //累计免税收入额
  624. BigDecimal accumulatedExemptIncome = complexIncome.getAccumulatedExemptIncome();
  625. //累计专项扣除额
  626. BigDecimal accumulatedSpecDeduction = complexIncome.getAccumulatedSpecDeduction();
  627. //累计专项(附加)扣除额
  628. BigDecimal accumulatedSpecAttachDeduction = complexIncome.getAccumulatedSpecAttachDeduction();
  629. //累计其他扣除额
  630. BigDecimal accumulatedOtherDeduction = complexIncome.getAccumulatedOtherDeduction();
  631. //累计减免税额
  632. BigDecimal accumulatedTaxDeduction = complexIncome.getAccumulatedTaxDeduction();
  633. //累计减除费用额
  634. BigDecimal accumulatedDeductionAmount = complexIncome.getAccumulatedDeductionAmount();
  635. //累计月减除费用
  636. BigDecimal accumulatedMonthDeduction = complexIncome.getAccumulatedMonthDeduction();
  637. //累计应纳税所得额
  638. BigDecimal accumulatedTaxableIncome = complexIncome.getAccumulatedTaxableIncome();
  639. //累计应纳税额
  640. BigDecimal accumulatedPayableAmount = complexIncome.getAccumulatedPayableAmount();
  641. //累计应扣缴税额
  642. BigDecimal accumulatedWithholdingAmount = complexIncome.getAccumulatedWithholdingAmount();
  643. //累计子女教育支出
  644. BigDecimal accumulatedChildEducation = complexIncome.getAccumulatedChildEducation();
  645. //累计继续教育支出
  646. BigDecimal accumulatedContinueEducation = complexIncome.getAccumulatedContinueEducation();
  647. //累计学历继续教育支出
  648. BigDecimal accumulatedDegreeContinueEducationLimit = complexIncome.getAccumulatedDegreeContinueEducationLimit();
  649. //累计非学历继续教育支出
  650. BigDecimal accumulatedUnDegreeContinueEducationLimit = complexIncome.getAccumulatedUnDegreeContinueEducationLimit();
  651. //累计住房租金支出
  652. BigDecimal accumulatedHouseRent = complexIncome.getAccumulatedHouseRent();
  653. //累计房屋贷款支出
  654. BigDecimal accumulatedHouseLoan = complexIncome.getAccumulatedHouseLoan();
  655. //累计赡养老人支出
  656. BigDecimal accumulatedSupportElder = complexIncome.getAccumulatedSupportElder();
  657. //累计3岁以下婴幼儿照护支出
  658. BigDecimal accumulatedBabyCare = complexIncome.getAccumulatedBabyCare();
  659. //累计准予扣除的捐赠额
  660. BigDecimal accumulatedDeductibleDonation = complexIncome.getAccumulatedDeductibleDonation();
  661. //累计个人养老金
  662. BigDecimal accumulatedPersonalPension = complexIncome.getAccumulatedPersonalPension();
  663. //累计个人养老金校验码
  664. String accumulatedPersonalPensionCheckCode = complexIncome.getAccumulatedPersonalPensionCheckCode();
  665. //准予扣除的捐赠额
  666. BigDecimal deductibleDonation = complexIncome.getDeductibleDonation();
  667. //累计已缴税额
  668. BigDecimal accumulatedPaidAmount = complexIncome.getAccumulatedPaidAmount();
  669. //企业上月是否已申报:
  670. String etaxDeclaredLastMonth = complexIncome.getEtaxDeclaredLastMonth();
  671. //员工在税局累计已扣缴的税额
  672. BigDecimal etaxAccumulatedPaidAmount = complexIncome.getEtaxAccumulatedPaidAmount();
  673. //本月已累计扣除税额
  674. BigDecimal monthAccumulatedWithholdingAmount = complexIncome.getMonthAccumulatedWithholdingAmount();
  675. //本次应扣缴税额
  676. BigDecimal currentWithholdingAmount = complexIncome.getCurrentWithholdingAmount();
  677. //允许扣除的税费
  678. BigDecimal taxDeductible = complexIncome.getTaxDeductible();
  679. //展业成本
  680. BigDecimal exhibitionCost = complexIncome.getExhibitionCost();
  681. //月减除费用
  682. BigDecimal monthDeduction = complexIncome.getMonthDeduction();
  683. //分摊年度数
  684. Integer apportionYears = complexIncome.getApportionYears();
  685. //年减除费用 默认为60000
  686. BigDecimal yearDeduction = complexIncome.getYearDeduction();
  687. }
  688. }
  689. /**
  690. * 处理失败算税原因列表
  691. *
  692. * @param failedCheckTaxCalResult
  693. */
  694. private void handleFailedCheckTaxCalResult(
  695. Context ctx,
  696. List<CheckTaxCalResult> failedCheckTaxCalResult)
  697. throws BOSException, JsonProcessingException {
  698. logger.info("handleFailedCheckTaxCalResult:" + objectMapper.writeValueAsString(failedCheckTaxCalResult));
  699. if (failedCheckTaxCalResult != null) {
  700. String updateSql = "/*dialect*/update T_HR_STaxCalInitDetail set FERRORINFO = ?,FSTATE = '50' " +
  701. "where fpersonId = ? " +
  702. "and FTAXUNITID=? and to_char(FPERIODBEGIN,'yyyy-mm-dd') >= ? and to_char(FPERIODEND,'yyyy-mm-dd') <= ? and FINCOMEITEMID=? and FSTATE =30";
  703. List<Object[]> udpateParameter = new ArrayList<>();
  704. for (int i = 0; failedCheckTaxCalResult != null && i < failedCheckTaxCalResult.size(); i++) {
  705. List list = new ArrayList();
  706. CheckTaxCalResult checkTaxCalResult = failedCheckTaxCalResult.get(i);
  707. //证件类型名称
  708. String licenseType = checkTaxCalResult.getLicenseType();
  709. //String cardTypeValue = cardTypeEnumMap.get(licenseType);
  710. //证件号码
  711. String licenseNumber = checkTaxCalResult.getLicenseNumber();
  712. //员工id
  713. String personId = taxPersonRecordMap.get(licenseNumber + licenseType);
  714. if (StringUtils.isEmpty(personId)) {
  715. logger.error("未匹配到人员 证件号: " + licenseNumber + " 证件类型: " + licenseType);
  716. continue;
  717. }
  718. //人员id
  719. Long employeeId = checkTaxCalResult.getEmployeeId();
  720. //人员名称
  721. String employeeName = checkTaxCalResult.getEmployeeName();
  722. //错误码
  723. String errorCode = checkTaxCalResult.getErrorCode();
  724. //错误信息
  725. String errorMessage = checkTaxCalResult.getErrorMessage();
  726. //所得税表的code
  727. String incomeItemCode = checkTaxCalResult.getIncomeItemCode();
  728. //所得税表的name
  729. String incomeItemName = checkTaxCalResult.getIncomeItemName();
  730. if (!incomeItemMap.containsKey(incomeItemName)) {
  731. logger.error("未匹配到所得项目 名称为: " + incomeItemName);
  732. continue;
  733. }
  734. String incomeItemId = incomeItemMap.get(incomeItemName);
  735. list.add(errorMessage);
  736. list.add(personId);
  737. list.add(taxUnitId);
  738. list.add(periodBegin);
  739. list.add(periodEnd);
  740. list.add(incomeItemId);
  741. udpateParameter.add(list.toArray());
  742. }
  743. try {
  744. logger.error("处理失败算税原因列表 updateSql " + updateSql);
  745. logger.error("处理失败算税原因列表 udpateParameter " + objectMapper.writeValueAsString(udpateParameter));
  746. if (!udpateParameter.isEmpty()) {
  747. DbUtil.executeBatch(ctx, updateSql, udpateParameter);
  748. }
  749. } catch (BOSException e) {
  750. e.printStackTrace();
  751. throw new BOSException("更新处理失败算税原因列表报错: " + e.getMessage());
  752. }
  753. }
  754. }
  755. /**
  756. * 生成个税应用+税款计算最终拆分明细表
  757. * 先新增再更新
  758. */
  759. private void generateOrUpdateTaxCalConfigDetail(Context ctx,
  760. Set<String> personIds,
  761. Set<String> incomeitemIds) throws BOSException, SQLException, ParseException, JsonProcessingException {
  762. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  763. Date periodBeginDate = sdf.parse(periodBegin);
  764. Date periodEndDate = sdf.parse(periodEnd);
  765. //先查出计算成功的初算数据(人员、纳税单位id、周期、所得项目、状态=成功)
  766. ITaxCalConfigDetail iTaxCalConfigDetail = TaxCalConfigDetailFactory.getLocalInstance(ctx);
  767. StringBuilder querySql = new StringBuilder();
  768. querySql.append("SELECT fid,fpersonId,fincomeitemid,FCALSCHEMEID,FCMPCALTABLEID,FTAXUNITID from T_HR_STaxCalInitDetail where").append("\n");
  769. querySql.append(" fpersonId in(").append(AtsUtil.convertSetToString(personIds)).append(")").append("\n");
  770. querySql.append(" and to_char(FPERIODBEGIN, 'yyyy-mm-dd') >= '").append(periodBegin).append("'").append("\n");
  771. querySql.append(" and to_char(FPERIODEND, 'yyyy-mm-dd') <= '").append(periodEnd).append("'").append("\n");
  772. querySql.append(" and FINCOMEITEMID in(").append(AtsUtil.convertSetToString(incomeitemIds)).append(")").append("\n");
  773. querySql.append(" and FTAXUNITID = '").append(taxUnitId).append("'").append("\n");
  774. querySql.append(" and FSTATE = '40'").append("\n");
  775. logger.info("generateOrUpdateTaxCalConfigDetail.sql: " + querySql);
  776. IRowSet iRowSet = DbUtil.executeQuery(ctx, querySql.toString());
  777. List<Map<String, String>> list = new ArrayList<>();
  778. while (iRowSet.next()) {
  779. Map<String, String> map = new HashMap<>();
  780. map.put("initId", iRowSet.getString("fid"));
  781. map.put("personId", iRowSet.getString("fpersonId"));
  782. map.put("incomeitemid", iRowSet.getString("FINCOMEITEMID"));
  783. map.put("calSchemeId", iRowSet.getString("FCALSCHEMEID"));
  784. map.put("cmpCalTableId", iRowSet.getString("FCMPCALTABLEID"));
  785. map.put("taxUnitId", iRowSet.getString("FTAXUNITID"));
  786. list.add(map);
  787. }
  788. //用初算数据生成明细表(需要判断明细表数据是否已经生成过)
  789. Set<String> initIds = new HashSet<>();
  790. Set<String> configIds = new HashSet<>();
  791. for (int i = 0; i < list.size(); i++) {
  792. try {
  793. String detailId = null;
  794. Map<String, String> map = list.get(i);
  795. String initId = map.get("initId");//初算id
  796. String personId = map.get("personId");
  797. String taxUnitId = map.get("taxUnitId");
  798. String incomeitemid = map.get("incomeitemid");
  799. String calSchemeId = map.get("calSchemeId");
  800. String cmpCalTableId = map.get("cmpCalTableId");
  801. FilterInfo filterInfo = new FilterInfo();
  802. FilterItemCollection filterItems = filterInfo.getFilterItems();
  803. filterItems.add(new FilterItemInfo("person", personId));
  804. filterItems.add(new FilterItemInfo("taxUnit", taxUnitId));
  805. filterItems.add(new FilterItemInfo("periodBegin", periodBeginDate, CompareType.GREATER_EQUALS));
  806. filterItems.add(new FilterItemInfo("periodEnd", periodEndDate, CompareType.LESS_EQUALS));
  807. filterItems.add(new FilterItemInfo("incomeItem", incomeitemid));
  808. filterItems.add(new FilterItemInfo("calScheme", calSchemeId));
  809. filterItems.add(new FilterItemInfo("cmpCalTable", cmpCalTableId));
  810. SelectorItemCollection sic = new SelectorItemCollection();
  811. sic.add("state");
  812. EntityViewInfo instance = EntityViewInfo.getInstance(filterInfo, sic, null);
  813. logger.info("instance: " + instance.toString());
  814. TaxCalConfigDetailCollection taxCalConfigDetailCol = iTaxCalConfigDetail.getTaxCalConfigDetailCollection(instance);
  815. if (taxCalConfigDetailCol.size() > 0) {
  816. TaxCalConfigDetailInfo taxCalConfigDetailInfo = taxCalConfigDetailCol.get(0);
  817. if (TaxResultStateEnum.UN_CONFIRM.equals(taxCalConfigDetailInfo.getState())) {
  818. //未确认,更新数据
  819. detailId = taxCalConfigDetailInfo.getId().toString();
  820. configIds.add(detailId);
  821. } else {
  822. //已确认,不能更新
  823. logger.error("更新明细表数据 已确认,不能更新");
  824. continue;
  825. }
  826. } else {
  827. //没有找到明细数据,创建数据
  828. //个税应用+税款计算最终拆分明细表
  829. TaxCalConfigDetailInfo taxCalConfigDetailInfo = new TaxCalConfigDetailInfo();
  830. //计算规则
  831. taxCalConfigDetailInfo.put("calScheme", map.get("calSchemeId"));
  832. //核算表id
  833. taxCalConfigDetailInfo.put("cmpCalTable", map.get("cmpCalTableId"));
  834. //状态
  835. taxCalConfigDetailInfo.setState(TaxResultStateEnum.UN_CONFIRM);
  836. //依赖id
  837. //taxCalConfigDetailInfo.setRelay();
  838. //是否最后一条
  839. taxCalConfigDetailInfo.setIsLast(true);
  840. //是否生成个税申报
  841. taxCalConfigDetailInfo.setIsGenerateTaxDeclare(false);
  842. //申报批次号
  843. //taxCalConfigDetailInfo.setBatchNo();
  844. //员工
  845. taxCalConfigDetailInfo.put("person", map.get("personId"));
  846. //纳税单位
  847. taxCalConfigDetailInfo.put("taxUnit", map.get("taxUnitId"));
  848. //税款所属期间起
  849. taxCalConfigDetailInfo.setPeriodBegin(periodBeginDate);
  850. //税款所属期间止
  851. taxCalConfigDetailInfo.setPeriodEnd(periodEndDate);
  852. //所得项目
  853. taxCalConfigDetailInfo.put("incomeItem", map.get("incomeitemid"));
  854. detailId = iTaxCalConfigDetail.addnew(taxCalConfigDetailInfo).toString();
  855. configIds.add(detailId);
  856. }
  857. initIds.add(initId);
  858. } catch (Exception e) {
  859. e.printStackTrace();
  860. }
  861. }
  862. logger.info("configIds: " + objectMapper.writeValueAsString(configIds));
  863. logger.info("initIds " + objectMapper.writeValueAsString(initIds));
  864. if (!configIds.isEmpty() && !initIds.isEmpty()) {
  865. //更新明细表数据
  866. StringBuilder updateSql = new StringBuilder();
  867. StringBuilder querySqlForUpdate = new StringBuilder();
  868. updateSql.append("update T_HR_STaxCalConfigDetail config set (").append("\n");
  869. //todo
  870. for (String key : taxItemConfigMap.keySet()) {
  871. updateSql.append(taxItemConfigMap.get(key)).append(",").append("\n");
  872. querySqlForUpdate.append(taxItemConfigMap.get(key)).append(",").append("\n");
  873. }
  874. updateSql.deleteCharAt(updateSql.lastIndexOf(","));
  875. querySqlForUpdate.deleteCharAt(querySqlForUpdate.lastIndexOf(","));
  876. updateSql.append(") = (select ").append(querySqlForUpdate).append("\n");
  877. updateSql.append(" from T_HR_STaxCalInitDetail ").append("\n");
  878. updateSql.append(" where fid in (").append(AtsUtil.convertSetToString(initIds)).append(")").append("\n");
  879. updateSql.append(" and config.fpersonId = fpersonId").append("\n");
  880. updateSql.append(" and config.fCmpCalTableId = fCmpCalTableId").append("\n");
  881. updateSql.append(" and config.fIncomeItemId = fIncomeItemId").append("\n");
  882. updateSql.append(" and config.FPERIODBEGIN = FPERIODBEGIN").append("\n");
  883. updateSql.append(" and config.FPERIODEND = FPERIODEND)").append("\n");
  884. updateSql.append(" where config.fstate = '10'").append("\n");
  885. updateSql.append(" and config.fid in(").append(AtsUtil.convertSetToString(configIds)).append(")").append("\n");
  886. logger.info("更新明细表sql: " + updateSql);
  887. DbUtil.execute(ctx, updateSql.toString());
  888. }
  889. }
  890. /**
  891. * 获取证件map
  892. *
  893. * @return
  894. */
  895. // private static Map<String, String> getCardTypeEnumMap() {
  896. // Map<String, String> cardTypeEnumMap = new HashMap<>();
  897. // List<Map<String, String>> enumList = CardTypeEnum.getEnumList();
  898. // for (int i = 0; i < enumList.size(); i++) {
  899. // CardTypeEnum cardTypeEnum = (CardTypeEnum) enumList.get(i);
  900. // String value = cardTypeEnum.getValue();
  901. // String alias = cardTypeEnum.getAlias();
  902. // cardTypeEnumMap.put(alias, value);
  903. // }
  904. // return cardTypeEnumMap;
  905. // }
  906. /**
  907. * 获取所得项目
  908. *
  909. * @param ctx
  910. * @return
  911. * @throws BOSException
  912. */
  913. private Map<String, String> getIncomeItemMap(Context ctx) throws BOSException {
  914. Map<String, String> incomeItemMap = new HashMap<>();
  915. try {
  916. TaxIncomeItemCollection taxIncomeItemCollection = TaxIncomeItemFactory.getLocalInstance(ctx).getTaxIncomeItemCollection("where state = 1");
  917. for (int i = 0; i < taxIncomeItemCollection.size(); i++) {
  918. TaxIncomeItemInfo taxIncomeItemInfo = taxIncomeItemCollection.get(i);
  919. String taxIncomeItemId = taxIncomeItemInfo.getId().toString();
  920. String name = taxIncomeItemInfo.getName();
  921. incomeItemMap.put(name, taxIncomeItemId);
  922. }
  923. return incomeItemMap;
  924. } catch (BOSException e) {
  925. e.printStackTrace();
  926. throw new BOSException("获取所得项目数据报错: " + e.getMessage());
  927. }
  928. }
  929. /**
  930. * 获取报送人员信息
  931. *
  932. * @param ctx
  933. * @throws BOSException
  934. */
  935. private void getTaxPersonRecordMap(Context ctx) throws BOSException {
  936. if (taxPersonRecordMap == null) {
  937. taxPersonRecordMap = new HashMap<>();
  938. }
  939. String oql = "select bill.person.id,bill.cardType,bill.cardNumber";
  940. TaxPersonRecordEntryCollection taxPersonRecordEntryCollection =
  941. TaxPersonRecordEntryFactory.getLocalInstance(ctx).getTaxPersonRecordEntryCollection(oql);
  942. for (int i = 0; i < taxPersonRecordEntryCollection.size(); i++) {
  943. TaxPersonRecordInfo taxPersonRecordInfo = taxPersonRecordEntryCollection.get(i).getBill();
  944. if (taxPersonRecordInfo != null) {
  945. String personId = taxPersonRecordInfo.getPerson().getId().toString();
  946. CardTypeEnum cardType = taxPersonRecordInfo.getCardType();
  947. if (cardType == null) {
  948. logger.error("获取报送人员信息 人员id[" + personId + "] 的证件类型为空!");
  949. continue;
  950. }
  951. String cardTypeName = cardType.getAlias();
  952. String cardNumber = taxPersonRecordInfo.getCardNumber();
  953. taxPersonRecordMap.put(cardNumber + cardTypeName, personId);
  954. }
  955. }
  956. }
  957. /**
  958. * 获取个税项目
  959. *
  960. * @param ctx
  961. * @return
  962. * @throws BOSException
  963. */
  964. private void getTaxItemMap(Context ctx) throws BOSException {
  965. if (taxItemInitMap == null) {
  966. taxItemInitMap = new HashMap<>();
  967. }
  968. if (taxItemConfigMap == null) {
  969. taxItemConfigMap = new HashMap<>();
  970. }
  971. //获取所有个税项目
  972. Set initSet = new HashSet();
  973. initSet.add("jmse");//减免税额
  974. initSet.add("qzd");//减除费用
  975. initSet.add("ynssde");//应纳税所得额
  976. initSet.add("sl");//税率
  977. initSet.add("sskcs");//速算扣除数
  978. initSet.add("bqybtse");//应补退税额
  979. initSet.add("bqljsre");//累计收入额
  980. initSet.add("bqljmssr");///累计免税收入额
  981. initSet.add("zxkchj");//累计专项扣除额
  982. initSet.add("zxfjkchj");//累计专项(附加)扣除额
  983. initSet.add("qtckhj");//累计其他扣除额
  984. initSet.add("ljjmse");//累计减免税额
  985. initSet.add("jcfy");//累计减除费用额
  986. initSet.add("ljynssde");//累计应纳税所得额
  987. initSet.add("ljynse");//累计应纳税额
  988. initSet.add("ljyingkjse");//累计应扣缴税额
  989. initSet.add("ljzykcdjze");//累计准予扣除的捐赠额
  990. initSet.add("grylj"); //累计个人养老金
  991. initSet.add("zykcjze");//准予扣除的捐赠额
  992. initSet.add("ykjse");//本月已累计扣除税额
  993. initSet.add("yxkcsf");//允许扣除的税费
  994. initSet.add("zycb");//展业成本
  995. initSet.add("znjyzc");//累计子女教育支出*
  996. initSet.add("jxjyzc");//累计继续教育支出*
  997. initSet.add("ljxljxjyzc");//累计学历继续教育支出*
  998. initSet.add("ljfxljxjyzc");//累计非学历继续教育支出*
  999. initSet.add("zfzjzc");//累计住房租金支出*
  1000. initSet.add("zfdklxzc");//累计房屋贷款支出*
  1001. initSet.add("sylrzc");//累计赡养老人支出*
  1002. initSet.add("yyezhfzc");// 累计婴幼儿照护费用*
  1003. initSet.add("dyznjyzc");// 子女教育支出*
  1004. initSet.add("dysylrzc");// 赡养老人支出*
  1005. initSet.add("dyfwdkzc");// 住房贷款利息支出*
  1006. initSet.add("dyzfzjzc");// 住房租金支出*
  1007. initSet.add("dyjxjyzc");// 继续教育支出*
  1008. initSet.add("dyfxljxjyzc");//非学历继续教育支出*
  1009. initSet.add("dyyyrzhzc");// 婴幼儿照护支出*
  1010. //最终拆分明细表个税项目
  1011. Set configSet = new HashSet();
  1012. configSet.add("sre");//本期收入
  1013. configSet.add("mssd");// 本期免税收入
  1014. configSet.add("jbylaobxf");// 基本养老保险费
  1015. configSet.add("jbylbxf");// 基本医疗保险费
  1016. configSet.add("sybxf");// 失业保险费
  1017. configSet.add("zfgjj");// 住房公积金
  1018. configSet.add("znjyzc");// 累计子女教育
  1019. configSet.add("jxjyzc");// 累计继续教育
  1020. configSet.add("zfdklxzc");// 累计住房贷款利息");
  1021. configSet.add("zfzjzc");// 累计住房租金");
  1022. configSet.add("nj");// 企业(职业)年金");
  1023. configSet.add("syjkbx");// 商业健康保险");
  1024. configSet.add("syylbx");// 税延养老保险");
  1025. configSet.add("qt");// 其他");
  1026. configSet.add("zykcjze");// 准予扣除的捐赠额");
  1027. configSet.add("jmse");// 减免税额");
  1028. configSet.add("yxkcsf");// 允许扣除的税费");
  1029. configSet.add("ljsre");// 上期累计收入");
  1030. configSet.add("bqljsre");// 本期累计收入");
  1031. configSet.add("ljmssd");// 上期累计免税收入");
  1032. configSet.add("bqljmssr");// 本期累计免税收入");
  1033. configSet.add("qzd");// 减除费用");
  1034. configSet.add("jcfy");// 累计减除费用");
  1035. configSet.add("fy");// 本期费用");
  1036. configSet.add("zxkchj");// 累计专项扣除");
  1037. configSet.add("zxfjkchj");// 累计专项附加扣除合计");
  1038. configSet.add("qtckhj");// 累计其他扣除");
  1039. configSet.add("ljzykcdjze");// 累计准予扣除的捐赠
  1040. configSet.add("ljynssde");// 累计应纳税所得额
  1041. configSet.add("sl");// 税率
  1042. configSet.add("sskcs");// 速算扣除数
  1043. configSet.add("ljynse");// 累计应纳税额
  1044. configSet.add("ljjmse");// 累计减免税额
  1045. configSet.add("ljyingkjse");// 累计应扣缴税额
  1046. configSet.add("ykjse");// 累计已预缴税额
  1047. configSet.add("ybtse");// 累计应补(退)税额
  1048. configSet.add("ycxbc");// 一次性补偿
  1049. configSet.add("zycb");// 展业成本
  1050. configSet.add("bz");// 备注
  1051. configSet.add("ccyz");// 财产原值
  1052. configSet.add("jsbl");// 减按计税比例
  1053. configSet.add("ynssde");// 应纳税所得额
  1054. configSet.add("bqybtse");// 本期应补(退)税额
  1055. configSet.add("sylrzc");// 累计赡养老人
  1056. configSet.add("yyezhfzc");// 累计婴幼儿照护费用
  1057. configSet.add("grylj");// 累计个人养老金
  1058. configSet.add("ljfxljxjyzc");// 累计非学历继续教育支出
  1059. configSet.add("ljxljxjyzc");// 累计学历继续教育支出
  1060. configSet.add("dyznjyzc");// 子女教育支出
  1061. configSet.add("dysylrzc");// 赡养老人支出
  1062. configSet.add("dyfwdkzc");// 住房贷款利息支出
  1063. configSet.add("dyzfzjzc");// 住房租金支出
  1064. configSet.add("dyjxjyzc");// 继续教育支出
  1065. configSet.add("dyfxljxjyzc");//非学历继续教育支出
  1066. configSet.add("dyyyrzhzc");// 婴幼儿照护支出
  1067. try {
  1068. TaxItemCollection itemColl = TaxItemFactory.getLocalInstance(ctx)
  1069. .getTaxItemCollection("where state = 1");
  1070. for (int i = 0; i < itemColl.size(); ++i) {
  1071. TaxItemInfo info = itemColl.get(i);
  1072. String number = info.getNumber();
  1073. if (initSet.contains(number)) {
  1074. taxItemInitMap.put(number, "T" + info.getFieldSn());
  1075. }
  1076. if (configSet.contains(number)) {
  1077. taxItemConfigMap.put(number, "T" + info.getFieldSn());
  1078. }
  1079. }
  1080. } catch (BOSException var5) {
  1081. var5.printStackTrace();
  1082. throw new BOSException("获取个税项目报错: " + var5.getMessage());
  1083. }
  1084. }
  1085. }