IncomeTaxDeclareListHandlerEx.java 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651
  1. package com.kingdee.eas.custom.compensation.handler;
  2. import cn.com.servyou.dto.ApiResponse;
  3. import cn.com.servyou.dto.AsyncResult;
  4. import cn.com.servyou.dto.declare.CompanyDeclareRequest;
  5. import cn.com.servyou.dto.tax.ComplexIncome;
  6. import cn.com.servyou.dto.tax.ComplexIncomeRequest;
  7. import cn.com.servyou.dto.tax.DetailCompanyEmployee;
  8. import cn.com.servyou.dto.tax.NormalSalarySpecIncome;
  9. import cn.com.servyou.rmi.client.ClientProxyFactory;
  10. import cn.com.servyou.service.DeclarationRequest;
  11. import com.alibaba.fastjson.JSONObject;
  12. import com.fasterxml.jackson.core.JsonProcessingException;
  13. import com.fasterxml.jackson.databind.ObjectMapper;
  14. import com.google.common.collect.Maps;
  15. import com.kingdee.bos.BOSException;
  16. import com.kingdee.bos.Context;
  17. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  18. import com.kingdee.bos.metadata.entity.*;
  19. import com.kingdee.bos.metadata.query.util.CompareType;
  20. import com.kingdee.bos.util.EASResource;
  21. import com.kingdee.eas.base.permission.UserInfo;
  22. import com.kingdee.eas.basedata.hraux.NationalityInfo;
  23. import com.kingdee.eas.basedata.person.PersonCollection;
  24. import com.kingdee.eas.basedata.person.PersonFactory;
  25. import com.kingdee.eas.basedata.person.PersonInfo;
  26. import com.kingdee.eas.common.EASBizException;
  27. import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoInfo;
  28. import com.kingdee.eas.custom.shuiyou.task.TaskCatalogEnum;
  29. import com.kingdee.eas.custom.shuiyou.uitls.ISYUtilsFacade;
  30. import com.kingdee.eas.custom.shuiyou.uitls.SYUtilsFacadeFactory;
  31. import com.kingdee.eas.custom.shuiyou.utils.ClientProxyFactoryUtils;
  32. import com.kingdee.eas.hr.ats.AtsUtil;
  33. import com.kingdee.eas.hr.rec.GenderEnum;
  34. import com.kingdee.eas.util.app.DbUtil;
  35. import com.kingdee.jdbc.rowset.IRowSet;
  36. import com.kingdee.shr.base.syssetting.context.SHRContext;
  37. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  38. import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
  39. import com.kingdee.shr.base.syssetting.web.dynamic.util.DynamicUtil;
  40. import com.kingdee.shr.base.syssetting.web.dynamic.util.MD5;
  41. import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
  42. import com.kingdee.shr.base.syssetting.web.util.UserUtil;
  43. import com.kingdee.shr.compensation.*;
  44. import com.kingdee.shr.compensation.app.incomeTax.*;
  45. import com.kingdee.shr.compensation.app.tax.*;
  46. import com.kingdee.shr.compensation.app.tax.base.TaxIncomeItemInfo;
  47. import com.kingdee.shr.compensation.app.tax.base.TaxItemInfo;
  48. import com.kingdee.shr.compensation.app.taxCal.ITaxCalConfigDetail;
  49. import com.kingdee.shr.compensation.app.taxCal.TaxCalConfigDetailCollection;
  50. import com.kingdee.shr.compensation.app.taxCal.TaxCalConfigDetailFactory;
  51. import com.kingdee.shr.compensation.app.taxCal.TaxCalConfigDetailInfo;
  52. import com.kingdee.shr.compensation.util.*;
  53. import com.kingdee.shr.compensation.web.handler.tax.IncomeTaxDeclareListHandler;
  54. import com.kingdee.shr.compensation.web.handler.tax.dto.TaxDeclarExcelRowDTO;
  55. import com.kingdee.shr.compensation.web.handler.tax.dto.TaxDeclareDTO;
  56. import com.kingdee.shr.dydeploy.web.executeSql.ExceptionUtils;
  57. import com.kingdee.util.StringUtils;
  58. import org.apache.log4j.Logger;
  59. import org.apache.poi.hssf.usermodel.*;
  60. import org.springframework.ui.ModelMap;
  61. import javax.servlet.http.HttpServletRequest;
  62. import javax.servlet.http.HttpServletResponse;
  63. import java.io.File;
  64. import java.io.FileNotFoundException;
  65. import java.io.FileOutputStream;
  66. import java.io.IOException;
  67. import java.math.BigDecimal;
  68. import java.sql.SQLException;
  69. import java.sql.Timestamp;
  70. import java.text.SimpleDateFormat;
  71. import java.util.*;
  72. /**
  73. * @author qingwu
  74. * @date 2024/9/18
  75. * @apiNote 个税申报扩展
  76. */
  77. public class IncomeTaxDeclareListHandlerEx extends IncomeTaxDeclareListHandler {
  78. private static final Logger LOG = Logger.getLogger(IncomeTaxDeclareListHandlerEx.class);
  79. private Context ctx = SHRContext.getInstance().getContext();
  80. private ObjectMapper mapper = new ObjectMapper();
  81. /**
  82. * 个税申报
  83. *
  84. * @param request
  85. * @param response
  86. * @param modelMap
  87. */
  88. @Override
  89. public void taxDeclareAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, SHRWebException {
  90. LOG.error("taxDeclareAction-----------start-----------");
  91. Context ctx = SHRContext.getInstance().getContext();
  92. try {
  93. boolean isHaveTaxService = CmpTaxUtil.isHaveTaxService(ctx);
  94. //if (!isHaveTaxService) {
  95. // throw new ShrWebBizException(EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label136", ctx.getLocale()));
  96. //} else {
  97. String selectedId = request.getParameter("selectedId");
  98. Map<String, Object> resultMap = new HashMap();
  99. Map<String, Object> declareData = this.getDeclareData(ctx, selectedId);
  100. Map<String, Object> paramMap = new HashMap();
  101. paramMap.put("declaData", declareData.get("WATI_TO_DECLARE"));
  102. LOG.error("paramMap-----------" + paramMap);
  103. try {
  104. //纳税单位
  105. List<String> advanceDeclareInfo = (List) declareData.get("advanceDeclareInfo");
  106. LOG.error("advanceDeclareInfo------------" + advanceDeclareInfo);
  107. if (!advanceDeclareInfo.isEmpty()) {
  108. throw new ShrWebBizException(this.combineError(advanceDeclareInfo));
  109. }
  110. //个税审批 审批状态=审批通过的数据
  111. List<IncomeTaxDeclarInfo> waitToDeclareList = (List) paramMap.get("declaData");
  112. if (waitToDeclareList.size() <= 0) {
  113. resultMap.put("success", false);
  114. resultMap.put("excel", "");
  115. resultMap.put("hasErrData", true);
  116. resultMap.put("hasCheckDataErr", true);
  117. resultMap.put("info", "不可重复声申报!!");
  118. JSONUtils.SUCCESS(resultMap);
  119. return;
  120. }
  121. //检查纳税申报数据
  122. Map<String, Object> checkResultMap = this.checkTaxDeclareData(ctx, request, waitToDeclareList);
  123. Boolean hasErr = (Boolean) checkResultMap.get("hasErrData");
  124. if (hasErr != null && hasErr) {
  125. resultMap.put("success", false);
  126. resultMap.put("excel", checkResultMap.get("excel"));
  127. resultMap.put("hasErrData", true);
  128. resultMap.put("hasCheckDataErr", true);
  129. resultMap.put("info", "");
  130. JSONUtils.SUCCESS(resultMap);
  131. return;
  132. }
  133. String errMsg = this.checkTaxCalStatus(ctx, waitToDeclareList);
  134. if (null != errMsg) {
  135. resultMap.put("success", false);
  136. resultMap.put("dataError", true);
  137. resultMap.put("errMsg", errMsg);
  138. JSONUtils.SUCCESS(resultMap);
  139. return;
  140. }
  141. checkResultMap = this.checkIncomeTaxIssue(ctx, waitToDeclareList);
  142. if (checkResultMap != null) {
  143. checkResultMap.put("success", false);
  144. JSONUtils.SUCCESS(checkResultMap);
  145. return;
  146. }
  147. //errMsg = this.checkReductionItems(ctx, waitToDeclareList);
  148. //if (null != errMsg) {
  149. // resultMap.put("success", false);
  150. // resultMap.put("reductionError", true);
  151. // resultMap.put("errMsg", errMsg);
  152. // JSONUtils.SUCCESS(resultMap);
  153. // return;
  154. //}
  155. //Map<String, Object> taxDeclareResult = IncomeTaxDeclareFacadeFactory.getLocalInstance(ctx).taxDeclare(paramMap);
  156. //调佣税友纳税申报
  157. Map<String, Object> taxDeclareResult = callShuiYouTaxDeclare(paramMap);
  158. Boolean isSuccess = (Boolean) taxDeclareResult.get("success");
  159. resultMap.put("success", isSuccess);
  160. resultMap.put("excel", "");
  161. resultMap.put("hasErrData", !isSuccess);
  162. resultMap.put("hasCheckDataErr", false);
  163. resultMap.put("info", declareData.get("info"));
  164. } catch (Exception var17) {
  165. var17.printStackTrace();
  166. LOG.error(var17.getMessage(), var17);
  167. resultMap.put("success", false);
  168. resultMap.put("excel", "");
  169. resultMap.put("hasErrData", true);
  170. resultMap.put("hasCheckDataErr", false);
  171. resultMap.put("info", declareData.get("info"));
  172. resultMap.put("errorMsg", var17.getMessage());
  173. }
  174. LOG.error("taxDeclareAction-----------end-----------");
  175. JSONUtils.SUCCESS(resultMap);
  176. //}
  177. } catch (JsonProcessingException e) {
  178. e.printStackTrace();
  179. throw new RuntimeException(e);
  180. }
  181. }
  182. /**
  183. * 调佣税友纳税申报
  184. *
  185. * @param paramMap
  186. * @return
  187. */
  188. public Map<String, Object> callShuiYouTaxDeclare(Map paramMap) throws JsonProcessingException, BOSException {
  189. LOG.error("callShuiYouTaxDeclare--------------------paramMap" + paramMap);
  190. Map<String, Object> resultMap = new HashMap();
  191. resultMap.put("success", true);
  192. resultMap.put("msg", "");
  193. List<IncomeTaxDeclarInfo> waitToDeclareList = (List) paramMap.get("declaData");
  194. Map<String, Object> requestParamMap = new HashMap();
  195. List<Object[]> paramList = new ArrayList();
  196. // LogInfoInfo logInfoCall = new LogInfoInfo();
  197. //日志
  198. // logInfoCall.setEntrance(this.getClass().getName());//入口
  199. Long timestampLong = System.currentTimeMillis();
  200. UserInfo userInfo = (UserInfo)ctx.get("UserInfo");
  201. // logInfoCall.setCreator(userInfo);
  202. Timestamp timestamp = new Timestamp(timestampLong);
  203. // logInfoCall.setCreateTime(timestamp);
  204. // logInfoCall.setLastUpdateTime(timestamp);
  205. // logInfoCall.setLastUpdateUser(userInfo);
  206. // logInfoCall.setBizDate(timestamp);
  207. ISYUtilsFacade localInstance = SYUtilsFacadeFactory.getLocalInstance(ctx);
  208. try {
  209. if (waitToDeclareList != null && waitToDeclareList.size() > 0) {
  210. for (int i = 0; i < waitToDeclareList.size(); i++) {
  211. LogInfoInfo logInfo = new LogInfoInfo();
  212. //日志
  213. logInfo.setEntrance(this.getClass().getName());//入口
  214. logInfo.setCreator(userInfo);
  215. logInfo.setCreateTime( new Timestamp(System.currentTimeMillis()));
  216. logInfo.setLastUpdateTime( new Timestamp(System.currentTimeMillis()));
  217. logInfo.setLastUpdateUser(userInfo);
  218. logInfo.setBizDate(timestamp);
  219. IncomeTaxDeclarInfo taxDeclarInfo = waitToDeclareList.get(i);
  220. IIncomeTaxDeclar iId = IncomeTaxDeclarFactory.getLocalInstance(ctx);
  221. SelectorItemCollection sc = new SelectorItemCollection();
  222. sc.add(new SelectorItemInfo("declareStatus"));
  223. taxDeclarInfo.setDeclareStatus(TaxDeclareStatusEnum.DECLARE_PROCESSING);
  224. iId.updatePartial(taxDeclarInfo,sc);
  225. JSONObject param = new JSONObject();
  226. param.put("taxDeclarId", taxDeclarInfo.getId().toString());
  227. param.put("taxDeclarBatchNo", taxDeclarInfo.getBatchNo());
  228. //纳税单位
  229. TaxUnitInfo taxUnitInfo = TaxUnitFactory.getLocalInstance(ctx).getTaxUnitInfo(new ObjectUuidPK(taxDeclarInfo.getTaxUnit().getId().toString()));
  230. //客户端代理工厂
  231. ClientProxyFactory clientProxyFactory = ClientProxyFactoryUtils.getClientProxyFactory();
  232. //算税请求接口
  233. DeclarationRequest declarationRequest = clientProxyFactory.getDeclarationRequest();
  234. //获取请求参数
  235. CompanyDeclareRequest declareRequestParameter = getDeclareRequestParameter(taxUnitInfo, taxDeclarInfo);
  236. LOG.error("declareRequestParameter-----------------" + mapper.writeValueAsString(declareRequestParameter));
  237. ApiResponse<AsyncResult> apiResponse = declarationRequest.importData(declareRequestParameter);
  238. LOG.error("asyncResultApiResponse-----getCode-------" + apiResponse.getHead().getCode());
  239. LOG.error("asyncResultApiResponse-----getMsg--------" + apiResponse.getHead().getMsg());
  240. resultMap.put("msg", mapper.writeValueAsString(declareRequestParameter));
  241. logInfo.setInParameter(mapper.writeValueAsString(declareRequestParameter));
  242. if (apiResponse.getHead().getCode().equals("00000000")) {
  243. Map<String,Object> msg = new HashMap<String,Object>();
  244. msg.put("Head",apiResponse.getHead());
  245. msg.put("Body",apiResponse.getBody());
  246. logInfo.setOutParameter(mapper.writeValueAsString(msg));//回参
  247. AsyncResult body = apiResponse.getBody();
  248. String requestId = body.getRequestId();
  249. LOG.error("requestId-----" + requestId);
  250. LOG.error("apiResponse-----" + mapper.writeValueAsString(apiResponse));
  251. //查询反算反馈结果
  252. ISYUtilsFacade isyUtilsFacade = SYUtilsFacadeFactory.getLocalInstance(ctx);
  253. //backTask(url,requestId,回调osf服务,自定义参数,任务类型)
  254. //isyUtilsFacade.backTask(isyUtilsFacade.getConfig().get("ip") + "/gateway/iit/reverseCalculateTax/getASynIndividualIncomeTaxFeedback", requestId, "synIndividualIncomeTaxService", jsonObject.toString(), TaskCatalogEnum.CAL_GET);
  255. JSONObject json = new JSONObject();
  256. json.put("requestId", requestId);
  257. json.put("param", param.toJSONString());
  258. isyUtilsFacade.addTask("synIncomeTaxDeclareService", json.toJSONString(), TaskCatalogEnum.TAX, "");
  259. }else {
  260. Map<String,Object> msg = new HashMap<String,Object>();
  261. msg.put("Head",apiResponse.getHead());
  262. msg.put("Body",apiResponse.getBody());
  263. logInfo.setErrorInfo(mapper.writeValueAsString(msg));//错误信息
  264. }
  265. logInfo.setInterfaceAddress(i+"/gateway/iit/report/importData");//接口地址
  266. logInfo.setInterfaceName("POST");//接口名
  267. localInstance.log(logInfo);
  268. }
  269. }
  270. } catch (Exception e) {
  271. e.printStackTrace();
  272. resultMap.put("success", false);
  273. resultMap.put("msg", e.getMessage());
  274. //logInfoCall. setOutParameter( ExceptionUtils.getStackTrace(e));//回参
  275. }finally {
  276. // logInfoCall.setInterfaceAddress("/gateway/iit/report/send");//接口地址
  277. // logInfoCall.setInterfaceName("POST");//接口名
  278. // try {
  279. // if (waitToDeclareList != null && !waitToDeclareList.isEmpty()) {
  280. // logInfoCall.setInParameter(JSONUtils.convertObjectToJson(ctx, waitToDeclareList));
  281. // }
  282. // }catch (Exception e){
  283. // e.printStackTrace();
  284. // }
  285. // localInstance.log(logInfoCall);
  286. }
  287. return resultMap;
  288. }
  289. /**
  290. * 获取请求参数
  291. * 注意:
  292. * 1.解除劳动合同一次性补偿金、全年一次性奖金所得,不能单独申报,需要同正常工资薪金一起申报。
  293. * 2.解除劳动合同一次性补偿金、稿酬所得,由于税务规则需要,解除劳动合同一次性补偿金、稿酬所得必须填写免税附表。
  294. *
  295. * @param taxUnitInfo
  296. * @param taxDeclarInfo
  297. * @return
  298. */
  299. private CompanyDeclareRequest getDeclareRequestParameter(TaxUnitInfo taxUnitInfo,
  300. IncomeTaxDeclarInfo taxDeclarInfo
  301. ) throws BOSException, JsonProcessingException, EASBizException, SQLException {
  302. LOG.error("getDeclareRequestParameter-----------taxDeclarInfo-----" + taxDeclarInfo);
  303. CompanyDeclareRequest declareRequestPara = new CompanyDeclareRequest();
  304. Map<String, Object> requestParamMap = new HashMap();
  305. //随机id
  306. String bizNo = UUID.randomUUID().toString();
  307. LOG.error("bizNo:" + bizNo);
  308. //外部业务订单号*
  309. declareRequestPara.setBizNo(bizNo);
  310. //企业名称*
  311. declareRequestPara.setName(taxUnitInfo.getName());
  312. //税号*
  313. declareRequestPara.setTaxNo(taxUnitInfo.getTaxNumber());
  314. //行政区划代码*
  315. declareRequestPara.setArea(taxUnitInfo.getAreaCode());
  316. //登记序号
  317. declareRequestPara.setRegistrationNumber(taxUnitInfo.getRegNumber());
  318. String declPassword = taxUnitInfo.getDeclPassword();
  319. //申报密码
  320. if (StringUtils.isEmpty(declPassword)) {
  321. //实名账号
  322. declareRequestPara.setRealNameAccount(taxUnitInfo.getString("realAccount"));
  323. //实名密码
  324. declareRequestPara.setRealNamePassword(Base64Utils.decode(taxUnitInfo.getRealPassword()));
  325. //密码类型
  326. declareRequestPara.setPasswordType("2");
  327. }else {
  328. String sbmm = new String(Base64Utils.decode(declPassword));
  329. declareRequestPara.setDeclarePassword(sbmm);
  330. //密码类型
  331. declareRequestPara.setPasswordType("0");
  332. }
  333. //所得月份
  334. String yearMonth = taxDeclarInfo.getYearMonth();
  335. String replaceYearMonth = yearMonth.replace("-", "");
  336. LOG.error("replaceYearMonth----------------" + replaceYearMonth);
  337. //税款所属期YYYYMM*
  338. declareRequestPara.setMonth(replaceYearMonth);
  339. //离职日期处理策略 1、不传或传1,代表离职日期自动清空,即人员状态由“非正常”变更为“正常”时,离职日期字段自动清空,默认逻辑。
  340. //2、传2离职日期不自动清空,即人员状态由“非正常”变更为“正常”时,离职日期不自动清空,客户如需清空需对离职日期字段传入空字符串。
  341. //declareRequestPara.setResignDateStrategy();
  342. //批次号
  343. String batchNo = taxDeclarInfo.getBatchNo();
  344. LOG.error("taxCalConfigDetailCollection--------taxDeclarInfo---------" + taxDeclarInfo);
  345. //个税应用+税款计算最终拆分明细表
  346. ITaxCalConfigDetail taxCalConfigDetail = TaxCalConfigDetailFactory.getLocalInstance(ctx);
  347. TaxCalConfigDetailCollection taxCalConfigDetailCollection = taxCalConfigDetail.getTaxCalConfigDetailCollection("select *,incomeItem.*, person.* where batchNo = '" + batchNo + "' and state = '20'");
  348. LOG.error("taxCalConfigDetailCollection-----------------" + taxCalConfigDetailCollection.size());
  349. //员工信息ID
  350. Set personIds = new HashSet();
  351. if (taxCalConfigDetailCollection.size() > 0) {
  352. for (int i = 0; i < taxCalConfigDetailCollection.size(); i++) {
  353. TaxCalConfigDetailInfo taxCalConfigDetailInfo = taxCalConfigDetailCollection.get(i);
  354. //员工信息
  355. PersonInfo personInfo = taxCalConfigDetailInfo.getPerson();
  356. personIds.add(personInfo.getId().toString());
  357. }
  358. }
  359. Map<String, String> paramDataMap = Maps.newHashMap();
  360. paramDataMap.put("taxUnitId",taxUnitInfo.getId().toString());
  361. paramDataMap.put("batchNo",batchNo);
  362. Map<String, List<Map<String, Object>>> caluDataMap = getCaluData(ctx, paramDataMap,this.getTaxItemMap(ctx));
  363. //综合所得
  364. //综合所得对象
  365. ComplexIncomeRequest complexIncomeRequest = new ComplexIncomeRequest();
  366. declareRequestPara.setComplexIncomeRequest(complexIncomeRequest);
  367. //是否离线算薪
  368. //complexIncomeRequest.setIsOffLineCalculateTax();
  369. //减免方式
  370. //complexIncomeRequest.setDeductionMode();
  371. //减免比例
  372. //complexIncomeRequest.setRatio();
  373. //减免限额
  374. //complexIncomeRequest.setLimitAmount();
  375. //正常工资薪金对象
  376. NormalSalarySpecIncome normalSalarySpecIncome = getNormalSalarySpecIncome(caluDataMap);
  377. complexIncomeRequest.setNormalSalarySpecIncome(normalSalarySpecIncome);
  378. //全年一次性奖金收入列表
  379. List<ComplexIncome> annualOneTimeBonusIncomeList = getAnnualOneTimeBonusIncomeList(caluDataMap);
  380. complexIncomeRequest.setAnnualOneTimeBonusIncome(annualOneTimeBonusIncomeList);
  381. //一般劳务报酬所得列表
  382. List<ComplexIncome> laborRemunerationIncome = getLaborRemunerationIncome(caluDataMap);
  383. complexIncomeRequest.setLaborRemunerationIncome(laborRemunerationIncome);
  384. //解除劳动合同一次性补偿金列表
  385. List<ComplexIncome> compensateIncome = getCompensateIncome(caluDataMap);
  386. complexIncomeRequest.setCompensateIncome(compensateIncome);
  387. //企业员工列表
  388. List<DetailCompanyEmployee> companyEmployeeList = getCompanyEmployeeList(personIds,taxUnitInfo);
  389. declareRequestPara.setCompanyEmployeeList(companyEmployeeList);
  390. return declareRequestPara;
  391. }
  392. /**
  393. * 解除劳动合同一次性补偿金列表
  394. *
  395. * @param caluDataMap
  396. * @return
  397. */
  398. private List<ComplexIncome> getCompensateIncome(
  399. Map<String, List<Map<String, Object>>> caluDataMap) {
  400. List<ComplexIncome> compensateIncome = new ArrayList<ComplexIncome>();
  401. List<Map<String, Object>> list = caluDataMap.get("jcldhtlb");
  402. for (int i = 0; list != null && i < list.size(); i++) {
  403. //个税应用+税款计算初算明细表
  404. Map<String, Object> map = list.get(i);
  405. ComplexIncome complexIncome = new ComplexIncome();
  406. //姓名*
  407. complexIncome.setName((String) map.get("personName"));
  408. //证件类型名称*
  409. complexIncome.setLicenseType((String) map.get("cardType"));
  410. //证件号码*
  411. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  412. //当期收入额* 一次性补偿
  413. complexIncome.setIncome((BigDecimal) map.get("ycxbc"));
  414. //免税收入
  415. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  416. //其他
  417. //complexIncome.setOther(BigDecimal.ZERO);
  418. //减免税额 无
  419. complexIncome.setTaxDeduction((BigDecimal) map.get("jmse"));
  420. //备注
  421. //complexIncome.setRemark("");
  422. //所得项目名称*
  423. complexIncome.setIncomeItemName("一般劳务报酬所得");
  424. //准予扣除的捐赠额 无
  425. complexIncome.setDeductibleDonation((BigDecimal) map.get("zykcjze"));
  426. compensateIncome.add(complexIncome);
  427. }
  428. return compensateIncome;
  429. }
  430. /**
  431. * 一般劳务报酬所得列表
  432. *
  433. * @param caluDataMap
  434. * @return
  435. */
  436. private List<ComplexIncome> getLaborRemunerationIncome(Map<String, List<Map<String, Object>>> caluDataMap) {
  437. List<ComplexIncome> laborRemunerationIncome = new ArrayList<>();
  438. List<Map<String, Object>> list = caluDataMap.get("lwbclb");
  439. for (int i = 0; list != null && i < list.size(); i++) {
  440. Map<String, Object> map = list.get(i);
  441. ComplexIncome complexIncome = new ComplexIncome();
  442. //姓名*
  443. complexIncome.setName((String) map.get("personName"));
  444. //证件类型名称*
  445. complexIncome.setLicenseType((String) map.get("cardType"));
  446. //证件号码*
  447. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  448. //是否明细申报
  449. //complexIncome.setIsDetailedDeclaration("");
  450. //当期收入额*
  451. complexIncome.setIncome((BigDecimal) map.get("sre"));
  452. //免税收入
  453. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  454. //商业健康保险
  455. complexIncome.setCommercialHealthInsurance((BigDecimal) map.get("syjkbx"));
  456. //税延养老保险
  457. complexIncome.setExtensionEndowmentInsurance((BigDecimal) map.get("syylbx"));
  458. //其他
  459. //complexIncome.setOther(BigDecimal.ZERO);
  460. //减免税额
  461. complexIncome.setTaxDeduction((BigDecimal) map.get("jmse"));
  462. //备注
  463. //complexIncome.setRemark("");
  464. //减除费用
  465. // complexIncome.setDeductionAmount(BigDecimal.ZERO);
  466. //应纳税额
  467. //complexIncome.setPayableAmount(BigDecimal.ZERO);
  468. //税率
  469. //complexIncome.setTaxRate(BigDecimal.ZERO);
  470. //所得项目名称*
  471. complexIncome.setIncomeItemName("一般劳务报酬所得");
  472. //允许扣除的税费
  473. complexIncome.setTaxDeductible((BigDecimal) map.get("yxkcsf"));
  474. laborRemunerationIncome.add(complexIncome);
  475. }
  476. return laborRemunerationIncome;
  477. }
  478. /**
  479. * 全年一次性奖金收入列表
  480. *
  481. * @return
  482. */
  483. private List<ComplexIncome> getAnnualOneTimeBonusIncomeList(
  484. Map<String, List<Map<String, Object>>> caluDataMap) {
  485. List<ComplexIncome> annualOneTimeBonusIncome = new ArrayList<>();
  486. List<Map<String, Object>> list = caluDataMap.get("qnycxjjlb");
  487. for (int i = 0; list != null && i < list.size(); i++) {
  488. Map<String, Object> map = list.get(i);
  489. ComplexIncome complexIncome = new ComplexIncome();
  490. //姓名*
  491. complexIncome.setName((String) map.get("personName"));
  492. //证件类型名称*
  493. complexIncome.setLicenseType((String) map.get("cardType"));
  494. //证件号码*
  495. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  496. //批次号(一月多次发薪)
  497. //complexIncome.setBatchNo(0);
  498. //当期收入额*
  499. complexIncome.setIncome((BigDecimal) map.get("sre"));
  500. //免税收入
  501. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  502. //其他
  503. //complexIncome.setOther(BigDecimal.ZERO);
  504. //减免税额
  505. complexIncome.setTaxDeduction((BigDecimal) map.get("jmse"));
  506. //备注
  507. //complexIncome.setRemark("");
  508. //所得项目名称*
  509. complexIncome.setIncomeItemName("全年一次性奖金收入");
  510. //准予扣除的捐赠额
  511. complexIncome.setDeductibleDonation((BigDecimal) map.get("zykcjze"));
  512. annualOneTimeBonusIncome.add(complexIncome);
  513. }
  514. return annualOneTimeBonusIncome;
  515. }
  516. /**
  517. * 获取正常工资薪金参数
  518. *
  519. * @return
  520. */
  521. private NormalSalarySpecIncome getNormalSalarySpecIncome
  522. (Map<String, List<Map<String, Object>>> caluDataMap) {
  523. //正常工资薪金对象
  524. NormalSalarySpecIncome normalSalarySpecIncome = new NormalSalarySpecIncome();
  525. //企业人员列表*
  526. List<DetailCompanyEmployee> companyEmployeeList = getCompanyEmployeeList(caluDataMap);
  527. normalSalarySpecIncome.setCompanyEmployeeList(companyEmployeeList);
  528. //正常工资薪金是否需要专项*
  529. normalSalarySpecIncome.setZcgzxjsfxyzx("1");
  530. //正常工资薪金是否传入累计(申报/单月计算时使用)
  531. normalSalarySpecIncome.setZcgzxjsfcrlj("1");
  532. //支持上月传专项或者累计专项金额(仅对两月算税上月薪金列表算税数据生效)
  533. //normalSalarySpecIncome.setZcgzxjsfcrzx("");
  534. //是否已申报上月正常工资薪金(两个月算税场景)
  535. //normalSalarySpecIncome.setDeclaredLastMonth("");
  536. //批次号(一月多次发薪)
  537. //normalSalarySpecIncome.setBatchNo(0);
  538. //导入上月正常工资薪金(一月多次发薪)
  539. normalSalarySpecIncome.setImportLastMonthSalaryOption("");
  540. //是否需要人员申报
  541. normalSalarySpecIncome.setDeclareEmployeeOption("");
  542. //年金算税上限选项
  543. normalSalarySpecIncome.setAnnuityAndHouseProvidentFundOption("");
  544. //是否使用上月传入的应补退税额
  545. normalSalarySpecIncome.setMultiCalculateTaxUseRefundTax("");
  546. //个人养老金策略
  547. normalSalarySpecIncome.setPersonalPensionOption("1");
  548. //上月个人养老金策略
  549. normalSalarySpecIncome.setLastMonthPersonalPensionOption("");
  550. //离职日期处理策略
  551. normalSalarySpecIncome.setResignDateStrategy("");
  552. //是否使用已报送人员信息进行补全
  553. //normalSalarySpecIncome.setSfsybsrybq();
  554. //上月正常工资薪金(带专项)列表
  555. //normalSalarySpecIncome.setLastMonthNormalSalary();
  556. List<ComplexIncome> normalSalarySpec = new ArrayList<>();
  557. //正常工资薪金(带专项)列表*
  558. normalSalarySpecIncome.setNormalSalarySpec(normalSalarySpec);
  559. List<Map<String, Object>> list = caluDataMap.get("zcgzxjlb");
  560. for (int i = 0; list != null && i < list.size(); i++) {
  561. Map<String, Object> map = list.get(i);
  562. ComplexIncome complexIncome = new ComplexIncome();
  563. //姓名*
  564. complexIncome.setName((String) map.get("personName"));
  565. //证件类型名称*
  566. complexIncome.setLicenseType((String) map.get("cardType"));
  567. //证件号码*
  568. complexIncome.setLicenseNumber((String) map.get("cardNumber"));
  569. //是否明细申报
  570. //complexIncome.setIsDetailedDeclaration("");
  571. //当期收入额*
  572. complexIncome.setIncome((BigDecimal) map.get("sre"));
  573. //免税收入
  574. complexIncome.setExemptIncome((BigDecimal) map.get("mssd"));
  575. //基本养老保险
  576. complexIncome.setEndowmentInsurance((BigDecimal) map.get("jbylaobxf"));
  577. //基本医疗保险
  578. complexIncome.setMedicalInsurance((BigDecimal) map.get("jbylbxf"));
  579. //失业保险
  580. complexIncome.setUnemploymentInsurance((BigDecimal) map.get("sybxf"));
  581. //住房公积金
  582. complexIncome.setHouseProvidentFund((BigDecimal) map.get("zfgjj"));
  583. //子女教育支出
  584. complexIncome.setAccumulatedChildEducation((BigDecimal) map.get("znjyzc"));
  585. //继续教育支出
  586. complexIncome.setAccumulatedContinueEducation((BigDecimal) map.get("jxjyzc"));
  587. //婴幼儿照护支出
  588. complexIncome.setAccumulatedBabyCare((BigDecimal) map.get("yyezhfzc"));
  589. //累计个人养老金
  590. complexIncome.setAccumulatedPersonalPension((BigDecimal) map.get("grylj"));
  591. //房屋贷款支出
  592. complexIncome.setAccumulatedHouseLoan((BigDecimal) map.get("zfdklxzc"));
  593. //住房租金支出
  594. complexIncome.setAccumulatedHouseRent((BigDecimal) map.get("zfzjzc"));
  595. //赡养老人支出
  596. complexIncome.setAccumulatedSupportElder((BigDecimal) map.get("sylrzc"));
  597. //累计其他扣除
  598. complexIncome.setOtherDeductionSum((BigDecimal) map.get("zxkchj"));
  599. //累计继续教育
  600. complexIncome.setAccumulatedContinueEducation((BigDecimal) map.get("jxjyzc"));
  601. //累计专项附加扣除合计
  602. complexIncome.setSpecAttachDeductionSum((BigDecimal) map.get("zxfjkchj"));
  603. // 企业年金/职业年金
  604. complexIncome.setAnnuity((BigDecimal) map.get("nj"));
  605. //商业健康保险
  606. complexIncome.setCommercialHealthInsurance((BigDecimal) map.get("syjkbx"));
  607. //税延养老保险
  608. complexIncome.setExtensionEndowmentInsurance((BigDecimal) map.get("syylbx"));
  609. //其他
  610. //complexIncome.setOther(BigDecimal.ZERO);
  611. normalSalarySpec.add(complexIncome);
  612. }
  613. return normalSalarySpecIncome;
  614. }
  615. /**
  616. * 获取企业人员列表
  617. */
  618. private List<DetailCompanyEmployee> getCompanyEmployeeList(Map<String, List<Map<String, Object>>> caluDataMap) {
  619. List<DetailCompanyEmployee> companyEmployeeList = new ArrayList<>();
  620. List<Map<String, Object>> list = caluDataMap.get("zcgzxjlb");
  621. for (int i = 0; list != null && i < list.size(); i++) {
  622. Map<String, Object> map = list.get(i);
  623. DetailCompanyEmployee employee = new DetailCompanyEmployee();
  624. //姓名*
  625. employee.setName((String) map.get("personName"));
  626. //证件类型名称*
  627. employee.setLicenseType((String) map.get("cardType"));
  628. //证件号码*
  629. employee.setLicenseNumber((String) map.get("cardNumber"));
  630. //部门编号
  631. //employee.setDeptNo("");
  632. //工号
  633. employee.setEmployeeNumber((String) map.get("personNumber"));
  634. //所属期
  635. //employee.setPeriod("");
  636. //手机号码 中国籍必填;非中国籍首次入境时间超过一个月必填;
  637. employee.setPhone((String) map.get("phoneNumber"));
  638. //人员状态* 默认为正常,可选择正常/非正常
  639. employee.setState((String) map.get("personstatusName"));
  640. //是否雇员* 可选择雇员、保险营销员、证券经纪人、其他、实习学生(全日制学历教育)
  641. employee.setIsEmployee((String) map.get("employedtypeName"));
  642. //入职年度就业情况 当雇员保险营销员、证券经纪人时可选择:当年首次入职学生、当年首次入职其他人员。其他情况下填写默认为空
  643. employee.setFirstEmploymentSituation((String) map.get("situationName"));
  644. //受雇日期
  645. employee.setEmployedDate((String) map.get("employeddate"));
  646. //性别* 男/女
  647. employee.setGender((String) map.get("gender"));
  648. //出生日期* YYYY-MM-DD 需要和身份证上保持一致
  649. employee.setBirthday((String) map.get("birthday"));
  650. //国籍*
  651. employee.setNationality((String) map.get("nationalityName"));
  652. //人员地区* 境内/境外
  653. employee.setArea((String) map.get("isoversea"));
  654. //离职日期
  655. employee.setResignDate((String) map.get("departuredate"));
  656. //个人投资总额
  657. employee.setPersonInvestment((BigDecimal) map.get("investmenttotal"));
  658. //个人投资比例
  659. employee.setPersonInvestmentRatio((BigDecimal) map.get("investmentrate"));
  660. //是否残疾
  661. String isdisability = (String) map.get("isdisability");
  662. employee.setIsDisabled(isdisability);
  663. if ("是".equals(isdisability)) {
  664. //todo 残疾证件类型
  665. employee.setDisableCardTypeName("残疾证");
  666. }
  667. //是否烈属
  668. employee.setIsMartyr((String) map.get("ishero"));
  669. //是否孤老
  670. employee.setIsBereavedGaffer((String) map.get("isold"));
  671. //残疾证号
  672. employee.setDisableCardNumber((String) map.get("discardnumber"));
  673. //烈属证号
  674. employee.setMartyrCardNumber((String) map.get("herocardnumber"));
  675. //电子邮箱
  676. employee.setEmail((String) map.get("email"));
  677. //学历
  678. employee.setEducation((String) map.get("diploma"));
  679. //职务
  680. employee.setPosition((String) map.get("positionName"));
  681. //开户银行省份(名字)
  682. employee.setDepositBankProvinceName((String) map.get("bankcardprovince"));
  683. //开户银行
  684. employee.setDepositBank((String) map.get("bankcardprovince"));
  685. //银行账号
  686. employee.setBankAccount((String) map.get("account"));
  687. //居住省份
  688. employee.setResidentProvince((String) map.get("address"));
  689. //居住城市
  690. employee.setResidentCity((String) map.get("addresscity"));
  691. //居住区县
  692. employee.setResidentDistrict((String) map.get("addresscounty"));
  693. //居住街道
  694. employee.setResidentStreet((String) map.get("addressstreet"));
  695. //户籍省份
  696. employee.setCensusProvince((String) map.get("hometown"));
  697. //户籍城市
  698. employee.setCensusCity((String) map.get("hometowncity"));
  699. //户籍区县
  700. employee.setCensusDistrict((String) map.get("hometowncountry"));
  701. //户籍街道
  702. employee.setCensusStreet((String) map.get("hometownstreet"));
  703. //户籍详细地址
  704. employee.setCensusAddress((String) map.get("hometowndetailed"));
  705. //备注
  706. employee.setEmpRemark((String) map.get("desc"));
  707. //出生地
  708. employee.setBirthplace((String) map.get("birthplaceName"));
  709. //首次入境时间
  710. employee.setFirstEntryDate((String) map.get("entrydate"));
  711. //预计离境时间
  712. employee.setEstimatedDepartureDate((String) map.get("leavedate"));
  713. //联系地省份
  714. employee.setContactProvince((String) map.get("contactaddress"));
  715. //联系地城市
  716. employee.setContactCity((String) map.get("contactcity"));
  717. //联系地区县
  718. employee.setContactDistrict((String) map.get("contactcountry"));
  719. //联系地街道
  720. employee.setContactStreet((String) map.get("contactstreet"));
  721. //联系地详细地址
  722. employee.setContactStreet((String) map.get("contactdetailed"));
  723. //中文名
  724. employee.setChineseName((String) map.get("chinesename"));
  725. //涉税事项
  726. employee.setTaxRelatedReason((String) map.get("taxreason"));
  727. //其他证件号码
  728. employee.setOtherLicenseNumber((String) map.get("othercardnumber"));
  729. //其他证件类型 其他证件类型为:外国人永久居留身份证(外国人永久居留证),外国护照,中华人民共和国外国人工作许可证(A类),中华人民共和国外国人工作许可证(B类),中华人民共和国外国人工作许可证(C类),中华人民共和国港澳居民居住证,中华人民共和国台湾居民居住证,中国护照,港澳居民来往内地通行证,台湾居民来往大陆通行证,其他证件号码必填
  730. employee.setOtherLicenseType((String) map.get("othercardtype"));
  731. //是否扣除减除费用(原是否主单位)
  732. employee.setIsMainUnits((String) map.get("deductfees"));
  733. companyEmployeeList.add(employee);
  734. }
  735. return companyEmployeeList;
  736. }
  737. /**
  738. * 获取个税项目
  739. *
  740. * @param ctx
  741. * @return
  742. * @throws BOSException
  743. */
  744. private Map<String, String> getTaxItemMap(Context ctx) throws BOSException {
  745. Map<String, String> taxItemInitMap = new HashMap<>();
  746. //获取所有个税项目
  747. Set initSet = new HashSet();
  748. initSet.add("sre");//当期收入额
  749. initSet.add("mssd");//免税收入
  750. initSet.add("jbylaobxf");//基本养老保险
  751. initSet.add("jbylbxf");//基本医疗保险
  752. initSet.add("sybxf");//失业保险
  753. initSet.add("zfgjj");//住房公积金
  754. initSet.add("nj");//企业年金
  755. initSet.add("syjkbx");//商业健康保险
  756. initSet.add("zykcjze");//准予扣除的捐赠额
  757. initSet.add("jmse");//减免税额
  758. initSet.add("syylbx");//税延养老保险
  759. initSet.add("yxkcsf");//允许扣除的税费
  760. initSet.add("ycxbc");//一次性补偿
  761. initSet.add("znjyzc"); // 累计子女教育支出
  762. initSet.add("jxjyzc"); // 累计继续教育支出
  763. initSet.add("yyezhfzc"); // 累计婴幼儿照护支出
  764. initSet.add("grylj"); // 累计个人养老金
  765. initSet.add("zfdklxzc"); // 累计房屋贷款支出
  766. initSet.add("zfzjzc"); // 住房租金支出
  767. initSet.add("sylrzc"); // 赡养老人支出
  768. initSet.add("zxkchj"); // 累计其他扣除
  769. initSet.add("zxfjkchj"); // 累计专项附加扣除合计
  770. try {
  771. com.kingdee.shr.compensation.app.tax.base.TaxItemCollection itemColl = com.kingdee.shr.compensation.app.tax.base.TaxItemFactory.getLocalInstance(ctx)
  772. .getTaxItemCollection("where number in (" + AtsUtil.convertSetToString(initSet) + ")");
  773. for (int i = 0; i < itemColl.size(); ++i) {
  774. TaxItemInfo info = itemColl.get(i);
  775. String number = info.getNumber();
  776. taxItemInitMap.put(number, "T" + info.getFieldSn());
  777. }
  778. } catch (BOSException var5) {
  779. var5.printStackTrace();
  780. throw new BOSException("获取个税项目报错: " + var5.getMessage());
  781. }
  782. return taxItemInitMap;
  783. }
  784. /**
  785. * 获取待计算数据
  786. */
  787. private Map<String, List<Map<String, Object>>> getCaluData(Context ctx, Map<String, String> paramDataMap,Map<String, String> taxItemInitMap) throws BOSException {
  788. try {
  789. String taxUnitId = paramDataMap.get("taxUnitId");//纳税单位id
  790. String batchNo = paramDataMap.get("batchNo");//初算数据id
  791. StringBuilder sql = new StringBuilder();
  792. sql.append("SELECT ").append("\n");
  793. for (String number : taxItemInitMap.keySet()) {
  794. String tableField = taxItemInitMap.get(number);
  795. sql.append("scid.").append(tableField).append(" ").append(number).append(",\n");
  796. }
  797. sql.append("item.fnumber AS itemNumber,").append("\n")
  798. .append("personRe.FCARDNUMBER,").append("\n")
  799. .append("personRe.FCARDTYPE,").append("\n")
  800. .append("(CASE WHEN personRe.FREPORTNAME IS NOT NULL THEN personRe.FREPORTNAME ELSE person.fname_l2 END) AS personName,").append("\n")
  801. .append("person.fnumber AS personNumber,").append("\n")
  802. .append("personRe.FPHONENUMBER,").append("\n") // 手机号
  803. .append("personRe.FISOVERSEA,").append("\n") // 是否境外人员
  804. .append("personRe.FGENDER,").append("\n") // 性别
  805. .append("personRe.FBIRTHDAY,").append("\n") // 出生日期
  806. .append("personRe.FISDISABILITY,").append("\n") // 是否残疾
  807. .append("personRe.FDISCARDNUMBER,").append("\n") // 残疾证号
  808. .append("personRe.FHEROCARDNUMBER,").append("\n") // 烈属证号
  809. .append("personRe.FEMAIL,").append("\n") // 电子邮箱
  810. .append("personRe.FCHINESENAME,").append("\n") // 中文名
  811. .append("personRe.FISHERO,").append("\n") // 是否烈属
  812. .append("personRe.FISOLD,").append("\n") // 是否孤老
  813. .append("personRe.FADDRESS,").append("\n") // 居住地省
  814. .append("personRe.FADDRESSCITY,").append("\n") // 居住城市
  815. .append("personRe.FADDRESSCOUNTY,").append("\n") // 居住区县
  816. .append("personRe.FADDRESSSTREET,").append("\n") // 居住街道
  817. .append("personRe.FDESC,").append("\n") // 备注
  818. .append("personRe.FHOMETOWN,").append("\n") // 户籍省份
  819. .append("personRe.FHOMETOWNCITY,").append("\n") // 户籍城市
  820. .append("personRe.FHOMETOWNCOUNTRY,").append("\n") // 户籍区县
  821. .append("personRe.FHOMETOWNSTREET,").append("\n") // 户籍街道
  822. .append("personRe.FHOMETOWNDETAILED,").append("\n") // 户籍详细地址
  823. .append("personRe.FACCOUNT,").append("\n") // 银行账号
  824. .append("personRe.FOTHERCARDTYPE,").append("\n") // 其他证件类型
  825. .append("personRe.FOTHERCARDNUMBER,").append("\n") // 其他证件号码
  826. .append("personRe.FTAXREASON,").append("\n") // 涉税事项
  827. .append("personRe.FBANKCARDPROVINCE,").append("\n") // 开户银行省份
  828. .append("bank.fname_l2 AS bankName,").append("\n") // 开户银行
  829. .append("personRe.FCONTACTADDRESS,").append("\n") // 联系地址_省
  830. .append("personRe.FCONTACTCITY,").append("\n") // 联系地城市
  831. .append("personRe.FCONTACTCOUNTRY,").append("\n") // 联系地区县
  832. .append("personRe.FCONTACTSTREET,").append("\n") // 联系地街道
  833. .append("personRe.FCONTACTDETAILED,").append("\n") // 联系地详细地址
  834. .append("personRe.FENTRYDATE,").append("\n") // 首次入境时间
  835. .append("personRe.FLEAVEDATE,").append("\n") // 预计离境时间
  836. .append("personRe.FPOSITION,").append("\n") // 职务
  837. .append("personRe.FINVESTMENTTOTAL,").append("\n") // 个人投资总额
  838. .append("personRe.FINVESTMENTRATE,").append("\n") // 个人投资比例
  839. .append("birthplace.FNAME_L2 AS birthplaceName,").append("\n") // 出生地
  840. .append("nationality.FNAME_L2 AS nationalityName,").append("\n") // 国籍
  841. .append("diploma.fnumber AS diplomaNumber,").append("\n") // 学历编码
  842. .append("personReEntry.FPERSONSTATUS,").append("\n") // 人员状态
  843. .append("personReEntry.FEMPLOYEDDATE,").append("\n") // 受雇日期
  844. .append("personReEntry.FDEPARTUREDATE,").append("\n") // 离职日期
  845. .append("personReEntry.FEMPLOYEDTYPE,").append("\n") // 任职受雇从业类型
  846. .append("personReEntry.FSITUATION,").append("\n") // 就业情况
  847. .append("personReEntry.FDEDUCTFEES").append("\n") // 是否扣除减除费用
  848. .append("FROM T_HR_STAXCALCONFIGDETAIL scid ").append("\n")
  849. .append("LEFT JOIN T_HR_STaxIncomeItem item ON item.fid = scid.FINCOMEITEMID ").append("\n")
  850. .append("LEFT JOIN (select * from ").append("\n")
  851. .append(" T_HR_STaxPersonRecordentry where fTaxUnitId||fPersonId||FLASTREPORTMONTH||FEMPLOYEDDATE in( ").append("\n")
  852. .append(" select fTaxUnitId||fPersonId||max(FLASTREPORTMONTH)||max(FEMPLOYEDDATE) from T_HR_STaxPersonRecordentry where FSUBMITSTATUS=2 group by FTAXUNITID,FPERSONID ").append("\n")
  853. .append(")) personReEntry ON personReEntry.fPersonId = scid.fPersonId AND scid.fTaxUnitId = personReEntry.fTaxUnitId ").append("\n")
  854. //.append("LEFT JOIN T_HR_STaxPersonRecordentry personReEntry ON personReEntry.fPersonId = scid.fPersonId AND scid.fTaxUnitId = personReEntry.fTaxUnitId and personReEntry.FPERSONSTATUS=1 )").append("\n")
  855. .append("LEFT JOIN T_HR_STaxPersonRecord personRe ON personReEntry.FBILLID = personRe.fid ").append("\n")
  856. .append("LEFT JOIN T_BD_Person person ON person.fid = personRe.FPERSONID ").append("\n")
  857. .append("LEFT JOIN T_BD_Nationality birthplace ON birthplace.fid = personRe.FBIRTHPLACEID ").append("\n")
  858. .append("LEFT JOIN T_BD_HRDiploma diploma ON diploma.fid = personRe.FEDULEVELID ").append("\n")
  859. .append("LEFT JOIN T_HR_PBank bank ON bank.fid = personRe.FHRBANKID ").append("\n")
  860. .append("LEFT JOIN T_BD_Nationality nationality ON nationality.fid = personRe.FNATIONALITYID ").append("\n")
  861. .append("WHERE scid.FTAXUNITID = '").append(taxUnitId).append("'").append("\n")
  862. .append("AND scid.FSTATE = '20' ").append("\n")
  863. .append("AND scid.FBATCHNO ='").append(batchNo).append("'").append("\n");
  864. LOG.info("getCaluData.sql:\n" + sql);
  865. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql.toString());
  866. Map<String, List<Map<String, Object>>> dataMap = new HashMap<>();
  867. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  868. while (iRowSet.next()) {
  869. List<Map<String, Object>> list;
  870. //所得项目编码
  871. String itemNumber = iRowSet.getString("itemNumber");
  872. if (dataMap.containsKey(itemNumber)) {
  873. list = dataMap.get(itemNumber);
  874. } else {
  875. list = new ArrayList<>();
  876. dataMap.put(itemNumber, list);
  877. }
  878. Map map = new HashMap();
  879. //姓名
  880. map.put("personName", iRowSet.getString("personName"));
  881. //工号
  882. map.put("personNumber", iRowSet.getString("personNumber"));
  883. //证件号码
  884. map.put("cardNumber", iRowSet.getString("FCARDNUMBER"));
  885. //证件类型
  886. String cardType = iRowSet.getString("FCARDTYPE");
  887. if (!StringUtils.isEmpty(cardType)) {
  888. CardTypeEnum anEnum = CardTypeEnum.getEnum(cardType);
  889. if (anEnum != null) {
  890. map.put("cardType", anEnum.getAlias());
  891. }
  892. }
  893. //人员状态
  894. String personstatus = iRowSet.getString("FPERSONSTATUS");
  895. if (personstatus != null) {
  896. PersonStatusEnum anEnum = PersonStatusEnum.getEnum(personstatus);
  897. if (anEnum != null) {
  898. map.put("personstatusName", anEnum.getAlias());
  899. }
  900. }
  901. //任职受雇从业类型
  902. String employedtype = iRowSet.getString("FEMPLOYEDTYPE");
  903. if (!StringUtils.isEmpty(employedtype)) {
  904. EmployedTypeEnum anEnum = EmployedTypeEnum.getEnum(employedtype);
  905. if (anEnum != null) {
  906. map.put("employedtypeName", anEnum.getAlias());
  907. }
  908. }
  909. //手机号码
  910. map.put("phoneNumber", iRowSet.getString("FPHONENUMBER"));
  911. //就业情况
  912. Integer situation = iRowSet.getInt("FSITUATION");
  913. if (situation != null) {
  914. EmploymentSituationEnum anEnum = EmploymentSituationEnum.getEnum(situation);
  915. if (anEnum != null) {
  916. map.put("situationName", anEnum.getAlias());
  917. }
  918. }
  919. //性别
  920. String gender = iRowSet.getString("FGENDER");
  921. if (!StringUtils.isEmpty(gender)) {
  922. GenderEnum anEnum = GenderEnum.getEnum(gender);
  923. if (anEnum != null) {
  924. map.put("gender", anEnum.getAlias());
  925. }
  926. }
  927. //否境外人员
  928. String isoversea = iRowSet.getString("FISOVERSEA");
  929. if ("1".equals(isoversea)) {
  930. map.put("isoversea", "境外");
  931. } else if ("0".equals(isoversea)) {
  932. map.put("isoversea", "境内");
  933. }
  934. //是否残疾
  935. String isdisability = iRowSet.getString("FISDISABILITY");
  936. if ("1".equals(isdisability)) {
  937. map.put("isdisability", "是");
  938. } else {
  939. map.put("isdisability", "否");
  940. }
  941. //残疾证号
  942. map.put("discardnumber", iRowSet.getString("FDISCARDNUMBER"));
  943. //是否烈属
  944. String ishero = iRowSet.getString("FISHERO");
  945. if ("1".equals(ishero)) {
  946. map.put("ishero", "是");
  947. } else {
  948. map.put("ishero", "否");
  949. }
  950. //烈属证号
  951. map.put("herocardnumber", iRowSet.getString("FHEROCARDNUMBER"));
  952. //是否孤老
  953. String isold = iRowSet.getString("FISOLD");
  954. if ("1".equals(isold)) {
  955. map.put("isold", "是");
  956. } else {
  957. map.put("isold", "否");
  958. }
  959. //是否扣除减除费用
  960. String deductfees = iRowSet.getString("FDEDUCTFEES");
  961. if ("0".equals(deductfees)) {
  962. map.put("deductfees", "是");
  963. } else {
  964. map.put("deductfees", "否");
  965. }
  966. //职务
  967. String position = iRowSet.getString("FPOSITION");
  968. if (!StringUtils.isEmpty(position)) {
  969. com.kingdee.eas.hr.base.PositionTypeEnum anEnum = com.kingdee.eas.hr.base.PositionTypeEnum.getEnum(position);
  970. if (anEnum != null) {
  971. map.put("positionName", anEnum.getAlias());
  972. }
  973. }
  974. //电子邮箱
  975. map.put("email", iRowSet.getString("FEMAIL"));
  976. //个人投资总额
  977. map.put("investmenttotal", iRowSet.getBigDecimal("FINVESTMENTTOTAL"));
  978. //个人投资比例
  979. map.put("investmentrate", iRowSet.getBigDecimal("FINVESTMENTRATE"));
  980. //中文名
  981. map.put("chinesename", iRowSet.getString("FCHINESENAME"));
  982. //出生日期
  983. Date birthday = iRowSet.getDate("FBIRTHDAY");
  984. if (birthday != null) {
  985. map.put("birthday", sdf.format(birthday));
  986. }
  987. //受雇日期
  988. Date employeddate = iRowSet.getDate("FEMPLOYEDDATE");
  989. if (employeddate != null) {
  990. map.put("employeddate", sdf.format(employeddate));
  991. }
  992. //离职日期
  993. Date departuredate = iRowSet.getDate("FDEPARTUREDATE");
  994. if (departuredate != null) {
  995. map.put("departuredate", sdf.format(departuredate));
  996. }
  997. //出生地
  998. map.put("birthplaceName", iRowSet.getString("birthplaceName"));
  999. //学历
  1000. int diplomaNumber = iRowSet.getInt("diplomaNumber");
  1001. //todo 大学本科以下 大学本科 研究生
  1002. if (diplomaNumber < 6) {
  1003. map.put("diploma", "大学本科以下");
  1004. } else if (diplomaNumber == 6) {
  1005. map.put("diploma", "大学本科");
  1006. } else if (diplomaNumber > 6) {
  1007. map.put("diploma", "研究生");
  1008. }
  1009. //开户银行省份
  1010. map.put("bankcardprovince", iRowSet.getString("FBANKCARDPROVINCE"));
  1011. //开户银行
  1012. map.put("bankName", iRowSet.getString("bankName"));
  1013. //银行账号
  1014. map.put("account", iRowSet.getString("FACCOUNT"));
  1015. //其他证件类型
  1016. map.put("othercardtype", iRowSet.getString("FOTHERCARDTYPE"));
  1017. //其他证件号码
  1018. map.put("othercardnumber", iRowSet.getString("FOTHERCARDNUMBER"));
  1019. //居住地省
  1020. map.put("address", iRowSet.getString("FADDRESS"));
  1021. //居住城市
  1022. map.put("addresscity", iRowSet.getString("FADDRESSCITY"));
  1023. //居住区县
  1024. map.put("addresscounty", iRowSet.getString("FADDRESSCOUNTY"));
  1025. //居住街道
  1026. map.put("addressstreet", iRowSet.getString("FADDRESSSTREET"));
  1027. //户籍省份
  1028. map.put("hometown", iRowSet.getString("FHOMETOWN"));
  1029. //户籍城市
  1030. map.put("hometowncity", iRowSet.getString("FHOMETOWNCITY"));
  1031. //户籍城市
  1032. map.put("hometowncountry", iRowSet.getString("FHOMETOWNCOUNTRY"));
  1033. //户籍街道
  1034. map.put("hometownstreet", iRowSet.getString("FHOMETOWNSTREET"));
  1035. //户籍详细地址
  1036. map.put("hometowndetailed", iRowSet.getString("FHOMETOWNDETAILED"));
  1037. //国籍
  1038. map.put("nationalityName", iRowSet.getString("nationalityName"));
  1039. //涉税事项
  1040. map.put("taxreason", iRowSet.getString("FTAXREASON"));
  1041. //首次入境时间
  1042. Date entrydate = iRowSet.getDate("FENTRYDATE");
  1043. if (entrydate != null) {
  1044. map.put("entrydate", sdf.format(entrydate));
  1045. }
  1046. //预计离境时间
  1047. Date leavedate = iRowSet.getDate("FLEAVEDATE");
  1048. if (leavedate != null) {
  1049. map.put("leavedate", sdf.format(leavedate));
  1050. }
  1051. //联系地址_省
  1052. map.put("contactaddress", iRowSet.getString("FCONTACTADDRESS"));
  1053. //联系地城市
  1054. map.put("contactcity", iRowSet.getString("FCONTACTCITY"));
  1055. //联系地区县
  1056. map.put("contactcountry", iRowSet.getString("FCONTACTCOUNTRY"));
  1057. //联系地街道
  1058. map.put("contactstreet", iRowSet.getString("FCONTACTSTREET"));
  1059. //联系地详细地址
  1060. map.put("contactdetailed", iRowSet.getString("FCONTACTDETAILED"));
  1061. //备注
  1062. map.put("desc", iRowSet.getString("FDESC"));
  1063. for (String number : taxItemInitMap.keySet()) {
  1064. map.put(number, iRowSet.getBigDecimal(number));
  1065. }
  1066. list.add(map);
  1067. }
  1068. return dataMap;
  1069. } catch (Exception e) {
  1070. e.printStackTrace();
  1071. throw new BOSException("获取待计算数据报错: " + e.getMessage());
  1072. }
  1073. }
  1074. /***
  1075. * 员工
  1076. * @return
  1077. */
  1078. private ComplexIncome getComplexIncome(PersonInfo personInfo, String incomeItemName, BigDecimal sre) {
  1079. ComplexIncome complexIncome = new ComplexIncome();
  1080. //姓名
  1081. complexIncome.setName(personInfo.getName());
  1082. //居民身份证
  1083. if (personInfo.getIdCardNO() != null) {
  1084. //证照号码
  1085. complexIncome.setLicenseNumber(personInfo.getIdCardNO());
  1086. //证照类型
  1087. complexIncome.setLicenseType("居民身份证");
  1088. }
  1089. //中国护照不
  1090. if (personInfo.getPassportNO() != null) {
  1091. //证照类型
  1092. complexIncome.setLicenseType("中国护照");
  1093. //证照号码
  1094. complexIncome.setLicenseNumber(personInfo.getPassportNO());
  1095. }
  1096. //收入额
  1097. complexIncome.setIncome(sre);
  1098. complexIncome.setIncomeItemName(incomeItemName);
  1099. return complexIncome;
  1100. }
  1101. /**
  1102. * 企业员工列表*
  1103. *
  1104. * @return
  1105. */
  1106. private List<DetailCompanyEmployee> getCompanyEmployeeList(Set personIds,TaxUnitInfo taxUnitInfo) throws BOSException, EASBizException {
  1107. List<DetailCompanyEmployee> companyEmployeeList = new ArrayList<DetailCompanyEmployee>();
  1108. SelectorItemCollection sic = new SelectorItemCollection();
  1109. sic.add("*");
  1110. FilterInfo filterInfo = new FilterInfo();
  1111. filterInfo.getFilterItems().add(new FilterItemInfo("id", personIds, CompareType.INCLUDE));
  1112. EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null); //获取人员数据
  1113. PersonCollection personCollection = PersonFactory.getLocalInstance(ctx).getPersonCollection(entityViewInfo);
  1114. if (personCollection.size() > 0) {
  1115. for (int i = 0; i < personCollection.size(); i++) {
  1116. PersonInfo personInfo = personCollection.get(i);
  1117. companyEmployeeList.add(getDetailCompanyEmployee(personInfo,taxUnitInfo));
  1118. }
  1119. }
  1120. return companyEmployeeList;
  1121. }
  1122. /**
  1123. * 人员
  1124. *
  1125. * @return
  1126. */
  1127. public DetailCompanyEmployee getDetailCompanyEmployee(PersonInfo personInfo,TaxUnitInfo taxUnitInfo) throws BOSException, EASBizException {
  1128. //人员对象
  1129. DetailCompanyEmployee detailCompanyEmployee = new DetailCompanyEmployee();
  1130. ////姓名
  1131. //detailCompanyEmployee.setName("何云");
  1132. ////证件类型
  1133. //detailCompanyEmployee.setLicenseType("居民身份证");
  1134. ////证照号码
  1135. //detailCompanyEmployee.setLicenseNumber("429004198601085125");
  1136. //姓名
  1137. detailCompanyEmployee.setName(personInfo.getName());
  1138. //complexIncome.setName("何云");
  1139. //居民身份证
  1140. if (personInfo.getIdCardNO() != null) {
  1141. //证照号码
  1142. detailCompanyEmployee.setLicenseNumber(personInfo.getIdCardNO());
  1143. //证照类型
  1144. detailCompanyEmployee.setLicenseType("居民身份证");
  1145. //人员地区
  1146. detailCompanyEmployee.setArea("境内");
  1147. }
  1148. //中国护照
  1149. if (personInfo.getPassportNO() != null) {
  1150. //证照类型
  1151. detailCompanyEmployee.setLicenseType("中国护照");
  1152. //证照号码
  1153. detailCompanyEmployee.setLicenseNumber(personInfo.getPassportNO());
  1154. //人员地区
  1155. detailCompanyEmployee.setArea("境外");
  1156. }
  1157. //电话号码
  1158. detailCompanyEmployee.setPhone(personInfo.getCell());
  1159. //人员状态
  1160. detailCompanyEmployee.setState(personInfo.getEmployeeType().getName());
  1161. //人员报税信息->任职受雇从业信息
  1162. ITaxPersonRecordEntry iTaxPersonRecordEntry = TaxPersonRecordEntryFactory.getLocalInstance(ctx);
  1163. EntityViewInfo view = new EntityViewInfo();
  1164. FilterInfo filter = new FilterInfo();
  1165. filter.getFilterItems().add(new FilterItemInfo("person.id",personInfo.getId().toString()));
  1166. filter.getFilterItems().add(new FilterItemInfo("personstatus",1));
  1167. filter.getFilterItems().add(new FilterItemInfo("taxUnit.id",taxUnitInfo.getId().toString()));
  1168. view.setFilter(filter);
  1169. SelectorItemCollection selector = new SelectorItemCollection();
  1170. selector.add(new SelectorItemInfo("id"));
  1171. selector.add(new SelectorItemInfo("employedType"));
  1172. selector.add(new SelectorItemInfo("employedDate"));
  1173. view.setSelector(selector);
  1174. TaxPersonRecordEntryCollection taxPersonRecordEntryCollection = iTaxPersonRecordEntry.getTaxPersonRecordEntryCollection(view);
  1175. if(null==taxPersonRecordEntryCollection&&taxPersonRecordEntryCollection.size()<=0) {
  1176. FilterInfo filter1 = new FilterInfo();
  1177. filter1.getFilterItems().add(new FilterItemInfo("person.id",personInfo.getId().toString()));
  1178. filter1.getFilterItems().add(new FilterItemInfo("taxUnit.id",taxUnitInfo.getId().toString()));
  1179. view.setFilter(filter1);
  1180. taxPersonRecordEntryCollection = iTaxPersonRecordEntry.getTaxPersonRecordEntryCollection(view);
  1181. }
  1182. TaxPersonRecordEntryInfo taxPersonRecordEntryInfo = taxPersonRecordEntryCollection.get(0);
  1183. //任职受雇类型 可选择雇员、保险营销员、证券经纪人、其他、实习学生(全日制学历教育)
  1184. //detailCompanyEmployee.setIsEmployee("其他");
  1185. detailCompanyEmployee.setIsEmployee(taxPersonRecordEntryInfo.getEmployedType().getAlias());
  1186. //受雇日期 YYYY-MM-DD,不能大于当前时间,任职受雇类型选择雇员、保险营销员、证券经纪人时必录
  1187. SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd");
  1188. detailCompanyEmployee.setEmployedDate(inputFormat.format(taxPersonRecordEntryInfo.getEmployedDate()));
  1189. //性别
  1190. detailCompanyEmployee.setGender(personInfo.getGender().getAlias());
  1191. //出生日期
  1192. detailCompanyEmployee.setBirthday(inputFormat.format(personInfo.getBirthday()));
  1193. //国籍 nationality
  1194. NationalityInfo nationality = personInfo.getNationality();
  1195. detailCompanyEmployee.setNationality(nationality.getName());
  1196. return detailCompanyEmployee;
  1197. }
  1198. private String getCheckSqlByType(Map<String, Object> incomeIdMap, String taxUnitId, String yearMonth, TbTypeEnum typeEnum) {
  1199. StringBuilder sqlBuf = new StringBuilder();
  1200. sqlBuf.append(" SELECT distinct tx.FTAXUNITID,t1.Fname_l2 as TAXNAME,p1.FNUMBER,p1.Fname_l2 as PERSONNAME, ti.fIncomeCode ");
  1201. sqlBuf.append(" FROM T_HR_STaxCalConfigDetail tx ");
  1202. sqlBuf.append(" left join T_HR_TAXUNIT as t1 on t1.fid = tx.FTaxUnitID ");
  1203. sqlBuf.append(" left join T_BD_PERSON as p1 on p1.fid = tx.FPersonId ");
  1204. sqlBuf.append(" left join t_hr_sTaxIncomeItem as ti on tx.fIncomeItemId = ti.fid ");
  1205. String dateFilter = CmpSQLUtil.generateSqlDateFilter("tx.FPeriodBegin", "tx.FPeriodEnd", yearMonth);
  1206. sqlBuf.append(" where ").append(dateFilter);
  1207. sqlBuf.append(" and tx.FTAXUNITID='").append(taxUnitId).append("'");
  1208. sqlBuf.append(" and tx.FSTATE=10");
  1209. sqlBuf.append(" and tx.FIsLast=1");
  1210. sqlBuf.append(" and tx.FIncomeItemId in ").append(incomeIdMap.get(typeEnum.getValue()));
  1211. return sqlBuf.toString();
  1212. }
  1213. //private Map<String, Object> checkTaxDeclareData(Context ctx, List<IncomeTaxDeclarInfo> waitToDeclareList) throws BOSException {
  1214. // Map<String, Object> checkDataResultMap = new HashMap();
  1215. // return null;
  1216. //}
  1217. private Map<String, Object> checkTaxDeclareData(Context ctx, HttpServletRequest request, List<IncomeTaxDeclarInfo> waitToDeclareList) throws BOSException, SQLException, ShrWebBizException {
  1218. Map<String, Object> checkDataResultMap = new HashMap();
  1219. boolean hasErrData = false;
  1220. if (waitToDeclareList != null && waitToDeclareList.size() > 0) {
  1221. List<String> preCheckSql = new ArrayList();
  1222. List<String> specCheckForPre = new ArrayList();
  1223. List<String> notPersonCheckSql = new ArrayList();
  1224. List<String> classifyCheckSql = new ArrayList();
  1225. Map<String, Object> incomeIdMap = new HashMap();
  1226. incomeIdMap.put("1", CmpTaxUtil.genIncomeItemId(ctx, "1"));
  1227. incomeIdMap.put("2", CmpTaxUtil.genIncomeItemId(ctx, "2"));
  1228. incomeIdMap.put("3", CmpTaxUtil.genIncomeItemId(ctx, "3"));
  1229. Iterator i$ = waitToDeclareList.iterator();
  1230. String yearMonth;
  1231. while (i$.hasNext()) {
  1232. IncomeTaxDeclarInfo declareInfo = (IncomeTaxDeclarInfo) i$.next();
  1233. TbTypeEnum tbType = declareInfo.getTbType();
  1234. String taxUnitId = declareInfo.getTaxUnit().getId().toString();
  1235. yearMonth = declareInfo.getYearMonth();
  1236. if (tbType != null) {
  1237. if ("1".equals(tbType.getValue())) {
  1238. preCheckSql.add(this.getCheckSqlByType(incomeIdMap, taxUnitId, yearMonth, TbTypeEnum.SB0701));
  1239. specCheckForPre.add(this.getPreCheckSql(declareInfo));
  1240. } else if ("3".equals(tbType.getValue())) {
  1241. notPersonCheckSql.add(this.getCheckSqlByType(incomeIdMap, taxUnitId, yearMonth, TbTypeEnum.SB0703));
  1242. } else {
  1243. classifyCheckSql.add(this.getCheckSqlByType(incomeIdMap, taxUnitId, yearMonth, TbTypeEnum.SB0702));
  1244. }
  1245. }
  1246. }
  1247. Map<String, String> reasonOperaMap = new HashMap();
  1248. reasonOperaMap.put("noCalDataReson", EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label140", ctx.getLocale()));
  1249. reasonOperaMap.put("noCalDataOper", EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label141", ctx.getLocale()));
  1250. reasonOperaMap.put("preDataReason", EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label142", ctx.getLocale()));
  1251. reasonOperaMap.put("preDataOpera", EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label143", ctx.getLocale()));
  1252. List<TaxDeclarExcelRowDTO> taxDeclareExcelRowDTOS = new ArrayList();
  1253. taxDeclareExcelRowDTOS.addAll(this.getExceptData(ctx, preCheckSql, specCheckForPre, reasonOperaMap, TbTypeEnum.SB0701));
  1254. taxDeclareExcelRowDTOS.addAll(this.getExceptData(ctx, classifyCheckSql, specCheckForPre, reasonOperaMap, TbTypeEnum.SB0702));
  1255. taxDeclareExcelRowDTOS.addAll(this.getExceptData(ctx, notPersonCheckSql, specCheckForPre, reasonOperaMap, TbTypeEnum.SB0703));
  1256. String filePath = "";
  1257. if (taxDeclareExcelRowDTOS.size() > 0) {
  1258. hasErrData = true;
  1259. HSSFWorkbook workbook = new HSSFWorkbook();
  1260. yearMonth = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label144", ctx.getLocale());
  1261. this.fillTitle(ctx, workbook, yearMonth.split(","));
  1262. this.fillWorkdBookData(workbook, taxDeclareExcelRowDTOS);
  1263. SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
  1264. File dir = new File(UserUtil.getUserTempDirAbsolutePath(request.getSession()));
  1265. if (!dir.exists()) {
  1266. dir.mkdirs();
  1267. }
  1268. String fileName = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label145", ctx.getLocale()) + "_" + format.format(new Date()) + ".xls";
  1269. String realFileName = MD5.md5Hash(fileName);
  1270. File file = new File(dir, realFileName);
  1271. FileOutputStream out = null;
  1272. try {
  1273. out = new FileOutputStream(file);
  1274. workbook.write(out);
  1275. out.flush();
  1276. } catch (FileNotFoundException var33) {
  1277. LOG.error(var33.getMessage(), var33);
  1278. } catch (IOException var34) {
  1279. LOG.error(var34.getMessage(), var34);
  1280. } finally {
  1281. if (out != null) {
  1282. try {
  1283. out.close();
  1284. } catch (IOException var32) {
  1285. LOG.error(var32.getMessage(), var32);
  1286. }
  1287. }
  1288. }
  1289. Map<String, String> params = new HashMap();
  1290. params.put("method", "tmp");
  1291. params.put("file", realFileName);
  1292. params.put("filename", fileName);
  1293. filePath = DynamicUtil.assembleUrl("/downloadfile.do", params);
  1294. }
  1295. checkDataResultMap.put("excel", filePath);
  1296. }
  1297. checkDataResultMap.put("hasErrData", hasErrData);
  1298. return checkDataResultMap;
  1299. }
  1300. private void fillTitle(Context ctx, HSSFWorkbook workbook, String[] titleArr) {
  1301. HSSFSheet sheet = workbook.createSheet();
  1302. HSSFRow createRow = sheet.createRow(0);
  1303. HSSFCell infoCell = createRow.createCell(0);
  1304. infoCell.setCellValue(EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label146", ctx.getLocale()));
  1305. sheet.setColumnWidth(0, 12800);
  1306. createRow = sheet.createRow(1);
  1307. HSSFFont font = workbook.createFont();
  1308. font.setColor((short) 8);
  1309. font.setFontHeightInPoints((short) 12);
  1310. font.setBoldweight((short) 700);
  1311. HSSFCellStyle style = workbook.createCellStyle();
  1312. style.setFont(font);
  1313. style.setAlignment((short) 2);
  1314. style.setVerticalAlignment((short) 1);
  1315. if (titleArr != null && titleArr.length > 0) {
  1316. for (int i = 0; i < titleArr.length; ++i) {
  1317. HSSFCell cell = createRow.createCell(i);
  1318. cell.setCellStyle(style);
  1319. cell.setCellValue(titleArr[i]);
  1320. if (i > 3) {
  1321. sheet.setColumnWidth(i, 15360);
  1322. } else {
  1323. sheet.setColumnWidth(i, 7680);
  1324. }
  1325. }
  1326. }
  1327. }
  1328. private void fillWorkdBookData(HSSFWorkbook workbook, List<TaxDeclarExcelRowDTO> dataList) {
  1329. HSSFSheet sheet = workbook.getSheetAt(0);
  1330. if (dataList != null && dataList.size() > 0) {
  1331. for (int i = 0; i < dataList.size(); ++i) {
  1332. HSSFRow row = sheet.createRow(i + 2);
  1333. TaxDeclarExcelRowDTO excelRowDTO = (TaxDeclarExcelRowDTO) dataList.get(i);
  1334. HSSFCell cell = row.createCell(0);
  1335. cell.setCellValue(excelRowDTO.getPersonNum());
  1336. cell = row.createCell(1);
  1337. cell.setCellValue(excelRowDTO.getPersonName());
  1338. cell = row.createCell(2);
  1339. cell.setCellValue(excelRowDTO.getTaxName());
  1340. cell = row.createCell(3);
  1341. cell.setCellValue(excelRowDTO.getDeclarType());
  1342. cell = row.createCell(4);
  1343. cell.setCellValue(excelRowDTO.getReason());
  1344. cell = row.createCell(5);
  1345. cell.setCellValue(excelRowDTO.getOperation());
  1346. }
  1347. }
  1348. }
  1349. private String getSqlDateFilterLqDate(String dateStr) {
  1350. String[] beginDateArr = dateStr.split("-");
  1351. Calendar calendar = Calendar.getInstance();
  1352. calendar.set(Integer.parseInt(beginDateArr[0]), Integer.parseInt(beginDateArr[1]) - 1, 1, 0, 0, 0);
  1353. Date beginDate = calendar.getTime();
  1354. return CmpDateUtil.toKSqlDate(beginDate);
  1355. }
  1356. private List<TaxDeclarExcelRowDTO> getExceptData(Context ctx, List<String> preCheckSql, List<String> specCheckForPre, Map<String, String> noCalDataOper, TbTypeEnum typeEnum) throws BOSException, SQLException, ShrWebBizException {
  1357. List<TaxDeclarExcelRowDTO> taxDeclarExcelRowDTOS = new ArrayList();
  1358. Iterator i$;
  1359. String s;
  1360. IRowSet rowSet;
  1361. TaxDeclarExcelRowDTO taxDeclareExcelRow;
  1362. if (preCheckSql != null && preCheckSql.size() > 0) {
  1363. i$ = preCheckSql.iterator();
  1364. while (i$.hasNext()) {
  1365. s = (String) i$.next();
  1366. rowSet = DbUtil.executeQuery(ctx, s);
  1367. while (rowSet.next()) {
  1368. taxDeclareExcelRow = new TaxDeclarExcelRowDTO();
  1369. taxDeclareExcelRow.setPersonNum(rowSet.getString("FNUMBER"));
  1370. taxDeclareExcelRow.setPersonName(rowSet.getString("PERSONNAME"));
  1371. String taxUnitName = rowSet.getString("TAXNAME");
  1372. taxDeclareExcelRow.setTaxName(taxUnitName);
  1373. taxDeclareExcelRow.setDeclarType(typeEnum.getAlias());
  1374. taxDeclareExcelRow.setReason((String) noCalDataOper.get("noCalDataReson"));
  1375. taxDeclareExcelRow.setOperation((String) noCalDataOper.get("noCalDataOper"));
  1376. String incomeCode = (String) noCalDataOper.get("fIncomeCode");
  1377. taxDeclarExcelRowDTOS.add(taxDeclareExcelRow);
  1378. }
  1379. }
  1380. }
  1381. if ("1".equals(typeEnum.getValue()) && specCheckForPre != null && specCheckForPre.size() > 0) {
  1382. i$ = specCheckForPre.iterator();
  1383. while (i$.hasNext()) {
  1384. s = (String) i$.next();
  1385. rowSet = DbUtil.executeQuery(ctx, s);
  1386. while (rowSet.next()) {
  1387. taxDeclareExcelRow = new TaxDeclarExcelRowDTO();
  1388. taxDeclareExcelRow.setPersonNum(rowSet.getString("FNUMBER"));
  1389. taxDeclareExcelRow.setPersonName(rowSet.getString("PERSONNAME"));
  1390. taxDeclareExcelRow.setTaxName(rowSet.getString("TAXNAME"));
  1391. taxDeclareExcelRow.setDeclarType(typeEnum.getAlias());
  1392. taxDeclareExcelRow.setReason((String) noCalDataOper.get("preDataReason"));
  1393. taxDeclareExcelRow.setOperation((String) noCalDataOper.get("preDataOpera"));
  1394. taxDeclarExcelRowDTOS.add(taxDeclareExcelRow);
  1395. }
  1396. }
  1397. }
  1398. return taxDeclarExcelRowDTOS;
  1399. }
  1400. private String getPreCheckSql(IncomeTaxDeclarInfo incomeTaxDeclarInfo) {
  1401. StringBuilder sqlBuf = new StringBuilder();
  1402. String yearMonth = incomeTaxDeclarInfo.getYearMonth();
  1403. String taxUnitId = incomeTaxDeclarInfo.getTaxUnit().getId().toString();
  1404. String sql = "select FPersonID from T_HR_STaxCalConfigDetail where FTaxUnitId='" + taxUnitId + "' and FPeriodBegin = " + CmpDateUtil.toKSqlDate(incomeTaxDeclarInfo.getYearMonthDate());
  1405. sqlBuf.append(" SELECT distinct ent.FTAXUNITID, t.Fname_l2 as TAXNAME, p.FNUMBER, p.Fname_l2 as PERSONNAME ");
  1406. sqlBuf.append(" FROM T_HR_STaxPersonRecordEntry ent ");
  1407. sqlBuf.append(" left join T_HR_TAXUNIT as t on t.fid = ent.FTaxUnitID ");
  1408. sqlBuf.append(" left join T_BD_PERSON as p on p.fid = ent.FPersonId ");
  1409. sqlBuf.append(" where ent.FSubmitStatus='2' and ent.FPersonStatus='1' ");
  1410. sqlBuf.append(" and ent.FTaxUnitID='").append(taxUnitId).append("'");
  1411. sqlBuf.append(" and ent.FENDDATE <=").append(this.getSqlDateFilterLqDate(yearMonth));
  1412. sqlBuf.append(" and ent.FPersonID not in ( ").append(sql).append(" )");
  1413. return sqlBuf.toString();
  1414. }
  1415. private Map<String, Object> checkIncomeTaxIssue(Context ctx, List<IncomeTaxDeclarInfo> waitToDeclareList) throws BOSException {
  1416. StringBuilder taxUnitIds = new StringBuilder();
  1417. IncomeTaxDeclarInfo declareInfo;
  1418. for (Iterator i$ = waitToDeclareList.iterator(); i$.hasNext(); taxUnitIds.append(declareInfo.getTaxUnit().getId().toString())) {
  1419. declareInfo = (IncomeTaxDeclarInfo) i$.next();
  1420. if (taxUnitIds.length() > 0) {
  1421. taxUnitIds.append(",");
  1422. }
  1423. }
  1424. String oql = "select person.person.name where taxUnit.id in " + CmpStrUtil.buildInSql(taxUnitIds.toString()) + " and result = " + 1 + " and status = " + 2 + " and inviteStatus = " + 0;
  1425. IncomeTaxIssueCollection collection = IncomeTaxIssueFactory.getLocalInstance(ctx).getIncomeTaxIssueCollection(oql);
  1426. if (collection != null && !collection.isEmpty()) {
  1427. StringBuilder errMsg = new StringBuilder();
  1428. for (int i = 0; i < collection.size() && i != 5; ++i) {
  1429. if (errMsg.length() > 0) {
  1430. errMsg.append(",");
  1431. }
  1432. errMsg.append("[").append(collection.get(i).getPerson().getPerson().getName()).append("]");
  1433. }
  1434. Map<String, Object> map = new HashMap();
  1435. map.put("errMsg", "以下员工存在申诉属实争议,且未进行邀请确认,需要进行发送邀请确认后才可进行个税申报或者进行非正常人员报送(更新人员报税信息中的人员状态为非正常,并进行人员报送成功),员工姓名:" + errMsg.toString() + ",选择[是]则跳转到[申诉争议-申诉属实人员]列表,选择[否]则跳转到[人员报税信息]列表。");
  1436. map.put("issueError", true);
  1437. return map;
  1438. } else {
  1439. return null;
  1440. }
  1441. }
  1442. private String checkTaxCalStatus(Context ctx, List<IncomeTaxDeclarInfo> waitToDeclareList) throws SHRWebException {
  1443. String sql = "select t.fState, u.fName_l2 taxUnitName, d.fIncomeItemId from t_hr_sTaxCalConfigDetail d left join t_hr_sTaxCalInitDetail t on d.fCmpCalTableId = t.fCmpCalTableId and d.fIncomeItemId = t.fIncomeItemId left join t_hr_taxUnit u on d.fTaxUnitId = u.fid where d.fTaxUnitId = ? and d.fPeriodBegin = ?";
  1444. try {
  1445. Iterator i$ = waitToDeclareList.iterator();
  1446. boolean isTaxCalFinished;
  1447. String taxUnitName;
  1448. do {
  1449. if (!i$.hasNext()) {
  1450. return null;
  1451. }
  1452. IncomeTaxDeclarInfo declareInfo = (IncomeTaxDeclarInfo) i$.next();
  1453. String taxUnitId = declareInfo.getTaxUnit().getId().toString();
  1454. Date periodDate = declareInfo.getYearMonthDate();
  1455. Object[] param = new Object[]{taxUnitId, CmpDateUtil.toSqlDate(periodDate)};
  1456. IRowSet rs = DbUtil.executeQuery(ctx, sql, param);
  1457. boolean havingSalaryIncome = false;
  1458. isTaxCalFinished = true;
  1459. taxUnitName = "";
  1460. while (rs.next()) {
  1461. int state = rs.getInt("fState");
  1462. taxUnitName = rs.getString("taxUnitName");
  1463. String incomeItemId = rs.getString("fIncomeItemId");
  1464. if (state != 40) {
  1465. isTaxCalFinished = false;
  1466. }
  1467. if ("8r0AAABCg2PDiOoP".equals(incomeItemId)) {
  1468. havingSalaryIncome = true;
  1469. }
  1470. }
  1471. TbTypeEnum typeEnum = declareInfo.getTbType();
  1472. if (!havingSalaryIncome && typeEnum == TbTypeEnum.SB0701) {
  1473. return "纳税单位[" + taxUnitName + "]当期预扣预缴申报表未包含所得项目为正常工资薪金所得的员工,不允许申报,请确认";
  1474. }
  1475. } while (isTaxCalFinished);
  1476. return "纳税单位【" + taxUnitName + "】存在接口算税未完成的数据,请确认";
  1477. } catch (Exception var15) {
  1478. LOG.error("checkTaxCalStatus error: ", var15);
  1479. throw new SHRWebException(var15.getMessage());
  1480. }
  1481. }
  1482. /**
  1483. * 异常提醒
  1484. *
  1485. * @param advanceDeclareInfo
  1486. * @return
  1487. */
  1488. private String combineError(List<String> advanceDeclareInfo) {
  1489. StringBuilder error = new StringBuilder();
  1490. error.append("以下纳税单位尚未到申报时间,请不要提前申报:");
  1491. Iterator i$ = advanceDeclareInfo.iterator();
  1492. while (i$.hasNext()) {
  1493. String taxUnitInfo = (String) i$.next();
  1494. if (advanceDeclareInfo.indexOf(taxUnitInfo) == 5) {
  1495. error.append("...");
  1496. break;
  1497. }
  1498. if (advanceDeclareInfo.indexOf(taxUnitInfo) > 0) {
  1499. error.append(",");
  1500. }
  1501. String[] arr = taxUnitInfo.split("_");
  1502. error.append(arr[0]).append("【").append(arr[1]).append("】");
  1503. }
  1504. return error.toString();
  1505. }
  1506. /**
  1507. * 获取个税申报审批通过数据
  1508. *
  1509. * @param ctx
  1510. * @param selectedId
  1511. * @return
  1512. * @throws BOSException
  1513. */
  1514. private Map<String, Object> getDeclareData(Context ctx, String selectedId) throws BOSException, JsonProcessingException {
  1515. Map<String, Object> resultMap = new HashMap();
  1516. List<TaxDeclareDTO> declaredList = new ArrayList();
  1517. List<IncomeTaxDeclarInfo> waitToDeclareList = new ArrayList();
  1518. String sqlInString = CmpUtils.spiltToSqlString(selectedId);
  1519. if (StringUtils.isEmpty(sqlInString)) {
  1520. sqlInString = "''";
  1521. }
  1522. String currentYearMonth = CmpDateUtil.getDateStr(new Date(), "yyyy-MM");
  1523. String oqlBuffer = "select id,yearMonth,totalPerson,totalMoney,taxRebate,declareStatus,versionCode,yearMonthDate,tbType,taxUnit.id,taxUnit.name,taxUnit.taxNumber,taxUnit.regNumber,taxUnit.realAccount,taxUnit.areaCode,taxUnit.declPassword,taxUnit.realPassword, batchNo where id in ( " + sqlInString + " )";
  1524. LOG.error("getDeclareData----------oqlBuffer------" + oqlBuffer);
  1525. IncomeTaxDeclarCollection declareCollection = IncomeTaxDeclarFactory.getLocalInstance(ctx).getIncomeTaxDeclarCollection(oqlBuffer);
  1526. LOG.error("getDeclareData----------declareCollection------" + declareCollection.size());
  1527. String ms1 = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label137", ctx.getLocale());
  1528. String ms2 = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label138", ctx.getLocale());
  1529. String ms3 = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label139", ctx.getLocale());
  1530. List<String> taxUnitInfo = new ArrayList();
  1531. if (declareCollection != null && declareCollection.size() > 0) {
  1532. for (int i = 0; i < declareCollection.size(); ++i) {
  1533. IncomeTaxDeclarInfo declareInfo = declareCollection.get(i);
  1534. String declareStatus = declareInfo.getDeclareStatus().getValue();
  1535. LOG.error("getDeclareData----------declareStatus------" + declareStatus);
  1536. String taxUnitName = declareInfo.getTaxUnit().getName();
  1537. String tbTypeAlia = declareInfo.getTbType().getAlias();
  1538. if (currentYearMonth.compareTo(declareInfo.getYearMonth()) <= 0) {
  1539. taxUnitInfo.add(declareInfo.getTaxUnit().getName() + "_" + declareInfo.getYearMonth());
  1540. }
  1541. if (!"2".equals(declareStatus)) {
  1542. waitToDeclareList.add(declareInfo);
  1543. LOG.error("getDeclareData----------waitToDeclareList------" + waitToDeclareList);
  1544. } else {
  1545. TaxDeclareDTO dto = new TaxDeclareDTO(taxUnitName, tbTypeAlia);
  1546. declaredList.add(dto);
  1547. }
  1548. }
  1549. if (declaredList.size() == declareCollection.size()) {
  1550. resultMap.put("info", ms1);
  1551. } else if (declaredList.size() == 0) {
  1552. resultMap.put("info", ms2);
  1553. } else {
  1554. resultMap.put("info", ms3);
  1555. }
  1556. }
  1557. LOG.error("getDeclareData----------resultMap------" + resultMap);
  1558. resultMap.put("DECLARED", declaredList);
  1559. resultMap.put("advanceDeclareInfo", taxUnitInfo);
  1560. resultMap.put("WATI_TO_DECLARE", waitToDeclareList);
  1561. return resultMap;
  1562. }
  1563. }