SubmitAsynTaxCalRequestService.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  1. package com.kingdee.eas.custom.shuiyou.taxCal.service;
  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.fasterxml.jackson.databind.ObjectMapper;
  8. import com.kingdee.bos.BOSException;
  9. import com.kingdee.bos.Context;
  10. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  11. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  12. import com.kingdee.eas.common.EASBizException;
  13. import com.kingdee.eas.custom.shuiyou.interfacelog.ILogInfo;
  14. import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoFactory;
  15. import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoInfo;
  16. import com.kingdee.eas.custom.shuiyou.task.MessageResult;
  17. import com.kingdee.eas.custom.shuiyou.task.TaskCatalogEnum;
  18. import com.kingdee.eas.custom.shuiyou.uitls.SYUtilsFacadeFactory;
  19. import com.kingdee.eas.custom.shuiyou.utils.ClientProxyFactoryUtils;
  20. import com.kingdee.eas.hr.ats.AtsUtil;
  21. import com.kingdee.eas.hr.base.PositionTypeEnum;
  22. import com.kingdee.eas.hr.rec.GenderEnum;
  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.EmployedTypeEnum;
  27. import com.kingdee.shr.compensation.PersonStatusEnum;
  28. import com.kingdee.shr.compensation.app.incomeTax.EmploymentSituationEnum;
  29. import com.kingdee.shr.compensation.app.tax.TaxUnitFactory;
  30. import com.kingdee.shr.compensation.app.tax.TaxUnitInfo;
  31. import com.kingdee.shr.compensation.app.tax.base.TaxItemCollection;
  32. import com.kingdee.shr.compensation.app.tax.base.TaxItemFactory;
  33. import com.kingdee.shr.compensation.app.tax.base.TaxItemInfo;
  34. import com.kingdee.shr.compensation.util.Base64Utils;
  35. import com.kingdee.util.StringUtils;
  36. import org.apache.log4j.Logger;
  37. import java.math.BigDecimal;
  38. import java.text.SimpleDateFormat;
  39. import java.util.*;
  40. /**
  41. * @Description 提交异步税款计算请求
  42. * @Date 2024/9/2 14:30
  43. * @Created by Heyuan
  44. */
  45. public class SubmitAsynTaxCalRequestService implements IHRMsfService {
  46. private static Logger logger = Logger.getLogger(SubmitAsynTaxCalRequestService.class);
  47. private Map<String, String> taxItemInitMap = null;//初算个税项目
  48. @Override
  49. public MessageResult process(Context ctx, Map paramMap) throws EASBizException, BOSException {
  50. ObjectMapper objectMapper = new ObjectMapper();
  51. String taskId = null;
  52. ILogInfo iLogInfo = LogInfoFactory.getLocalInstance(ctx);
  53. //接口日志实体
  54. LogInfoInfo logInfo = new LogInfoInfo();
  55. //入口
  56. logInfo.setEntrance(this.getClass().getName());
  57. logInfo.setBizDate(new Date());
  58. try {
  59. logger.info("调用 CalTaxService, 参数 " + objectMapper.writeValueAsString(paramMap));
  60. MessageResult messageResult = null;
  61. String this_taskId = (String) paramMap.get("this_taskId");//任务id
  62. String paramData = (String) paramMap.get("paramData");
  63. Map<String, String> paramDataMap = objectMapper.readValue(paramData, Map.class);
  64. String taxUnitId = paramDataMap.get("TAXUNITID");//纳税单位id
  65. String period = paramDataMap.get("PERIOD");//周期yyyy-MM
  66. String creator = paramDataMap.get("creator");//创建人id
  67. StringBuilder errorMsg = new StringBuilder();
  68. if (StringUtils.isEmpty(taxUnitId)) {
  69. errorMsg.append("纳税单位id不能为空!\n");
  70. }
  71. if (StringUtils.isEmpty(period)) {
  72. errorMsg.append("周期yyyy-MM不能为空!\n");
  73. }
  74. if (errorMsg.length() > 0) {
  75. throw new BOSException(errorMsg.toString());
  76. }
  77. //客户端代理工厂
  78. ClientProxyFactory clientProxyFactory = ClientProxyFactoryUtils.getClientProxyFactory();
  79. TaxUnitInfo taxUnitInfo = TaxUnitFactory.getLocalInstance(ctx).getTaxUnitInfo(new ObjectUuidPK(taxUnitId));
  80. //获取个税项目
  81. getTaxItemMap(ctx);
  82. //获取待计算数据
  83. Map<String, List<Map<String, Object>>> caluDataMap = getCaluData(ctx, paramDataMap);
  84. //算税请求接口
  85. TaxRequest taxRequest = clientProxyFactory.getTaxRequest();
  86. //获取请求参数
  87. CalculateIndividualIncomeTaxRequest taxRequestPara = getTaxRequestParameter(taxUnitInfo, caluDataMap, period);
  88. //调用异步算税接口
  89. ApiResponse<AsyncResult> asyncResultApiResponse = taxRequest.calculateASynIndividualIncomeTax(taxRequestPara);
  90. String status = asyncResultApiResponse.getHead().getStatus();
  91. logInfo.setInterfaceAddress("/gateway/iit/calculateTax/calculateASynIndividualIncomeTax");//接口地址
  92. logInfo.setInterfaceName("calculateASynIndividualIncomeTax");//接口名
  93. ObjectMapper mapper = new ObjectMapper();
  94. logInfo.setInParameter(mapper.writeValueAsString(taxRequestPara));//入参
  95. logInfo.setOutParameter(mapper.writeValueAsString(asyncResultApiResponse));//回参
  96. if ("N".equals(status)) {
  97. //请求失败响应
  98. String msg = asyncResultApiResponse.getHead().getMsg();
  99. messageResult = MessageResult.FAILED(msg);
  100. logInfo.setErrorInfo(msg);//错误信息
  101. logInfo.setStatus("失败");
  102. } else {
  103. //调用成功
  104. //请求id
  105. String requestId = asyncResultApiResponse.getBody().getRequestId();
  106. logInfo.setStatus("成功");
  107. paramDataMap.put("requestId", requestId);
  108. String backParam = mapper.writeValueAsString(paramDataMap);
  109. // 创建轮询请求任务
  110. taskId = SYUtilsFacadeFactory.getLocalInstance(ctx).addTask(
  111. "getASynIndividualIncomeTaxFeedback",
  112. backParam,
  113. TaskCatalogEnum.CAL_GET,
  114. "");
  115. messageResult = MessageResult.SUCCESS();
  116. Map map = new HashMap();
  117. messageResult.setData(map);
  118. map.put("taskId", taskId);
  119. map.put("requestId", requestId);
  120. }
  121. iLogInfo.addnew(logInfo);
  122. return messageResult;
  123. } catch (Exception e) {
  124. e.printStackTrace();
  125. logInfo.setErrorInfo(e.getMessage());//错误信息
  126. iLogInfo.addnew(logInfo);
  127. return MessageResult.ERROR(e.getMessage());
  128. }
  129. }
  130. /**
  131. * 获取个税项目
  132. *
  133. * @param ctx
  134. * @return
  135. * @throws BOSException
  136. */
  137. private void getTaxItemMap(Context ctx) throws BOSException {
  138. if (taxItemInitMap == null) {
  139. taxItemInitMap = new HashMap<>();
  140. }
  141. //获取所有个税项目
  142. Set initSet = new HashSet();
  143. initSet.add("sre");//当期收入额
  144. initSet.add("mssd");//免税收入
  145. initSet.add("jbylaobxf");//基本养老保险
  146. initSet.add("jbylbxf");//基本医疗保险
  147. initSet.add("sybxf");//失业保险
  148. initSet.add("zfgjj");//住房公积金
  149. initSet.add("nj");//企业年金
  150. initSet.add("syjkbx");//商业健康保险
  151. initSet.add("zykcjze");//准予扣除的捐赠额
  152. initSet.add("jmse");//减免税额
  153. initSet.add("syylbx");//税延养老保险
  154. initSet.add("yxkcsf");//允许扣除的税费
  155. initSet.add("ycxbc");//一次性补偿
  156. initSet.add("dyznjyzc"); // 子女教育支出
  157. initSet.add("dysylrzc"); // 赡养老人支出
  158. initSet.add("dyfwdkzc"); // 房屋贷款支出
  159. initSet.add("dyzfzjzc"); // 住房租金支出
  160. initSet.add("dyjxjyzc"); // 继续教育支出
  161. initSet.add("dyyyrzhzc"); // 婴幼儿照护支出
  162. try {
  163. TaxItemCollection itemColl = TaxItemFactory.getLocalInstance(ctx)
  164. .getTaxItemCollection("where number in (" + AtsUtil.convertSetToString(initSet) + ")");
  165. for (int i = 0; i < itemColl.size(); ++i) {
  166. TaxItemInfo info = itemColl.get(i);
  167. String number = info.getNumber();
  168. taxItemInitMap.put(number, "T" + info.getFieldSn());
  169. }
  170. } catch (BOSException var5) {
  171. var5.printStackTrace();
  172. throw new BOSException("获取个税项目报错: " + var5.getMessage());
  173. }
  174. }
  175. /**
  176. * 获取待计算数据
  177. */
  178. private Map<String, List<Map<String, Object>>> getCaluData(Context ctx, Map<String, String> paramDataMap) throws BOSException {
  179. try {
  180. String taxUnitId = paramDataMap.get("TAXUNITID");//纳税单位id
  181. String period = paramDataMap.get("PERIOD");//周期yyyy-MM
  182. String creator = paramDataMap.get("creator");//创建人id
  183. String initIds = paramDataMap.get("initIds");//初算数据id
  184. StringBuilder sql = new StringBuilder();
  185. sql.append("SELECT ").append("\n");
  186. for (String number : taxItemInitMap.keySet()) {
  187. String tableField = taxItemInitMap.get(number);
  188. sql.append("scid.").append(tableField).append(" ").append(number).append(",\n");
  189. }
  190. sql.append("item.fnumber AS itemNumber,").append("\n")
  191. .append("personRe.FCARDNUMBER,").append("\n")
  192. .append("personRe.FCARDTYPE,").append("\n")
  193. .append("(CASE WHEN personRe.FREPORTNAME IS NOT NULL THEN personRe.FREPORTNAME ELSE person.fname_l2 END) AS personName,").append("\n")
  194. .append("person.fnumber AS personNumber,").append("\n")
  195. .append("personRe.FPHONENUMBER,").append("\n") // 手机号
  196. .append("personRe.FISOVERSEA,").append("\n") // 是否境外人员
  197. .append("personRe.FGENDER,").append("\n") // 性别
  198. .append("personRe.FBIRTHDAY,").append("\n") // 出生日期
  199. .append("personRe.FISDISABILITY,").append("\n") // 是否残疾
  200. .append("personRe.FDISCARDNUMBER,").append("\n") // 残疾证号
  201. .append("personRe.FHEROCARDNUMBER,").append("\n") // 烈属证号
  202. .append("personRe.FEMAIL,").append("\n") // 电子邮箱
  203. .append("personRe.FCHINESENAME,").append("\n") // 中文名
  204. .append("personRe.FISHERO,").append("\n") // 是否烈属
  205. .append("personRe.FISOLD,").append("\n") // 是否孤老
  206. .append("personRe.FADDRESS,").append("\n") // 居住地省
  207. .append("personRe.FADDRESSCITY,").append("\n") // 居住城市
  208. .append("personRe.FADDRESSCOUNTY,").append("\n") // 居住区县
  209. .append("personRe.FADDRESSSTREET,").append("\n") // 居住街道
  210. .append("personRe.FDESC,").append("\n") // 备注
  211. .append("personRe.FHOMETOWN,").append("\n") // 户籍省份
  212. .append("personRe.FHOMETOWNCITY,").append("\n") // 户籍城市
  213. .append("personRe.FHOMETOWNCOUNTRY,").append("\n") // 户籍区县
  214. .append("personRe.FHOMETOWNSTREET,").append("\n") // 户籍街道
  215. .append("personRe.FHOMETOWNDETAILED,").append("\n") // 户籍详细地址
  216. .append("personRe.FACCOUNT,").append("\n") // 银行账号
  217. .append("personRe.FOTHERCARDTYPE,").append("\n") // 其他证件类型
  218. .append("personRe.FOTHERCARDNUMBER,").append("\n") // 其他证件号码
  219. .append("personRe.FTAXREASON,").append("\n") // 涉税事项
  220. .append("personRe.FBANKCARDPROVINCE,").append("\n") // 开户银行省份
  221. .append("bank.fname_l2 AS bankName,").append("\n") // 开户银行
  222. .append("personRe.FCONTACTADDRESS,").append("\n") // 联系地址_省
  223. .append("personRe.FCONTACTCITY,").append("\n") // 联系地城市
  224. .append("personRe.FCONTACTCOUNTRY,").append("\n") // 联系地区县
  225. .append("personRe.FCONTACTSTREET,").append("\n") // 联系地街道
  226. .append("personRe.FCONTACTDETAILED,").append("\n") // 联系地详细地址
  227. .append("personRe.FENTRYDATE,").append("\n") // 首次入境时间
  228. .append("personRe.FLEAVEDATE,").append("\n") // 预计离境时间
  229. .append("personRe.FPOSITION,").append("\n") // 职务
  230. .append("personRe.FINVESTMENTTOTAL,").append("\n") // 个人投资总额
  231. .append("personRe.FINVESTMENTRATE,").append("\n") // 个人投资比例
  232. .append("birthplace.FNAME_L2 AS birthplaceName,").append("\n") // 出生地
  233. .append("nationality.FNAME_L2 AS nationalityName,").append("\n") // 国籍
  234. .append("diploma.fnumber AS diplomaNumber,").append("\n") // 学历编码
  235. .append("personReEntry.FPERSONSTATUS,").append("\n") // 人员状态
  236. .append("personReEntry.FEMPLOYEDDATE,").append("\n") // 受雇日期
  237. .append("personReEntry.FDEPARTUREDATE,").append("\n") // 离职日期
  238. .append("personReEntry.FEMPLOYEDTYPE,").append("\n") // 任职受雇从业类型
  239. .append("personReEntry.FSITUATION,").append("\n") // 就业情况
  240. .append("personReEntry.FDEDUCTFEES").append("\n") // 是否扣除减除费用
  241. .append("FROM T_HR_STaxCalInitDetail scid ").append("\n")
  242. .append("LEFT JOIN T_HR_STaxIncomeItem item ON item.fid = scid.FINCOMEITEMID ").append("\n")
  243. .append("LEFT JOIN T_HR_STaxPersonRecordentry personReEntry ON personReEntry.fPersonId = scid.fPersonId AND scid.fTaxUnitId = personReEntry.fTaxUnitId ").append("\n")
  244. .append("LEFT JOIN T_HR_STaxPersonRecord personRe ON personReEntry.FBILLID = personRe.fid ").append("\n")
  245. .append("LEFT JOIN T_BD_Person person ON person.fid = personRe.FPERSONID ").append("\n")
  246. .append("LEFT JOIN T_BD_Nationality birthplace ON birthplace.fid = personRe.FBIRTHPLACEID ").append("\n")
  247. .append("LEFT JOIN T_BD_HRDiploma diploma ON diploma.fid = personRe.FEDULEVELID ").append("\n")
  248. .append("LEFT JOIN T_HR_PBank bank ON bank.fid = personRe.FHRBANKID ").append("\n")
  249. .append("LEFT JOIN T_BD_Nationality nationality ON nationality.fid = personRe.FNATIONALITYID ").append("\n")
  250. .append("WHERE scid.FTAXUNITID = '").append(taxUnitId).append("'").append("\n")
  251. .append("AND scid.FSTATE = '30' ").append("\n")
  252. .append("AND scid.fid in(").append(initIds).append(")").append("\n");
  253. logger.info("getCaluData.sql:\n" + sql);
  254. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql.toString());
  255. Map<String, List<Map<String, Object>>> dataMap = new HashMap<>();
  256. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  257. while (iRowSet.next()) {
  258. List<Map<String, Object>> list;
  259. //所得项目编码
  260. String itemNumber = iRowSet.getString("itemNumber");
  261. if (dataMap.containsKey(itemNumber)) {
  262. list = dataMap.get(itemNumber);
  263. } else {
  264. list = new ArrayList<>();
  265. dataMap.put(itemNumber, list);
  266. }
  267. Map map = new HashMap();
  268. //姓名
  269. map.put("personName", iRowSet.getString("personName"));
  270. //工号
  271. map.put("personNumber", iRowSet.getString("personNumber"));
  272. //证件号码
  273. map.put("cardNumber", iRowSet.getString("FCARDNUMBER"));
  274. //证件类型
  275. String cardType = iRowSet.getString("FCARDTYPE");
  276. if (!StringUtils.isEmpty(cardType)) {
  277. CardTypeEnum anEnum = CardTypeEnum.getEnum(cardType);
  278. if (anEnum != null) {
  279. map.put("cardType", anEnum.getAlias());
  280. }
  281. }
  282. //人员状态
  283. String personstatus = iRowSet.getString("FPERSONSTATUS");
  284. if (personstatus != null) {
  285. PersonStatusEnum anEnum = PersonStatusEnum.getEnum(personstatus);
  286. if (anEnum != null) {
  287. map.put("personstatusName", anEnum.getAlias());
  288. }
  289. }
  290. //任职受雇从业类型
  291. String employedtype = iRowSet.getString("FEMPLOYEDTYPE");
  292. if (!StringUtils.isEmpty(employedtype)) {
  293. EmployedTypeEnum anEnum = EmployedTypeEnum.getEnum(employedtype);
  294. if (anEnum != null) {
  295. map.put("employedtypeName", anEnum.getAlias());
  296. }
  297. }
  298. //手机号码
  299. map.put("phoneNumber", iRowSet.getString("FPHONENUMBER"));
  300. //就业情况
  301. Integer situation = iRowSet.getInt("FSITUATION");
  302. if (situation != null) {
  303. EmploymentSituationEnum anEnum = EmploymentSituationEnum.getEnum(situation);
  304. if (anEnum != null) {
  305. map.put("situationName", anEnum.getAlias());
  306. }
  307. }
  308. //性别
  309. String gender = iRowSet.getString("FGENDER");
  310. if (!StringUtils.isEmpty(gender)) {
  311. GenderEnum anEnum = GenderEnum.getEnum(gender);
  312. if (anEnum != null) {
  313. map.put("gender", anEnum.getAlias());
  314. }
  315. }
  316. //否境外人员
  317. String isoversea = iRowSet.getString("FISOVERSEA");
  318. if ("1".equals(isoversea)) {
  319. map.put("isoversea", "境外");
  320. } else if ("0".equals(isoversea)) {
  321. map.put("isoversea", "境内");
  322. }
  323. //是否残疾
  324. String isdisability = iRowSet.getString("FISDISABILITY");
  325. if ("1".equals(isdisability)) {
  326. map.put("isdisability", "是");
  327. } else {
  328. map.put("isdisability", "否");
  329. }
  330. //残疾证号
  331. map.put("discardnumber", iRowSet.getString("FDISCARDNUMBER"));
  332. //是否烈属
  333. String ishero = iRowSet.getString("FISHERO");
  334. if ("1".equals(ishero)) {
  335. map.put("ishero", "是");
  336. } else {
  337. map.put("ishero", "否");
  338. }
  339. //烈属证号
  340. map.put("herocardnumber", iRowSet.getString("FHEROCARDNUMBER"));
  341. //是否孤老
  342. String isold = iRowSet.getString("FISOLD");
  343. if ("1".equals(isold)) {
  344. map.put("isold", "是");
  345. } else {
  346. map.put("isold", "否");
  347. }
  348. //是否扣除减除费用
  349. String deductfees = iRowSet.getString("FDEDUCTFEES");
  350. if ("0".equals(deductfees)) {
  351. map.put("deductfees", "是");
  352. } else {
  353. map.put("deductfees", "否");
  354. }
  355. //职务
  356. String position = iRowSet.getString("FPOSITION");
  357. if (!StringUtils.isEmpty(position)) {
  358. PositionTypeEnum anEnum = PositionTypeEnum.getEnum(position);
  359. if (anEnum != null) {
  360. map.put("positionName", anEnum.getAlias());
  361. }
  362. }
  363. //电子邮箱
  364. map.put("email", iRowSet.getString("FEMAIL"));
  365. //个人投资总额
  366. map.put("investmenttotal", iRowSet.getBigDecimal("FINVESTMENTTOTAL"));
  367. //个人投资比例
  368. map.put("investmentrate", iRowSet.getBigDecimal("FINVESTMENTRATE"));
  369. //中文名
  370. map.put("chinesename", iRowSet.getString("FCHINESENAME"));
  371. //出生日期
  372. Date birthday = iRowSet.getDate("FBIRTHDAY");
  373. if (birthday != null) {
  374. map.put("birthday", sdf.format(birthday));
  375. }
  376. //受雇日期
  377. Date employeddate = iRowSet.getDate("FEMPLOYEDDATE");
  378. if (employeddate != null) {
  379. map.put("employeddate", sdf.format(employeddate));
  380. }
  381. //离职日期
  382. Date departuredate = iRowSet.getDate("FDEPARTUREDATE");
  383. if (departuredate != null) {
  384. map.put("departuredate", sdf.format(departuredate));
  385. }
  386. //出生地
  387. map.put("birthplaceName", iRowSet.getString("birthplaceName"));
  388. //学历
  389. int diplomaNumber = iRowSet.getInt("diplomaNumber");
  390. //todo 大学本科以下 大学本科 研究生
  391. if (diplomaNumber < 6) {
  392. map.put("diploma", "大学本科以下");
  393. } else if (diplomaNumber == 6) {
  394. map.put("diploma", "大学本科");
  395. } else if (diplomaNumber > 6) {
  396. map.put("diploma", "研究生");
  397. }
  398. //开户银行省份
  399. map.put("bankcardprovince", iRowSet.getString("FBANKCARDPROVINCE"));
  400. //开户银行
  401. map.put("bankName", iRowSet.getString("bankName"));
  402. //银行账号
  403. map.put("account", iRowSet.getString("FACCOUNT"));
  404. //其他证件类型
  405. map.put("othercardtype", iRowSet.getString("FOTHERCARDTYPE"));
  406. //其他证件号码
  407. map.put("othercardnumber", iRowSet.getString("FOTHERCARDNUMBER"));
  408. //居住地省
  409. map.put("address", iRowSet.getString("FADDRESS"));
  410. //居住城市
  411. map.put("addresscity", iRowSet.getString("FADDRESSCITY"));
  412. //居住区县
  413. map.put("addresscounty", iRowSet.getString("FADDRESSCOUNTY"));
  414. //居住街道
  415. map.put("addressstreet", iRowSet.getString("FADDRESSSTREET"));
  416. //户籍省份
  417. map.put("hometown", iRowSet.getString("FHOMETOWN"));
  418. //户籍城市
  419. map.put("hometowncity", iRowSet.getString("FHOMETOWNCITY"));
  420. //户籍城市
  421. map.put("hometowncountry", iRowSet.getString("FHOMETOWNCOUNTRY"));
  422. //户籍街道
  423. map.put("hometownstreet", iRowSet.getString("FHOMETOWNSTREET"));
  424. //户籍详细地址
  425. map.put("hometowndetailed", iRowSet.getString("FHOMETOWNDETAILED"));
  426. //国籍
  427. map.put("nationalityName", iRowSet.getString("nationalityName"));
  428. //涉税事项
  429. map.put("taxreason", iRowSet.getString("FTAXREASON"));
  430. //首次入境时间
  431. Date entrydate = iRowSet.getDate("FENTRYDATE");
  432. if (entrydate != null) {
  433. map.put("entrydate", sdf.format(entrydate));
  434. }
  435. //预计离境时间
  436. Date leavedate = iRowSet.getDate("FLEAVEDATE");
  437. if (leavedate != null) {
  438. map.put("leavedate", sdf.format(leavedate));
  439. }
  440. //联系地址_省
  441. map.put("contactaddress", iRowSet.getString("FCONTACTADDRESS"));
  442. //联系地城市
  443. map.put("contactcity", iRowSet.getString("FCONTACTCITY"));
  444. //联系地区县
  445. map.put("contactcountry", iRowSet.getString("FCONTACTCOUNTRY"));
  446. //联系地街道
  447. map.put("contactstreet", iRowSet.getString("FCONTACTSTREET"));
  448. //联系地详细地址
  449. map.put("contactdetailed", iRowSet.getString("FCONTACTDETAILED"));
  450. //备注
  451. map.put("desc", iRowSet.getString("FDESC"));
  452. for (String number : taxItemInitMap.keySet()) {
  453. map.put(number, iRowSet.getBigDecimal(number));
  454. }
  455. list.add(map);
  456. }
  457. return dataMap;
  458. } catch (Exception e) {
  459. e.printStackTrace();
  460. throw new BOSException("获取待计算数据报错:" + e.getMessage());
  461. }
  462. }
  463. /**
  464. * 获取请求参数
  465. *
  466. * @param taxUnitInfo
  467. * @param caluDataMap
  468. * @param period
  469. * @return
  470. * @throws BOSException
  471. */
  472. private CalculateIndividualIncomeTaxRequest getTaxRequestParameter(
  473. TaxUnitInfo taxUnitInfo,
  474. Map<String, List<Map<String, Object>>> caluDataMap,
  475. String period) throws BOSException {
  476. //异步算税参数对象
  477. CalculateIndividualIncomeTaxRequest taxRequestPara = new CalculateIndividualIncomeTaxRequest();
  478. //随机id
  479. String bizNo = UUID.randomUUID().toString();
  480. //外部业务订单号*
  481. taxRequestPara.setBizNo(bizNo);
  482. //企业名称*
  483. taxRequestPara.setName(taxUnitInfo.getName());
  484. //taxRequestPara.setName("荆州九州通医药有限公司00");
  485. //税号*
  486. taxRequestPara.setTaxNo(taxUnitInfo.getTaxNumber());
  487. //taxRequestPara.setTaxNo("91310124834931897I");
  488. //行政区划代码*
  489. taxRequestPara.setArea(taxUnitInfo.getAreaCode());
  490. //taxRequestPara.setArea("310101");
  491. //登记序号
  492. taxRequestPara.setRegistrationNumber(taxUnitInfo.getRegNumber());
  493. //taxRequestPara.setRegistrationNumber("10117310124834931897");
  494. //部门编号
  495. //taxRequestPara.setDeptNo("");
  496. //部门名称
  497. //taxRequestPara.setDeptName("");
  498. //税款所属期YYYYMM*
  499. taxRequestPara.setMonth(period.replace("-", ""));
  500. //实名账号
  501. //taxRequestPara.setRealNameAccount();
  502. //实名密码
  503. //taxRequestPara.setRealNamePassword();
  504. //加密实名密码
  505. //taxRequestPara.setEncryptedRealNamePassword();
  506. //申报密码
  507. //taxRequestPara.setDeclarePassword("Aa123456");
  508. String declPassword = taxUnitInfo.getDeclPassword();
  509. if (StringUtils.isEmpty(declPassword)) {
  510. throw new BOSException("申报密码不能为空!");
  511. }
  512. taxRequestPara.setDeclarePassword(Base64Utils.decode(declPassword));
  513. //加密申报密码
  514. //taxRequestPara.setEncryptedDeclarePassword();
  515. //密码类型*
  516. taxRequestPara.setPasswordType("0");
  517. //综合所得
  518. //综合所得对象
  519. ComplexIncomeRequest complexIncomeRequest = new ComplexIncomeRequest();
  520. taxRequestPara.setComplexIncomeRequest(complexIncomeRequest);
  521. //是否离线算薪
  522. //complexIncomeRequest.setIsOffLineCalculateTax();
  523. //减免方式
  524. //complexIncomeRequest.setDeductionMode();
  525. //减免比例
  526. //complexIncomeRequest.setRatio();
  527. //减免限额
  528. //complexIncomeRequest.setLimitAmount();
  529. //正常工资薪金对象
  530. NormalSalarySpecIncome normalSalarySpecIncome = getNormalSalarySpecIncome(caluDataMap);
  531. complexIncomeRequest.setNormalSalarySpecIncome(normalSalarySpecIncome);
  532. //全年一次性奖金收入列表
  533. List<ComplexIncome> annualOneTimeBonusIncomeList = getAnnualOneTimeBonusIncomeList(caluDataMap);
  534. complexIncomeRequest.setAnnualOneTimeBonusIncome(annualOneTimeBonusIncomeList);
  535. //一般劳务报酬所得列表
  536. List<ComplexIncome> laborRemunerationIncome = getLaborRemunerationIncome(caluDataMap);
  537. complexIncomeRequest.setLaborRemunerationIncome(laborRemunerationIncome);
  538. //解除劳动合同一次性补偿金列表
  539. List<ComplexIncome> compensateIncome = getCompensateIncome(caluDataMap);
  540. complexIncomeRequest.setCompensateIncome(compensateIncome);
  541. return taxRequestPara;
  542. }
  543. /**
  544. * 解除劳动合同一次性补偿金列表
  545. *
  546. * @param caluDataMap
  547. * @return
  548. */
  549. private List<ComplexIncome> getCompensateIncome(
  550. Map<String, List<Map<String, Object>>> caluDataMap) {
  551. List<ComplexIncome> compensateIncome = new ArrayList<ComplexIncome>();
  552. List<Map<String, Object>> list = caluDataMap.get("jcldhtlb");
  553. for (int i = 0; list != null && i < list.size(); i++) {
  554. //个税应用+税款计算初算明细表
  555. Map<String, Object> map = list.get(i);
  556. ComplexIncome complexIncome = new ComplexIncome();
  557. //姓名*
  558. complexIncome.setName((String) map.get("personName"));
  559. //证件类型名称*
  560. complexIncome.setLicenseType((String) map.get("cardType"));
  561. //证件号码*
  562. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  563. //当期收入额* 一次性补偿
  564. complexIncome.setIncome((BigDecimal) map.get("ycxbc"));
  565. //免税收入
  566. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  567. //其他
  568. //complexIncome.setOther(BigDecimal.ZERO);
  569. //减免税额 无
  570. complexIncome.setTaxDeduction((BigDecimal) map.get("jmse"));
  571. //备注
  572. //complexIncome.setRemark("");
  573. //所得项目名称*
  574. complexIncome.setIncomeItemName("一般劳务报酬所得");
  575. //准予扣除的捐赠额 无
  576. complexIncome.setDeductibleDonation((BigDecimal) map.get("zykcjze"));
  577. compensateIncome.add(complexIncome);
  578. }
  579. return compensateIncome;
  580. }
  581. /**
  582. * 一般劳务报酬所得列表
  583. *
  584. * @param caluDataMap
  585. * @return
  586. */
  587. private List<ComplexIncome> getLaborRemunerationIncome(Map<String, List<Map<String, Object>>> caluDataMap) {
  588. List<ComplexIncome> laborRemunerationIncome = new ArrayList<>();
  589. List<Map<String, Object>> list = caluDataMap.get("lwbclb");
  590. for (int i = 0; list != null && i < list.size(); i++) {
  591. Map<String, Object> map = list.get(i);
  592. ComplexIncome complexIncome = new ComplexIncome();
  593. //姓名*
  594. complexIncome.setName((String) map.get("personName"));
  595. //证件类型名称*
  596. complexIncome.setLicenseType((String) map.get("cardType"));
  597. //证件号码*
  598. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  599. //是否明细申报
  600. //complexIncome.setIsDetailedDeclaration("");
  601. //当期收入额*
  602. complexIncome.setIncome((BigDecimal) map.get("sre"));
  603. //免税收入
  604. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  605. //商业健康保险
  606. complexIncome.setCommercialHealthInsurance((BigDecimal) map.get("syjkbx"));
  607. //税延养老保险
  608. complexIncome.setExtensionEndowmentInsurance((BigDecimal) map.get("syylbx"));
  609. //其他
  610. //complexIncome.setOther(BigDecimal.ZERO);
  611. //减免税额
  612. complexIncome.setTaxDeduction((BigDecimal) map.get("jmse"));
  613. //备注
  614. //complexIncome.setRemark("");
  615. //减除费用
  616. // complexIncome.setDeductionAmount(BigDecimal.ZERO);
  617. //应纳税额
  618. //complexIncome.setPayableAmount(BigDecimal.ZERO);
  619. //税率
  620. //complexIncome.setTaxRate(BigDecimal.ZERO);
  621. //所得项目名称*
  622. complexIncome.setIncomeItemName("一般劳务报酬所得");
  623. //允许扣除的税费
  624. complexIncome.setTaxDeductible((BigDecimal) map.get("yxkcsf"));
  625. laborRemunerationIncome.add(complexIncome);
  626. }
  627. return laborRemunerationIncome;
  628. }
  629. /**
  630. * 全年一次性奖金收入列表
  631. *
  632. * @return
  633. */
  634. private List<ComplexIncome> getAnnualOneTimeBonusIncomeList(
  635. Map<String, List<Map<String, Object>>> caluDataMap) {
  636. List<ComplexIncome> annualOneTimeBonusIncome = new ArrayList<>();
  637. List<Map<String, Object>> list = caluDataMap.get("qnycxjjlb");
  638. for (int i = 0; list != null && i < list.size(); i++) {
  639. Map<String, Object> map = list.get(i);
  640. ComplexIncome complexIncome = new ComplexIncome();
  641. //姓名*
  642. complexIncome.setName((String) map.get("personName"));
  643. //证件类型名称*
  644. complexIncome.setLicenseType((String) map.get("cardType"));
  645. //证件号码*
  646. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  647. //批次号(一月多次发薪)
  648. //complexIncome.setBatchNo(0);
  649. //当期收入额*
  650. complexIncome.setIncome((BigDecimal) map.get("sre"));
  651. //免税收入
  652. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  653. //其他
  654. //complexIncome.setOther(BigDecimal.ZERO);
  655. //减免税额
  656. complexIncome.setTaxDeduction((BigDecimal) map.get("jmse"));
  657. //备注
  658. //complexIncome.setRemark("");
  659. //所得项目名称*
  660. complexIncome.setIncomeItemName("全年一次性奖金收入");
  661. //准予扣除的捐赠额
  662. complexIncome.setDeductibleDonation((BigDecimal) map.get("zykcjze"));
  663. annualOneTimeBonusIncome.add(complexIncome);
  664. }
  665. return annualOneTimeBonusIncome;
  666. }
  667. /**
  668. * 获取正常工资薪金参数
  669. *
  670. * @return
  671. */
  672. private NormalSalarySpecIncome getNormalSalarySpecIncome
  673. (Map<String, List<Map<String, Object>>> caluDataMap) {
  674. //正常工资薪金对象
  675. NormalSalarySpecIncome normalSalarySpecIncome = new NormalSalarySpecIncome();
  676. //企业人员列表*
  677. List<DetailCompanyEmployee> companyEmployeeList = getCompanyEmployeeList(caluDataMap);
  678. normalSalarySpecIncome.setCompanyEmployeeList(companyEmployeeList);
  679. //正常工资薪金是否需要专项*
  680. //normalSalarySpecIncome.setZcgzxjsfxyzx("");
  681. //正常工资薪金是否传入累计(申报/单月计算时使用)
  682. //normalSalarySpecIncome.setZcgzxjsfcrlj("");
  683. //支持上月传专项或者累计专项金额(仅对两月算税上月薪金列表算税数据生效)
  684. //normalSalarySpecIncome.setZcgzxjsfcrzx("");
  685. //是否已申报上月正常工资薪金(两个月算税场景)
  686. //normalSalarySpecIncome.setDeclaredLastMonth("");
  687. //批次号(一月多次发薪)
  688. //normalSalarySpecIncome.setBatchNo(0);
  689. //导入上月正常工资薪金(一月多次发薪)
  690. normalSalarySpecIncome.setImportLastMonthSalaryOption("");
  691. //是否需要人员申报
  692. normalSalarySpecIncome.setDeclareEmployeeOption("");
  693. //年金算税上限选项
  694. normalSalarySpecIncome.setAnnuityAndHouseProvidentFundOption("");
  695. //是否使用上月传入的应补退税额
  696. normalSalarySpecIncome.setMultiCalculateTaxUseRefundTax("");
  697. //个人养老金策略
  698. normalSalarySpecIncome.setPersonalPensionOption("");
  699. //上月个人养老金策略
  700. normalSalarySpecIncome.setLastMonthPersonalPensionOption("");
  701. //离职日期处理策略
  702. normalSalarySpecIncome.setResignDateStrategy("");
  703. //是否使用已报送人员信息进行补全
  704. //normalSalarySpecIncome.setSfsybsrybq();
  705. //上月正常工资薪金(带专项)列表
  706. //normalSalarySpecIncome.setLastMonthNormalSalary();
  707. List<ComplexIncome> normalSalarySpec = new ArrayList<>();
  708. //正常工资薪金(带专项)列表*
  709. normalSalarySpecIncome.setNormalSalarySpec(normalSalarySpec);
  710. List<Map<String, Object>> list = caluDataMap.get("zcgzxjlb");
  711. for (int i = 0; list != null && i < list.size(); i++) {
  712. Map<String, Object> map = list.get(i);
  713. ComplexIncome complexIncome = new ComplexIncome();
  714. //姓名*
  715. complexIncome.setName((String) map.get("personName"));
  716. //证件类型名称*
  717. complexIncome.setLicenseType((String) map.get("cardType"));
  718. //证件号码*
  719. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  720. //是否明细申报
  721. //complexIncome.setIsDetailedDeclaration("");
  722. //当期收入额*
  723. complexIncome.setIncome((BigDecimal) map.get("sre"));
  724. //免税收入
  725. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  726. //基本养老保险
  727. complexIncome.setEndowmentInsurance((BigDecimal) map.get("jbylaobxf"));
  728. //基本医疗保险
  729. complexIncome.setMedicalInsurance((BigDecimal) map.get("jbylbxf"));
  730. //失业保险
  731. complexIncome.setUnemploymentInsurance((BigDecimal) map.get("sybxf"));
  732. //住房公积金
  733. complexIncome.setHouseProvidentFund((BigDecimal) map.get("zfgjj"));
  734. //子女教育支出
  735. complexIncome.setChildEducationExpenditure((BigDecimal) map.get("dyznjyzc"));
  736. //赡养老人支出
  737. complexIncome.setSupportElderExpenditure((BigDecimal) map.get("dysylrzc"));
  738. //住房租金支出
  739. complexIncome.setHouseRentExpenditure((BigDecimal) map.get("dyzfzjzc"));
  740. //房屋贷款支出
  741. complexIncome.setHouseLoanExpenditure((BigDecimal) map.get("dyfwdkzc"));
  742. //继续教育支出
  743. complexIncome.setContinueEducationExpenditure((BigDecimal) map.get("dyjxjyzc"));
  744. //婴幼儿照护支出
  745. complexIncome.setBabyCareExpenditure((BigDecimal) map.get("dyyyrzhzc"));
  746. // 企业年金/职业年金
  747. complexIncome.setAnnuity((BigDecimal) map.get("nj"));
  748. //商业健康保险
  749. complexIncome.setCommercialHealthInsurance((BigDecimal) map.get("syjkbx"));
  750. //税延养老保险
  751. complexIncome.setExtensionEndowmentInsurance((BigDecimal) map.get("syylbx"));
  752. //其他
  753. //complexIncome.setOther(BigDecimal.ZERO);
  754. normalSalarySpec.add(complexIncome);
  755. }
  756. return normalSalarySpecIncome;
  757. }
  758. /**
  759. * 获取企业人员列表
  760. */
  761. private List<DetailCompanyEmployee> getCompanyEmployeeList(Map<String, List<Map<String, Object>>> caluDataMap) {
  762. List<DetailCompanyEmployee> companyEmployeeList = new ArrayList<>();
  763. List<Map<String, Object>> list = caluDataMap.get("zcgzxjlb");
  764. for (int i = 0; list != null && i < list.size(); i++) {
  765. Map<String, Object> map = list.get(i);
  766. DetailCompanyEmployee employee = new DetailCompanyEmployee();
  767. //姓名*
  768. employee.setName((String) map.get("personName"));
  769. //证件类型名称*
  770. employee.setLicenseType((String) map.get("cardType"));
  771. //证件号码*
  772. employee.setLicenseNumber((String) map.get("cardNumber"));
  773. //部门编号
  774. //employee.setDeptNo("");
  775. //工号
  776. employee.setEmployeeNumber((String) map.get("personNumber"));
  777. //所属期
  778. //employee.setPeriod("");
  779. //手机号码 中国籍必填;非中国籍首次入境时间超过一个月必填;
  780. employee.setPhone((String) map.get("phoneNumber"));
  781. //人员状态* 默认为正常,可选择正常/非正常
  782. employee.setState((String) map.get("personstatusName"));
  783. //是否雇员* 可选择雇员、保险营销员、证券经纪人、其他、实习学生(全日制学历教育)
  784. employee.setIsEmployee((String) map.get("employedtypeName"));
  785. //入职年度就业情况 当雇员保险营销员、证券经纪人时可选择:当年首次入职学生、当年首次入职其他人员。其他情况下填写默认为空
  786. employee.setFirstEmploymentSituation((String) map.get("situationName"));
  787. //受雇日期
  788. employee.setEmployedDate((String) map.get("employeddate"));
  789. //性别* 男/女
  790. employee.setGender((String) map.get("gender"));
  791. //出生日期* YYYY-MM-DD 需要和身份证上保持一致
  792. employee.setBirthday((String) map.get("birthday"));
  793. //国籍*
  794. employee.setNationality((String) map.get("nationalityName"));
  795. //人员地区* 境内/境外
  796. employee.setArea((String) map.get("isoversea"));
  797. //离职日期
  798. employee.setResignDate((String) map.get("departuredate"));
  799. //个人投资总额
  800. employee.setPersonInvestment((BigDecimal) map.get("investmenttotal"));
  801. //个人投资比例
  802. employee.setPersonInvestmentRatio((BigDecimal) map.get("investmentrate"));
  803. //是否残疾
  804. String isdisability = (String) map.get("isdisability");
  805. employee.setIsDisabled(isdisability);
  806. if ("是".equals(isdisability)) {
  807. //todo 残疾证件类型
  808. employee.setDisableCardTypeName("残疾证");
  809. }
  810. //是否烈属
  811. employee.setIsMartyr((String) map.get("ishero"));
  812. //是否孤老
  813. employee.setIsBereavedGaffer((String) map.get("isold"));
  814. //残疾证号
  815. employee.setDisableCardNumber((String) map.get("discardnumber"));
  816. //烈属证号
  817. employee.setMartyrCardNumber((String) map.get("herocardnumber"));
  818. //电子邮箱
  819. employee.setEmail((String) map.get("email"));
  820. //学历
  821. employee.setEducation((String) map.get("diploma"));
  822. //职务
  823. employee.setPosition((String) map.get("positionName"));
  824. //开户银行省份(名字)
  825. employee.setDepositBankProvinceName((String) map.get("bankcardprovince"));
  826. //开户银行
  827. employee.setDepositBank((String) map.get("bankcardprovince"));
  828. //银行账号
  829. employee.setBankAccount((String) map.get("account"));
  830. //居住省份
  831. employee.setResidentProvince((String) map.get("address"));
  832. //居住城市
  833. employee.setResidentCity((String) map.get("addresscity"));
  834. //居住区县
  835. employee.setResidentDistrict((String) map.get("addresscounty"));
  836. //居住街道
  837. employee.setResidentStreet((String) map.get("addressstreet"));
  838. //户籍省份
  839. employee.setCensusProvince((String) map.get("hometown"));
  840. //户籍城市
  841. employee.setCensusCity((String) map.get("hometowncity"));
  842. //户籍区县
  843. employee.setCensusDistrict((String) map.get("hometowncountry"));
  844. //户籍街道
  845. employee.setCensusStreet((String) map.get("hometownstreet"));
  846. //户籍详细地址
  847. employee.setCensusAddress((String) map.get("hometowndetailed"));
  848. //备注
  849. employee.setEmpRemark((String) map.get("desc"));
  850. //出生地
  851. employee.setBirthplace((String) map.get("birthplaceName"));
  852. //首次入境时间
  853. employee.setFirstEntryDate((String) map.get("entrydate"));
  854. //预计离境时间
  855. employee.setEstimatedDepartureDate((String) map.get("leavedate"));
  856. //联系地省份
  857. employee.setContactProvince((String) map.get("contactaddress"));
  858. //联系地城市
  859. employee.setContactCity((String) map.get("contactcity"));
  860. //联系地区县
  861. employee.setContactDistrict((String) map.get("contactcountry"));
  862. //联系地街道
  863. employee.setContactStreet((String) map.get("contactstreet"));
  864. //联系地详细地址
  865. employee.setContactStreet((String) map.get("contactdetailed"));
  866. //中文名
  867. employee.setChineseName((String) map.get("chinesename"));
  868. //涉税事项
  869. employee.setTaxRelatedReason((String) map.get("taxreason"));
  870. //其他证件号码
  871. employee.setOtherLicenseNumber((String) map.get("othercardnumber"));
  872. //其他证件类型 其他证件类型为:外国人永久居留身份证(外国人永久居留证),外国护照,中华人民共和国外国人工作许可证(A类),中华人民共和国外国人工作许可证(B类),中华人民共和国外国人工作许可证(C类),中华人民共和国港澳居民居住证,中华人民共和国台湾居民居住证,中国护照,港澳居民来往内地通行证,台湾居民来往大陆通行证,其他证件号码必填
  873. employee.setOtherLicenseType((String) map.get("othercardtype"));
  874. //是否扣除减除费用(原是否主单位)
  875. employee.setIsMainUnits((String) map.get("deductfees"));
  876. companyEmployeeList.add(employee);
  877. }
  878. return companyEmployeeList;
  879. }
  880. }