SubmitAsynTaxCalRequestService.java 44 KB

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