薪酬接口

This commit is contained in:
18895359881@163.com 2022-04-16 15:33:51 +08:00
parent 23388ef017
commit 3e64b1cfde
31 changed files with 2119 additions and 116 deletions

15
.gitignore vendored
View File

@ -1,15 +0,0 @@
/weaver-hrm-salary.iml
/out/
/.idea/
HELP.md
target/
### IntelliJ IDEA ###
.idea
/src/test
/src/META-INF
/log

View File

@ -0,0 +1,33 @@
package com.engine.salary.cmd.taxDeclaration;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.salary.biz.TaxRateBiz;
import com.engine.salary.entity.taxrate.param.TaxRateSaveParam;
import weaver.hrm.User;
import java.util.HashMap;
import java.util.Map;
public class TaxDeclarationGetFormCmd extends AbstractCommonCommand<Map<String, Object>> {
public TaxDeclarationGetFormCmd(Map<String, Object> params, User user) {
this.user = user;
this.params = params;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
Map<String, Object> apidatas = new HashMap<String, Object>(16);
TaxRateBiz taxRateBiz = new TaxRateBiz();
TaxRateSaveParam taxRateSaveParam = (TaxRateSaveParam) params.get("taxRateSaveParam");
taxRateBiz.save(taxRateSaveParam, (long) user.getUID());
return apidatas;
}
}

View File

@ -0,0 +1,33 @@
package com.engine.salary.cmd.taxDeclaration;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.salary.biz.TaxRateBiz;
import com.engine.salary.entity.taxrate.param.TaxRateSaveParam;
import weaver.hrm.User;
import java.util.HashMap;
import java.util.Map;
public class TaxDeclarationGetTaxDeclarationInfoCmd extends AbstractCommonCommand<Map<String, Object>> {
public TaxDeclarationGetTaxDeclarationInfoCmd(Map<String, Object> params, User user) {
this.user = user;
this.params = params;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
Map<String, Object> apidatas = new HashMap<String, Object>(16);
TaxRateBiz taxRateBiz = new TaxRateBiz();
TaxRateSaveParam taxRateSaveParam = (TaxRateSaveParam) params.get("taxRateSaveParam");
taxRateBiz.save(taxRateSaveParam, (long) user.getUID());
return apidatas;
}
}

View File

@ -1,19 +1,22 @@
package com.engine.salary.cmd.taxDeclaration;
import com.cloudstore.eccom.constant.WeaBoolAttr;
import com.cloudstore.eccom.pc.table.WeaTable;
import com.cloudstore.eccom.pc.table.WeaTableColumn;
import com.cloudstore.eccom.result.WeaResultMsg;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.salary.component.SalaryWeaTable;
import com.engine.salary.entity.salaryarchive.po.TaxAgentPO;
import com.engine.salary.entity.taxdeclaration.TaxDeclaration;
import com.engine.salary.entity.taxrate.vo.TaxAgentTableVO;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.db.DBType;
import com.fapiao.neon.model.in.Page;
import org.apache.commons.lang3.StringUtils;
import weaver.general.PageIdConst;
import weaver.general.Util;
import weaver.conn.RecordSet;
import weaver.hrm.User;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
public class TaxDeclarationListCmd extends AbstractCommonCommand<Map<String, Object>> {
@ -31,51 +34,68 @@ public class TaxDeclarationListCmd extends AbstractCommonCommand<Map<String, Obj
public Map<String, Object> execute(CommandContext commandContext) {
Map<String, Object> apidatas = new HashMap<String, Object>(16);
//查询个税申报表
SalaryWeaTable<TaxDeclaration> table = new SalaryWeaTable<TaxDeclaration>(user, TaxDeclaration.class);
//sql条件
String sqlWhere = makeSqlWhere(params,user);
table.setSqlwhere(sqlWhere);
WeaResultMsg result = new WeaResultMsg(false);
String pageID = "a4f85287-e3f9-4275-9527-7d06e54y6rj8";
String pageUid = pageID + "_" + user.getUID();
String pageSize = PageIdConst.getPageSize(pageID, user.getUID());
String fileds = " create_time,creator,delete_type, description, id, name, system_type, tenant_key, update_time";
String sql = " from hrsa_sys_tax_rate_base s " +
" where s.delete_type = 0";
//模糊查询
String name = Util.null2String(params.get("name"));
if (StringUtils.isNotBlank(name)) {
sql += " and s.name like '%" + name + "%' ";
}
sql += " union all " +
" select create_time,creator,delete_type, description, id, name, system_type, tenant_key, update_time " +
" from hrsa_tax_rate_base b " +
" where b.delete_type = 0 ";
//模糊查询
if (StringUtils.isNotBlank(name)) {
sql += " and b.name like '%" + name + "%' ";
}
WeaTable table = new WeaTable();
table.setPageUID(pageUid);
table.setPageID(pageID);
table.setPagesize(pageSize);
table.setBackfields(fileds);
table.setSqlform(sql);
// table.setSqlwhere();
table.setSqlorderby("id desc");
table.setSqlprimarykey("id");
table.setSqlisdistinct("false");
table.getColumns().add(new WeaTableColumn("id").setDisplay(WeaBoolAttr.FALSE));
table.getColumns().add(new WeaTableColumn("20%", "名称", "name", ""));
table.getColumns().add(new WeaTableColumn("20%", "名称", "systemType", ""));
table.getColumns().add(new WeaTableColumn("20%", "名称", "createTime", ""));
table.getColumns().add(new WeaTableColumn("20%", "名称", "description", ""));
result.putAll(table.makeDataResult());
result.success();
apidatas = result.getResultMap();
return apidatas;
//人员list
List<Object> list = table.makeDataResult().values().stream().collect(Collectors.toList());
//SalaryWeaTable<SimpleEmployee> simpleEmployees = new SalaryWeaTable<SimpleEmployee>(user, SimpleEmployee.class);
//查询个税扣缴义务人
SalaryWeaTable<TaxAgentTableVO> taxAgentPOS = new SalaryWeaTable<TaxAgentTableVO>(user, TaxAgentTableVO.class);
List employeeIds = new ArrayList();
if(!table.makeDataResult().isEmpty()){
//查询人员
//查询个税扣缴义务人
}
return result.getResultMap();
}
/**
* sql条件
*
* @param params
* @return
*/
private String makeSqlWhere(Map<String, Object> params,User user) {
DBType dbType = DBType.get(new RecordSet().getDBType());
//租户key
String userId = user.getLoginid();
String sqlWhere = "where delete_Type = 0 and tenantKey = userId";
//区间查询
String FromSalaryMonth = (String) params.get("FromSalaryMonth");
String EndSalaryMonth = (String) params.get("EndSalaryMonth");
if (SalaryEntityUtil.isNotNullOrEmpty(FromSalaryMonth)&&SalaryEntityUtil.isNotNullOrEmpty(EndSalaryMonth)) {
sqlWhere += "AND salary_month between to_date(FromSalaryMonth,'yyyy-mm') and to_date(EndSalaryMonth,'yyyy-mm')";
}
return sqlWhere;
}
/**
* sql条件
*
* @param params
* @return
*/
private String makeSqlWhereAgent(Map<String, Object> params) {
DBType dbType = DBType.get(new RecordSet().getDBType());
String sqlWhere = "where delete_Type = 0";
//模糊查询
String name = (String) params.get("name");
if (StringUtils.isNotBlank(name)) {
sqlWhere += " AND name " + dbType.like(name);
}
return sqlWhere;
}
}

View File

@ -56,4 +56,9 @@ public class TaxDeclaration {
*/
private Date updateTime;
/**
* 应税项目1:正常工资薪金所得
*/
private Integer incomeCategory;
}

View File

@ -0,0 +1,372 @@
package com.engine.salary.entity.taxdeclaration.bo;
import com.engine.salary.entity.datacollection.AddUpSituation;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationListDTO;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
import com.engine.salary.entity.taxrate.TaxAgent;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import dm.jdbc.util.IdGenerator;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* @description: 个税申报表
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 10:01 AM
* @version:v1.0
*/
public class TaxDeclarationBO {
public static List<TaxDeclarationListDTO> convert2ListDTO(List<TaxDeclarationPO> taxDeclarations,
List<DataCollectionEmployee> simpleEmployees,
List<TaxAgent> taxAgents) {
if (CollectionUtils.isEmpty(simpleEmployees)) {
return Collections.emptyList();
}
Map<Long, String> taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgent::getId, TaxAgent::getName);
Map<Long, String> employeeNameMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername);
return taxDeclarations.stream().map(e -> TaxDeclarationListDTO.builder()
.id(e.getId())
.salaryMonth(e.getSalaryMonth().toString())
.taxAgentId(e.getTaxAgentId())
.taxAgentName(taxAgentNameMap.getOrDefault(e.getTaxAgentId(), ""))
.taxCycle(e.getTaxCycle().toString())
.operateEmployeeId(e.getCreator())
.operateEmployeeName(employeeNameMap.getOrDefault(e.getCreator(), ""))
.operateTime(SalaryDateUtil.getFormatLocalDateTime(e.getCreateTime()))
.description(e.getDescription())
.build()).collect(Collectors.toList());
}
/*public static void buildDetailListDTO(Long taxDeclarationId,
Page<TaxDeclarationDetailListDTO> page,
List<TaxDeclarationDetailPO> taxDeclarationDetails,
List<SimpleEmployee> simpleEmployees) {
if (CollectionUtils.isEmpty(taxDeclarationDetails)) {
return;
}
int index = (int) ((page.getCurrent() - 1) * page.getSize());
List<TaxDeclarationDetailListDTO> dtos = Lists.newArrayListWithExpectedSize(simpleEmployees.size());
Map<Long, List<TaxDeclarationDetailPO>> taxDeclarationDetailMap = SalaryEntityUtil.group2Map(taxDeclarationDetails, TaxDeclarationDetailPO::getEmployeeId);
for (SimpleEmployee simpleEmployee : simpleEmployees) {
Map<String, String> valueMap = SalaryEntityUtil.convert2Map(taxDeclarationDetailMap.get(simpleEmployee.getEmployeeId()), TaxDeclarationDetailPO::getFieldCode, TaxDeclarationDetailPO::getFieldValue);
TaxDeclarationDetailListDTO dto = new TaxDeclarationDetailListDTO();
dto.setId(simpleEmployee.getEmployeeId());
dto.setTaxDeclarationId(taxDeclarationId);
dto.setSeq(++index);
dto.setEmployeeId(simpleEmployee.getEmployeeId());
dto.setEmployeeName(simpleEmployee.getUsername());
dto.setIdCardType(SalaryI18nUtil.getI18nLabel(101696,"身份证"));
dto.setIdCardNo("");
dto.setTaxpayerIdNo("");
dto.setResidentType(SalaryI18nUtil.getI18nLabel(101697,"居民"));
dto.setIncomeType(SalaryI18nUtil.getI18nLabel(101698,"工资、薪金"));
dto.setIncome(valueMap.getOrDefault("income",""));
dto.setFee(valueMap.getOrDefault("fee", ""));
dto.setTaxFreeIncome(valueMap.getOrDefault("taxFreeIncome", ""));
dto.setSubtraction(valueMap.getOrDefault("subtraction", ""));
dto.setEndowmentInsurance(valueMap.getOrDefault("endowmentInsurance", ""));
dto.setMedicalInsurance(valueMap.getOrDefault("medicalInsurance",""));
dto.setUnemploymentInsurance(valueMap.getOrDefault("unemploymentInsurance",""));
dto.setHousingProvidentFund(valueMap.getOrDefault("housingProvidentFund",""));
dto.setAnnuity(valueMap.getOrDefault("annuity",""));
dto.setCommercialHealthInsurance(valueMap.getOrDefault("commercialHealthInsurance",""));
dto.setTaxDeferredEndowmentInsurance(valueMap.getOrDefault("taxDeferredEndowmentInsurance",""));
dto.setOriginalValueOfProperty(valueMap.getOrDefault("originalValueOfProperty",""));
dto.setDeductedTax(valueMap.getOrDefault("deductedTax",""));
dto.setOther(valueMap.getOrDefault("other",""));
dto.setAddUpIncome(valueMap.getOrDefault("addUpIncome",""));
dto.setAddUpSubtraction(valueMap.getOrDefault("addUpSubtraction",""));
dto.setAddUpSpecialDeduction(valueMap.getOrDefault("addUpSpecialDeduction",""));
dto.setAddUpChildEducation(valueMap.getOrDefault("addUpChildEducation",""));
dto.setAddUpContinuingEducation(valueMap.getOrDefault("addUpContinuingEducation",""));
dto.setAddUpHousingLoanInterest(valueMap.getOrDefault("addUpHousingLoanInterest",""));
dto.setAddUpHousingRent(valueMap.getOrDefault("addUpHousingRent",""));
dto.setAddUpSupportElderly(valueMap.getOrDefault("addUpSupportElderly",""));
dto.setAddUpOther(valueMap.getOrDefault("addUpOtherDeduction",""));
dto.setLessTaxProportion(valueMap.getOrDefault("lessTaxProportion",""));
dto.setAllowedDonation(valueMap.getOrDefault("addUpAllowedDonation",""));
dto.setTaxableIncome(valueMap.getOrDefault("addUpTaxableIncome",""));
dto.setTaxRate(valueMap.getOrDefault("taxRate",""));
dto.setQuickDeductionFactor(valueMap.getOrDefault("quickDeductionFactor",""));
dto.setTaxPayable(valueMap.getOrDefault("addUpTaxPayable",""));
dto.setTaxSavings(valueMap.getOrDefault("addUpTaxDeduction",""));
dto.setTaxWithheld(valueMap.getOrDefault("taxWithheld",""));
dto.setRefundedOrSupplementedTax(valueMap.getOrDefault("refundedOrSupplementedTax",""));
dtos.add(dto);
}
page.setRecords(dtos);
}*/
public static Result handle(TaxDeclarationSaveParam saveParam,
Date taxCycle,
List<SalaryItemPO> salaryItems,
List<SalarySobPO> salarySobs,
List<SalaryAcctResultPO> salaryAcctResults
) {
Result result = new Result();
if (CollectionUtils.isEmpty(salaryAcctResults)) {
return result;
}
// 薪资项目聚合成map为了根据code获取id
Map<String, Long> salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getCode, SalaryItemPO::getId);
// 薪资账套聚合成map为了根据id获取incomeCategory
Map<Long, SalarySobPO> salarySobPOMap = SalaryEntityUtil.convert2Map(salarySobs, SalarySobPO::getId);
// 薪资核算结果按照个税扣缴义务人id所用薪资账套的incomeCategory聚合成map
/* Map<Long, Map<Integer, List<SalaryAcctResultPO>>> taxAgentIdKeyAcctResultMap = salaryAcctResults.stream()
.collect(Collectors.groupingBy(SalaryAcctResultPO::getTaxAgentId,
Collectors.groupingBy(salaryAcctResultPO -> salarySobPOMap.get(salaryAcctResultPO.getSalarySobId()).getIncomeCategory())));
*/// 一个个税扣缴义务人一种薪资类型生成一张个税申报表
Map<Long, List<SalaryAcctResultPO>> taxAgentIdKeyAcctResultMap = SalaryEntityUtil.group2Map(salaryAcctResults, SalaryAcctResultPO::getTaxAgentId);
taxAgentIdKeyAcctResultMap.forEach((k, v) -> {
// 新增的个税申报表
TaxDeclarationPO taxDeclaration = convert2PO(saveParam, taxCycle, k);
result.getNeedInsertTaxDeclarations().add(taxDeclaration);
// 处理个税申报明细以及累计情况
handleTaxDeclarationDetail(result, taxDeclaration, v, salaryItemMap);
});
/*taxAgentIdKeyAcctResultMap.forEach((taxAgentId, incomeCategoryKeyAcctResultPOMap) -> {
incomeCategoryKeyAcctResultPOMap.forEach((incomeCategory, salaryAcctResultPOS) -> {
// 新增的个税申报表
TaxDeclarationPO taxDeclaration = convert2PO(saveParam, taxCycle, taxAgentId, incomeCategory, employeeId);
result.getNeedInsertTaxDeclarations().add(taxDeclaration);
if (Objects.equals(incomeCategory, IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) {
// 生成个税申报表
handleTaxDeclaration4Wage(result, taxDeclaration, salaryAcctResultPOS, salaryItemMap);
// 生成往期累计情况
handleAddUpSituation(result, taxDeclaration, salaryAcctResultPOS, salaryItemMap);
}
if (Objects.equals(incomeCategory, IncomeCategoryEnum.REMUNERATION_FOR_LABOR.getValue())) {
// 生成个税申报表
handleTaxDeclaration4Labor(result, taxDeclaration, salaryAcctResultPOS, salaryItemMap);
}
});
});*/
return result;
}
private static void handleTaxDeclarationDetail(Result result,
TaxDeclarationPO taxDeclaration,
List<SalaryAcctResultPO> salaryAcctResults,
Map<String, Long> salaryItemMap) {
if (CollectionUtils.isEmpty(salaryAcctResults)) {
return;
}
// 核算结果按照人员id分类
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(salaryAcctResults, SalaryAcctResultPO::getEmployeeId);
acctResultMap.forEach((k, v) -> {
Map<String, BigDecimal> valueMap = Maps.newHashMapWithExpectedSize(32);
Map<Long, List<SalaryAcctResultPO>> resultMap = SalaryEntityUtil.group2Map(v, SalaryAcctResultPO::getSalaryItemId);
// 收入
BigDecimal income = SalaryEntityUtil.reduce(resultMap.get(salaryItemMap.getOrDefault("income", 0L)), e -> SalaryEntityUtil.empty2Zero(e.getResultValue()));
valueMap.put("income", income);
// 费用
BigDecimal fee = BigDecimal.ZERO;
valueMap.put("fee", fee);
// 免税收入
BigDecimal taxFreeIncome = BigDecimal.ZERO;
valueMap.put("taxFreeIncome", taxFreeIncome);
// 减除费用
BigDecimal subtraction = findValue("subtraction", resultMap, salaryItemMap);
valueMap.put("subtraction", subtraction);
// 基本养老保险
BigDecimal endowmentInsurance = findValue("endowmentInsurance", resultMap, salaryItemMap);
valueMap.put("endowmentInsurance", endowmentInsurance);
// 基本医疗保险
BigDecimal medicalInsurance = findValue("medicalInsurance", resultMap, salaryItemMap);
valueMap.put("medicalInsurance", medicalInsurance);
// 失业保险
BigDecimal unemploymentInsurance = findValue("unemploymentInsurance", resultMap, salaryItemMap);
valueMap.put("unemploymentInsurance", unemploymentInsurance);
// 住房公积金
BigDecimal housingProvidentFund = findValue("housingProvidentFund", resultMap, salaryItemMap);
valueMap.put("housingProvidentFund", housingProvidentFund);
// 年金
BigDecimal annuity = findValue("annuity", resultMap, salaryItemMap);
valueMap.put("annuity", annuity);
// 商业健康保险
BigDecimal commercialHealthInsurance = findValue("commercialHealthInsurance", resultMap, salaryItemMap);
valueMap.put("commercialHealthInsurance", commercialHealthInsurance);
// 税延养老保险
BigDecimal taxDeferredEndowmentInsurance = findValue("taxDeferredEndowmentInsurance", resultMap, salaryItemMap);
valueMap.put("taxDeferredEndowmentInsurance", taxDeferredEndowmentInsurance);
// 财产原值
BigDecimal originalValueOfProperty = findValue("originalValueOfProperty", resultMap, salaryItemMap);
valueMap.put("originalValueOfProperty", originalValueOfProperty);
// 允许扣除的税费
BigDecimal deductedTax = findValue("deductedTax", resultMap, salaryItemMap);
valueMap.put("deductedTax", deductedTax);
// 其他
BigDecimal other = findValue("other", resultMap, salaryItemMap);
valueMap.put("other", other);
// 累计收入
BigDecimal addUpIncome = findAddUpValue("addUpIncome", resultMap, salaryItemMap);
valueMap.put("addUpIncome", addUpIncome);
// 累计减除费用
BigDecimal addUpSubtraction = findAddUpValue("addUpSubtraction", resultMap, salaryItemMap);
valueMap.put("addUpSubtraction", addUpSubtraction);
// 累计专项扣除
BigDecimal addUpSpecialDeduction = findAddUpValue("addUpSpecialDeduction", resultMap, salaryItemMap);
valueMap.put("addUpSpecialDeduction", addUpSpecialDeduction);
// 累计子女教育
BigDecimal addUpChildEducation = findAddUpValue("addUpChildEducation", resultMap, salaryItemMap);
valueMap.put("addUpChildEducation", addUpChildEducation);
// 累计继续教育
BigDecimal addUpContinuingEducation = findAddUpValue("addUpContinuingEducation", resultMap, salaryItemMap);
valueMap.put("addUpContinuingEducation", addUpContinuingEducation);
// 累计住房贷款利息
BigDecimal addUpHousingLoanInterest = findAddUpValue("addUpHousingLoanInterest", resultMap, salaryItemMap);
valueMap.put("addUpHousingLoanInterest", addUpHousingLoanInterest);
// 累计住房租金
BigDecimal addUpHousingRent = findAddUpValue("addUpHousingRent", resultMap, salaryItemMap);
valueMap.put("addUpHousingRent", addUpHousingRent);
// 累计赡养老人
BigDecimal addUpSupportElderly = findAddUpValue("addUpSupportElderly", resultMap, salaryItemMap);
valueMap.put("addUpSupportElderly", addUpSupportElderly);
// 累计其他扣除
BigDecimal addUpOtherDeduction = findAddUpValue("addUpOtherDeduction", resultMap, salaryItemMap);
valueMap.put("addUpOtherDeduction", addUpOtherDeduction);
// 减按计税比例
BigDecimal lessTaxProportion = BigDecimal.ONE;
valueMap.put("lessTaxProportion", lessTaxProportion);
// 准允扣除的捐赠额
BigDecimal addUpAllowedDonation = findAddUpValue("addUpAllowedDonation", resultMap, salaryItemMap);
valueMap.put("addUpAllowedDonation", addUpAllowedDonation);
// 应纳税所得额
BigDecimal addUpTaxableIncome = findAddUpValue("addUpTaxableIncome", resultMap, salaryItemMap);
valueMap.put("addUpTaxableIncome", addUpTaxableIncome);
// 税率
BigDecimal taxRate = findAddUpValue("taxRate", resultMap, salaryItemMap);
valueMap.put("taxRate", taxRate);
// 速算扣除数
BigDecimal quickDeductionFactor = findAddUpValue("quickDeductionFactor", resultMap, salaryItemMap);
valueMap.put("quickDeductionFactor", quickDeductionFactor);
// 应纳税额
BigDecimal addUpTaxPayable = findAddUpValue("addUpTaxPayable", resultMap, salaryItemMap);
valueMap.put("addUpTaxPayable", addUpTaxPayable);
// 减免税额
BigDecimal addUpTaxDeduction = BigDecimal.ZERO;
valueMap.put("addUpTaxDeduction", addUpTaxDeduction);
// 应补缴税额
BigDecimal refundedOrSupplementedTax = SalaryEntityUtil.reduce(resultMap.get(salaryItemMap.getOrDefault("refundedOrSupplementedTax", 0L)),
e -> SalaryEntityUtil.empty2Zero(e.getResultValue()));
valueMap.put("refundedOrSupplementedTax", refundedOrSupplementedTax);
// 已扣缴税额
BigDecimal taxWithheld = addUpTaxPayable.subtract(refundedOrSupplementedTax);
valueMap.put("taxWithheld", taxWithheld);
valueMap.forEach((key, value) -> {
TaxDeclarationDetailPO detailPO = TaxDeclarationDetailPO.builder()
.id(IdGenerator.generate())
.taxDeclarationId(taxDeclaration.getId())
.employeeId(k)
.fieldCode(key)
.fieldValue(value.toPlainString())
.creator(taxDeclaration.getCreator())
.createTime(SalaryDateUtil.dateToLocalDateTime(taxDeclaration.getCreateTime()))
.updateTime(SalaryDateUtil.dateToLocalDateTime(taxDeclaration.getUpdateTime()))
.deleteType(0)
.tenantKey(taxDeclaration.getTenantKey())
.build();
result.getNeedInsertTaxDeclarationDetails().add(detailPO);
});
// 累计社保个人合计
BigDecimal addUpSocialSecurityTotal = findAddUpValue("addUpSocialSecurityTotal", resultMap, salaryItemMap);
// 累计公积金个人合计
BigDecimal addUpAccumulationFundTotal = findAddUpValue("addUpAccumulationFundTotal", resultMap, salaryItemMap);
// 累计年金及其他福利合计
BigDecimal addUpEnterpriseAndOther = findAddUpValue("addUpEnterpriseAndOther", resultMap, salaryItemMap);
// 更新累计情况
AddUpSituation accumulatedSituation = AddUpSituation.builder()
.id(IdGenerator.generate())
.employeeId(k)
.taxAgentId(taxDeclaration.getTaxAgentId())
.taxYearMonth((taxDeclaration.getSalaryMonth()))
.year(taxDeclaration.getSalaryMonth().getYear())
.addUpIncome(addUpIncome.toPlainString())
.addUpSocialSecurityTotal(addUpSocialSecurityTotal.toPlainString())
.addUpAccumulationFundTotal(addUpAccumulationFundTotal.toPlainString())
.addUpEnterpriseAndOther(addUpEnterpriseAndOther.toPlainString())
.addUpSubtraction(addUpSubtraction.toPlainString())
.addUpChildEducation(addUpChildEducation.toPlainString())
.addUpContinuingEducation(addUpContinuingEducation.toPlainString())
.addUpHousingLoanInterest(addUpHousingLoanInterest.toPlainString())
.addUpHousingRent(addUpHousingRent.toPlainString())
.addUpSupportElderly(addUpSupportElderly.toPlainString())
.addUpOtherDeduction(addUpOtherDeduction.toPlainString())
.addUpTaxExemptIncome("0")
.addUpAllowedDonation(addUpAllowedDonation.toPlainString())
.addUpAdvanceTax(addUpTaxPayable.toPlainString())
.creator(taxDeclaration.getCreator())
.createTime(taxDeclaration.getCreateTime())
.updateTime(taxDeclaration.getUpdateTime())
.tenantKey(taxDeclaration.getTenantKey())
.deleteType(0)
.build();
result.getNeedInsertAccumulatedSituations().add(accumulatedSituation);
});
}
private static TaxDeclarationPO convert2PO(TaxDeclarationSaveParam saveParam, Date taxCycle, Long taxAgentId) {
LocalDateTime now = LocalDateTime.now();
return TaxDeclarationPO.builder()
.id(IdGenerator.generate())
.taxAgentId(taxAgentId)
.salaryMonth(SalaryDateUtil.localDateToDate(saveParam.getSalaryMonth().atDay(1)))
.taxCycle(taxCycle)
.description(saveParam.getDescription())
// .creator(employeeId)
.createTime(SalaryDateUtil.localDateTimeToDate(now))
.updateTime(SalaryDateUtil.localDateTimeToDate(now))
.deleteType(0)
//.tenantKey(tenantKey)
.build();
}
private static BigDecimal findValue(String fieldCode, Map<Long, List<SalaryAcctResultPO>> resultMap, Map<String, Long> salaryItemMap) {
return resultMap.getOrDefault(salaryItemMap.getOrDefault(fieldCode, 0L), Collections.emptyList()).stream()
.map(e -> SalaryEntityUtil.empty2Zero(e.getResultValue()))
.filter(e -> e.compareTo(BigDecimal.ZERO) > 0)
.findAny()
.orElse(BigDecimal.ZERO);
}
private static BigDecimal findAddUpValue(String fieldCode, Map<Long, List<SalaryAcctResultPO>> resultMap, Map<String, Long> salaryItemMap) {
return resultMap.getOrDefault(salaryItemMap.getOrDefault(fieldCode, 0L), Collections.emptyList()).stream()
.map(e -> SalaryEntityUtil.empty2Zero(e.getResultValue()))
.max(Comparator.comparingDouble(BigDecimal::doubleValue))
.orElse(BigDecimal.ZERO);
}
@Data
public static class Result {
private Collection<TaxDeclarationPO> needInsertTaxDeclarations;
private Collection<TaxDeclarationDetailPO> needInsertTaxDeclarationDetails;
private Collection<AddUpSituation> needInsertAccumulatedSituations;
public Result() {
this.needInsertTaxDeclarations = Lists.newArrayList();
this.needInsertTaxDeclarationDetails = Lists.newArrayList();
this.needInsertAccumulatedSituations = Lists.newArrayList();
}
}
}

View File

@ -0,0 +1,235 @@
package com.engine.salary.entity.taxdeclaration.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: 个税申报表详情列表
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 10:31 AM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationDetailListDTO {
/**
* 主键id
*/
private Long id;
/**
* 个税申报记录id
*/
private Long taxDeclarationId;
/**
* 序号
*/
private Integer seq;
/**
* 人员id
*/
private Long employeeId;
/**
* 姓名
*/
private String employeeName;
/**
* 身份证件类型
*/
private String idCardType;
/**
* 身份证件号码
*/
private String idCardNo;
/**
* 纳税人识别号
*/
private String taxpayerIdNo;
/**
* 是居民还是非居民
*/
private String residentType;
/**
* 所得项目
*/
private String incomeType;
/**
* 收入
*/
private String income;
/**
* 费用
*/
private String fee;
/**
* 免税收入
*/
private String taxFreeIncome;
/**
* 减除费用
*/
private String subtraction;
/**
* 养老保险
*/
private String endowmentInsurance;
/**
* 医疗保险
*/
private String medicalInsurance;
/**
* 失业保险
*/
private String unemploymentInsurance;
/**
* 住房公积金
*/
private String housingProvidentFund;
/**
* 年金
*/
private String annuity;
/**
* 商业健康保险
*/
private String commercialHealthInsurance;
/**
* 税延养老保险
*/
private String taxDeferredEndowmentInsurance;
/**
* 财产原值
*/
private String originalValueOfProperty;
/**
* 允许扣除的税费
*/
private String deductedTax;
/**
* 其他
*/
private String other;
/**
* 累计收入额
*/
private String addUpIncome;
/**
* 累计减除费用
*/
private String addUpSubtraction;
/**
* 累计专项扣除
*/
private String addUpSpecialDeduction;
/**
* 累计子女教育
*/
private String addUpChildEducation;
/**
* 累计继续教育
*/
private String addUpContinuingEducation;
/**
* 累计住房贷款利息
*/
private String addUpHousingLoanInterest;
/**
* 累计住房租金
*/
private String addUpHousingRent;
/**
* 累计赡养老人
*/
private String addUpSupportElderly;
/**
* 累计其他扣除
*/
private String addUpOther;
/**
* 减按计税比例
*/
private String lessTaxProportion;
/**
* 准允扣除的捐赠额
*/
private String allowedDonation;
/**
* 应纳税所得额
*/
private String taxableIncome;
/**
* 税率
*/
private String taxRate;
/**
* 速算扣除数
*/
private String quickDeductionFactor;
/**
* 应纳税款
*/
private String taxPayable;
/**
* 减免税额
*/
private String taxSavings;
/**
* 已扣缴税额
*/
private String taxWithheld;
/**
* 应补退税额
*/
private String refundedOrSupplementedTax;
/**
* 备注
*/
private String description;
}

View File

@ -0,0 +1,33 @@
package com.engine.salary.entity.taxdeclaration.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.YearMonth;
/**
* @description: 个税申报记录表单
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 9:40 AM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationFormDTO {
//薪资所属月")
private YearMonth salaryMonth;
//个税扣缴义务人id")
private Long taxAgentId;
//个税扣缴义务人名称")
private String taxAgentName;
//备注")
private String description;
}

View File

@ -0,0 +1,31 @@
package com.engine.salary.entity.taxdeclaration.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.YearMonth;
/**
* @description: 个税申报表信息
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/16/21 3:22 PM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationInfoDTO {
//薪资所属月")
private YearMonth salaryMonth;
//个税扣缴义务人id")
private Long taxAgentId;
//个税扣缴义务人名称")
private String taxAgentName;
}

View File

@ -0,0 +1,61 @@
package com.engine.salary.entity.taxdeclaration.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @description: 个税申报表详情列表劳务报酬所得
* @author: xiajun
* @modified By: xiajun
* @date: 2022/3/11 10:05
* @version:v1.0
*/
@Data
@Accessors(chain = true)
public class TaxDeclarationLaborListDTO {
//主键id")
private Long id;
//人员id")
private Long employeeId;
//工号")
private String jobNum;
//姓名")
private String username;
//证件类型")
private String cardType;
//证件号码")
private String cardNum;
//"所得项目")
private String incomeItems;
//"劳务收入")
private String laborIncome;
//"劳务免税收入")
private String laborTaxFreeIncome;
//"商业健康保险")
private String commercialHealthInsurance;
//"税延养老保险")
private String taxDeferredEndowmentInsurance;
//"其他")
private String other;
//"准允扣除的捐赠额")
private String allowedDonation;
//"减免税额")
private String taxDeduction;
//备注")
private String description;
}

View File

@ -0,0 +1,52 @@
package com.engine.salary.entity.taxdeclaration.dto;
import com.engine.salary.annotation.TableTitle;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: 个税申报记录列表
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 9:31 AM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationListDTO {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@TableTitle(title = "薪资所属月份", dataIndex = "salaryMonth", key = "salaryMonth")
private String salaryMonth;
@TableTitle(title = "个税扣缴义务人", dataIndex = "taxAgentId", key = "taxAgentId")
private Long taxAgentId;
@TableTitle(title = "个税扣缴义务人名称", dataIndex = "taxAgentName", key = "taxAgentName")
private String taxAgentName;
@TableTitle(title = "税款所属期", dataIndex = "taxCycle", key = "taxCycle")
private String taxCycle;
@TableTitle(title = "操作人id", dataIndex = "operateEmployeeId", key = "operateEmployeeId")
private Long operateEmployeeId;
@TableTitle(title = "操作人名称", dataIndex = "operateEmployeeName", key = "operateEmployeeName")
private String operateEmployeeName;
@JsonFormat(pattern = "yyyy-MM-dd")
@TableTitle(title = "操作时间", dataIndex = "operateTime", key = "operateTime")
private String operateTime;
@TableTitle(title = "备注", dataIndex = "description", key = "description")
private String description;
}

View File

@ -0,0 +1,91 @@
package com.engine.salary.entity.taxdeclaration.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @description: 个税申报表详情列表正常工资薪金所得
* @author: xiajun
* @modified By: xiajun
* @date: 2022/3/11 9:35
* @version:v1.0
*/
@Data
@Accessors(chain = true)
public class TaxDeclarationWageListDTO {
//主键id")
private Long id;
//人员id")
private Long employeeId;
//"工号")
private String jobNum;
//"姓名")
private String username;
//证件类型")
private String cardType;
//证件号码")
private String cardNum;
//本期收入")
private String income;
//本期免税收入")
private String taxFreeIncome;
//"基本养老保险费")
private String endowmentInsurance;
//"基本医疗保险费")
private String medicalInsurance;
//失业保险费")
private String unemploymentInsurance;
//住房公积金")
private String housingProvidentFund;
//"累计子女教育")
private String addUpChildEducation;
//累计住房贷款利息")
private String addUpHousingLoanInterest;
//"累计住房租金")
private String addUpHousingRent;
//累计继续教育")
private String addUpContinuingEducation;
//"累计赡养老人")
private String addUpSupportElderly;
//"累计大病医疗")
private String addUpIllnessMedical;
//"企业(职业)年金")
private String annuity;
//商业健康保险")
private String commercialHealthInsurance;
//"税延养老保险")
private String taxDeferredEndowmentInsurance;
//"其他")
private String other;
//"准允扣除的捐赠额")
private String allowedDonation;
//"减免税额")
private String taxDeduction;
//"备注")
private String description;
}

View File

@ -0,0 +1,26 @@
package com.engine.salary.entity.taxdeclaration.param;
import com.engine.salary.common.BaseQueryParam;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @description: 个税申报记录详情列表查询参数
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 3:21 PM
* @version:v1.0
*/
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationDetailListQueryParam extends BaseQueryParam {
//"个税申报记录id")
private Long taxDeclarationId;
}

View File

@ -0,0 +1,33 @@
package com.engine.salary.entity.taxdeclaration.param;
import com.engine.salary.common.BaseQueryParam;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.YearMonth;
/**
* @description: 个税申报记录查询条件
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 9:30 AM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationListQueryParam extends BaseQueryParam {
//薪资所属月范围起点
private YearMonth fromSalaryMonth;
//薪资所属月范围终点
private YearMonth endSalaryMonth;
private String fromSalaryMonthStr;
private String endSalaryMonthStr;
}

View File

@ -0,0 +1,31 @@
package com.engine.salary.entity.taxdeclaration.param;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.YearMonth;
/**
* @description: 生成个税申报表参数
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 9:44 AM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationSaveParam {
//薪资所属月")
private YearMonth salaryMonth;
//备注")
private String description;
private String salaryMonthStr;
}

View File

@ -0,0 +1,78 @@
package com.engine.salary.entity.taxdeclaration.po;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* @description: 个税申报表详情
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/14/21 7:01 PM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationDetailPO {
/**
* 主键id
*/
private Long id;
/**
* 个税申报记录id
*/
private Long taxDeclarationId;
/**
* 人员id
*/
private Long employeeId;
/**
* 申报表字段code
*/
private String fieldCode;
/**
* 申报表字段的值
*/
private String fieldValue;
/**
* 租户key
*/
private String tenantKey;
/**
* 创建人id
*/
private Long creator;
/**
* 是否删除
*/
private Integer deleteType;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 应税项目1:正常工资薪金所得
*/
private Integer incomeCategory;
}

View File

@ -0,0 +1,76 @@
package com.engine.salary.entity.taxdeclaration.po;
import com.engine.salary.common.LocalDateRange;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @description: 个税申报记录
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/14/21 6:57 PM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationPO {
/**
* 主键id
*/
private Long id;
/**
* 薪资所属月
*/
private Date salaryMonth;
/**
* 税款所属期
*/
private Date taxCycle;
/**
* 个税扣缴义务人id
*/
private Long taxAgentId;
/**
* 备注
*/
private String description;
/**
* 租户key
*/
private String tenantKey;
/**
* 创建人id
*/
private Long creator;
/**
* 是否删除
*/
private Integer deleteType;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
//税款所属期
LocalDateRange salaryMonths;
}

View File

@ -0,0 +1,78 @@
package com.engine.salary.entity.taxrate.vo;
import com.engine.salary.annotation.SalaryTable;
import com.engine.salary.annotation.SalaryTableColumn;
import com.engine.salary.annotation.SalaryTableOperate;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: 个税申报记录列表
* @author: xiajun
* @modified By: xiajun
* @date: Created in 12/15/21 9:31 AM
* @version:v1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@SalaryTable(pageId = "a4f85287-e3f9-4275-9527-7d06e54y6rj8",
fields = "id, salary_month, tax_cycle, tax_agent_id, description,creator, create_time, update_time, delete_type, tenant_key",
fromSql = "from hrsa_tax_declaration",
orderby = "id desc",
primarykey = "id",
operates = {@SalaryTableOperate(text = "查看")}
)
public class TaxDeclarationListVO {
private Long id;
@SalaryTableColumn(
text = "薪资所属月",
column = "salaryMonth",
width = "10%"
)
private String salaryMonth;
private Long taxAgentId;
/* @SalaryTableColumn(
text = "个税扣缴义务人",
column = "taxAgentName",
width = "20%"
)
private String taxAgentName;*/
@SalaryTableColumn(
text = "税款所属期",
column = "taxCycle",
width = "10%"
)
private String taxCycle;
private Long operateEmployeeId;
/* @SalaryTableColumn(
text = "操作人",
column = "operateEmployeeName",
width = "10%"
)
private String operateEmployeeName;
*/
/* @SalaryTableColumn(
text = "操作时间",
column = "operateTime",
width = "20%"
)
private String operateTime;*/
@SalaryTableColumn(
text = "备注",
column = "description",
width = "30%"
)
private String description;
}

View File

@ -15,6 +15,8 @@ public enum IncomeCategoryEnum implements BaseEnum<Integer> {
WAGES_AND_SALARIES(1, "正常工资薪金所得", 98656),
REMUNERATION_FOR_LABOR(4, "劳务报酬所得", 105218),
// 暂时注释掉后续会开放
// ONETIME_ANNUAL_BONUS(2,"全年一次性奖金收入", 0),
//

View File

@ -1,8 +1,11 @@
package com.engine.salary.mapper.taxdeclaration;
import com.engine.salary.entity.taxdeclaration.TaxDeclarationDetail;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
@Mapper
@ -63,5 +66,11 @@ public interface TaxDeclarationDetailMapper {
* @return 返回影响行数
*/
int delete(TaxDeclarationDetail taxDeclarationDetail);
/**
* 批量插入
*
* @param taxDeclarationDetails
*/
void batchInsert(@Param("collection") Collection<TaxDeclarationDetailPO> taxDeclarationDetails);
}

View File

@ -148,6 +148,26 @@
</if>
</trim>
</insert>
<insert id="batchInsert">
INSERT INTO hrsa_tax_declaration_detail
(id, tax_declaration_id, employee_id, field_code, field_value, creator,
create_time, update_time, delete_type, tenant_key)
VALUES
<foreach collection="collection" item="item" separator=",">
(
#{item.id},
#{item.taxDeclarationId},
#{item.employeeId},
#{item.fieldCode},
#{item.fieldValue},
#{item.creator},
#{item.createTime},
#{item.updateTime},
#{item.deleteType},
#{item.tenantKey}
)
</foreach>
</insert>
<!-- 更新,更新全部字段 -->
<update id="update" parameterType="com.engine.salary.entity.taxdeclaration.TaxDeclarationDetail">

View File

@ -1,8 +1,11 @@
package com.engine.salary.mapper.taxdeclaration;
import com.engine.salary.entity.taxdeclaration.TaxDeclaration;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
@Mapper
@ -63,5 +66,19 @@ public interface TaxDeclarationMapper {
* @return 返回影响行数
*/
int delete(TaxDeclaration taxDeclaration);
/**
* 条件查询
*
* @return 返回集合没有返回空List
*/
List<TaxDeclarationPO> listSome(TaxDeclarationPO taxDeclarationPO);
/**
* 批量插入
*
* @param taxDeclarationDetails
*/
void batchInsert(@Param("collection") Collection<TaxDeclarationPO> taxDeclarationDetails);
}

View File

@ -16,9 +16,7 @@
<!-- 表字段 -->
<sql id="baseColumns">
t
.
create_time
t.create_time
, t.creator
, t.delete_type
, t.description
@ -45,6 +43,41 @@
FROM hrsa_tax_declaration t
WHERE id = #{id} AND delete_type = 0
</select>
<!-- 条件查询 -->
<select id="listSome" resultType="com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO">
SELECT
<include refid="baseColumns"/>
FROM hrsa_tax_declaration t
WHERE delete_type = 0
<if test="salaryMonths != null and salaryMonths.fromSalaryMonth != null">
AND salary_month <![CDATA[ >= ]]> #{salaryMonths.fromSalaryMonth}
</if>
<if test="salaryMonths != null and salaryMonths.endSalaryMonth != null">
AND salary_month <![CDATA[ <= ]]> #{salaryMonths.endSalaryMonth}
</if>
ORDER BY id DESC
</select>
<insert id="batchInsert">
INSERT INTO hrsa_tax_declaration
(create_time, creator, delete_type, description, id, salary_month,
tax_agent_id, tax_cycle, tenant_key, update_time)
VALUES
<foreach collection="collection" item="item" separator=",">
(
#{item.create_time},
#{item.creator},
#{item.delete_type},
#{item.description},
#{item.id},
#{item.salary_month},
#{item.tax_agent_id},
#{item.tax_cycle},
#{item.tenant_key},
#{item.update_time}
)
</foreach>
</insert>
<!-- 插入全部字段 -->
<insert id="insert" parameterType="com.engine.salary.entity.taxdeclaration.TaxDeclaration"

View File

@ -0,0 +1,73 @@
package com.engine.salary.service;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationLaborListDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationWageListDTO;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
import com.engine.salary.util.page.PageInfo;
import com.fapiao.neon.model.in.Page;
import java.util.Collection;
/**
* @description: 个税申报表明细
* @author: xiajun
* @modified By: xiajun
* @date: Created in 1/23/22 4:28 PM
* @version:v1.0
*/
public interface TaxDeclarationDetailService {
/**
* 根据个税申报表id人员id查询个税申报表明细
*
* @param taxDeclarationId 个税申报表id
* @param employeeIds 人员id
* @param tenantKey 租户key
* @return
*/
//List<TaxDeclarationDetailPO> listByTaxDeclarationIdAndEmployeeIds(Long taxDeclarationId, Collection<Long> employeeIds, String tenantKey);
/**
* 根据列表查询条件查询个税申报列表明细中的人员
*
* @param queryParam 列表查询条件
* @param tenantKey 租户key
* @return
*/
//Page<Long> listPage4EmployeeIdByParam(TaxDeclarationDetailListQueryParam queryParam, String tenantKey);
/**
* 根据列表查询条件查询个税申报列表明细
*
* @param queryParam 列表查询条件
* @param tenantKey 租户key
* @return
*/
// Page<TaxDeclarationDetailListDTO> listDtoPageByParam(TaxDeclarationDetailListQueryParam queryParam, String tenantKey);
/**
* 根据列表查询条件查询个税申报列表明细劳务报酬所得
*
* @param queryParam 列表查询条件
* @param tenantKey 租户key
* @return
*/
PageInfo<TaxDeclarationLaborListDTO> listDtoPageByParam4Labor(TaxDeclarationDetailListQueryParam queryParam);
/**
* 根据列表查询条件查询个税申报列表明细正常工资薪金所得
*
* @param queryParam 列表查询条件
* @param tenantKey 租户key
* @return
*/
PageInfo<TaxDeclarationWageListDTO> listDtoPageByParam4Wage(TaxDeclarationDetailListQueryParam queryParam);
/**
* 批量保存
*
* @param taxDeclarationDetailPOS 个税申报表明细po
*/
void batchSave(Collection<TaxDeclarationDetailPO> taxDeclarationDetailPOS);
}

View File

@ -1,5 +1,14 @@
package com.engine.salary.service;
import com.engine.salary.entity.taxdeclaration.TaxDeclaration;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
import com.engine.salary.entity.taxrate.TaxAgent;
import com.engine.salary.util.page.PageInfo;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public interface TaxDeclarationService {
@ -9,7 +18,18 @@ public interface TaxDeclarationService {
*/
Map<String, Object> listPage(Map<String, Object> params);
Map<String, Object> save(Map<String, Object> params);
PageInfo<TaxDeclarationPO> listPageByParam(TaxDeclarationListQueryParam queryParam);
List<TaxAgent> countByTaxDeclarationId(Collection<Long> taxAgentIds);
//表单
TaxDeclaration getById(Long id);
Map<String, Object> getForm(Map<String, Object> params);
Map<String, Object> getTaxDeclarationInfo(Map<String, Object> params);
void save(TaxDeclarationSaveParam saveParam);
Map<String, Object> update(Map<String, Object> params);

View File

@ -0,0 +1,81 @@
package com.engine.salary.service.impl;
import com.engine.core.impl.Service;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationLaborListDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationWageListDTO;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
import com.engine.salary.mapper.taxdeclaration.TaxDeclarationDetailMapper;
import com.engine.salary.service.TaxDeclarationDetailService;
import com.engine.salary.util.page.PageInfo;
import javax.annotation.Resource;
import java.util.Collection;
/**
* @description: 个税申报表明细
* @author: xiajun
* @modified By: xiajun
* @date: Created in 1/23/22 4:29 PM
* @version:v1.0
*/
public class TaxDeclarationDetailServiceImpl extends Service implements TaxDeclarationDetailService {
@Resource
private TaxDeclarationDetailMapper taxDeclarationDetailMapper;
//@Resource
//private HrmCommonEmployeeService hrmCommonEmployeeService;
/*@Override
public List<TaxDeclarationDetailPO> listByTaxDeclarationIdAndEmployeeIds(Long taxDeclarationId, Collection<Long> employeeIds, String tenantKey) {
if (CollectionUtils.isEmpty(employeeIds)) {
return Collections.emptyList();
}
return new LambdaQueryChainWrapper<>(taxDeclarationDetailMapper)
.eq(TaxDeclarationDetailPO::getTenantKey, tenantKey)
.eq(TaxDeclarationDetailPO::getDeleteType, 0)
.eq(TaxDeclarationDetailPO::getTaxDeclarationId, taxDeclarationId)
.in(TaxDeclarationDetailPO::getEmployeeId, employeeIds)
.list();
}
@Override
public Page<Long> listPage4EmployeeIdByParam(TaxDeclarationDetailListQueryParam queryParam, String tenantKey) {
// 分页参数
Page<Long> page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize());
// 查询个税申报表明细中的人员分页
return taxDeclarationDetailMapper.listEmployeeId(page, queryParam.getTaxDeclarationId(), tenantKey);
}
@Override
public Page<TaxDeclarationDetailListDTO> listDtoPageByParam(TaxDeclarationDetailListQueryParam queryParam, String tenantKey) {
// 查询个税申报表明细的人员
Page<Long> employeeIdPage = listPage4EmployeeIdByParam(queryParam, tenantKey);
Page<TaxDeclarationDetailListDTO> dtoPage = new Page<>(employeeIdPage.getCurrent(), employeeIdPage.getSize(), employeeIdPage.getTotal(), employeeIdPage.isSearchCount());
if (CollectionUtils.isNotEmpty(employeeIdPage.getRecords())) {
// 查询个税申报表明细
List<TaxDeclarationDetailPO> taxDeclarationDetailPOS = listByTaxDeclarationIdAndEmployeeIds(queryParam.getTaxDeclarationId(),
employeeIdPage.getRecords(), tenantKey);
// 查询人员信息
List<SimpleEmployee> simpleEmployees = hrmCommonEmployeeService.getEmployeeByIds(employeeIdPage.getRecords(), tenantKey);
// 转换成列表dto
TaxDeclarationBO.buildDetailListDTO(queryParam.getTaxDeclarationId(), dtoPage, taxDeclarationDetailPOS, simpleEmployees);
}
return dtoPage;
}*/
@Override
public PageInfo<TaxDeclarationLaborListDTO> listDtoPageByParam4Labor(TaxDeclarationDetailListQueryParam queryParam) {
return null;
}
@Override
public PageInfo<TaxDeclarationWageListDTO> listDtoPageByParam4Wage(TaxDeclarationDetailListQueryParam queryParam) {
return null;
}
@Override
public void batchSave(Collection<TaxDeclarationDetailPO> taxDeclarationDetailPOS) {
taxDeclarationDetailMapper.batchInsert(taxDeclarationDetailPOS);
}
}

View File

@ -1,24 +1,98 @@
package com.engine.salary.service.impl;
import com.engine.core.impl.Service;
import com.engine.salary.cmd.taxDeclaration.TaxDeclarationDeleteCmd;
import com.engine.salary.cmd.taxDeclaration.TaxDeclarationListCmd;
import com.engine.salary.cmd.taxDeclaration.TaxDeclarationSaveCmd;
import com.engine.salary.cmd.taxDeclaration.TaxDeclarationUpdateCmd;
import com.engine.salary.cmd.taxDeclaration.*;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.entity.taxdeclaration.TaxDeclaration;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
import com.engine.salary.entity.taxrate.TaxAgent;
import com.engine.salary.entity.taxrate.param.TaxAgentQueryParam;
import com.engine.salary.mapper.TaxAgentMapper;
import com.engine.salary.mapper.taxdeclaration.TaxDeclarationMapper;
import com.engine.salary.service.TaxDeclarationService;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.PageUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSession;
import weaver.conn.mybatis.MyBatisFactory;
import java.util.Map;
import java.util.*;
public class TaxDeclarationServiceImpl extends Service implements TaxDeclarationService {
private TaxDeclarationMapper getTaxDeclarationMapper() {
return MapperProxyFactory.getProxy(TaxDeclarationMapper.class);
}
@Override
public Map<String, Object> listPage(Map<String, Object> params) {
return commandExecutor.execute(new TaxDeclarationListCmd(params, user));
}
@Override
public Map<String, Object> save(Map<String, Object> params) {
return commandExecutor.execute(new TaxDeclarationSaveCmd(params, user));
public PageInfo<TaxDeclarationPO> listPageByParam(TaxDeclarationListQueryParam queryParam) {
// 分页参数
TaxDeclarationPO po = TaxDeclarationPO.builder().build();
PageInfo<TaxDeclarationPO> page = new PageInfo<>();
LocalDateRange localDateRange = new LocalDateRange();
if (Objects.nonNull(queryParam.getFromSalaryMonth())) {
localDateRange.setFromDate(SalaryDateUtil.localDateToDate(queryParam.getFromSalaryMonth().atDay(1)));
}
if (Objects.nonNull(queryParam.getEndSalaryMonth())) {
localDateRange.setEndDate(SalaryDateUtil.localDateToDate(queryParam.getEndSalaryMonth().atEndOfMonth()));
}
po.setSalaryMonths(localDateRange);
//Page<TaxDeclarationPO> page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize());
// if (SalaryEntityUtil.isNotNullOrEmpty(queryParam.getFromSalaryMonth())&&SalaryEntityUtil.isNotNullOrEmpty(queryParam.getEndSalaryMonth()) ) {
// // taxDeclarationMapper.selectPage(page, queryWrapper)
// }
// 查询个税申报表
PageUtil.start(queryParam.getCurrent(), queryParam.getPageSize());
List<TaxDeclarationPO> taxDeclarationPOS = getTaxDeclarationMapper().listSome(po);
page.setList(taxDeclarationPOS);
return page;
}
//根据id查询taxAgents
@Override
public List<TaxAgent> countByTaxDeclarationId(Collection<Long> taxAgentIds) {
if (CollectionUtils.isEmpty(taxAgentIds)) {
return Collections.emptyList();
}
SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession();
try {
TaxAgentMapper taxAgentMapper = sqlSession.getMapper(TaxAgentMapper.class);
return taxAgentMapper.listBySome(TaxAgentQueryParam.builder().ids(taxAgentIds).build());
} finally {
sqlSession.close();
}
}
//根据id获取TaxDeclaration
@Override
public TaxDeclaration getById(Long id) {
return getTaxDeclarationMapper().getById(id);
}
@Override
public Map<String, Object> getForm(Map<String, Object> params) {
return commandExecutor.execute(new TaxDeclarationGetFormCmd(params, user));
}
@Override
public Map<String, Object> getTaxDeclarationInfo(Map<String, Object> params) {
return commandExecutor.execute(new TaxDeclarationGetTaxDeclarationInfoCmd(params, user));
}
@Override
public void save(TaxDeclarationSaveParam saveParam) {
//return commandExecutor.execute(new TaxDeclarationSaveCmd(saveParam));
return;
}
@Override

View File

@ -165,6 +165,12 @@ public class SalaryDateUtil {
ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
return Date.from(zonedDateTime.toInstant());
}
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
if (null == localDateTime) {
return null;
}
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
public static String getFormatLocalDate(Date date) {
if (date == null) {

View File

@ -1,47 +1,90 @@
package com.engine.salary.web;
import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationFormDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationInfoDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationListDTO;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam;
import com.engine.salary.service.TaxDeclarationService;
import com.engine.salary.service.impl.TaxDeclarationServiceImpl;
import com.engine.salary.util.ResponseResult;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.page.PageInfo;
import com.engine.salary.wrapper.TaxDeclarationWrapper;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import weaver.general.BaseBean;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
public class TaxDeclarationController {
// @PostMapping("/list")
// @ApiOperation("个税申报表列表")
// @WeaPermission
// public WeaResult<WeaTable<TaxDeclarationListDTO>> listTaxDeclaration(@RequestBody TaxDeclarationListQueryParam queryParam) {
// WeaTable<TaxDeclarationListDTO> weaTable = taxDeclarationWrapper.listPage(queryParam, TenantContext.getCurrentTenantKey());
// return WeaResult.success(weaTable);
// }
//
// @GetMapping("/getForm")
// @ApiOperation("个税申报表表单")
// @WeaPermission
// public WeaResult<WeaForm> getForm(@RequestParam(value = "id", required = false) Long id) {
// WeaForm weaForm = taxDeclarationWrapper.getForm(id, TenantContext.getCurrentTenantKey());
// return WeaResult.success(weaForm);
// }
//
// @GetMapping("/getTaxDeclarationInfo")
// @ApiOperation("个税申报表相关信息")
// @WeaPermission
// public WeaResult<TaxDeclarationInfoDTO> getTaxDeclarationInfo(@RequestParam(value = "taxDeclarationId") Long taxDeclarationId) {
// TaxDeclarationInfoDTO taxDeclarationInfo = taxDeclarationWrapper.getTaxDeclarationInfoById(taxDeclarationId, TenantContext.getCurrentTenantKey());
// return WeaResult.success(taxDeclarationInfo);
// }
//
// @PostMapping("/save")
// @ApiOperation("个税申报表生成")
// @WeaPermission
// public WeaResult<Object> saveTaxDeclaration(@RequestBody TaxDeclarationSaveParam saveParam) {
// taxDeclarationWrapper.save(saveParam, UserContext.getCurrentEmployeeId(), TenantContext.getCurrentTenantKey());
// return WeaResult.success(null);
// }
//
// @PostMapping("/detail/list")
// @ApiOperation("个税申报表详情列表")
// @WeaPermission
// public WeaResult<WeaTable<TaxDeclarationDetailListDTO>> listTaxDeclarationDetail(@RequestBody TaxDeclarationDetailListQueryParam queryParam) {
// WeaTable<TaxDeclarationDetailListDTO> weaTable = taxDeclarationDetailWrapper.listPage(queryParam, TenantContext.getCurrentTenantKey());
// return WeaResult.success(weaTable);
// }
//
// private BaseBean logger = new BaseBean();
private TaxDeclarationService getService(User user) {
return (TaxDeclarationService) ServiceUtil.getService(TaxDeclarationServiceImpl.class, user);
}
private TaxDeclarationWrapper getTaxDeclarationWrapper(User user) {
return ServiceUtil.getService(TaxDeclarationWrapper.class, user);
}
/* private TaxDeclarationDetailWrapper getTaxDeclarationDetailWrapper(User user) {
return ServiceUtil.getService(TaxDeclarationDetailWrapper.class, user);
}*/
//个税申报表列表
@POST
@Path("/listPage")
@Produces(MediaType.APPLICATION_JSON)
public String list(@Context HttpServletRequest request, @Context HttpServletResponse response,@RequestBody TaxDeclarationListQueryParam queryParam) {
User user = HrmUserVarify.getUser(request, response);
queryParam.setFromSalaryMonth(SalaryDateUtil.String2YearMonth(queryParam.getFromSalaryMonthStr()));
queryParam.setEndSalaryMonth(SalaryDateUtil.String2YearMonth(queryParam.getEndSalaryMonthStr()));
return new ResponseResult<TaxDeclarationListQueryParam, PageInfo<TaxDeclarationListDTO>>().run(getTaxDeclarationWrapper(user)::listPage, queryParam);
}
//个税申报表表单
@GET
@Path("/getForm")
@Produces(MediaType.APPLICATION_JSON)
public String getForm(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Long, TaxDeclarationFormDTO>().run(getTaxDeclarationWrapper(user)::getForm, id);
}
//个税申报表相关信息
@GET
@Path("/getTaxDeclarationInfo")
@Produces(MediaType.APPLICATION_JSON)
public String getTaxDeclarationInfo(@Context HttpServletRequest request, @Context HttpServletResponse response,@QueryParam(value = "taxDeclarationId") Long taxDeclarationId) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Long, TaxDeclarationInfoDTO>().run(getTaxDeclarationWrapper(user)::getTaxDeclarationInfoById, taxDeclarationId);
}
//个税申报表生成
@POST
@Path("/save")
@Produces(MediaType.APPLICATION_JSON)
public String save(@Context HttpServletRequest request, @Context HttpServletResponse response,@RequestBody TaxDeclarationSaveParam param) {
User user = HrmUserVarify.getUser(request, response);
param.setSalaryMonth(SalaryDateUtil.String2YearMonth(param.getSalaryMonthStr()));
return new ResponseResult<TaxDeclarationSaveParam, Long>().run(getTaxDeclarationWrapper(user)::save, param);
}
//个税申报表详情列表
/* @GET
@Path("/detail/list")
@Produces(MediaType.APPLICATION_JSON)
public String listTaxDeclarationDetail(@Context HttpServletRequest request, @Context HttpServletResponse response,@RequestBody TaxDeclarationDetailListQueryParam param) {
User user = HrmUserVerify.getUser(request, response);
return new ResponseResult<TaxDeclarationDetailListQueryParam, Long>().run(getTaxDeclarationDetailWrapper(user)::listPage, param);
}*/
// @PostMapping("/export")
// @ApiOperation("个税申报表相关信息")
// @WeaPermission

View File

@ -0,0 +1,66 @@
/*
package com.engine.salary.wrapper;
import com.engine.core.impl.Service;
import com.engine.salary.entity.taxdeclaration.TaxDeclaration;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationDetailListDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationLaborListDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationWageListDTO;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.service.TaxDeclarationDetailService;
import com.engine.salary.service.TaxDeclarationService;
import com.engine.salary.util.page.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Objects;
*/
/**
* @description: 个税申报表明细
* @author: xiajun
* @modified By: xiajun
* @date: Created in 1/23/22 6:07 PM
* @version:v1.0
*//*
@Slf4j
@Component
public class TaxDeclarationDetailWrapper extends Service {
@Resource
private TaxDeclarationService taxDeclarationService;
@Resource
private TaxDeclarationDetailService taxDeclarationDetailService;
*/
/**
* 个税申报表明细列表
*
* @param queryParam 列表查询条件
* @return
*//*
public PageInfo listPage(TaxDeclarationDetailListQueryParam queryParam) {
TaxDeclaration taxDeclaration = taxDeclarationService.getById(queryParam.getTaxDeclarationId());
PageInfo<TaxDeclarationDetailListDTO> dtoPage = new PageInfo<TaxDeclarationDetailListDTO>(TaxDeclarationDetailListDTO.class);
dtoPage.setPageNum(queryParam.getCurrent());
dtoPage.setPageSize(queryParam.getPageSize());
// 正常工资薪金所得
if (Objects.equals(taxDeclaration.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) {
PageInfo<TaxDeclarationWageListDTO> taxDeclarationWageListDTOPageInfo = taxDeclarationDetailService.listDtoPageByParam4Wage(queryParam);
dtoPage.setList(taxDeclarationWageListDTOPageInfo.getList());
//weaTable = SalaryFormatUtil.<TaxDeclarationWageListDTO>getInstance().buildTable(TaxDeclarationWageListDTO.class, dtoPage);
}
// 劳务报酬所得
if (Objects.equals(taxDeclaration.getIncomeCategory(), IncomeCategoryEnum.REMUNERATION_FOR_LABOR.getValue())) {
PageInfo<TaxDeclarationLaborListDTO> taxDeclarationLaborListDTOPageInfo = taxDeclarationDetailService.listDtoPageByParam4Labor(queryParam);
dtoPage.setList(taxDeclarationLaborListDTOPageInfo.getList());
//weaTable = SalaryFormatUtil.<TaxDeclarationLaborListDTO>getInstance().buildTable(TaxDeclarationLaborListDTO.class, dtoPage);
}
return dtoPage;
}
}
*/

View File

@ -0,0 +1,286 @@
package com.engine.salary.wrapper;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.biz.EmployBiz;
import com.engine.salary.biz.SalaryItemBiz;
import com.engine.salary.biz.TaxAgentBiz;
import com.engine.salary.common.LocalDateRange;
import com.engine.salary.component.WeaFormOption;
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobPO;
import com.engine.salary.entity.taxdeclaration.TaxDeclaration;
import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationBO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationFormDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationInfoDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationListDTO;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
import com.engine.salary.entity.taxrate.TaxAgent;
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.datacollection.AddUpSituationMapper;
import com.engine.salary.mapper.salaryacct.SalaryAcctRecordMapper;
import com.engine.salary.mapper.taxdeclaration.TaxDeclarationMapper;
import com.engine.salary.service.*;
import com.engine.salary.service.impl.TaxAgentServiceImpl;
import com.engine.salary.service.impl.TaxDeclarationServiceImpl;
import com.engine.salary.util.SalaryDateUtil;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.page.PageInfo;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import weaver.hrm.User;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @description: 个税申报表
* @author: xiajun
* @modified By: xiajun
* @date: Created in 1/23/22 5:50 PM
* @version:v1.0
*/
@Component
public class TaxDeclarationWrapper extends Service {
private TaxDeclarationService getTaxDeclarationService(User user) {
return (TaxDeclarationService) ServiceUtil.getService(TaxDeclarationServiceImpl.class, user);
}
private TaxAgentService getTaxAgentService(User user) {
return (TaxAgentService) ServiceUtil.getService(TaxAgentServiceImpl.class, user);
}
private TaxDeclarationMapper getTaxDeclarationMapper() {
return MapperProxyFactory.getProxy(TaxDeclarationMapper.class);
}
private SalaryAcctRecordMapper getSalaryAcctRecordMapper() {
return MapperProxyFactory.getProxy(SalaryAcctRecordMapper.class);
}
@Resource
private TaxAgentBiz taxAgentBiz;
@Resource
private SalaryItemBiz salaryItemBiz;
@Resource
private TaxDeclarationDetailService taxDeclarationDetailService;
@Resource
private SalaryAcctResultService salaryAcctResultService;
@Resource
private SalaryAcctRecordService salaryAcctRecordService;
@Resource
private AddUpSituationMapper addUpSituationMapper;
@Resource
private TaxDeclarationMapper taxDeclarationMapper;
@Resource
private SalarySobService salarySobService;
/**
* 个税申报表列表
*
* @param queryParam 列表查询条件
* @param
* @return
*/
public PageInfo listPage(TaxDeclarationListQueryParam queryParam) {
EmployBiz employBiz = new EmployBiz();
// 询个税申报表分页
PageInfo<TaxDeclarationPO> page = getTaxDeclarationService(user).listPageByParam(queryParam);
PageInfo<TaxDeclarationListDTO> dtoPage = new PageInfo<TaxDeclarationListDTO>(TaxDeclarationListDTO.class);
dtoPage.setPageNum(queryParam.getCurrent());
dtoPage.setPageSize(queryParam.getPageSize());
List<TaxDeclarationPO> list = page.getList();
if (CollectionUtils.isNotEmpty(list)) {
// 查询人员
List<Long> employeeIds = SalaryEntityUtil.properties(list, TaxDeclarationPO::getCreator, Collectors.toList());
List<DataCollectionEmployee> employeeComInfos = employBiz.getEmployeeByIdsAll(employeeIds);
// 查询个税扣缴义务人
Set<Long> taxAgentIds = SalaryEntityUtil.properties(list, TaxDeclarationPO::getTaxAgentId);
List<TaxAgent> taxAgentPOS = taxAgentBiz.listByIds(taxAgentIds);
//List<TaxAgent> taxAgentPOS = getTaxDeclarationService(user).countByTaxDeclarationId(taxAgentIds);
// 转换成列表dto
List<TaxDeclarationListDTO> taxDeclarationListDTOS = TaxDeclarationBO.convert2ListDTO(list, employeeComInfos, taxAgentPOS);
dtoPage.setList(taxDeclarationListDTOS);
}
return dtoPage;
}
public TaxDeclarationFormDTO getForm(Long id) {
TaxDeclarationFormDTO formDTO = new TaxDeclarationFormDTO();
if (Objects.nonNull(id)) {
// 查询个税申报表
TaxDeclaration taxDeclaration = getTaxDeclarationService(user).getById(id);
if (Objects.isNull(taxDeclaration)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98877, "个税申报表不存在或已删除"));
}
// 查询个税扣缴义务人
TaxAgent taxAgent = taxAgentBiz.getById(id);
// 转换成个税申报表详情dto
formDTO = TaxDeclarationFormDTO.builder()
.salaryMonth(SalaryDateUtil.localDate2YearMonth(taxDeclaration.getSalaryMonth()))
.taxAgentId(taxDeclaration.getTaxAgentId())
.taxAgentName(Optional.ofNullable(taxAgent).map(TaxAgent::getName).orElse(""))
.description(taxDeclaration.getDescription())
.build();
}
// 转换成前端所需的数据格式
// WeaForm weaForm = SalaryFormatUtil.<TaxDeclarationFormDTO>getInstance().buildForm(TaxDeclarationFormDTO.class, formDTO);
// 查询租户所有的个税扣缴义务人
Collection<TaxAgent> taxAgentListDTOS = taxAgentBiz.listAll();
// 表单中个税扣缴义务人的可选项
List<WeaFormOption> weaFormOptions = Lists.newArrayListWithExpectedSize(taxAgentListDTOS.size());
for (TaxAgent taxAgent : taxAgentListDTOS) {
weaFormOptions.add(new WeaFormOption("" + taxAgent.getId(), taxAgent.getName()));
}
// weaForm.getItems().forEach((k, v) -> {
// if (StringUtils.equals("taxAgentId", k)) {
// v.setOptions(weaFormOptions);
// }
// if (StringUtils.equals("salaryMonth", k)) {
// Map<String, Object> otherParams = new HashMap<>();
// otherParams.put("type", "month");
// v.setOtherParams(otherParams);
// }
// });
return formDTO;
}
/*
*//**
* 查询个税申报表的基本信息
*
* @param id 个税申报表id
* @return
*/
public TaxDeclarationInfoDTO getTaxDeclarationInfoById(Long id) {
// 查询个税申报表
//TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(id);
TaxDeclaration taxDeclaration = getTaxDeclarationService(user).getById(id);
if (Objects.isNull(taxDeclaration)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98877, "个税申报表不存在或已删除"));
}
// 查询个税扣缴义务人
TaxAgent taxAgentPO = taxAgentBiz.getById(taxDeclaration.getTaxAgentId());
return TaxDeclarationInfoDTO.builder()
.salaryMonth(SalaryDateUtil.localDate2YearMonth(taxDeclaration.getSalaryMonth()))
.taxAgentId(taxDeclaration.getTaxAgentId())
.taxAgentName(Optional.ofNullable(taxAgentPO).map(TaxAgent::getName).orElse(""))
.build();
}
/*
*//**
* 保存
*
* @param saveParam 保存参数
*/
@Transactional(rollbackFor = Exception.class)
public void save(TaxDeclarationSaveParam saveParam) {
//getTaxDeclarationService(user).save(saveParam);
EmployBiz employBiz = new EmployBiz();
// 薪资所属月的日期范围
LocalDateRange salaryMonthDateRange = SalaryDateUtil.localDate2YearRange(SalaryDateUtil.localDateToDate(saveParam.getSalaryMonth().atDay(1)));
if (Objects.isNull(salaryMonthDateRange)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误"));
}
// 查询薪资所属月已经生成过的个税申报表
List<TaxDeclarationPO> taxDeclarationPOS = listBySalaryMonthTax(salaryMonthDateRange);
// 已经生成过个税申报表不允许再次生成个税申报表
if (CollectionUtils.isNotEmpty(taxDeclarationPOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98873, "{0}已经生成过个税申报表,不允许再次生成")
.replace("{0}", saveParam.getSalaryMonth().toString()));
}
// 查询薪资所属月的薪资核算记录
List<SalaryAcctRecordPO> salaryAcctRecordPOS = listBySalaryMonth(salaryMonthDateRange);
// 无薪资核算记录不允许生成个税申报表
if (CollectionUtils.isEmpty(salaryAcctRecordPOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98874, "{0}无申报数据")
.replace("{0}", saveParam.getSalaryMonth().toString()));
}
// 如果存在未归档的也不允许生成个税申报表
boolean notArchived = salaryAcctRecordPOS.stream().anyMatch(salaryAcctRecordPO -> !Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.ARCHIVED.getValue()));
if (notArchived) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98875, "{0}有未归档数据,请全部归档后再申报")
.replace("{0}", saveParam.getSalaryMonth().toString()));
}
// 如果当前薪资所属月下存在不同的税款所属期属于异常业务场景不允许生成个税申报表
Date taxCycle = salaryAcctRecordPOS.get(0).getTaxCycle();
boolean differentTaxCycle = salaryAcctRecordPOS.stream().anyMatch(salaryAcctRecordPO -> salaryAcctRecordPO.getTaxCycle().compareTo(taxCycle) != 0);
if (differentTaxCycle) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98876, "{0}存在不同的税款所属期,无法正常生成个税申报表,请调整账套设置,重新核算后再生成个税申报表")
.replace("{0}", saveParam.getSalaryMonth().toString()));
}
// 查询薪资核算结果
Set<Long> salaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getId);
List<SalaryAcctResultPO> salaryAcctResultPOS = salaryAcctResultService.listBySalaryAcctRecordIds(salaryAcctRecordIds);
// 无薪资核算结果不允许生成个税申报表
if (CollectionUtils.isEmpty(salaryAcctResultPOS)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98874, "{0}无申报数据")
.replace("{0}", saveParam.getSalaryMonth().toString()));
}
// 查询薪资账套
Set<Long> salarySobIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getSalarySobId);
List<SalarySobPO> salarySobPOS = salarySobService.listByIds(salarySobIds);
//查询DataCollectionEmployee
//DataCollectionEmployee employeeId =
// 查询所有薪资项目
List<SalaryItemPO> salaryItemPOS = salaryItemBiz.listAll();
// 处理要保存的数据
TaxDeclarationBO.Result result = TaxDeclarationBO.handle(saveParam, taxCycle, salaryItemPOS, salarySobPOS,salaryAcctResultPOS);
// 保存个税申报表
if (CollectionUtils.isNotEmpty(result.getNeedInsertTaxDeclarations())) {
taxDeclarationMapper.batchInsert(result.getNeedInsertTaxDeclarations());
}
// 保存个税申报表明细
if (CollectionUtils.isNotEmpty(result.getNeedInsertTaxDeclarationDetails())) {
taxDeclarationDetailService.batchSave(result.getNeedInsertTaxDeclarationDetails());
}
// 保存累计情况
if (CollectionUtils.isNotEmpty(result.getNeedInsertAccumulatedSituations())) {
// TODO: 1/23/22 待修改不能直接调用mapper
// addUpSituationMapper.insertData(Lists.newArrayList(result.getNeedInsertAccumulatedSituations()));
}
// 更新薪资核算记录的状态
salaryAcctRecordService.updateStatusByIds(salaryAcctRecordIds, SalaryAcctRecordStatusEnum.DECLARED);
// 查询个税扣缴义务人
Set<Long> taxAgentIds = SalaryEntityUtil.properties(result.getNeedInsertTaxDeclarations(), TaxDeclarationPO::getTaxAgentId);
List<TaxAgent> taxAgentPOS = taxAgentBiz.listByIds(taxAgentIds);
Map<Long, String> taxAgentNameMap = SalaryEntityUtil.convert2Map(taxAgentPOS, TaxAgent::getId, TaxAgent::getName);
// 记录日志
/*for (TaxDeclarationPO taxDeclarationPO : result.getNeedInsertTaxDeclarations()) {
String targetName = SalaryDateUtil.toYearMonth(taxDeclarationPO.getSalaryMonth())
+ "(" + taxAgentNameMap.getOrDefault(taxDeclarationPO.getTaxAgentId(), StringUtils.EMPTY) + ")";
LoggerContext<TaxDeclarationPO> loggerContext = new LoggerContext<>();
loggerContext.setTargetId(String.valueOf(taxDeclarationPO.getId()));
loggerContext.setTargetName(targetName);
loggerContext.setOperateType(OperateTypeEnum.UPDATE.getValue());
loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(99815, "生成个税申报表"));
loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(99815, "生成个税申报表"));
taxDeclarationLoggerTemplate.write(loggerContext);
}*/
}
public List<TaxDeclarationPO> listBySalaryMonthTax(LocalDateRange salaryMonthDateRange) {
return getTaxDeclarationMapper().listSome(TaxDeclarationPO.builder().salaryMonths(salaryMonthDateRange).build());
}
public List<SalaryAcctRecordPO> listBySalaryMonth(LocalDateRange salaryMonthDateRange) {
return getSalaryAcctRecordMapper().listSome(SalaryAcctRecordPO.builder().salaryMonths(salaryMonthDateRange).build());
}
}