diff --git a/resource/sqlupgrade/DM/sql202312270603.sql b/resource/sqlupgrade/DM/sql202312270603.sql new file mode 100644 index 000000000..f9aba2b22 --- /dev/null +++ b/resource/sqlupgrade/DM/sql202312270603.sql @@ -0,0 +1,10 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + +ALTER TABLE declare_request_id add ( + declare_request_id varchar2(100) +); +/ + diff --git a/resource/sqlupgrade/DM/sql202312270703.sql b/resource/sqlupgrade/DM/sql202312270703.sql new file mode 100644 index 000000000..fa59157ed --- /dev/null +++ b/resource/sqlupgrade/DM/sql202312270703.sql @@ -0,0 +1,3 @@ +update hrsa_tax_declaration_value set source = 0; +/ + diff --git a/resource/sqlupgrade/GS/sql202312270603.sql b/resource/sqlupgrade/GS/sql202312270603.sql new file mode 100644 index 000000000..f9aba2b22 --- /dev/null +++ b/resource/sqlupgrade/GS/sql202312270603.sql @@ -0,0 +1,10 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + +ALTER TABLE declare_request_id add ( + declare_request_id varchar2(100) +); +/ + diff --git a/resource/sqlupgrade/GS/sql202312270703.sql b/resource/sqlupgrade/GS/sql202312270703.sql new file mode 100644 index 000000000..fa59157ed --- /dev/null +++ b/resource/sqlupgrade/GS/sql202312270703.sql @@ -0,0 +1,3 @@ +update hrsa_tax_declaration_value set source = 0; +/ + diff --git a/resource/sqlupgrade/JC/sql202312270603.sql b/resource/sqlupgrade/JC/sql202312270603.sql new file mode 100644 index 000000000..f9aba2b22 --- /dev/null +++ b/resource/sqlupgrade/JC/sql202312270603.sql @@ -0,0 +1,10 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + +ALTER TABLE declare_request_id add ( + declare_request_id varchar2(100) +); +/ + diff --git a/resource/sqlupgrade/JC/sql202312270703.sql b/resource/sqlupgrade/JC/sql202312270703.sql new file mode 100644 index 000000000..fa59157ed --- /dev/null +++ b/resource/sqlupgrade/JC/sql202312270703.sql @@ -0,0 +1,3 @@ +update hrsa_tax_declaration_value set source = 0; +/ + diff --git a/resource/sqlupgrade/Mysql/sql202312270603.sql b/resource/sqlupgrade/Mysql/sql202312270603.sql new file mode 100644 index 000000000..52d95fada --- /dev/null +++ b/resource/sqlupgrade/Mysql/sql202312270603.sql @@ -0,0 +1,3 @@ +ALTER TABLE hrsa_tax_declaration_value ADD COLUMN source int(0) NULL ; + +ALTER TABLE hrsa_tax_declare_record ADD COLUMN declare_request_id varchar(100) NULL ; \ No newline at end of file diff --git a/resource/sqlupgrade/Mysql/sql202312270703.sql b/resource/sqlupgrade/Mysql/sql202312270703.sql new file mode 100644 index 000000000..099b6ab58 --- /dev/null +++ b/resource/sqlupgrade/Mysql/sql202312270703.sql @@ -0,0 +1 @@ +update hrsa_tax_declaration_value set source = 0; \ No newline at end of file diff --git a/resource/sqlupgrade/Oracle/sql202312270603.sql b/resource/sqlupgrade/Oracle/sql202312270603.sql new file mode 100644 index 000000000..4aea94ab0 --- /dev/null +++ b/resource/sqlupgrade/Oracle/sql202312270603.sql @@ -0,0 +1,9 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +) +/ + +ALTER TABLE declare_request_id add ( + declare_request_id varchar2(100) +) +/ \ No newline at end of file diff --git a/resource/sqlupgrade/Oracle/sql202312270703.sql b/resource/sqlupgrade/Oracle/sql202312270703.sql new file mode 100644 index 000000000..e2477f553 --- /dev/null +++ b/resource/sqlupgrade/Oracle/sql202312270703.sql @@ -0,0 +1,2 @@ +update hrsa_tax_declaration_value set source = 0; +/ \ No newline at end of file diff --git a/resource/sqlupgrade/PG/sql202206090403.sql b/resource/sqlupgrade/PG/sql202206090403.sql index 679a8cc59..8f5d32f79 100644 --- a/resource/sqlupgrade/PG/sql202206090403.sql +++ b/resource/sqlupgrade/PG/sql202206090403.sql @@ -1,3 +1,3 @@ -ALTER TABLE hrsa_tax_declaration ADD COLUMN income_category int NOT NULL ; +ALTER TABLE hrsa_tax_declaration ADD COLUMN income_category int ; -ALTER TABLE hrsa_tax_declaration_detail ADD COLUMN employee_type int NOT NULL ; \ No newline at end of file +ALTER TABLE hrsa_tax_declaration_detail ADD COLUMN employee_type int ; \ No newline at end of file diff --git a/resource/sqlupgrade/PG/sql202312270603.sql b/resource/sqlupgrade/PG/sql202312270603.sql new file mode 100644 index 000000000..42b0d9089 --- /dev/null +++ b/resource/sqlupgrade/PG/sql202312270603.sql @@ -0,0 +1,3 @@ +ALTER TABLE hrsa_tax_declaration_value ADD COLUMN source int NULL ; + +ALTER TABLE hrsa_salary_template ADD COLUMN declare_request_id varchar(200) NULL; \ No newline at end of file diff --git a/resource/sqlupgrade/PG/sql202312270703.sql b/resource/sqlupgrade/PG/sql202312270703.sql new file mode 100644 index 000000000..099b6ab58 --- /dev/null +++ b/resource/sqlupgrade/PG/sql202312270703.sql @@ -0,0 +1 @@ +update hrsa_tax_declaration_value set source = 0; \ No newline at end of file diff --git a/resource/sqlupgrade/SQLServer/sql202312270603.sql b/resource/sqlupgrade/SQLServer/sql202312270603.sql new file mode 100644 index 000000000..6955742ff --- /dev/null +++ b/resource/sqlupgrade/SQLServer/sql202312270603.sql @@ -0,0 +1,5 @@ +ALTER TABLE hrsa_tax_declaration_value ADD source int NULL +GO + +ALTER TABLE hrsa_tax_declare_record ADD declare_request_id varchar(100) NULL +GO \ No newline at end of file diff --git a/resource/sqlupgrade/SQLServer/sql202312270703.sql b/resource/sqlupgrade/SQLServer/sql202312270703.sql new file mode 100644 index 000000000..0384f9313 --- /dev/null +++ b/resource/sqlupgrade/SQLServer/sql202312270703.sql @@ -0,0 +1,2 @@ +update hrsa_tax_declaration_value set source = 0 +GO \ No newline at end of file diff --git a/resource/sqlupgrade/ST/sql202312270603.sql b/resource/sqlupgrade/ST/sql202312270603.sql new file mode 100644 index 000000000..f9aba2b22 --- /dev/null +++ b/resource/sqlupgrade/ST/sql202312270603.sql @@ -0,0 +1,10 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + +ALTER TABLE declare_request_id add ( + declare_request_id varchar2(100) +); +/ + diff --git a/resource/sqlupgrade/ST/sql202312270703.sql b/resource/sqlupgrade/ST/sql202312270703.sql new file mode 100644 index 000000000..fa59157ed --- /dev/null +++ b/resource/sqlupgrade/ST/sql202312270703.sql @@ -0,0 +1,3 @@ +update hrsa_tax_declaration_value set source = 0; +/ + diff --git a/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java b/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java new file mode 100644 index 000000000..48898d83d --- /dev/null +++ b/src/com/engine/salary/entity/employeedeclare/bo/EmployeeDeclareBO.java @@ -0,0 +1,46 @@ +package com.engine.salary.entity.employeedeclare.bo; + +import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareExcelDTO; +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; +import com.engine.salary.enums.employeedeclare.CardTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryI18nUtil; +import org.apache.commons.lang3.StringUtils; + +/** + * @author Harryxzy + * @ClassName EmployeeDeclareBO + * @date 2023/12/27 14:13 + * @description + */ +public class EmployeeDeclareBO { + + public static EmployeeDeclarePO convert2PO(EmployeeDeclareExcelDTO dto) { + if (dto == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "参数错误")); + } + EmployeeDeclarePO po = EmployeeDeclarePO.builder() + .jobNum(dto.getJobNum()) + .employeeName(dto.getEmployeeName()) + .cardType(dto.getCardType() == null ? null :CardTypeEnum.RESIDENT_IDENTITY_CARDS.getValue()) + .cardNum(dto.getCardNum()) + .employmentStatus(StringUtils.isBlank(dto.getEmploymentStatus()) ? null : new Integer(dto.getEmploymentStatus())) + .employmentType(StringUtils.isBlank(dto.getEmploymentType()) ? null : new Integer(dto.getEmploymentType())) + .employmentFirstYear(dto.getEmploymentFirstYear()) + .mobile(dto.getMobile()) + .employmentDate(StringUtils.isBlank(dto.getEmploymentDate()) ? null : SalaryDateUtil.stringToDate(dto.getEmploymentDate()) ) + .dismissDate(StringUtils.isBlank(dto.getDismissDate()) ? null : SalaryDateUtil.stringToDate(dto.getDismissDate())) + .disability(dto.getDisability()) + .disabilityCardNo(dto.getDisabilityCardNo()) + .martyrDependents(dto.getMartyrDependents()) + .martyrDependentsCardNo(dto.getMartyrDependentsCardNo()) + .lonelyOld(dto.getLonelyOld()) + .deductExpenses(dto.getDeductExpenses()) + .gender(StringUtils.isBlank(dto.getGender()) ? null : new Integer(dto.getGender())) + .birthday(StringUtils.isBlank(dto.getBirthday()) ? null : SalaryDateUtil.stringToDate(dto.getBirthday())) + .build(); + return po; + } + +} diff --git a/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java b/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java index 5e1c658d7..8880ce557 100644 --- a/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java +++ b/src/com/engine/salary/entity/employeedeclare/dto/EmployeeDeclareExcelDTO.java @@ -104,12 +104,33 @@ public class EmployeeDeclareExcelDTO { @TableTitle(title = "任职受雇从业日期", dataIndex = "employmentDate", key = "employmentDate") private String employmentDate; + // 入职年度就业情形 + private String employmentFirstYear; + // 离职日期 @SalaryTableColumn(text = "离职日期", width = "10%", column = "dismissDate") @TableTitle(title = "离职日期", dataIndex = "dismissDate", key = "dismissDate") private String dismissDate; + // 是否残疾 + private Integer disability; + + // 残疾证号 + private String disabilityCardNo; + + // 是否孤老 + private Integer lonelyOld; + + // 是否是烈属 + private Integer martyrDependents; + + // 烈属证号 + private String martyrDependentsCardNo; + + // 是否扣除减除费用 + private Integer deductExpenses; + // 申报状态 private DeclareStatusEnum declareStatus; diff --git a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java index 72a7bd9f3..114013a90 100644 --- a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java +++ b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareImportParam.java @@ -15,4 +15,14 @@ public class EmployeeDeclareImportParam extends EmployeeDeclareListQueryParam { @ApiModelProperty("是否导出现有数据") private String exportData; + + //上传文件id + String imageId; + + // 校验字段 + private String checkType; + + // 个税扣义务人id + private Long taxAgentId; + } diff --git a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareListQueryParam.java b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareListQueryParam.java index e569ecbf1..27222c08f 100644 --- a/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareListQueryParam.java +++ b/src/com/engine/salary/entity/employeedeclare/param/EmployeeDeclareListQueryParam.java @@ -48,6 +48,7 @@ public class EmployeeDeclareListQueryParam extends BaseQueryParam { // 员工姓名/编号 private String keyword; + private Long employeeId; // 部门 private Collection departmentIds; diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java index 893b0d55e..cd7af96ba 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java @@ -167,6 +167,8 @@ public class SalaryTemplateBO { .id(String.valueOf(e.getSalaryItemId())) .salaryItemId(String.valueOf(e.getSalaryItemId())) .name(e.getName()) + .salaryItemShowName(e.getName()) + .originName(e.getName()) .sortedIndex(e.getSortedIndex()) .build() ); diff --git a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java index cabb3cc1c..f2eaf8e83 100644 --- a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java +++ b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java @@ -14,11 +14,13 @@ import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.enums.taxdeclaration.SourceEnum; 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 org.apache.commons.lang3.StringUtils; import java.lang.reflect.Field; import java.math.BigDecimal; @@ -41,11 +43,9 @@ public class TaxDeclarationCommon implements TaxDeclarationStrategy { public TaxDeclarationGenerateResult generate(TaxDeclareContext taxDeclareContext, Long employeeId) { Date now = new Date(); // 薪资核算结果按照薪资核算人员id聚合分类 - Map> salaryAcctResultValueMap = SalaryEntityUtil.group2Map( - taxDeclareContext.getSalaryAcctResultValues(), SalaryAcctResultPO::getSalaryAcctEmpId); + Map> salaryAcctResultValueMap = SalaryEntityUtil.group2Map(taxDeclareContext.getSalaryAcctResultValues(), SalaryAcctResultPO::getSalaryAcctEmpId); // 薪资核算人员按照人员id聚合分类 - Map> employeeIdKeyMap = SalaryEntityUtil.group2Map( - taxDeclareContext.getSalaryAcctEmployees(), SalaryAcctEmployeePO::getEmployeeId); + Map> employeeIdKeyMap = SalaryEntityUtil.group2Map(taxDeclareContext.getSalaryAcctEmployees(), SalaryAcctEmployeePO::getEmployeeId); List taxDeclarationValues = Lists.newArrayListWithExpectedSize(employeeIdKeyMap.size()); for (Map.Entry> employeeIdEntry : employeeIdKeyMap.entrySet()) { @@ -63,8 +63,7 @@ public class TaxDeclarationCommon implements TaxDeclarationStrategy { SalarySobTaxReportRulePO salarySobTaxReportRule = taxDeclareContext.getSalarySobTaxReportRuleMap() .get(lastSalaryAcctEmployee.getSalarySobId() + "-" + taxReportColumn.getReportColumnDataIndex()); List salaryAcctResultValue = salaryAcctResultValueMap.get(lastSalaryAcctEmployee.getId()); - String defaultValue = Objects.equals(taxReportColumn.getDataType(), SalaryDataTypeEnum.NUMBER.getValue()) ? "0" : ""; - String value = defaultValue; + String value = ""; if (salarySobTaxReportRule != null && salaryAcctResultValue != null) { value = salaryAcctResultValue.stream() .filter(result -> result.getSalaryItemId().equals(salarySobTaxReportRule.getSalaryItemId())) @@ -72,6 +71,7 @@ public class TaxDeclarationCommon implements TaxDeclarationStrategy { .orElse(new SalaryAcctResultPO()) .getResultValue(); } + value = StringUtils.isNotBlank(value) ? value : Objects.equals(taxReportColumn.getDataType(), SalaryDataTypeEnum.NUMBER.getValue()) ? "0.00" : ""; valueMap.put(taxReportColumn.getReportColumnDataIndex(), value); } TaxDeclarationValuePO taxDeclarationValue = TaxDeclarationValuePO.builder() @@ -86,6 +86,7 @@ public class TaxDeclarationCommon implements TaxDeclarationStrategy { .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) .createTime(now) .updateTime(now) + .source(SourceEnum.ACCT.getValue()) .build(); taxDeclarationValues.add(taxDeclarationValue); } diff --git a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationDetailBO.java b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationDetailBO.java index 81010fb7b..5b8454a82 100644 --- a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationDetailBO.java +++ b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationDetailBO.java @@ -2,11 +2,9 @@ package com.engine.salary.entity.taxdeclaration.bo; import com.engine.salary.constant.TaxDeclarationDataIndexConstant; import com.engine.salary.entity.datacollection.DataCollectionEmployee; -import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationAnnualListDTO; -import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationEmployeeDTO; -import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationLaborListDTO; -import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationWageListDTO; +import com.engine.salary.entity.taxdeclaration.dto.*; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO; +import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO; import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; @@ -15,6 +13,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.*; +import java.util.stream.Collectors; /** * 个税申报表详情 @@ -177,4 +176,23 @@ public class TaxDeclarationDetailBO { } return taxDeclarationLaborListDTOS; } + + + public static List convert2ListTaxReportColumn(List pos) { + if (CollectionUtils.isEmpty(pos)) { + return Collections.emptyList(); + } + + List collect = pos.stream().map(po -> { + TaxDeclareRecordDetailFormDTO.TaxReportColumn taxReportColumn = new TaxDeclareRecordDetailFormDTO.TaxReportColumn(); + taxReportColumn.setReportColumnName(po.getReportColumnName()); + taxReportColumn.setReportColumnDataIndex(po.getReportColumnDataIndex()); + taxReportColumn.setTaxReportType(po.getTaxReportType()); + taxReportColumn.setIncomeCategory(po.getIncomeCategory()); + taxReportColumn.setDataType(po.getDataType()); + return taxReportColumn; + }).collect(Collectors.toList()); + + return collect; + } } diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/AbnormalEmployeeListDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/AbnormalEmployeeListDTO.java index 7970724c7..88f0400cd 100644 --- a/src/com/engine/salary/entity/taxdeclaration/dto/AbnormalEmployeeListDTO.java +++ b/src/com/engine/salary/entity/taxdeclaration/dto/AbnormalEmployeeListDTO.java @@ -2,6 +2,7 @@ package com.engine.salary.entity.taxdeclaration.dto; import com.engine.salary.annotation.TableTitle; import com.engine.salary.enums.employeedeclare.DeclareStatusEnum; +import com.engine.salary.util.excel.ExcelHead; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; @@ -32,18 +33,22 @@ public class AbnormalEmployeeListDTO { //姓名") @TableTitle(title = "姓名",dataIndex = "employeeName",key = "employeeName") + @ExcelHead(title = "姓名",dataIndex = "employeeName") private String employeeName; //工号") @TableTitle(title = "工号",dataIndex = "jobNum",key = "jobNum") + @ExcelHead(title = "工号",dataIndex = "jobNum") private String jobNum; //证件类型") @TableTitle(title = "证件类型",dataIndex = "cardType",key = "cardType") + @ExcelHead(title = "证件类型",dataIndex = "cardType") private String cardType; //证件号码") @TableTitle(title = "证件号码",dataIndex = "cardNum",key = "cardNum") + @ExcelHead(title = "证件号码",dataIndex = "cardNum") private String cardNum; //报送状态") @@ -51,5 +56,6 @@ public class AbnormalEmployeeListDTO { //报送状态") @TableTitle(title = "报送状态",dataIndex = "declareStatusDesc",key = "declareStatusDesc") + @ExcelHead(title = "报送状态",dataIndex = "declareStatusDesc") private String declareStatusDesc; } diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/FailEmployeeListDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/FailEmployeeListDTO.java index 7d2ae71d2..a6e79e5ec 100644 --- a/src/com/engine/salary/entity/taxdeclaration/dto/FailEmployeeListDTO.java +++ b/src/com/engine/salary/entity/taxdeclaration/dto/FailEmployeeListDTO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.taxdeclaration.dto; import com.engine.salary.annotation.TableTitle; +import com.engine.salary.util.excel.ExcelHead; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; @@ -23,7 +24,8 @@ public class FailEmployeeListDTO { private Long id; //姓名 - @TableTitle(title = "姓名",dataIndex = "employeeName",key = "employeeName") + @TableTitle(title = "姓名", dataIndex = "employeeName", key = "employeeName") + @ExcelHead(title = "姓名", dataIndex = "employeeName") private String employeeName; //个税扣缴义务人id @@ -31,18 +33,22 @@ public class FailEmployeeListDTO { private Long taxAgentId; //个税扣缴义务人名称 - @TableTitle(title = "个税扣缴义务人名称",dataIndex = "taxAgentName",key = "taxAgentName") + @TableTitle(title = "个税扣缴义务人名称", dataIndex = "taxAgentName", key = "taxAgentName") + @ExcelHead(title = "个税扣缴义务人名称", dataIndex = "taxAgentName") private String taxAgentName; //证件号码 - @TableTitle(title = "证件号码",dataIndex = "cardNum",key = "cardNum") + @TableTitle(title = "证件号码", dataIndex = "cardNum", key = "cardNum") + @ExcelHead(title = "证件号码", dataIndex = "cardNum") private String cardNum; //失败原因 - @TableTitle(title = "失败原因",dataIndex = "errorMsg",key = "errorMsg") + @TableTitle(title = "失败原因", dataIndex = "errorMsg", key = "errorMsg") + @ExcelHead(title = "失败原因", dataIndex = "errorMsg") private String errorMsg; //所得项目 - @TableTitle(title = "所得项目",dataIndex = "incomeCategory",key = "incomeCategory") + @TableTitle(title = "所得项目", dataIndex = "incomeCategory", key = "incomeCategory") + @ExcelHead(title = "所得项目", dataIndex = "incomeCategory") private String incomeCategory; } diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationAnnualListDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationAnnualListDTO.java index 75b1b3191..696a3f9f7 100644 --- a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationAnnualListDTO.java +++ b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationAnnualListDTO.java @@ -2,6 +2,7 @@ package com.engine.salary.entity.taxdeclaration.dto; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.annotation.TableTitle; +import com.engine.salary.util.excel.ExcelHead; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; @@ -31,59 +32,69 @@ public class TaxDeclarationAnnualListDTO { text = "工号", width = "10%", column = "jobNum" ) @TableTitle(title ="工号",dataIndex = "jobNum",key = "jobNum") + @ExcelHead(title ="工号",dataIndex = "jobNum") private String jobNum; @SalaryTableColumn( text = "姓名", width = "10%", column = "username" ) @TableTitle(title ="姓名",dataIndex = "username",key = "username") + @ExcelHead(title ="姓名",dataIndex = "username") private String username; @SalaryTableColumn( text = "证件类型", width = "10%", column = "cardType" ) @TableTitle(title ="证件类型",dataIndex = "cardType",key = "cardType") + @ExcelHead(title ="证件类型",dataIndex = "cardType") private String cardType; @SalaryTableColumn( text = "证件号码", width = "10%", column = "cardNum" ) @TableTitle(title ="证件号码",dataIndex = "cardNum",key = "cardNum") + @ExcelHead(title ="证件号码",dataIndex = "cardNum") private String cardNum; @SalaryTableColumn( text = "全年一次性奖金额", width = "10%", column = "annualIncome" ) @TableTitle(title ="全年一次性奖金额",dataIndex = "annualIncome",key = "annualIncome") + @ExcelHead(title ="全年一次性奖金额",dataIndex = "annualIncome") private String annualIncome; @SalaryTableColumn( text = "免税收入", width = "10%", column = "annualTaxFreeIncome" ) @TableTitle(title ="免税收入",dataIndex = "annualTaxFreeIncome",key = "annualTaxFreeIncome") + @ExcelHead(title ="免税收入",dataIndex = "annualTaxFreeIncome") private String annualTaxFreeIncome; @SalaryTableColumn( text = "其他", width = "10%", column = "annualOther" ) @TableTitle(title ="其他",dataIndex = "annualOther",key = "annualOther") + @ExcelHead(title ="其他",dataIndex = "annualOther") private String annualOther; @SalaryTableColumn( text = "准予扣除的捐赠额", width = "10%", column = "annualDonateTax" ) @TableTitle(title ="准予扣除的捐赠额",dataIndex = "annualDonateTax",key = "annualDonateTax") + @ExcelHead(title ="准予扣除的捐赠额",dataIndex = "annualDonateTax") private String annualDonateTax; @SalaryTableColumn( text = "减免税额", width = "10%", column = "annualTaxSavings" ) @TableTitle(title ="减免税额",dataIndex = "annualTaxSavings",key = "annualTaxSavings") + @ExcelHead(title ="减免税额",dataIndex = "annualTaxSavings") private String annualTaxSavings; @SalaryTableColumn( text = "备注", width = "10%", column = "annualRemark" ) @TableTitle(title ="备注",dataIndex = "annualRemark",key = "annualRemark") + @ExcelHead(title ="备注",dataIndex = "annualRemark") private String annualRemark; } diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationInfoDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationInfoDTO.java index 20a06d05a..c3d48af5b 100644 --- a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationInfoDTO.java +++ b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationInfoDTO.java @@ -29,11 +29,11 @@ public class TaxDeclarationInfoDTO { @ApiModelProperty("薪资所属月") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8") private Date salaryMonth; @ApiModelProperty("税款所属期") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8") private Date taxCycle; @ApiModelProperty("个税扣缴义务人id") diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationLaborListDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationLaborListDTO.java index 73872aa0a..ce03fd52c 100644 --- a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationLaborListDTO.java +++ b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationLaborListDTO.java @@ -2,6 +2,7 @@ package com.engine.salary.entity.taxdeclaration.dto; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.annotation.TableTitle; +import com.engine.salary.util.excel.ExcelHead; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; @@ -30,78 +31,91 @@ public class TaxDeclarationLaborListDTO { @SalaryTableColumn( text = "工号", width = "10%", column = "jobNum" ) - @TableTitle(title ="工号",dataIndex = "jobNum",key = "jobNum") + @TableTitle(title = "工号", dataIndex = "jobNum", key = "jobNum") + @ExcelHead(title = "工号", dataIndex = "jobNum") private String jobNum; @SalaryTableColumn( text = "姓名", width = "10%", column = "username" ) - @TableTitle(title ="姓名",dataIndex = "username",key = "username") + @TableTitle(title = "姓名", dataIndex = "username", key = "username") + @ExcelHead(title = "姓名", dataIndex = "username") private String username; @SalaryTableColumn( text = "证件类型", width = "10%", column = "cardType" ) - @TableTitle(title ="证件类型",dataIndex = "cardType",key = "cardType") + @TableTitle(title = "证件类型", dataIndex = "cardType", key = "cardType") + @ExcelHead(title = "证件类型", dataIndex = "cardType") private String cardType; @SalaryTableColumn( text = "证件号码", width = "10%", column = "cardNum" ) - @TableTitle(title ="证件号码",dataIndex = "cardNum",key = "cardNum") + @TableTitle(title = "证件号码", dataIndex = "cardNum", key = "cardNum") + @ExcelHead(title = "证件号码", dataIndex = "cardNum") private String cardNum; @SalaryTableColumn( text = "所得项目", width = "10%", column = "incomeItems" ) - @TableTitle(title ="所得项目",dataIndex = "incomeItems",key = "incomeItems") + @TableTitle(title = "所得项目", dataIndex = "incomeItems", key = "incomeItems") + @ExcelHead(title = "所得项目", dataIndex = "incomeItems") private String incomeItems; @SalaryTableColumn( text = "劳务收入", width = "10%", column = "laborIncome" ) - @TableTitle(title ="劳务收入",dataIndex = "laborIncome",key = "laborIncome") + @TableTitle(title = "劳务收入", dataIndex = "laborIncome", key = "laborIncome") + @ExcelHead(title = "劳务收入", dataIndex = "laborIncome") private String laborIncome; @SalaryTableColumn( text = "劳务免税收入", width = "10%", column = "laborTaxFreeIncome" ) - @TableTitle(title ="劳务免税收入",dataIndex = "laborTaxFreeIncome",key = "laborTaxFreeIncome") + @TableTitle(title = "劳务免税收入", dataIndex = "laborTaxFreeIncome", key = "laborTaxFreeIncome") + @ExcelHead(title = "劳务免税收入", dataIndex = "laborTaxFreeIncome") private String laborTaxFreeIncome; @SalaryTableColumn( text = "商业健康保险", width = "10%", column = "commercialHealthInsurance" ) - @TableTitle(title ="商业健康保险",dataIndex = "commercialHealthInsurance",key = "commercialHealthInsurance") + @TableTitle(title = "商业健康保险", dataIndex = "commercialHealthInsurance", key = "commercialHealthInsurance") + @ExcelHead(title = "商业健康保险", dataIndex = "commercialHealthInsurance") private String commercialHealthInsurance; @SalaryTableColumn( text = "税延养老保险", width = "10%", column = "taxDeferredEndowmentInsurance" ) - @TableTitle(title ="税延养老保险",dataIndex = "taxDeferredEndowmentInsurance",key = "taxDeferredEndowmentInsurance") + @TableTitle(title = "税延养老保险", dataIndex = "taxDeferredEndowmentInsurance", key = "taxDeferredEndowmentInsurance") + @ExcelHead(title = "税延养老保险", dataIndex = "taxDeferredEndowmentInsurance") private String taxDeferredEndowmentInsurance; @SalaryTableColumn( text = "其他", width = "10%", column = "other" ) - @TableTitle(title ="其他",dataIndex = "other",key = "other") + @TableTitle(title = "其他", dataIndex = "other", key = "other") + @ExcelHead(title = "其他", dataIndex = "other") private String other; @SalaryTableColumn( text = "准予扣除的捐赠额", width = "10%", column = "allowedDonation" ) - @TableTitle(title ="准予扣除的捐赠额",dataIndex = "allowedDonation",key = "allowedDonation") + @TableTitle(title = "准予扣除的捐赠额", dataIndex = "allowedDonation", key = "allowedDonation") + @ExcelHead(title = "准予扣除的捐赠额", dataIndex = "allowedDonation") private String allowedDonation; @SalaryTableColumn( text = "减免税额", width = "10%", column = "taxDeduction" ) - @TableTitle(title ="减免税额",dataIndex = "taxDeduction",key = "taxDeduction") + @TableTitle(title = "减免税额", dataIndex = "taxDeduction", key = "taxDeduction") + @ExcelHead(title = "减免税额", dataIndex = "taxDeduction") private String taxDeduction; @SalaryTableColumn( text = "备注", width = "10%", column = "description" ) - @TableTitle(title ="备注",dataIndex = "description",key = "description") + @TableTitle(title = "备注", dataIndex = "description", key = "description") + @ExcelHead(title = "备注", dataIndex = "description") private String description; } diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationWageListDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationWageListDTO.java index 3725aaf27..419f8f1e0 100644 --- a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationWageListDTO.java +++ b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclarationWageListDTO.java @@ -4,6 +4,7 @@ import com.cloudstore.eccom.pc.table.WeaTableType; import com.engine.salary.annotation.SalaryTable; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.annotation.TableTitle; +import com.engine.salary.util.excel.ExcelHead; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -35,101 +36,126 @@ public class TaxDeclarationWageListDTO { @SalaryTableColumn(text = "工号", width = "10%", column = "jobNum") @TableTitle(title = "工号", dataIndex = "jobNum", key = "jobNum") + @ExcelHead(title = "工号", dataIndex = "jobNum") private String jobNum; @SalaryTableColumn(text = "姓名", width = "10%", column = "username") @TableTitle(title = "姓名", dataIndex = "username", key = "username") + @ExcelHead(title = "姓名", dataIndex = "username") private String username; @SalaryTableColumn(text = "证件类型", width = "10%", column = "cardType") @TableTitle(title = "证件类型", dataIndex = "cardType", key = "cardType") + @ExcelHead(title = "证件类型", dataIndex = "cardType") private String cardType; @SalaryTableColumn(text = "证件号码", width = "10%", column = "cardNum") @TableTitle(title = "证件号码", dataIndex = "cardNum", key = "cardNum") + @ExcelHead(title = "证件号码", dataIndex = "cardNum") private String cardNum; @SalaryTableColumn(text = "本期收入", width = "10%", column = "income") @TableTitle(title = "本期收入", dataIndex = "income", key = "income") + @ExcelHead(title = "本期收入", dataIndex = "income") private String income; @SalaryTableColumn(text = "本期免税收入", width = "10%", column = "taxFreeIncome") @TableTitle(title = "本期免税收入", dataIndex = "taxFreeIncome", key = "taxFreeIncome") + @ExcelHead(title = "本期免税收入", dataIndex = "taxFreeIncome") private String taxFreeIncome; @SalaryTableColumn(text = "基本养老保险费", width = "10%", column = "endowmentInsurance") @TableTitle(title = "基本养老保险费", dataIndex = "endowmentInsurance", key = "endowmentInsurance") + @ExcelHead(title = "基本养老保险费", dataIndex = "endowmentInsurance") private String endowmentInsurance; @SalaryTableColumn(text = "基本医疗保险费", width = "10%", column = "medicalInsurance") @TableTitle(title = "基本医疗保险费", dataIndex = "medicalInsurance", key = "medicalInsurance") + @ExcelHead(title = "基本医疗保险费", dataIndex = "medicalInsurance") private String medicalInsurance; @SalaryTableColumn(text = "失业保险费", width = "10%", column = "unemploymentInsurance") @TableTitle(title = "失业保险费", dataIndex = "unemploymentInsurance", key = "unemploymentInsurance") + @ExcelHead(title = "失业保险费", dataIndex = "unemploymentInsurance") private String unemploymentInsurance; @SalaryTableColumn(text = "住房公积金", width = "10%", column = "housingProvidentFund") @TableTitle(title = "住房公积金", dataIndex = "housingProvidentFund", key = "housingProvidentFund") + @ExcelHead(title = "住房公积金", dataIndex = "housingProvidentFund") private String housingProvidentFund; @SalaryTableColumn(text = "累计子女教育", width = "10%", column = "addUpChildEducation") @TableTitle(title = "累计子女教育", dataIndex = "addUpChildEducation", key = "addUpChildEducation") + @ExcelHead(title = "累计子女教育", dataIndex = "addUpChildEducation") private String addUpChildEducation; @SalaryTableColumn(text = "累计住房贷款利息", width = "10%", column = "addUpHousingLoanInterest") @TableTitle(title = "累计住房贷款利息", dataIndex = "addUpHousingLoanInterest", key = "addUpHousingLoanInterest") + @ExcelHead(title = "累计住房贷款利息", dataIndex = "addUpHousingLoanInterest") private String addUpHousingLoanInterest; @SalaryTableColumn(text = "累计住房租金", width = "10%", column = "addUpHousingRent") @TableTitle(title = "累计住房租金", dataIndex = "addUpHousingRent", key = "addUpHousingRent") + @ExcelHead(title = "累计住房租金", dataIndex = "addUpHousingRent") private String addUpHousingRent; @SalaryTableColumn(text = "累计继续教育", width = "10%", column = "addUpContinuingEducation") @TableTitle(title = "累计继续教育", dataIndex = "addUpContinuingEducation", key = "addUpContinuingEducation") + @ExcelHead(title = "累计继续教育", dataIndex = "addUpContinuingEducation") private String addUpContinuingEducation; @SalaryTableColumn(text = "累计赡养老人", width = "10%", column = "addUpSupportElderly") @TableTitle(title = "累计赡养老人", dataIndex = "addUpSupportElderly", key = "addUpSupportElderly") + @ExcelHead(title = "累计赡养老人", dataIndex = "addUpSupportElderly") private String addUpSupportElderly; @SalaryTableColumn(text = "累计大病医疗", width = "10%", column = "addUpIllnessMedical") @TableTitle(title = "累计大病医疗", dataIndex = "addUpIllnessMedical", key = "addUpIllnessMedical") + @ExcelHead(title = "累计大病医疗", dataIndex = "addUpIllnessMedical") private String addUpIllnessMedical; @SalaryTableColumn(text = "累计3岁以下婴幼儿照护", width = "10%", column = "addUpInfantCare") @TableTitle(title = "累计3岁以下婴幼儿照护", dataIndex = "addUpInfantCare", key = "addUpInfantCare") + @ExcelHead(title = "累计3岁以下婴幼儿照护", dataIndex = "addUpInfantCare") private String addUpInfantCare; @SalaryTableColumn(text = "累计个人养老金", width = "10%", column = "addUpPrivatePension") @TableTitle(title = "累计个人养老金", dataIndex = "addUpPrivatePension", key = "addUpPrivatePension") + @ExcelHead(title = "累计个人养老金", dataIndex = "addUpPrivatePension") private String addUpPrivatePension; @SalaryTableColumn(text = "企业(职业)年金", width = "10%", column = "annuity") @TableTitle(title = "企业(职业)年金", dataIndex = "annuity", key = "annuity") + @ExcelHead(title = "企业(职业)年金", dataIndex = "annuity") private String annuity; @SalaryTableColumn(text = "商业健康保险", width = "10%", column = "commercialHealthInsurance") @TableTitle(title = "商业健康保险", dataIndex = "commercialHealthInsurance", key = "commercialHealthInsurance") + @ExcelHead(title = "商业健康保险", dataIndex = "commercialHealthInsurance") private String commercialHealthInsurance; @SalaryTableColumn(text = "税延养老保险", width = "10%", column = "taxDeferredEndowmentInsurance") @TableTitle(title = "税延养老保险", dataIndex = "taxDeferredEndowmentInsurance", key = "taxDeferredEndowmentInsurance") + @ExcelHead(title = "税延养老保险", dataIndex = "taxDeferredEndowmentInsurance") private String taxDeferredEndowmentInsurance; @SalaryTableColumn(text = "其他", width = "10%", column = "other") @TableTitle(title = "其他", dataIndex = "other", key = "other") + @ExcelHead(title = "其他", dataIndex = "other") private String other; @SalaryTableColumn(text = "准予扣除的捐赠额", width = "10%", column = "allowedDonation") @TableTitle(title = "准予扣除的捐赠额", dataIndex = "allowedDonation", key = "allowedDonation") + @ExcelHead(title = "准予扣除的捐赠额", dataIndex = "allowedDonation") private String allowedDonation; @SalaryTableColumn(text = "减免税额", width = "10%", column = "taxDeduction") @TableTitle(title = "减免税额", dataIndex = "taxDeduction", key = "taxDeduction") + @ExcelHead(title = "减免税额", dataIndex = "taxDeduction") private String taxDeduction; @SalaryTableColumn(text = "备注", width = "10%", column = "description") @TableTitle(title = "备注", dataIndex = "description", key = "description") + @ExcelHead(title = "备注", dataIndex = "description") private String description; } diff --git a/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclareRecordDetailFormDTO.java b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclareRecordDetailFormDTO.java new file mode 100644 index 000000000..04e7d0bff --- /dev/null +++ b/src/com/engine/salary/entity/taxdeclaration/dto/TaxDeclareRecordDetailFormDTO.java @@ -0,0 +1,87 @@ +package com.engine.salary.entity.taxdeclaration.dto; + +import com.engine.salary.annotation.TableTitle; +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; +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; + +import java.util.List; +import java.util.Map; + +/** + * 个税申报明细新增表单 + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TaxDeclareRecordDetailFormDTO { + + /** + * 个税申报表id + */ + private Long taxDeclarationId; + + //主键id + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + //人员id + @JsonSerialize(using = ToStringSerializer.class) + private Long employeeId; + private Integer employeeType; + + @TableTitle(title = "工号", dataIndex = "jobNum", key = "jobNum") + private String jobNum; + + @TableTitle(title = "姓名", dataIndex = "username", key = "username") + private String username; + + @TableTitle(title = "证件类型", dataIndex = "cardType", key = "cardType") + private String cardType; + + @TableTitle(title = "证件号码", dataIndex = "cardNum", key = "cardNum") + private String cardNum; + + /** + * 收入所得项目 + */ + private String incomeCategory; + + /** + * 人员报送下拉选择 + */ + private List employeeDeclares; + + /** + * 当前申报类型可编辑字段 + */ + private List taxReportColumns; + private Map resultValue; + + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class TaxReportColumn { + //报表类型 + private String taxReportType; + //所得项目 + private String incomeCategory; + //申报表列索引 + private String reportColumnDataIndex ; + //申报表的列名 + private String reportColumnName; + //数值类型 + private String dataType; + } +} diff --git a/src/com/engine/salary/entity/taxdeclaration/param/DeclareTaxResultFeedbackQueryParam.java b/src/com/engine/salary/entity/taxdeclaration/param/DeclareTaxResultFeedbackQueryParam.java new file mode 100644 index 000000000..7ce6c69c7 --- /dev/null +++ b/src/com/engine/salary/entity/taxdeclaration/param/DeclareTaxResultFeedbackQueryParam.java @@ -0,0 +1,18 @@ +package com.engine.salary.entity.taxdeclaration.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@Data +@Builder +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class DeclareTaxResultFeedbackQueryParam { + Long id; + + String requestId; +} diff --git a/src/com/engine/salary/entity/taxdeclaration/param/DownloadTemplateParam.java b/src/com/engine/salary/entity/taxdeclaration/param/DownloadTemplateParam.java new file mode 100644 index 000000000..d9371b3fd --- /dev/null +++ b/src/com/engine/salary/entity/taxdeclaration/param/DownloadTemplateParam.java @@ -0,0 +1,26 @@ +package com.engine.salary.entity.taxdeclaration.param; + +import com.engine.salary.util.valid.DataCheck; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DownloadTemplateParam { + /** + * 申报表id,下载模板 + */ + @DataCheck(require = true,message = "imageId为空") + Long taxDeclarationId; + + + + /** + * 导入文件id + */ + String imageId; +} diff --git a/src/com/engine/salary/entity/taxdeclaration/param/TaxDeclareRecordDetailFormParam.java b/src/com/engine/salary/entity/taxdeclaration/param/TaxDeclareRecordDetailFormParam.java new file mode 100644 index 000000000..3386119bf --- /dev/null +++ b/src/com/engine/salary/entity/taxdeclaration/param/TaxDeclareRecordDetailFormParam.java @@ -0,0 +1,21 @@ +package com.engine.salary.entity.taxdeclaration.param; + +import lombok.Data; + +/** + * 个税申报明细保存 + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Data +public class TaxDeclareRecordDetailFormParam { + + /** + * 个税申报表id + */ + private Long taxDeclarationId; + +} diff --git a/src/com/engine/salary/entity/taxdeclaration/param/TaxDeclareRecordDetailSaveParam.java b/src/com/engine/salary/entity/taxdeclaration/param/TaxDeclareRecordDetailSaveParam.java new file mode 100644 index 000000000..0f60decd9 --- /dev/null +++ b/src/com/engine/salary/entity/taxdeclaration/param/TaxDeclareRecordDetailSaveParam.java @@ -0,0 +1,34 @@ +package com.engine.salary.entity.taxdeclaration.param; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.util.Map; + +/** + * 个税申报明细保存 + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Data +public class TaxDeclareRecordDetailSaveParam { + + //主键id + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + //个税申报表id + private Long taxDeclarationId; + + //人员id + @JsonSerialize(using = ToStringSerializer.class) + private Long employeeId; + private Integer employeeType; + + private Map taxReportColumnValues; + +} diff --git a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java index 11b97036b..9c88986dd 100644 --- a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java +++ b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.taxdeclaration.po; import com.engine.salary.annotation.Encrypt; +import com.engine.salary.enums.taxdeclaration.SourceEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -88,6 +89,12 @@ public class TaxDeclarationValuePO implements Serializable { */ private Date updateTime; + /** + * 数据来源 + * @see SourceEnum + */ + private Integer source; + private Collection ids; private Collection taxDeclarationIds; diff --git a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclareRecordPO.java b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclareRecordPO.java index 6664f1985..e65fff3d7 100644 --- a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclareRecordPO.java +++ b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclareRecordPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.taxdeclaration.po; +import com.engine.salary.enums.taxdeclaration.TaxDeclareStatusEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -50,6 +51,7 @@ public class TaxDeclareRecordPO implements Serializable { private Integer taxDeclareType; /** * 申报状态 + * @see TaxDeclareStatusEnum */ private Integer taxDeclareStatus; /** @@ -60,6 +62,10 @@ public class TaxDeclareRecordPO implements Serializable { * 请求的requestId */ private String requestId; + /** + * 申报的requestId,用于下载申报过程 + */ + private String declareRequestId; /** * 备注 */ diff --git a/src/com/engine/salary/entity/taxdeclaration/po/TaxReportColumnPO.java b/src/com/engine/salary/entity/taxdeclaration/po/TaxReportColumnPO.java index 5e824dc48..a6591e714 100644 --- a/src/com/engine/salary/entity/taxdeclaration/po/TaxReportColumnPO.java +++ b/src/com/engine/salary/entity/taxdeclaration/po/TaxReportColumnPO.java @@ -20,34 +20,34 @@ import java.util.Date; @Builder @AllArgsConstructor @NoArgsConstructor -//hrsa_tax_report_column") +//hrsa_tax_report_column public class TaxReportColumnPO { - //name = "主键id") + //name = 主键id private Long id; - //name = "报表类型") + //name = 报表类型 private String taxReportType; - //name = "所得项目") + //name = 所得项目 private String incomeCategory; - //name = "申报表的列名") + //name = 申报表的列名 private String reportColumnName; - //name = "申报表的列名多语言标签") + //name = 申报表的列名多语言标签 private Integer reportColumnLabel; - //name = "申报表的列索引") + //name = 申报表的列索引 private String reportColumnDataIndex; - //name = "数值类型") + //name = 数值类型 private String dataType; - //name = "个税对接时的参数key") + //name = 个税对接时的参数key private String requestParamKey; - //name = "租户key", ignore = true) + //name = 租户key private String tenantKey; - //name = "创建人id", ignore = true) + //name = 创建人id private Long creator; - //name = "是否删除", ignore = true) + //name = 是否删除 private Integer deleteType; - //name = "创建时间", ignore = true) + //name = 创建时间 private Date createTime; - //name = "更新时间", ignore = true) + //name = 更新时间 private Date updateTime; Collection ids; diff --git a/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java b/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java index 75a8901b6..88e40e0de 100644 --- a/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java +++ b/src/com/engine/salary/enums/employeedeclare/EmploymentStatusEnum.java @@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare; import com.engine.salary.enums.BaseEnum; +import java.util.Arrays; + /** * 人员状态 *

Copyright: Copyright (c) 2023

@@ -41,4 +43,17 @@ public enum EmploymentStatusEnum implements BaseEnum { public Integer getLabelId() { return labelId; } + + public static Integer getValueByDefaultLabel(String defaultLabel) { + if (defaultLabel == null) { + return null; + } + EmploymentStatusEnum[] enumAry = EmploymentStatusEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getDefaultLabel().equals(defaultLabel)) { + return enumAry[i].getValue(); + } + } + return null; + } } diff --git a/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java b/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java index 609e7f8f8..08941637d 100644 --- a/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java +++ b/src/com/engine/salary/enums/employeedeclare/EmploymentTypeEnum.java @@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare; import com.engine.salary.enums.BaseEnum; +import java.util.Arrays; + /** * 任职受雇从业类型 *

Copyright: Copyright (c) 2023

@@ -44,4 +46,17 @@ public enum EmploymentTypeEnum implements BaseEnum { public Integer getLabelId() { return labelId; } + + public static Integer getValueByDefaultLabel(String defaultLabel) { + if (defaultLabel == null) { + return null; + } + EmploymentTypeEnum[] enumAry = EmploymentTypeEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getDefaultLabel().equals(defaultLabel)) { + return enumAry[i].getValue(); + } + } + return null; + } } diff --git a/src/com/engine/salary/enums/employeedeclare/GenderEnum.java b/src/com/engine/salary/enums/employeedeclare/GenderEnum.java index 805afa7bd..a4849d129 100644 --- a/src/com/engine/salary/enums/employeedeclare/GenderEnum.java +++ b/src/com/engine/salary/enums/employeedeclare/GenderEnum.java @@ -2,6 +2,8 @@ package com.engine.salary.enums.employeedeclare; import com.engine.salary.enums.BaseEnum; +import java.util.Arrays; + /** * 性别 *

Copyright: Copyright (c) 2023

@@ -41,4 +43,17 @@ public enum GenderEnum implements BaseEnum { public Integer getLabelId() { return labelId; } + + public static Integer getValueByDefaultLabel(String defaultLabel) { + if (defaultLabel == null) { + return null; + } + GenderEnum[] enumAry = GenderEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getDefaultLabel().equals(defaultLabel)) { + return enumAry[i].getValue(); + } + } + return null; + } } diff --git a/src/com/engine/salary/enums/salarysob/IncomeCategoryEnum.java b/src/com/engine/salary/enums/salarysob/IncomeCategoryEnum.java index 762b3e581..71009b4e6 100644 --- a/src/com/engine/salary/enums/salarysob/IncomeCategoryEnum.java +++ b/src/com/engine/salary/enums/salarysob/IncomeCategoryEnum.java @@ -1,13 +1,12 @@ package com.engine.salary.enums.salarysob; import com.engine.salary.enums.BaseEnum; +import com.engine.salary.remote.tax.response.employee.GetDeclareTaxResultFeedbackResponse; +import com.engine.salary.util.excel.ExcelUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; /** * 应税项目 @@ -20,19 +19,123 @@ import java.util.Objects; public enum IncomeCategoryEnum implements BaseEnum { // todo 多语言 - WAGES_AND_SALARIES(1, "0101", "正常工资薪金", 160487), - REMUNERATION_FOR_LABOR(4, "0400", "一般劳务报酬所得", 160488), - ONETIME_ANNUAL_BONUS(2, "0103", "全年一次性奖金收入", 160489), - COMPENSATION_FOR_RETIRE(107, "0107", "内退一次性补偿金", 181936), - COMPENSATION_FOR_DISMISS(108, "0108", "解除劳动合同一次性补偿金", 181937), - INCOME_FOR_INDIVIDUAL_EQUITY_INCENTIVE(109, "0109", "个人股权激励收入", 181938), - ANNUITY_RECEIPT(110, "0110", "年金领取", 181939), - INCOME_FOR_INSURANCE_SALESMAN(402, "0402", "保险营销员佣金收入", 181940), - INCOME_FOR_SECURITIES_BROKER(403, "0403", "证券经纪人佣金收入", 181942), - REMUNERATION_FOR_OTHER_CONTINUOUS_LABOR(489, "0489", "其他连续劳务报酬所得", 181943), - REMUNERATION_FOR_OTHER_LABOR(499, "0499", "其他非连续劳务报酬所得", 175330), - REMUNERATION_FOR_AUTHOR(500, "0500", "稿酬所得", 181944), - ROYALTIES(600, "0600", "特许权使用费所得", 181945), + WAGES_AND_SALARIES(1, "0101", "正常工资薪金", 160487) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getZcgzxj().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + REMUNERATION_FOR_LABOR(4, "0400", "一般劳务报酬所得", 160488) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getLwbclb().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + ONETIME_ANNUAL_BONUS(2, "0103", "全年一次性奖金收入", 160489) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getQnycxjjsslb().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + COMPENSATION_FOR_RETIRE(107, "0107", "内退一次性补偿金", 181936) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getNtycxbcjlb().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + COMPENSATION_FOR_DISMISS(108, "0108", "解除劳动合同一次性补偿金", 181937) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getJcldhtycxbcjlb().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + INCOME_FOR_INDIVIDUAL_EQUITY_INCENTIVE(109, "0109", "个人股权激励收入", 181938) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getGrgqjl().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + ANNUITY_RECEIPT(110, "0110", "年金领取", 181939) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getQynj().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + INCOME_FOR_INSURANCE_SALESMAN(402, "0402", "保险营销员佣金收入", 181940) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getBxyxy().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + INCOME_FOR_SECURITIES_BROKER(403, "0403", "证券经纪人佣金收入", 181942) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getZqjjr().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + REMUNERATION_FOR_OTHER_CONTINUOUS_LABOR(489, "0489", "其他连续劳务报酬所得", 181943) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getQtlxlwbc().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + REMUNERATION_FOR_OTHER_LABOR(499, "0499", "其他非连续劳务报酬所得", 175330) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getQtflxlwbc().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + REMUNERATION_FOR_AUTHOR(500, "0500", "稿酬所得", 181944) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getGcsdlb().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, + ROYALTIES(600, "0600", "特许权使用费所得", 181945) { + @Override + public Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse) { + List zhsd = declareTaxResultFeedbackResponse.getBody().getZhsd().getTxq().getSscglb(); + List> zhsdSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, zhsd); + result.put(this.getDefaultLabel(), zhsdSheetData); + return result; + } + }, ; @@ -51,6 +154,8 @@ public enum IncomeCategoryEnum implements BaseEnum { this.labelId = labelId; } + public abstract Map>> parseGetDeclareTaxResultFeedbackResponse(Map>> result, GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse); + @Override public Integer getValue() { return value; @@ -79,6 +184,7 @@ public enum IncomeCategoryEnum implements BaseEnum { } return null; } + public static List parseByValue(Collection values) { if (CollectionUtils.isEmpty(values)) { return Collections.emptyList(); diff --git a/src/com/engine/salary/enums/taxdeclaration/SourceEnum.java b/src/com/engine/salary/enums/taxdeclaration/SourceEnum.java new file mode 100644 index 000000000..999720d3f --- /dev/null +++ b/src/com/engine/salary/enums/taxdeclaration/SourceEnum.java @@ -0,0 +1,48 @@ +package com.engine.salary.enums.taxdeclaration; + +import com.engine.salary.enums.BaseEnum; + +/** + * 作废申报 + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public enum SourceEnum implements BaseEnum { + + ACCT(0, "薪资核算", 160490), + AUTO(1, "自动补充", 160490), + ADD(2, "界面新增", 160491), + EDIT(3, "界面新增", 160491), + IMP(4, "界面导入", 160491); + + + SourceEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + private int value; + + private String defaultLabel; + + private int labelId; + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } +} diff --git a/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareMapper.xml b/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareMapper.xml index 890181735..008deae95 100644 --- a/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareMapper.xml +++ b/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareMapper.xml @@ -452,8 +452,7 @@ update_time ) VALUES - ( - + ( #{item.birthday}, #{item.cardNum}, #{item.cardType}, @@ -486,8 +485,8 @@ #{item.taxCycle}, #{item.tenantKey}, #{item.updateTime} - ) + @@ -838,6 +837,9 @@ AND declare_status = #{param.declareStatus.value} + + AND employee_id=#{param.employeeId} + AND employment_status = #{param.employmentStatus.value} diff --git a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml index a88ac1600..17e371c33 100644 --- a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml @@ -956,7 +956,7 @@ #{tenantKey}, - #{sms_setting}, + #{smsSetting}, diff --git a/src/com/engine/salary/mapper/taxagent/TaxAgentMapper.xml b/src/com/engine/salary/mapper/taxagent/TaxAgentMapper.xml index 2d9d361d5..4de75ae85 100644 --- a/src/com/engine/salary/mapper/taxagent/TaxAgentMapper.xml +++ b/src/com/engine/salary/mapper/taxagent/TaxAgentMapper.xml @@ -38,6 +38,31 @@ + + + + AND id IN + + #{id} + + + + AND name like '%'||#{param.name}||'%' + + + + + + AND id IN + + #{id} + + + + AND name like '%'+#{param.name}+'%' + + + diff --git a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java index 1515f916c..fc5d0415f 100644 --- a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java +++ b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java @@ -120,4 +120,9 @@ public interface TaxDeclarationValueMapper { */ void batchInsert(@Param("collection") Collection taxDeclarationValues); + + List queryNotWagesEmpIds(@Param("taxDeclareRecordId")Long taxDeclareRecordId); + + List queryWagesEmpIds(@Param("taxDeclareRecordId")Long taxDeclareRecordId); + } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml index dfcaecaf1..5eba618cb 100644 --- a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml +++ b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml @@ -13,6 +13,7 @@ + @@ -30,6 +31,7 @@ , t.employee_type , t.employee_id , t.result_value_json + , t.source @@ -88,6 +90,9 @@ AND result_value_json = #{resultValueJson} + + AND source = #{source} + AND id IN @@ -142,6 +147,9 @@ result_value_json, + + source, + @@ -177,6 +185,9 @@ #{resultValueJson}, + + #{source}, + @@ -195,7 +206,8 @@ tax_declaration_id, employee_type, employee_id, - result_value_json + result_value_json, + source ) VALUES ( @@ -210,7 +222,8 @@ #{item.taxDeclarationId}, #{item.employeeType}, #{item.employeeId}, - #{item.resultValueJson} + #{item.resultValueJson}, + #{item.source} ) @@ -228,7 +241,8 @@ tax_declaration_id, employee_type, employee_id, - result_value_json + result_value_json, + source ) @@ -243,7 +257,8 @@ #{item.taxDeclarationId,jdbcType=DOUBLE}, #{item.employeeType,jdbcType=INTEGER}, #{item.employeeId,jdbcType=DOUBLE}, - #{item.resultValueJson,jdbcType=VARCHAR} + #{item.resultValueJson,jdbcType=VARCHAR}, + #{item.source,jdbcType=INTEGER} from dual @@ -262,7 +277,8 @@ tax_declaration_id, employee_type, employee_id, - result_value_json + result_value_json, + source ) VALUES ( @@ -276,7 +292,8 @@ #{item.taxDeclarationId}, #{item.employeeType}, #{item.employeeId}, - #{item.resultValueJson} + #{item.resultValueJson}, + #{item.source} ) @@ -295,6 +312,7 @@ employee_type=#{employeeType}, employee_id=#{employeeId}, result_value_json=#{resultValueJson}, + source=#{source}, WHERE id = #{id} AND delete_type = 0 @@ -334,6 +352,9 @@ result_value_json=#{resultValueJson}, + + source=#{source}, + WHERE id = #{id} AND delete_type = 0 @@ -428,4 +449,24 @@ + + + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclareRecordMapper.xml b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclareRecordMapper.xml index 7edc1e580..c6b660859 100644 --- a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclareRecordMapper.xml +++ b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclareRecordMapper.xml @@ -13,6 +13,7 @@ + @@ -38,6 +39,7 @@ , t.tax_cycle , t.remark , t.request_id + , t.declare_request_id , t.tax_declare_type , t.tax_declare_status , t.display_update_icon @@ -105,6 +107,9 @@ AND request_id = #{requestId} + + AND declare_request_id = #{declareRequestId} + AND tax_declare_type = #{taxDeclareType} @@ -189,6 +194,9 @@ request_id, + + declare_request_id, + tax_declare_type, @@ -248,6 +256,9 @@ #{requestId}, + + #{declareRequestId}, + #{taxDeclareType}, @@ -291,6 +302,7 @@ tax_cycle, remark, request_id, + declare_request_id, tax_declare_type, tax_declare_status, display_update_icon, @@ -314,6 +326,7 @@ #{item.taxCycle}, #{item.remark}, #{item.requestId}, + #{item.declareRequestId}, #{item.taxDeclareType}, #{item.taxDeclareStatus}, #{item.displayUpdateIcon}, @@ -340,6 +353,7 @@ tax_cycle, remark, request_id, + declare_request_id, tax_declare_type, tax_declare_status, display_update_icon, @@ -363,6 +377,7 @@ #{item.taxCycle,jdbcType=DATE}, #{item.remark,jdbcType=VARCHAR}, #{item.requestId,jdbcType=DOUBLE}, + #{item.declareRequestId,jdbcType=VARCHAR}, #{item.taxDeclareType,jdbcType=INTEGER}, #{item.taxDeclareStatus,jdbcType=INTEGER}, #{item.displayUpdateIcon,jdbcType=INTEGER}, @@ -390,6 +405,7 @@ tax_cycle, remark, request_id, + declare_request_id, tax_declare_type, tax_declare_status, display_update_icon, @@ -412,6 +428,7 @@ #{item.taxCycle}, #{item.remark}, #{item.requestId}, + #{item.declareRequestId}, #{item.taxDeclareType}, #{item.taxDeclareStatus}, #{item.displayUpdateIcon}, @@ -438,6 +455,7 @@ tax_cycle=#{taxCycle}, remark=#{remark}, request_id=#{requestId}, + declare_request_id=#{declareRequestId}, tax_declare_type=#{taxDeclareType}, tax_declare_status=#{taxDeclareStatus}, display_update_icon=#{displayUpdateIcon}, @@ -485,6 +503,9 @@ request_id=#{requestId}, + + declare_request_id=#{declareRequestId}, + tax_declare_type=#{taxDeclareType}, diff --git a/src/com/engine/salary/remote/tax/response/employee/GetDeclareTaxResultFeedbackResponse.java b/src/com/engine/salary/remote/tax/response/employee/GetDeclareTaxResultFeedbackResponse.java index 47f9c42fe..1313ca083 100644 --- a/src/com/engine/salary/remote/tax/response/employee/GetDeclareTaxResultFeedbackResponse.java +++ b/src/com/engine/salary/remote/tax/response/employee/GetDeclareTaxResultFeedbackResponse.java @@ -58,10 +58,11 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { // * 限售股所得 必填:是 见限售股所得计算结果 // */ // private 对象 xsgsd; -// /** -// * 人员申报失败列表 必填:是 参考人员代报结果对象 -// */ -// private 数组 rysbsblb; + + /** + * 人员申报失败列表 必填:是 参考人员代报结果对象 + */ + private List rysbsblb; @Data public static class zhsd { @@ -73,66 +74,66 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { * 正常工资薪金算税结果对象 参考综合所得算税结果对象 */ private zcgzxj zcgzxj; -// /** -// * 全年一次性奖金收入算税结果对象 参考综合所得算税结果对象 -// */ -// private 对象 qnycxjjsslb; -// /** -// * 稿酬所得算税结果对象 参考综合所得算税结果对象 -// */ -// private 对象 gcsdlb; -// /** -// * 一般劳务报酬算税结果对象 参考综合所得算税结果对象 -// */ -// private 对象 lwbclb; -// /** -// * 解除劳动合同一次性补偿金列表 参考综合所得算税结果对象 -// */ -// private 对象 jcldhtycxbcjlb; -// /** -// * 保险营销员薪金算税结果对象 参考综合所得算税结果对象 -// */ -// private 对象 bxyxy; -// /** -// * 证券经纪人薪金算税结果对象 参考综合所得算税结果对象 -// */ -// private 对象 zqjjr; -// /** -// * 特许权算税结果对象 参考综合所得算税结果对象 -// */ -// private 对象 txq; -// /** -// * 个人股权激励结果对象 参考综合所得算税结果对象 -// */ -// private 对象 grgqjl; -// /** -// * 企业年金结果对象 参考综合所得算税结果对象 -// */ -// private 对象 qynj; -// /** -// * 内退一次性补偿金 参考综合所得算税结果对象 -// */ -// private 对象 ntycxbcjlb; -// /** -// * 其他连续劳务报酬 参考综合所得算税结果对象 -// */ -// private 对象 qtlxlwbc; -// /** -// * 其他非连续劳务报酬 参考综合所得算税结果对象 -// */ -// private 对象 qtflxlwbc; -// /** -// * 提前退休一次性补贴 参考综合所得算税结果对象 -// */ -// private 对象 tqtxycxbt; -// /** -// * 央企负责人绩效薪金延期兑现收入和任期奖励 参考综合所得算税结果对象 -// */ -// private 对象 yqfzrsrhjl; -// /** -// * 法律援助劳务报酬 参考综合所得算税结果对象 -// */ -// private 对象 flyzlwbclb; + /** + * 全年一次性奖金收入算税结果对象 参考综合所得算税结果对象 + */ + private zcgzxj qnycxjjsslb; + /** + * 稿酬所得算税结果对象 参考综合所得算税结果对象 + */ + private zcgzxj gcsdlb; + /** + * 一般劳务报酬算税结果对象 参考综合所得算税结果对象 + */ + private zcgzxj lwbclb; + /** + * 解除劳动合同一次性补偿金列表 参考综合所得算税结果对象 + */ + private zcgzxj jcldhtycxbcjlb; + /** + * 保险营销员薪金算税结果对象 参考综合所得算税结果对象 + */ + private zcgzxj bxyxy; + /** + * 证券经纪人薪金算税结果对象 参考综合所得算税结果对象 + */ + private zcgzxj zqjjr; + /** + * 特许权算税结果对象 参考综合所得算税结果对象 + */ + private zcgzxj txq; + /** + * 个人股权激励结果对象 参考综合所得算税结果对象 + */ + private zcgzxj grgqjl; + /** + * 企业年金结果对象 参考综合所得算税结果对象 + */ + private zcgzxj qynj; + /** + * 内退一次性补偿金 参考综合所得算税结果对象 + */ + private zcgzxj ntycxbcjlb; + /** + * 其他连续劳务报酬 参考综合所得算税结果对象 + */ + private zcgzxj qtlxlwbc; + /** + * 其他非连续劳务报酬 参考综合所得算税结果对象 + */ + private zcgzxj qtflxlwbc; + /** + * 提前退休一次性补贴 参考综合所得算税结果对象 + */ + private zcgzxj tqtxycxbt; + /** + * 央企负责人绩效薪金延期兑现收入和任期奖励 参考综合所得算税结果对象 + */ + private zcgzxj yqfzrsrhjl; + /** + * 法律援助劳务报酬 参考综合所得算税结果对象 + */ + private zcgzxj flyzlwbclb; /** @@ -234,7 +235,6 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { /** * 是否明细申报 必填:否 是或者否 */ - @SalaryTableColumn(text = "是否明细申报", width = "10%", column = "sfmxsb") private String sfmxsb; /** * 姓名 必填:null 如果是汇总申报返回空 @@ -264,133 +264,143 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { /** * 当期收入额 必填:是 不填写默认为0 */ - @SalaryTableColumn(text = "当期收入额", width = "10%", column = "sre") + @SalaryTableColumn(text = "本期收入", width = "10%", column = "sre") private BigDecimal sre; /** * 当期免税收入 必填:null */ - @SalaryTableColumn(text = "当期免税收入", width = "10%", column = "mssd") + @SalaryTableColumn(text = "本期免税收入", width = "10%", column = "mssd") private BigDecimal mssd; /** * 基本养老保险 必填:null */ - @SalaryTableColumn(text = "基本养老保险", width = "10%", column = "jbylaobxf") + @SalaryTableColumn(text = "本期基本养老保险费", width = "10%", column = "jbylaobxf") private BigDecimal jbylaobxf; /** * 基本医疗保险 必填:null */ - @SalaryTableColumn(text = "基本医疗保险", width = "10%", column = "jbylbxf") + @SalaryTableColumn(text = "本期基本医疗保险费", width = "10%", column = "jbylbxf") private BigDecimal jbylbxf; /** * 失业保险 必填:null */ - @SalaryTableColumn(text = "失业保险", width = "10%", column = "sybxf") + @SalaryTableColumn(text = "本期失业保险费", width = "10%", column = "sybxf") private BigDecimal sybxf; /** * 住房公积金 必填:null */ - @SalaryTableColumn(text = "住房公积金", width = "10%", column = "zfgjj") + @SalaryTableColumn(text = "本期住房公积金", width = "10%", column = "zfgjj") private BigDecimal zfgjj; - /** - * 子女教育支出 必填:null - */ - @SalaryTableColumn(text = "子女教育支出", width = "10%", column = "znjyzc") - private BigDecimal znjyzc; - /** - * 赡养老人支出 必填:null - */ - @SalaryTableColumn(text = "赡养老人支出", width = "10%", column = "sylrzc") - private BigDecimal sylrzc; - /** - * 住房贷款利息支出 必填:null - */ - @SalaryTableColumn(text = "住房贷款利息支出", width = "10%", column = "zfdklxzc") - private BigDecimal zfdklxzc; - /** - * 住房租金支出 必填:null - */ - @SalaryTableColumn(text = "住房租金支出", width = "10%", column = "zfzjzc") - private BigDecimal zfzjzc; - /** - * 继续教育支出 必填:null - */ - @SalaryTableColumn(text = "继续教育支出", width = "10%", column = "jxjyzc") - private BigDecimal jxjyzc; - /** - * 非学历继续教育支出 必填:null - */ - @SalaryTableColumn(text = "非学历继续教育支出", width = "10%", column = "fxljxjyzc") - private BigDecimal fxljxjyzc; - /** - * 3岁以下婴幼儿照护支出 必填:null - */ - @SalaryTableColumn(text = "3岁以下婴幼儿照护支出", width = "10%", column = "yyezhzc") - private BigDecimal yyezhzc; + /** * 年金 必填:null */ - @SalaryTableColumn(text = "年金", width = "10%", column = "nj") + @SalaryTableColumn(text = "本期企业(职业)年金", width = "10%", column = "nj") private BigDecimal nj; + /** * 商业健康保险 必填:null */ - @SalaryTableColumn(text = "商业健康保险", width = "10%", column = "syjkbx") + @SalaryTableColumn(text = "本期商业健康保险费", width = "10%", column = "syjkbx") private BigDecimal syjkbx; /** * 税延养老保险 必填:null */ - @SalaryTableColumn(text = "税延养老保险", width = "10%", column = "syylbx") + @SalaryTableColumn(text = "本期税延养老保险费", width = "10%", column = "syylbx") private BigDecimal syylbx; /** * 其他 必填:null 按法律规定可以在税前扣除的项目 */ - @SalaryTableColumn(text = "其他", width = "10%", column = "qt") + @SalaryTableColumn(text = "本期其他扣除(其他)", width = "10%", column = "qt") private BigDecimal qt; + /** - * 准予扣除的捐赠额 必填:null + * 累计收入额 必填:null */ - @SalaryTableColumn(text = "准予扣除的捐赠额", width = "10%", column = "zykcjze") - private BigDecimal zykcjze; + @SalaryTableColumn(text = "累计收入额", width = "10%", column = "ljsre") + private BigDecimal ljsre; /** - * 减免税额 必填:null + * 累计免税收入额 必填:null */ - @SalaryTableColumn(text = "减免税额", width = "10%", column = "jmse") - private BigDecimal jmse; + @SalaryTableColumn(text = "累计免税收入", width = "10%", column = "ljmssd") + private BigDecimal ljmssd; + /** - * 备注 必填:null + * 累计减除费用额 必填:null 正常工资薪金累计减除费用 对应保险营销员、证券经纪人累计费用 */ - @SalaryTableColumn(text = "备注", width = "10%", column = "bz") - private String bz; + @SalaryTableColumn(text = "累计减除费用", width = "10%", column = "ljjcfye") + private BigDecimal ljjcfye; + /** - * 减除费用 必填:null 正常工资薪金的减除费用。 对应保险营销员、证券经纪人的费用 + * 累计专项扣除额 必填:null 三险一金合计 */ - @SalaryTableColumn(text = "减除费用", width = "10%", column = "jcfy") - private BigDecimal jcfy; + @SalaryTableColumn(text = "累计专项扣除", width = "10%", column = "ljzxkce") + private BigDecimal ljzxkce; + /** - * 其他扣除合计 必填:null + * 累计子女教育支出 必填:null */ - @SalaryTableColumn(text = "其他扣除合计", width = "10%", column = "qtckhj") - private BigDecimal qtckhj; + @SalaryTableColumn(text = "累计子女教育支出扣除", width = "10%", column = "ljznjyzc") + private BigDecimal ljznjyzc; /** - * 应纳税所得额 必填:null 正常工资薪金返回Null + * 累计继续教育支出 必填:null */ - @SalaryTableColumn(text = "应纳税所得额", width = "10%", column = "ynssde") - private BigDecimal ynssde; + @SalaryTableColumn(text = "累计继续教育支出扣除", width = "10%", column = "ljjxjyzc") + private BigDecimal ljjxjyzc; /** - * 应纳税额 必填:null 正常工资薪金返回Null + * 累计非学历继续教育支持 必填:null */ - @SalaryTableColumn(text = "应纳税额", width = "10%", column = "ynse") - private BigDecimal ynse; + private BigDecimal ljfxljxjyzc; /** - * 已缴税额 必填:null 正常工资薪金返回Null + * 累计学历继续教育支持 必填:null */ - @SalaryTableColumn(text = "已缴税额", width = "10%", column = "ykjse") - private BigDecimal ykjse; + private BigDecimal ljxljxjyzc; /** - * 应扣缴税额 必填:null 正常工资薪金返回Null + * 累计住房租金支出 必填:null */ - @SalaryTableColumn(text = "应扣缴税额", width = "10%", column = "yingkjse") - private BigDecimal yingkjse; + @SalaryTableColumn(text = "累计住房租金支出扣除", width = "10%", column = "ljzfzjzc") + private BigDecimal ljzfzjzc; + /** + * 累计房屋贷款支出 必填:null + */ + @SalaryTableColumn(text = "累计房屋贷款支出扣除", width = "10%", column = "ljzfdklxzc") + private BigDecimal ljzfdklxzc; + /** + * 累计赡养老人支出 必填:null + */ + @SalaryTableColumn(text = "累计赡养老人支出扣除", width = "10%", column = "ljsylrzc") + private BigDecimal ljsylrzc; + /** + * 累计3岁以下婴幼儿照护支出 必填:null + */ + @SalaryTableColumn(text = "累计3岁以下婴幼儿照护", width = "10%", column = "ljyyezhzc") + private BigDecimal ljyyezhzc; + + + /** + * 累计个人养老金 必填:null + */ + @SalaryTableColumn(text = "累计个人养老金", width = "10%", column = "ljgrylj") + private BigDecimal ljgrylj; + + /** + * 累计其他扣除额 必填:null + */ + @SalaryTableColumn(text = "累计其他扣除", width = "10%", column = "ljqtkce") + private BigDecimal ljqtkce; + + /** + * 累计准予扣除的捐赠额 必填:null + */ + @SalaryTableColumn(text = "累计准予扣除的捐赠", width = "10%", column = "ljzykcjze") + private BigDecimal ljzykcjze; + + /** + * 累计应纳税所得额 必填:null + */ + @SalaryTableColumn(text = "累计应纳税所得额", width = "10%", column = "ljynssde") + private BigDecimal ljynssde; + /** * 税率 必填:null */ @@ -401,81 +411,19 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { */ @SalaryTableColumn(text = "速算扣除数", width = "10%", column = "sskcs") private BigDecimal sskcs; - /** - * 所得项目名称 必填:是 正常工资薪金;全年一次性奖金收入;稿酬所得;劳务报酬 - */ - @SalaryTableColumn(text = "所得项目名称", width = "10%", column = "sdxm") - private String sdxm; - /** - * 应补退税额 必填:null 应补退税额=累计应扣缴税额-累计已缴税额 - */ - @SalaryTableColumn(text = "应补退税额", width = "10%", column = "ybtse") - private BigDecimal ybtse; - /** - * 累计收入额 必填:null - */ - @SalaryTableColumn(text = "累计收入额", width = "10%", column = "ljsre") - private BigDecimal ljsre; - /** - * 累计免税收入额 必填:null - */ - @SalaryTableColumn(text = "累计免税收入额", width = "10%", column = "ljmssd") - private BigDecimal ljmssd; - /** - * 累计专项扣除额 必填:null 三险一金合计 - */ - @SalaryTableColumn(text = "累计专项扣除额", width = "10%", column = "ljzxkce") - private BigDecimal ljzxkce; - /** - * 累计专项附加扣除额 必填:null 专项附加合计 - */ - @SalaryTableColumn(text = "累计专项附加扣除额", width = "10%", column = "ljzxfjkce") - private BigDecimal ljzxfjkce; - /** - * 累计其他扣除额 必填:null - */ - @SalaryTableColumn(text = "累计其他扣除额", width = "10%", column = "ljqtkce") - private BigDecimal ljqtkce; - /** - * 累计减免税额 必填:null - */ - @SalaryTableColumn(text = "累计减免税额", width = "10%", column = "ljjmse") - private BigDecimal ljjmse; - /** - * 累计减除费用额 必填:null 正常工资薪金累计减除费用 对应保险营销员、证券经纪人累计费用 - */ - @SalaryTableColumn(text = "累计减除费用额", width = "10%", column = "ljjcfye") - private BigDecimal ljjcfye; - /** - * 累计月减除费用 必填:null 保险营销员、证券经纪人,其他连续劳务报酬的减除费用 - */ - @SalaryTableColumn(text = "累计月减除费用", width = "10%", column = "ljyjcfy") - private BigDecimal ljyjcfy; - /** - * 允许扣除税费 必填:null 保险营销员、证券经纪人 - */ - @SalaryTableColumn(text = "允许扣除税费", width = "10%", column = "yxkcsf") - private BigDecimal yxkcsf; - /** - * 展业成本 必填:null 保险营销员、证券经纪人 - */ - @SalaryTableColumn(text = "展业成本", width = "10%", column = "zycb") - private BigDecimal zycb; - /** - * 月减除费用 必填:null 保险营销员、证券经纪人,其他连续劳务报酬的减除费用 - */ - @SalaryTableColumn(text = "月减除费用", width = "10%", column = "yjcfy") - private BigDecimal yjcfy; - /** - * 累计应纳税所得额 必填:null - */ - @SalaryTableColumn(text = "累计应纳税所得额", width = "10%", column = "ljynssde") - private BigDecimal ljynssde; + /** * 累计应纳税额 必填:null */ @SalaryTableColumn(text = "累计应纳税额", width = "10%", column = "ljynse") private BigDecimal ljynse; + + /** + * 累计减免税额 必填:null + */ + @SalaryTableColumn(text = "累计减免税额", width = "10%", column = "ljjmse") + private BigDecimal ljjmse; + /** * 累计应扣缴税额 必填:null 累计应扣缴税额 = 累计应纳税额 - 累计减免税额 */ @@ -487,59 +435,114 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { @SalaryTableColumn(text = "累计已缴税额", width = "10%", column = "ljykjse") private BigDecimal ljykjse; /** - * 累计子女教育支出 必填:null + * 已缴税额 必填:null 正常工资薪金返回Null */ - @SalaryTableColumn(text = "累计子女教育支出", width = "10%", column = "ljznjyzc") - private BigDecimal ljznjyzc; + @SalaryTableColumn(text = "已缴税额", width = "10%", column = "ykjse") + private BigDecimal ykjse; + /** - * 累计继续教育支出 必填:null + * 累计专项附加扣除额 必填:null 专项附加合计 */ - @SalaryTableColumn(text = "累计继续教育支出", width = "10%", column = "ljjxjyzc") - private BigDecimal ljjxjyzc; + @SalaryTableColumn(text = "累计专项附加扣除额", width = "10%", column = "ljzxfjkce") + private BigDecimal ljzxfjkce; + /** - * 累计非学历继续教育支持 必填:null + * 应补退税额 必填:null 应补退税额=累计应扣缴税额-累计已缴税额 */ - @SalaryTableColumn(text = "累计非学历继续教育支持", width = "10%", column = "ljfxljxjyzc") - private BigDecimal ljfxljxjyzc; + @SalaryTableColumn(text = "应补退税额", width = "10%", column = "ybtse") + private BigDecimal ybtse; + /** - * 累计学历继续教育支持 必填:null + * 备注 必填:null */ - @SalaryTableColumn(text = "累计学历继续教育支持", width = "10%", column = "ljxljxjyzc") - private BigDecimal ljxljxjyzc; + @SalaryTableColumn(text = "备注", width = "10%", column = "bz") + private String bz; + /** - * 累计住房租金支出 必填:null + * 子女教育支出 必填:null */ - @SalaryTableColumn(text = "累计住房租金支出", width = "10%", column = "ljzfzjzc") - private BigDecimal ljzfzjzc; + private BigDecimal znjyzc; /** - * 累计房屋贷款支出 必填:null + * 赡养老人支出 必填:null */ - @SalaryTableColumn(text = "累计房屋贷款支出", width = "10%", column = "ljzfdklxzc") - private BigDecimal ljzfdklxzc; + private BigDecimal sylrzc; /** - * 累计赡养老人支出 必填:null + * 住房贷款利息支出 必填:null */ - @SalaryTableColumn(text = "累计赡养老人支出", width = "10%", column = "ljsylrzc") - private BigDecimal ljsylrzc; + private BigDecimal zfdklxzc; /** - * 累计3岁以下婴幼儿照护支出 必填:null + * 住房租金支出 必填:null */ - @SalaryTableColumn(text = "累计3岁以下婴幼儿照护支出", width = "10%", column = "ljyyezhzc") - private BigDecimal ljyyezhzc; + private BigDecimal zfzjzc; /** - * 累计准予扣除的捐赠额 必填:null + * 继续教育支出 必填:null */ - @SalaryTableColumn(text = "累计准予扣除的捐赠额", width = "10%", column = "ljzykcjze") - private BigDecimal ljzykcjze; + private BigDecimal jxjyzc; /** - * 累计个人养老金 必填:null + * 非学历继续教育支出 必填:null */ - @SalaryTableColumn(text = "累计个人养老金", width = "10%", column = "ljgrylj") - private BigDecimal ljgrylj; + private BigDecimal fxljxjyzc; + /** + * 3岁以下婴幼儿照护支出 必填:null + */ + private BigDecimal yyezhzc; + + /** + * 准予扣除的捐赠额 必填:null + */ + private BigDecimal zykcjze; + /** + * 减免税额 必填:null + */ + private BigDecimal jmse; + + /** + * 减除费用 必填:null 正常工资薪金的减除费用。 对应保险营销员、证券经纪人的费用 + */ + private BigDecimal jcfy; + /** + * 其他扣除合计 必填:null + */ + private BigDecimal qtckhj; + /** + * 应纳税所得额 必填:null 正常工资薪金返回Null + */ + private BigDecimal ynssde; + /** + * 应纳税额 必填:null 正常工资薪金返回Null + */ + private BigDecimal ynse; + + /** + * 应扣缴税额 必填:null 正常工资薪金返回Null + */ + private BigDecimal yingkjse; + + /** + * 所得项目名称 必填:是 正常工资薪金;全年一次性奖金收入;稿酬所得;劳务报酬 + */ + private String sdxm; + + /** + * 累计月减除费用 必填:null 保险营销员、证券经纪人,其他连续劳务报酬的减除费用 + */ + private BigDecimal ljyjcfy; + /** + * 允许扣除税费 必填:null 保险营销员、证券经纪人 + */ + private BigDecimal yxkcsf; + /** + * 展业成本 必填:null 保险营销员、证券经纪人 + */ + private BigDecimal zycb; + /** + * 月减除费用 必填:null 保险营销员、证券经纪人,其他连续劳务报酬的减除费用 + */ + private BigDecimal yjcfy; + /** * 累计个人养老金校验码 必填:null */ - @SalaryTableColumn(text = "累计个人养老金校验码", width = "10%", column = "ljgryljjym") private String ljgryljjym; /** * 企业上月是否已申报 必填:null 仅在两个月算税场景时使用,当前月分为N月: @@ -547,34 +550,28 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { * 1表示N-1月(上月)已申报 * 2表示N-2月(上上个月)未申报 */ - @SalaryTableColumn(text = "企业上月是否已申报", width = "10%", column = "qysysfysb") private String qysysfysb; /** * 员工在税局累计已扣缴的税额 必填:null 当前月分为N,如果N-1(上月)已申报,则返回N-1月员工在税局累计已扣缴的税额; * 如果N-1月未申报,则返回N-2月工在税局累计已扣缴的税额; */ - @SalaryTableColumn(text = "员工在税局累计已扣缴的税额", width = "10%", column = "ygzsjljykjse") private BigDecimal ygzsjljykjse; /** * 本月已累计扣除税额 必填:null 针对一月多次算税的场景字段 */ - @SalaryTableColumn(text = "本月已累计扣除税额", width = "10%", column = "byyljkjse") private BigDecimal byyljkjse; /** * 本次应扣缴税额 必填:null 针对一月多次算税的场景字段,本次应扣缴税额=本月应扣缴税额-本月已累计税额 */ - @SalaryTableColumn(text = "本次应扣缴税额", width = "10%", column = "bcykjse") private BigDecimal bcykjse; /** * 分摊年度数 必填:null */ - @SalaryTableColumn(text = "分摊年度数", width = "10%", column = "ftnds") private Integer ftnds; /** * 年减除费用 必填:null 默认为60000 */ - @SalaryTableColumn(text = "年减除费用", width = "10%", column = "njcfy") private BigDecimal njcfy; } @@ -622,6 +619,44 @@ public class GetDeclareTaxResultFeedbackResponse extends BaseResponse { } + /** + * 4.4.1.3.1.1人员代报结果对象 + */ + @Data + public static class rydbjgdx { + /** + * 人员ID + */ + private Integer ygid; + /** + * 人员名称 + */ + private String xm; + /** + * 证件类型 见证件类型字典 + */ + private String zzlx; + /** + * 证件号码 + */ + private String zzhm; + /** + * 错误码 + */ + private String cwm; + /** + * 错误信息 + */ + private String cwxx; + /** + * 所得税的code + */ + private String sdxmdm; + /** + * 所得税的名称 + */ + private String sdxmmc; + } } diff --git a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java index 4bb650f92..3f9745f11 100644 --- a/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java +++ b/src/com/engine/salary/report/service/impl/SalaryStatisticsReportServiceImpl.java @@ -497,7 +497,7 @@ public class SalaryStatisticsReportServiceImpl extends Service implements Salary Arrays.asList(salaryReportConditions.split(",")).forEach(paramMd5 -> { if (StringUtils.isNotBlank(paramMd5)) { //条件对应的结果 - getSalaryCacheService(user).remove(SalaryCacheKey.SALARY_REPORT_DATA + paramMd5); + getSalaryCacheService(user).remove(SalaryCacheKey.SALARY_REPORT_DATA + id + "_" + paramMd5); } } ); diff --git a/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java b/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java index ce270b1fa..508877028 100644 --- a/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java +++ b/src/com/engine/salary/report/wrapper/SalaryStatisticsReportWrapper.java @@ -216,6 +216,7 @@ public class SalaryStatisticsReportWrapper extends Service { /** * 复制薪资账套 + * * @param id */ public void duplicate(Long id) { @@ -322,7 +323,7 @@ public class SalaryStatisticsReportWrapper extends Service { //报表中缓存的条件 salaryReportConditions = Utils.null2String(getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_CONDITIONS + id)); if (StringUtils.isNotBlank(salaryReportConditions) && salaryReportConditions.contains(paramMd5)) { - return getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_DATA + paramMd5); + return getSalaryCacheService(user).get(SalaryCacheKey.SALARY_REPORT_DATA + id + "_" + paramMd5); } } @@ -344,9 +345,10 @@ public class SalaryStatisticsReportWrapper extends Service { resultMap.put("reportId", id); + //设置报表缓存 getSalaryCacheService(user).set(SalaryCacheKey.SALARY_REPORT_IDS, salaryReportIds + "," + id); getSalaryCacheService(user).set(SalaryCacheKey.SALARY_REPORT_CONDITIONS + id, salaryReportConditions + "," + paramMd5); - getSalaryCacheService(user).set(SalaryCacheKey.SALARY_REPORT_DATA + paramMd5, resultMap); + getSalaryCacheService(user).set(SalaryCacheKey.SALARY_REPORT_DATA + id + "_" + paramMd5, resultMap); return resultMap; diff --git a/src/com/engine/salary/service/EmployeeDeclareExcelService.java b/src/com/engine/salary/service/EmployeeDeclareExcelService.java index f48aa1199..cce2e72e9 100644 --- a/src/com/engine/salary/service/EmployeeDeclareExcelService.java +++ b/src/com/engine/salary/service/EmployeeDeclareExcelService.java @@ -4,6 +4,8 @@ import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareImportParam import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.util.Map; + /** * @description: 人员报送(人员)导入导出 * @author: xiajun @@ -21,6 +23,21 @@ public interface EmployeeDeclareExcelService { */ XSSFWorkbook exportTemplate(EmployeeDeclareImportParam importParam); + + /** + * 导入预览 + * @param param + * @return + */ + Map preview(EmployeeDeclareImportParam param); + + /** + * 导入人员报送数据 + * @param param + * @return + */ + Map importData(EmployeeDeclareImportParam param); + /** * 导出人员信息采集-全部 * diff --git a/src/com/engine/salary/service/EmployeeDeclareService.java b/src/com/engine/salary/service/EmployeeDeclareService.java index 0869a5869..ed184159a 100644 --- a/src/com/engine/salary/service/EmployeeDeclareService.java +++ b/src/com/engine/salary/service/EmployeeDeclareService.java @@ -182,4 +182,6 @@ public interface EmployeeDeclareService{ * @return */ String syncEmploymentDate(EmployeeDeclareSyncStartDateParam param); + + void batchInsert(List insertList); } diff --git a/src/com/engine/salary/service/TaxDeclarationExcelService.java b/src/com/engine/salary/service/TaxDeclarationExcelService.java index 15d6c81fd..e5e154fe7 100644 --- a/src/com/engine/salary/service/TaxDeclarationExcelService.java +++ b/src/com/engine/salary/service/TaxDeclarationExcelService.java @@ -1,9 +1,12 @@ package com.engine.salary.service; import com.engine.salary.entity.taxdeclaration.param.AbnormalEmployeeListQueryParam; +import com.engine.salary.entity.taxdeclaration.param.DownloadTemplateParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import java.util.Map; + /** * 个税申报表导出 *

Copyright: Copyright (c) 2022

@@ -45,4 +48,16 @@ public interface TaxDeclarationExcelService { * @return */ XSSFWorkbook exportEmployee4Fail(AbnormalEmployeeListQueryParam queryParam); + + XSSFWorkbook downloadTemplate(DownloadTemplateParam param); + /** + * 预览 + */ + Map preview(DownloadTemplateParam importParam); + + /** + * 导入数据 + */ + Map importData(DownloadTemplateParam importParam); + } diff --git a/src/com/engine/salary/service/TaxDeclarationService.java b/src/com/engine/salary/service/TaxDeclarationService.java index 2731904a5..91b38c3eb 100644 --- a/src/com/engine/salary/service/TaxDeclarationService.java +++ b/src/com/engine/salary/service/TaxDeclarationService.java @@ -23,6 +23,9 @@ public interface TaxDeclarationService { */ List listByTaxCycleAndTaxAgentIds(YearMonth salaryMonth, Collection taxAgentIds); + List listByTaxDeclareRecordId(Long taxDeclareRecordId); + List listByTaxDeclareRecordId(Long taxDeclareRecordId,Integer incomeCategory); + PageInfo listPageByParam(TaxDeclarationListQueryParam queryParam); List countByTaxDeclarationId(Collection taxAgentIds); @@ -33,7 +36,6 @@ public interface TaxDeclarationService { /** * 删除个税申报表 - * */ void delete(SalaryAcctRecordPO salaryAcctRecordPO); @@ -48,6 +50,7 @@ public interface TaxDeclarationService { /** * 撤回个税申报单 + * * @param taxDeclarationId */ void withDrawTaxDeclaration(Long taxDeclarationId); diff --git a/src/com/engine/salary/service/TaxDeclarationValueService.java b/src/com/engine/salary/service/TaxDeclarationValueService.java index 8ec154857..969292efb 100644 --- a/src/com/engine/salary/service/TaxDeclarationValueService.java +++ b/src/com/engine/salary/service/TaxDeclarationValueService.java @@ -2,8 +2,10 @@ package com.engine.salary.service; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationValueListDTO; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam; +import com.engine.salary.entity.taxdeclaration.param.TaxDeclareRecordDetailSaveParam; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationValuePO; +import com.engine.salary.entity.taxdeclaration.po.TaxDeclareRecordPO; import com.engine.salary.util.page.PageInfo; import java.util.Collection; @@ -34,6 +36,7 @@ public interface TaxDeclarationValueService { * @return */ List listByTaxDeclarationIds(Collection taxDeclarationIds); + List listByTaxDeclarationId(Long taxDeclarationIds); /** * 查询个税申报表明细 @@ -57,6 +60,12 @@ public interface TaxDeclarationValueService { * @param taxDeclarationValues */ void batchSave(List taxDeclarationValues); + void batchEdit(List taxDeclarationValues); + + + void save(TaxDeclareRecordDetailSaveParam param); + void edit(TaxDeclareRecordDetailSaveParam param); + TaxDeclarationValuePO getById(Long id); /** * 删除个税申报表明细 @@ -64,4 +73,13 @@ public interface TaxDeclarationValueService { * @param taxDeclareRecordIds */ void deleteByTaxDeclareRecordIds(Collection taxDeclareRecordIds); + + /** + * 因为单独申报年终奖不可行 + * 需要补充正常工资薪金的申报,按0申报 + * @param po + */ + void autoAddWagesDeclare(TaxDeclareRecordPO po); + + } diff --git a/src/com/engine/salary/service/TaxDeclareRecordService.java b/src/com/engine/salary/service/TaxDeclareRecordService.java index a294e259d..aac9db48d 100644 --- a/src/com/engine/salary/service/TaxDeclareRecordService.java +++ b/src/com/engine/salary/service/TaxDeclareRecordService.java @@ -2,6 +2,7 @@ package com.engine.salary.service; import com.engine.salary.common.YearMonthRange; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationRateDTO; +import com.engine.salary.entity.taxdeclaration.param.DeclareTaxResultFeedbackQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; @@ -140,7 +141,7 @@ public interface TaxDeclareRecordService { */ Object getDeclareTaxResultFeedback(Long id); - XSSFWorkbook exportGetDeclareTaxResultFeedback(Long id,String requestId); + XSSFWorkbook exportGetDeclareTaxResultFeedback(DeclareTaxResultFeedbackQueryParam param); /** * 作废 * diff --git a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java index 783e15511..520dcc68a 100644 --- a/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/EmployeeDeclareExcelServiceImpl.java @@ -2,36 +2,62 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.constant.SalaryDefaultTenantConstant; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.employeedeclare.bo.EmployeeDeclareBO; +import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareExcelDTO; import com.engine.salary.entity.employeedeclare.dto.EmployeeDeclareListDTO; import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareImportParam; import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam; import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.SalaryOnOffEnum; +import com.engine.salary.enums.datacollection.UseEmployeeTypeEnum; import com.engine.salary.enums.employeedeclare.CardTypeEnum; +import com.engine.salary.enums.employeedeclare.DeclareStatusEnum; import com.engine.salary.enums.employeedeclare.EmploymentStatusEnum; import com.engine.salary.enums.employeedeclare.EmploymentTypeEnum; +import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; +import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.employeedeclare.EmployeeDeclareMapper; import com.engine.salary.service.EmployeeDeclareExcelService; import com.engine.salary.service.EmployeeDeclareService; import com.engine.salary.service.SalaryEmployeeService; import com.engine.salary.service.TaxAgentService; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryEnumUtil; import com.engine.salary.util.SalaryI18nUtil; -import com.engine.salary.util.excel.ExcelSheetData; -import com.engine.salary.util.excel.ExcelUtil; +import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.excel.*; +import com.engine.salary.util.valid.SalaryCardUtil; import com.google.common.base.Joiner; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import dm.jdbc.util.IdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; +import weaver.file.ExcelSheet; +import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.beans.PropertyDescriptor; +import java.io.InputStream; +import java.time.LocalDate; +import java.util.*; import java.util.stream.Collectors; +import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX; + /** * 人员报送(人员)导入导出 *

Copyright: Copyright (c) 2023

@@ -56,6 +82,10 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } + private EmployeeDeclareMapper getEmployeeDeclareMapper() { + return MapperProxyFactory.getProxy(EmployeeDeclareMapper.class); + } + @Override public XSSFWorkbook exportTemplate(EmployeeDeclareImportParam importParam) { // 查询人员 @@ -75,11 +105,11 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee row.add(CardTypeEnum.RESIDENT_IDENTITY_CARDS.getDefaultLabel()); row.add(employeeDeclare.getCardNum()); row.add(employmentStatusEnum == null ? "" : employmentStatusEnum.getDefaultLabel()); - row.add(employmentTypeEnum == null ? "" : employmentTypeEnum.getDefaultLabel()); + row.add(employmentTypeEnum == null ? EmploymentTypeEnum.EMPLOYEE.getDefaultLabel() : employmentTypeEnum.getDefaultLabel()); row.add(employeeDeclare.getEmploymentFirstYear()); row.add(employeeDeclare.getMobile()); - row.add(Util.null2String(employeeDeclare.getEmploymentDate())); - row.add(Util.null2String(employeeDeclare.getDismissDate())); + row.add(SalaryDateUtil.getFormatDate(employeeDeclare.getEmploymentDate())); + row.add(SalaryDateUtil.getFormatDate(employeeDeclare.getDismissDate())); row.add(Objects.equals(employeeDeclare.getDisability(), 1) ? yesI18 : noI18); row.add(employeeDeclare.getDisabilityCardNo()); row.add(Objects.equals(employeeDeclare.getMartyrDependents(), 1) ? yesI18 : noI18); @@ -96,6 +126,436 @@ public class EmployeeDeclareExcelServiceImpl extends Service implements Employee return ExcelUtil.genWorkbook(excelSheetData); } + @Override + public Map preview(EmployeeDeclareImportParam param) { + //1、参数校验 + String imageId = param.getImageId(); + if (StringUtils.isBlank(imageId)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "文件id为空")); + } + Map map = new HashMap<>(); + + InputStream fileInputStream = null; + try { + + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId())); + + Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); + List headers = ExcelSupport.getSheetHeader(sheet, 0); + + map.put("headers", headers); + map.put("list", ExcelParseHelper.parse2List(sheet, 1)); + + return map; + + } finally { + IOUtils.closeQuietly(fileInputStream); + } + } + + @Override + public Map importData(EmployeeDeclareImportParam param) { + Map apidatas = new HashMap<>(); + InputStream fileInputStream = null; + try { + Date now = new Date(); + // 个税扣缴义务人id + Long taxAgentId = param.getTaxAgentId(); + TaxAgentPO taxAgent = getTaxAgentService(user).getById(taxAgentId); + if (taxAgent == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "参数错误,无法找到个税扣缴义务人")); + } + // 税款所属期 + String taxCycle = SalaryDateUtil.getFormatDate(param.getTaxCycle()); + Date taxCycleDate = param.getTaxCycle(); + + // 导出模板中的表头 + List headerList = getImportHeader().stream().map(header -> header.toString()).collect(Collectors.toList()); + // 查询所有的人员 + List simpleEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.ORG); + // 查询所有的外部人员 + List extEmployees = getSalaryEmployeeService(user).listAll(UseEmployeeTypeEnum.EXT); + // 查询人员报送表的人员 + List employeeDeclares = getEmployeeDeclareService(user).listByTaxCycleAndTaxAgentId(SalaryDateUtil.dateStrToLocalDate(taxCycle), taxAgentId); + // 校验字段 + String checkType = param.getCheckType(); + Map extEmployeeMap = Maps.newHashMap(); + Map simpleEmployeeMap = Maps.newHashMap(); + Map employeeDeclareMap = Maps.newHashMapWithExpectedSize(employeeDeclares.size()); + if (Objects.equals(checkType, "jobNum")) { + extEmployeeMap = Collections.emptyMap(); + simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getWorkcode); + employeeDeclareMap = SalaryEntityUtil.convert2Map(employeeDeclares, EmployeeDeclarePO::getJobNum); + } else { + // 查询所有人员的个人信息 + simpleEmployeeMap = SalaryEntityUtil.convert2Map(simpleEmployees, DataCollectionEmployee::getIdNo); + extEmployeeMap = SalaryEntityUtil.convert2Map(extEmployees, DataCollectionEmployee::getIdNo); + employeeDeclareMap = SalaryEntityUtil.convert2Map(employeeDeclares, EmployeeDeclarePO::getCardNum); + } + // 需要新增的报送人员 + List needAddEmployeeDeclares = Lists.newArrayList(); + // 需要更新的报送人员 + List needUpdateEmployeeDeclares = Lists.newArrayList(); + // 索引(用于计算进度) + int index = 0; + // 失败的数量 + int failCount = 0; + // 成功的数量 + int successCount = 0; + // 错误行的索引 + int failRowIndex = 1; + // 包含错误提示信息的sheet页 + List errorExcelSheets = Lists.newArrayList(); + + String imageId = Util.null2String(param.getImageId()); + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId)); + Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); + // 表头 + List headers = ExcelSupport.getSheetHeader(sheet, 0); + + // 检查表头 + String isCorrectHeader = checkHeader(headers, headerList); + if (isCorrectHeader != null) { + throw new SalaryRunTimeException(isCorrectHeader); + } + // 数据 + List> data = ExcelParseHelper.parse2Map(sheet, 1); + if (CollectionUtils.isEmpty(data)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "导入数据不能为空")); + } + // 错误提示信息 + List excelComments = Lists.newArrayList(); + List errorData = new ArrayList<>(); + for (int i = 0; i < data.size(); i++) { + //行号 + String rowIndex = String.format("第%s行", i + 2); + + Map map = data.get(i); + // 数据是否存在错误 + boolean isError = false; + EmployeeDeclareExcelDTO employeeDeclareExcel = new EmployeeDeclareExcelDTO(); + for (String dataKey : headerList) { + String dataValue = Util.null2String(map.get(dataKey)); + if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel( 0, "工号"))) { + if (StringUtils.equals(checkType, "jobNum") && StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "工号不能为空")); + errorData.add(errorMessageMap); + } + employeeDeclareExcel.setJobNum(dataValue); + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "姓名"))) { + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "姓名不能为空")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setEmployeeName(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "证件类型"))) { + employeeDeclareExcel.setCardType(CardTypeEnum.RESIDENT_IDENTITY_CARDS.getValue().toString()); + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "证件号码"))) { + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "证件号码不能为空")); + errorData.add(errorMessageMap); + } else if (!SalaryCardUtil.checkIdNum(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "证件号码格式不正确")); + errorData.add(errorMessageMap); + } else { + // 身份证号全部转为大写 + employeeDeclareExcel.setCardNum(dataValue.toUpperCase()); + employeeDeclareExcel.setGender(SalaryCardUtil.judgeGender(dataValue).getValue().toString()); + employeeDeclareExcel.setBirthday(SalaryCardUtil.judgeBirthday(dataValue).toString()); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "人员状态"))) { + boolean legalDataValue = false; + for (EmploymentStatusEnum employmentStatusEnum : EmploymentStatusEnum.values()) { + if (StringUtils.equals(dataValue, employmentStatusEnum.getDefaultLabel())) { + legalDataValue = true; + employeeDeclareExcel.setEmploymentStatus(employmentStatusEnum.getValue().toString()); + break; + } + } + if (!legalDataValue) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态只能填写正常或非正常")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型"))) { + boolean legalDataValue = false; + for (EmploymentTypeEnum employmentTypeEnum : EmploymentTypeEnum.values()) { + if (StringUtils.equals(dataValue, employmentTypeEnum.getDefaultLabel())) { + legalDataValue = true; + employeeDeclareExcel.setEmploymentType(employmentTypeEnum.getValue().toString()); + break; + } + } + if (!legalDataValue) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型填写错误")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "入职年度就业情形"))) { + employeeDeclareExcel.setEmploymentFirstYear(dataValue); + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "手机号码"))) { + if (StringUtils.isEmpty(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "手机号码不能为空")); + errorData.add(errorMessageMap); + } else if (!SalaryCardUtil.checkMobile(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "手机号码格式不正确")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setMobile(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "任职受雇从业日期"))) { + if (StringUtils.isEmpty(dataValue)) { + if (!Objects.equals(employeeDeclareExcel.getEmploymentType(), EmploymentTypeEnum.OTHER.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "任职受雇从业类型不为「其他」时,任职受雇从业日期为必填")); + errorData.add(errorMessageMap); + } + } else { + if (StringUtils.isNotBlank(dataValue) && dataValue.length() >= 10) { + dataValue = dataValue.substring(0,10); + } + if (!SalaryDateUtil.checkDay(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "日期格式不正确")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setEmploymentDate(LocalDate.parse(dataValue).toString()); + } + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "离职日期"))) { + if (StringUtils.isEmpty(dataValue)) { + if (Objects.equals(employeeDeclareExcel.getEmploymentStatus(), EmploymentStatusEnum.ABNORMAL.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "人员状态为非正常时,离职日期必填")); + errorData.add(errorMessageMap); + } + } else { + if (!SalaryDateUtil.checkDay(dataValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "日期格式不正确")); + errorData.add(errorMessageMap); + } else { + employeeDeclareExcel.setDismissDate(LocalDate.parse(dataValue).toString()); + } + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否残疾"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setDisability(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setDisability(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否残疾只能填写是与否")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "残疾证号"))) { + if (StringUtils.isEmpty(dataValue)) { + if (Objects.equals(employeeDeclareExcel.getDisability(), SalaryOnOffEnum.ON.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "「是否残疾」填「是」时,残疾证号必填")); + errorData.add(errorMessageMap); + } + } else { + employeeDeclareExcel.setDisabilityCardNo(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否烈属"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setMartyrDependents(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setMartyrDependents(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否烈属只能填写是与否")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "烈属证号"))) { + if (StringUtils.isEmpty(dataValue)) { + if (Objects.equals(employeeDeclareExcel.getMartyrDependents(), SalaryOnOffEnum.ON.getValue())) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "「是否烈属」填「是」时,烈属证号必填")); + errorData.add(errorMessageMap); + } + } else { + employeeDeclareExcel.setMartyrDependentsCardNo(dataValue); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否孤老"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setLonelyOld(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setLonelyOld(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否孤老只能填写是与否")); + errorData.add(errorMessageMap); + } + } else if (StringUtils.equals(dataKey, SalaryI18nUtil.getI18nLabel(0, "是否扣除减除费用"))) { + if (StringUtils.equals(dataValue, SalaryOnOffEnum.ON.getDefaultLabel())) { + employeeDeclareExcel.setDeductExpenses(SalaryOnOffEnum.ON.getValue()); + } else if (StringUtils.equals(dataValue, SalaryOnOffEnum.OFF.getDefaultLabel())) { + employeeDeclareExcel.setDeductExpenses(SalaryOnOffEnum.OFF.getValue()); + } else { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "是否扣除减除费用只能填写是与否")); + errorData.add(errorMessageMap); + } + } + } + if (!isError) { + if (StringUtils.equals(checkType, "jobNum")) { + EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getJobNum()); + if (employeeDeclare == null) { + DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getJobNum()); + DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getJobNum()); + if (extEmployee == null && simpleEmployee == null) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "系统内的人员不存在该工号")); + errorData.add(errorMessageMap); + } else { + needAddEmployeeDeclares.add(buildEmployeeDeclare(extEmployee, simpleEmployee, + employeeDeclareExcel, taxAgentId, taxCycleDate, now)); + } + } else { + EmployeeDeclarePO newEmployeeDeclare = new EmployeeDeclarePO(); + BeanUtils.copyProperties(employeeDeclare, newEmployeeDeclare); + EmployeeDeclarePO employeeDeclarePO = EmployeeDeclareBO.convert2PO(employeeDeclareExcel); + BeanUtils.copyProperties(employeeDeclarePO, newEmployeeDeclare, getNullPropertyNames(employeeDeclarePO)); + newEmployeeDeclare.setNewEmployeeInfo(StringUtils.equals(employeeDeclare.toCompareString(), newEmployeeDeclare.toCompareString()) ? 0 : 1); + newEmployeeDeclare.setUpdateTime(now); + needUpdateEmployeeDeclares.add(newEmployeeDeclare); + if (Objects.equals(newEmployeeDeclare.getNewEmployeeInfo(), 1)) { + newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); + newEmployeeDeclare.setDeclareErrorMsg(""); + } + } + } else { + EmployeeDeclarePO employeeDeclare = employeeDeclareMap.get(employeeDeclareExcel.getCardNum()); + if (employeeDeclare == null) { + DataCollectionEmployee extEmployee = extEmployeeMap.get(employeeDeclareExcel.getCardNum()); + DataCollectionEmployee simpleEmployee = simpleEmployeeMap.get(employeeDeclareExcel.getCardNum()); + if (extEmployee == null && simpleEmployee == null) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + SalaryI18nUtil.getI18nLabel(0, "系统内的人员不存在该证件号码")); + errorData.add(errorMessageMap); + } else { + needAddEmployeeDeclares.add(buildEmployeeDeclare(extEmployee, simpleEmployee, + employeeDeclareExcel, taxAgentId, taxCycleDate, now)); + } + } else { + EmployeeDeclarePO newEmployeeDeclare = new EmployeeDeclarePO(); + BeanUtils.copyProperties(employeeDeclare, newEmployeeDeclare); + EmployeeDeclarePO employeeDeclarePO = EmployeeDeclareBO.convert2PO(employeeDeclareExcel); + BeanUtils.copyProperties(employeeDeclarePO, newEmployeeDeclare, getNullPropertyNames(employeeDeclarePO)); + newEmployeeDeclare.setNewEmployeeInfo(StringUtils.equals(employeeDeclare.toCompareString(), newEmployeeDeclare.toCompareString()) ? 0 : 1); + newEmployeeDeclare.setUpdateTime(now); + if (Objects.equals(newEmployeeDeclare.getNewEmployeeInfo(), 1)) { + newEmployeeDeclare.setDeclareStatus(DeclareStatusEnum.NOT_DECLARE.getValue()); + newEmployeeDeclare.setDeclareErrorMsg(""); + } + needUpdateEmployeeDeclares.add(newEmployeeDeclare); + } + } + } + if (isError) { + failCount++; + failRowIndex++; + continue; + } + successCount++; + } + + if (CollectionUtils.isNotEmpty(needAddEmployeeDeclares)) { + getEmployeeDeclareService(user).batchInsert(needAddEmployeeDeclares); + } + if (CollectionUtils.isNotEmpty(needUpdateEmployeeDeclares)) { + needUpdateEmployeeDeclares.stream().forEach(getEmployeeDeclareMapper()::update); + } + + apidatas.put("successCount", successCount); + apidatas.put("errorCount", failCount); + apidatas.put("errorData", errorData); + // 发送导入回调信息 +// salaryBatchService.sendImportCallBackInfo(message, successCount, errorCount, errorExcelSheets); + + } catch (Exception e) { + log.error("人员报送信息导入失败:{}", e.getMessage(), e); + } finally { + IOUtils.closeQuietly(fileInputStream); + } + return apidatas; + } + + + public static String[] getNullPropertyNames (Object source) { + final BeanWrapper src = new BeanWrapperImpl(source); + PropertyDescriptor[] pds = src.getPropertyDescriptors(); + + Set emptyNames = new HashSet<>(); + for(PropertyDescriptor pd : pds) { + Object srcValue = src.getPropertyValue(pd.getName()); + // 此处判断可根据需求修改 + if (srcValue == null) { + emptyNames.add(pd.getName()); + } + } + String[] result = new String[emptyNames.size()]; + return emptyNames.toArray(result); + } + + + + private EmployeeDeclarePO buildEmployeeDeclare(DataCollectionEmployee extEmployee, DataCollectionEmployee simpleEmployee, + EmployeeDeclareExcelDTO employeeDeclareExcel, Long taxAgentId, + Date taxCycle, Date now) { + EmployeeDeclarePO employeeDeclare = EmployeeDeclarePO.builder() + .id(IdGenerator.generate()) + .taxAgentId(taxAgentId) + .taxCycle(taxCycle) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .creator(Long.valueOf(user.getUID())) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .createTime(now) + .updateTime(now).build(); + EmployeeDeclarePO employeeDeclarePO = EmployeeDeclareBO.convert2PO(employeeDeclareExcel); + + BeanUtils.copyProperties(employeeDeclarePO, employeeDeclare, getNullPropertyNames(employeeDeclarePO)); + if (extEmployee != null) { + employeeDeclare.setEmployeeId(extEmployee.getEmployeeId()); + employeeDeclare.setEmployeeType(EmployeeTypeEnum.EXT_EMPLOYEE.getValue()); + } + if (simpleEmployee != null) { + employeeDeclare.setEmployeeId(simpleEmployee.getEmployeeId()); + employeeDeclare.setEmployeeType(EmployeeTypeEnum.ORGANIZATION.getValue()); + } + return employeeDeclare; + } + @Override public XSSFWorkbook export(EmployeeDeclareListQueryParam queryParam) { // 查询需要报送的人员 diff --git a/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java b/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java index 476aa4731..99b3b12c4 100644 --- a/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java +++ b/src/com/engine/salary/service/impl/EmployeeDeclareServiceImpl.java @@ -737,4 +737,13 @@ public class EmployeeDeclareServiceImpl extends Service implements EmployeeDecla return "执行完毕"; } + + @Override + public void batchInsert(List insertList) { + if (CollectionUtils.isEmpty(insertList)) { + return; + } + List> partition = Lists.partition(insertList, 100); + partition.forEach(getEmployeeDeclareMapper()::batchInsert); + } } diff --git a/src/com/engine/salary/service/impl/TaxDeclarationExcelServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationExcelServiceImpl.java index 72597d4f2..5f5796e39 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationExcelServiceImpl.java @@ -1,30 +1,53 @@ package com.engine.salary.service.impl; +import com.api.formmode.mybatis.util.SqlProxyHandle; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; -import com.engine.salary.annotation.SalaryTableColumn; +import com.engine.salary.constant.SalaryDefaultTenantConstant; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.taxdeclaration.dto.AbnormalEmployeeListDTO; import com.engine.salary.entity.taxdeclaration.dto.FailEmployeeListDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationValueListDTO; import com.engine.salary.entity.taxdeclaration.param.AbnormalEmployeeListQueryParam; +import com.engine.salary.entity.taxdeclaration.param.DownloadTemplateParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam; import com.engine.salary.entity.taxdeclaration.po.*; +import com.engine.salary.enums.UserStatusEnum; +import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; +import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; +import com.engine.salary.enums.salarysob.IncomeCategoryEnum; +import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.enums.taxdeclaration.SourceEnum; +import com.engine.salary.mapper.sys.SalarySysConfMapper; import com.engine.salary.service.*; +import com.engine.salary.sys.entity.po.SalarySysConfPO; import com.engine.salary.util.JsonUtil; +import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.excel.ExcelParseHelper; import com.engine.salary.util.excel.ExcelSheetData; +import com.engine.salary.util.excel.ExcelSupport; import com.engine.salary.util.excel.ExcelUtil; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import dm.jdbc.util.IdGenerator; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; -import java.lang.reflect.Field; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.io.InputStream; +import java.util.*; +import java.util.stream.Collectors; + +import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX; /** * 个税申报表导出 @@ -57,6 +80,19 @@ public class TaxDeclarationExcelServiceImpl extends Service implements TaxDeclar return ServiceUtil.getService(TaxDeclareFailServiceImpl.class, user); } + + private TaxReportColumnService getTaxReportColumnService(User user) { + return ServiceUtil.getService(TaxReportColumnServiceImpl.class, user); + } + + private SalarySysConfMapper getSalarySysConfMapper() { + return SqlProxyHandle.getProxy(SalarySysConfMapper.class); + } + + private SalaryEmployeeService getSalaryEmployeeService(User user) { + return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); + } + @Override public XSSFWorkbook exportTaxDeclarationValue(TaxDeclarationValueListQueryParam queryParam) { // 查询个税申报表 @@ -140,7 +176,7 @@ public class TaxDeclarationExcelServiceImpl extends Service implements TaxDeclar // 导出的表头 List headerList = Lists.newArrayList(); List dataIndexList = Lists.newArrayList(); - parseHeader(clazz, headerList, dataIndexList); + ExcelUtil.parseHeader(clazz, headerList, dataIndexList); // 导出的数据 List> rows = Lists.newArrayListWithExpectedSize(dtoList.size()); dtoList.forEach(dto -> { @@ -157,23 +193,222 @@ public class TaxDeclarationExcelServiceImpl extends Service implements TaxDeclar return excelSheetData; } - /** - * 解析表头 - * - * @param clazz - * @param headerList - * @param dataIndexList - * @param - */ - private void parseHeader(Class clazz, List headerList, List dataIndexList) { - Field[] declaredFields = clazz.getDeclaredFields(); - for (Field declaredField : declaredFields) { - if (!declaredField.isAnnotationPresent(SalaryTableColumn.class)) { - continue; - } - SalaryTableColumn annotation = declaredField.getAnnotation(SalaryTableColumn.class); - headerList.add(SalaryI18nUtil.getI18nLabel(annotation.labelId(), annotation.text())); - dataIndexList.add(declaredField.getName()); + @Override + public XSSFWorkbook downloadTemplate(DownloadTemplateParam param) { + TaxDeclarationPO declarationPO = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); + IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum.parseByValue(declarationPO.getIncomeCategory()); + List taxReportColumnPOS = getTaxReportColumnService(user).listByIncomeCategory(incomeCategoryEnum); + + + List heads = new ArrayList<>(); + heads.add(SalaryI18nUtil.getI18nLabel(85429, "姓名")); + heads.add(SalaryI18nUtil.getI18nLabel(86185, "部门")); + heads.add(SalaryI18nUtil.getI18nLabel(86186, "手机号")); + heads.add(SalaryI18nUtil.getI18nLabel(86317, "工号")); + heads.addAll(SalaryEntityUtil.properties(taxReportColumnPOS, TaxReportColumnPO::getReportColumnName, Collectors.toList())); + + List> rowList = new ArrayList<>(); + rowList.add(heads); + XSSFWorkbook book = ExcelUtil.genWorkbookV2(rowList, incomeCategoryEnum.getDefaultLabel()); + return book; + } + + @Override + public Map preview(DownloadTemplateParam importParam) { + //excel文件id + String imageId = Util.null2String(importParam.getImageId()); + Validate.notBlank(imageId, "imageId为空"); + + InputStream fileInputStream = null; + Map map = new HashMap<>(); + try { + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(importParam.getImageId())); + Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); + map.put("headers", ExcelSupport.getSheetHeader(sheet, 0)); + map.put("list", ExcelParseHelper.parse2List(sheet, 1, 0)); + return map; + } finally { + IOUtils.closeQuietly(fileInputStream); } } + + @Override + public Map importData(DownloadTemplateParam param) { + Map apidatas = new HashMap<>(); + + //查询对于人员信息导入筛选的全局配置 + SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); + String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; + + + // 租户下所有的人员 + List salaryEmployees = getSalaryEmployeeService(user).listAllForReport(); + + + TaxDeclarationPO declarationPO = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); + IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum.parseByValue(declarationPO.getIncomeCategory()); + List taxReportColumnPOS = getTaxReportColumnService(user).listByIncomeCategory(incomeCategoryEnum); + List taxReportColumnNames = SalaryEntityUtil.properties(taxReportColumnPOS, TaxReportColumnPO::getReportColumnName, Collectors.toList()); + + List taxDeclarationValuePOS = getTaxDeclarationValueService(user).listByTaxDeclarationId(declarationPO.getId()); + Map empDeclarationValueMap = SalaryEntityUtil.convert2Map(taxDeclarationValuePOS, TaxDeclarationValuePO::getEmployeeId); + + // 失败的数量 + int errorCount = 0; + // 成功的数量 + int successCount = 0; + Date now = new Date(); + + List addList = Lists.newArrayList(); + List editList = Lists.newArrayList(); + + + InputStream fileInputStream = null; + try { + + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(param.getImageId())); + Sheet sheet = ExcelSupport.parseFile(fileInputStream, 0, EXCEL_TYPE_XLSX); + + // 错误提示信息 + List excelComments = Lists.newArrayList(); + // 存在错误的那行数据 + List> errorDatas = Lists.newArrayList(); + // 表头 + List headers = ExcelSupport.getSheetHeader(sheet, 0); + List> data = ExcelParseHelper.parse2Map(sheet, 1, 0); + + if (CollectionUtils.isEmpty(headers)) { + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", "表头为空"); + excelComments.add(errorMessageMap); + apidatas.put("successCount", successCount); + apidatas.put("errorCount", errorCount); + apidatas.put("errorData", excelComments); + return apidatas; + } + if (CollectionUtils.isEmpty(data)) { + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", "无数据"); + excelComments.add(errorMessageMap); + apidatas.put("successCount", successCount); + apidatas.put("errorCount", errorCount); + apidatas.put("errorData", excelComments); + return apidatas; + } + + Optional first = taxReportColumnNames.stream().filter(name -> !headers.contains(name)).findFirst(); + if (first.isPresent()) { + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", "申报模板异常,缺失" + first.get() + "列,请检查是否为" + incomeCategoryEnum.getDefaultLabel() + "申报模板"); + excelComments.add(errorMessageMap); + apidatas.put("successCount", successCount); + apidatas.put("errorCount", errorCount); + apidatas.put("errorData", excelComments); + return apidatas; + } + + + for (int i = 0; i < data.size(); i++) { + + String row = "第" + (i + 2) + "行"; + + boolean isError = false; + Map map = data.get(i); + Long employeeId = 0L; + + String username = (String) map.getOrDefault("姓名", ""); + String deparmentName = (String) map.getOrDefault("部门", ""); + String mobile = (String) map.getOrDefault("手机号", ""); + String workcode = (String) map.getOrDefault("工号", ""); + + if (StringUtils.isEmpty(username) && "0".equals(confValue)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(102838, "姓名不能为空")); + excelComments.add(errorMessageMap); + } else { + //筛选导入人员信息可以在人力资源池中匹配到的人员信息 + List employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(salaryEmployees, username, deparmentName, mobile, workcode, null); + + if (CollectionUtils.isEmpty(employeeSameIds)) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + SalaryI18nUtil.getI18nLabel(100579, "姓名错误,系统内不存在该姓名")); + excelComments.add(errorMessageMap); + } else if (employeeSameIds.size() > 1) { + //存在离职和在职状态取在职状态 + employeeSameIds = employeeSameIds.stream() + .filter(e -> UserStatusEnum.getNormalStatus().contains(e.getStatus())) + .collect(Collectors.toList()); + if (employeeSameIds.size() != 1) { + isError = true; + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", row + "员工信息不存在或者存在多个员工"); + excelComments.add(errorMessageMap); + } else { + employeeId = CollectionUtils.isNotEmpty(employeeSameIds) && employeeSameIds.size() == 1 ? employeeSameIds.get(0).getEmployeeId() : null; + } + } else { + employeeId = employeeSameIds.get(0).getEmployeeId(); + } + } + + if (isError) { + errorCount++; + errorDatas.add(map); + continue; + } + + successCount++; + + Map valueMap = Maps.newHashMap(); + for (TaxReportColumnPO taxReportColumn : taxReportColumnPOS) { + String value = (String) map.getOrDefault(taxReportColumn.getReportColumnName(), ""); + valueMap.put(taxReportColumn.getReportColumnDataIndex(), StringUtils.isNotBlank(value) ? value.toString() : Objects.equals(taxReportColumn.getDataType(), SalaryDataTypeEnum.NUMBER.getValue()) ? "0.00" : ""); + } + + if (empDeclarationValueMap.containsKey(employeeId)) { + TaxDeclarationValuePO taxDeclarationValue = empDeclarationValueMap.get(employeeId); + taxDeclarationValue.setResultValue(valueMap); + taxDeclarationValue.setResultValueJson(JsonUtil.toJsonString(valueMap)); + taxDeclarationValue.setUpdateTime(new Date()); + taxDeclarationValue.setSource(SourceEnum.IMP.getValue()); + editList.add(taxDeclarationValue); + } else { + //新增 + TaxDeclarationValuePO taxDeclarationValue = TaxDeclarationValuePO.builder() + .id(IdGenerator.generate()) + .taxDeclareRecordId(declarationPO.getTaxDeclareRecordId()) + .taxDeclarationId(declarationPO.getId()) + .employeeType(EmployeeTypeEnum.ORGANIZATION.getValue()) + .employeeId(employeeId) + .resultValue(valueMap) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .creator(employeeId) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .createTime(now) + .updateTime(now) + .source(SourceEnum.IMP.getValue()) + .build(); + addList.add(taxDeclarationValue); + } + } + + getTaxDeclarationValueService(user).batchSave(addList); + getTaxDeclarationValueService(user).batchEdit(editList); + + if (incomeCategoryEnum == IncomeCategoryEnum.ONETIME_ANNUAL_BONUS) { + TaxDeclareRecordPO declareRecordPO = getTaxDeclareRecordService(user).getById(declarationPO.getTaxDeclareRecordId()); + getTaxDeclarationValueService(user).autoAddWagesDeclare(declareRecordPO); + } + + apidatas.put("successCount", successCount); + apidatas.put("errorCount", errorCount); + apidatas.put("errorData", excelComments); + } finally { + IOUtils.closeQuietly(fileInputStream); + } + return apidatas; + } + } diff --git a/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java index 987eacf58..d69513ae0 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java @@ -94,6 +94,24 @@ public class TaxDeclarationServiceImpl extends Service implements TaxDeclaration return taxDeclarationPOS; } + @Override + public List listByTaxDeclareRecordId(Long taxDeclareRecordId) { + if (Objects.isNull(taxDeclareRecordId)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + } + TaxDeclarationPO po = TaxDeclarationPO.builder().taxDeclareRecordId(taxDeclareRecordId).build(); + return getTaxDeclarationMapper().listSome(po); + } + @Override + public List listByTaxDeclareRecordId(Long taxDeclareRecordId,Integer incomeCategory) { + if (Objects.isNull(taxDeclareRecordId)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + } + TaxDeclarationPO po = TaxDeclarationPO.builder().taxDeclareRecordId(taxDeclareRecordId).incomeCategory(incomeCategory).build(); + return getTaxDeclarationMapper().listSome(po); + } + + @Override public PageInfo listPageByParam(TaxDeclarationListQueryParam queryParam) { long currentEmployeeId = user.getUID(); @@ -205,7 +223,7 @@ public class TaxDeclarationServiceImpl extends Service implements TaxDeclaration // 无薪资核算结果,不允许生成个税申报表 if (CollectionUtils.isEmpty(salaryAcctResultPOS)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(110093, "{0}无可申报数据") - .replace("{0}", SalaryDateUtil.getFormatYearMonth(saveParam.getSalaryMonth()))); + .replace("{0}", SalaryDateUtil.getFormatYearMonth(saveParam.getSalaryMonth()))); } Set salaryAcctRecordIds = SalaryEntityUtil.properties(salaryAcctResultPOS, SalaryAcctResultPO::getSalaryAcctRecordId); @@ -214,14 +232,14 @@ public class TaxDeclarationServiceImpl extends Service implements TaxDeclaration boolean notArchived = salaryAcctRecordPOS.stream().anyMatch(salaryAcctRecordPO -> Objects.equals(salaryAcctRecordPO.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue())); if (notArchived) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98875, "{0}有未归档数据,请全部归档后再申报") - .replace("{0}", SalaryDateUtil.getFormatYearMonth(saveParam.getSalaryMonth()))); + .replace("{0}", SalaryDateUtil.getFormatYearMonth(saveParam.getSalaryMonth()))); } // 如果当前薪资所属月下存在不同的税款所属期,属于异常业务场景,不允许生成个税申报表 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}", SalaryDateUtil.getFormatYearMonth(saveParam.getSalaryMonth()))); + .replace("{0}", SalaryDateUtil.getFormatYearMonth(saveParam.getSalaryMonth()))); } // 查询薪资账套 Set salarySobIds = SalaryEntityUtil.properties(salaryAcctRecordPOS, SalaryAcctRecordPO::getSalarySobId); diff --git a/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java index f7aaf17c9..80e1c8209 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java @@ -3,6 +3,7 @@ package com.engine.salary.service.impl; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; @@ -10,12 +11,19 @@ import com.engine.salary.entity.extemp.po.ExtEmpPO; import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationValueList; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationValueListDTO; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam; +import com.engine.salary.entity.taxdeclaration.param.TaxDeclareRecordDetailSaveParam; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationValuePO; +import com.engine.salary.entity.taxdeclaration.po.TaxDeclareRecordPO; import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO; import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; +import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; +import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.enums.taxdeclaration.SourceEnum; +import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.taxdeclaration.TaxDeclarationValueMapper; +import com.engine.salary.mapper.taxdeclaration.TaxDeclareRecordMapper; import com.engine.salary.service.*; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryEntityUtil; @@ -24,6 +32,8 @@ import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import dm.jdbc.util.IdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import weaver.hrm.User; @@ -47,6 +57,10 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar return MapperProxyFactory.getProxy(TaxDeclarationValueMapper.class); } + private TaxDeclareRecordMapper getTaxDeclareRecordMapper() { + return MapperProxyFactory.getProxy(TaxDeclareRecordMapper.class); + } + private SalaryEmployeeService getSalaryEmployeeService(User user) { return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } @@ -63,6 +77,10 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar return ServiceUtil.getService(TaxReportColumnServiceImpl.class, user); } + private TaxDeclarationService getTaxDeclarationService(User user) { + return ServiceUtil.getService(TaxDeclarationServiceImpl.class, user); + } + @Override public PageInfo listPageByTaxDeclarationIds(TaxDeclarationValueListQueryParam queryParam, Collection taxDeclarationIds) { List taxDeclarationValuePOS = getTaxDeclarationValueMapper().listSome(TaxDeclarationValuePO.builder().taxDeclarationIds(taxDeclarationIds).build()); @@ -76,6 +94,12 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar return decryptBatch(taxDeclarationValues); } + @Override + public List listByTaxDeclarationId(Long taxDeclarationId) { + List taxDeclarationValues = getTaxDeclarationValueMapper().listSome(TaxDeclarationValuePO.builder().taxDeclarationId(taxDeclarationId).build()); + return decryptBatch(taxDeclarationValues); + } + @Override public List listByTaxDeclarationIdsNoDecrypt(Collection taxDeclarationIds) { return getTaxDeclarationValueMapper().listSome(TaxDeclarationValuePO.builder().taxDeclarationIds(taxDeclarationIds).build()); @@ -126,11 +150,85 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar List> partition = Lists.partition(taxDeclarationValues, 100); for (List subTaxDeclarationValues : partition) { subTaxDeclarationValues.forEach(getTaxDeclarationValueMapper()::insertIgnoreNull); -// getTaxDeclarationValueMapper().batchInsert(subTaxDeclarationValues); } } } + @Override + public void batchEdit(List taxDeclarationValues) { + if (CollectionUtils.isNotEmpty(taxDeclarationValues)) { + // 加密 + taxDeclarationValues.forEach(taxDeclarationValue -> + taxDeclarationValue.setResultValueJson(JsonUtil.toJsonString(taxDeclarationValue.getResultValue()))); + taxDeclarationValues = encryptUtil.encryptList(taxDeclarationValues, TaxDeclarationValuePO.class); + // 分批保存 + List> partition = Lists.partition(taxDeclarationValues, 100); + for (List subTaxDeclarationValues : partition) { + subTaxDeclarationValues.forEach(getTaxDeclarationValueMapper()::updateIgnoreNull); + } + } + } + + @Override + public void save(TaxDeclareRecordDetailSaveParam param) { + TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); + if (taxDeclaration == null) { + throw new SalaryRunTimeException("个税申报表不存在!"); + } + + Long taxDeclareRecordId = taxDeclaration.getTaxDeclareRecordId(); + TaxDeclareRecordPO declareRecordPO = getTaxDeclareRecordMapper().getById(taxDeclareRecordId); + if (declareRecordPO == null) { + throw new SalaryRunTimeException("个税申报记录不存在!"); + } + + TaxDeclarationValuePO po = TaxDeclarationValuePO.builder() + .id(IdGenerator.generate()) + .taxDeclarationId(param.getTaxDeclarationId()) + .taxDeclareRecordId(taxDeclareRecordId) + .employeeId(param.getEmployeeId()) + .employeeType(param.getEmployeeType()) + .resultValue(param.getTaxReportColumnValues()) + .resultValueJson(JsonUtil.toJsonString(param.getTaxReportColumnValues())) + .createTime(new Date()) + .updateTime(new Date()) + .source(SourceEnum.ADD.getValue()) + .creator((long) user.getUID()) + .deleteType(0) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .build(); + encryptUtil.encrypt(po, TaxDeclarationValuePO.class); + getTaxDeclarationValueMapper().insertIgnoreNull(po); + + //新增年终奖 + if (IncomeCategoryEnum.ONETIME_ANNUAL_BONUS.getValue().equals(taxDeclaration.getIncomeCategory())) { + autoAddWagesDeclare(declareRecordPO); + } + } + + @Override + public void edit(TaxDeclareRecordDetailSaveParam param) { + TaxDeclarationValuePO po = getById(param.getId()); + po.setResultValue(param.getTaxReportColumnValues()); + po.setResultValueJson(JsonUtil.toJsonString(param.getTaxReportColumnValues())); + po.setUpdateTime(new Date()); + po.setSource(SourceEnum.EDIT.getValue()); + encryptUtil.encrypt(po, TaxDeclarationValuePO.class); + getTaxDeclarationValueMapper().updateIgnoreNull(po); + } + + @Override + public TaxDeclarationValuePO getById(Long id) { + TaxDeclarationValuePO po = getTaxDeclarationValueMapper().getById(id); + if (po == null) { + throw new SalaryRunTimeException("个税申报明细不存在!"); + } + encryptUtil.decrypt(po, TaxDeclarationValuePO.class); + po.setResultValue(JsonUtil.parseMap(po.getResultValueJson(), String.class)); + + return po; + } + @Override public void deleteByTaxDeclareRecordIds(Collection taxDeclareRecordIds) { if (CollectionUtils.isEmpty(taxDeclareRecordIds)) { @@ -150,4 +248,84 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar }); return taxDeclarationValues; } + + + @Override + public void autoAddWagesDeclare(TaxDeclareRecordPO taxDeclareRecord) { + + Long taxDeclareRecordId = taxDeclareRecord.getId(); + Date now = new Date(); + + //非正常薪资的人员 + List notWagesEmpIds = getTaxDeclarationValueMapper().queryNotWagesEmpIds(taxDeclareRecordId); + if (CollectionUtils.isEmpty(notWagesEmpIds)) { + return; + } + + //正常薪资人员 + List wagesEmpIds = getTaxDeclarationValueMapper().queryWagesEmpIds(taxDeclareRecordId); + + //比较差异 + List autoAddIds = notWagesEmpIds.stream().filter(id -> !wagesEmpIds.contains(id)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(autoAddIds)) { + return; + } + + //正常薪资的表头 + List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES); + Map valueMap = Maps.newHashMap(); + for (TaxReportColumnPO taxReportColumn : taxReportColumns) { + String value = Objects.equals(taxReportColumn.getDataType(), SalaryDataTypeEnum.NUMBER.getValue()) ? "0.00" : ""; + valueMap.put(taxReportColumn.getReportColumnDataIndex(), value); + } + + //当前申报表是否含正常申报 + List list = getTaxDeclarationService(user).listByTaxDeclareRecordId(taxDeclareRecordId, IncomeCategoryEnum.WAGES_AND_SALARIES.getValue()); + TaxDeclarationPO taxDeclarationPO; + if (CollectionUtils.isNotEmpty(list)) { + if (list.size() > 1) { + throw new SalaryRunTimeException("存在多条正常工资薪金申报表数据"); + } + taxDeclarationPO = list.get(0); + } else { + taxDeclarationPO = TaxDeclarationPO + .builder() + .id(IdGenerator.generate()) + .taxDeclareRecordId(taxDeclareRecordId) + .incomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES.getValue()) + .taxAgentId(taxDeclareRecord.getTaxAgentId()) + .salaryMonth(taxDeclareRecord.getSalaryMonth()) + .taxCycle(taxDeclareRecord.getTaxCycle()) + .description(taxDeclareRecord.getRemark()) + .controlView(0) + .creator((long) user.getUID()) + .createTime(now) + .updateTime(now) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .build(); + List taxList = new ArrayList<>(); + getTaxDeclarationService(user).saveBatch(taxList); + } + + //组装数据,自动补足 + List autoAddValuePOs = autoAddIds.stream().map((empId -> { + TaxDeclarationValuePO taxDeclarationValue = TaxDeclarationValuePO.builder() + .id(IdGenerator.generate()) + .taxDeclareRecordId(taxDeclarationPO.getTaxDeclareRecordId()) + .taxDeclarationId(taxDeclarationPO.getId()) + .employeeType(0) + .employeeId(empId) + .resultValue(valueMap) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .creator((long) user.getUID()) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .createTime(now) + .updateTime(now) + .source(SourceEnum.AUTO.getValue()) + .build(); + return taxDeclarationValue; + })).collect(Collectors.toList()); + batchSave(autoAddValuePOs); + } } diff --git a/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java index ac6829f00..7f388cf8f 100644 --- a/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java @@ -26,6 +26,7 @@ import com.engine.salary.entity.taxapiflow.po.TaxDeclarationApiFlowRecordPO; import com.engine.salary.entity.taxdeclaration.bo.*; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationRateDTO; import com.engine.salary.entity.taxdeclaration.param.AbnormalEmployeeListQueryParam; +import com.engine.salary.entity.taxdeclaration.param.DeclareTaxResultFeedbackQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam; import com.engine.salary.entity.taxdeclaration.po.*; @@ -35,6 +36,7 @@ import com.engine.salary.entity.taxdeclaration.response.DeclareTaxResponse; import com.engine.salary.entity.taxdeclaration.response.UpdateDeclareResponse; import com.engine.salary.enums.employeedeclare.DeclareStatusEnum; import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum; +import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.enums.taxagent.TaxAgentTaxReturnStatusEnum; import com.engine.salary.enums.taxdeclaration.*; @@ -307,6 +309,12 @@ public class TaxDeclareRecordServiceImpl extends Service implements TaxDeclareRe } } + //补充正常工资薪金的申报人员 + newTaxDeclareRecords.forEach(taxDeclareRecordPO -> { + getTaxDeclarationValueService(user).autoAddWagesDeclare(taxDeclareRecordPO); + }); + + //更新核算记录状态 getSalaryAcctRecordService(user).updateStatusByIds(salaryAcctRecordIds, SalaryAcctRecordStatusEnum.DECLARED); // // 记录日志 @@ -375,6 +383,9 @@ public class TaxDeclareRecordServiceImpl extends Service implements TaxDeclareRe } } + //补充正常工资薪金的申报人员 + getTaxDeclarationValueService(user).autoAddWagesDeclare(taxDeclareRecord); + //更新核算记录状态 getSalaryAcctRecordService(user).updateStatusByIds(salaryAcctRecordIds, SalaryAcctRecordStatusEnum.DECLARED); } @@ -414,7 +425,15 @@ public class TaxDeclareRecordServiceImpl extends Service implements TaxDeclareRe // 薪资核算结果 Set salaryAcctEmployeeIdSet = SalaryEntityUtil.properties(incomeCategoryEntry.getValue(), SalaryAcctEmployeePO::getId); List> resultValues = salaryAcctEmployeeIdSet.stream().map(salaryAcctResultValueMap::get).filter(Objects::nonNull).collect(Collectors.toList()); - TaxDeclareContext taxDeclareContext = new TaxDeclareContext().setSalaryAcctRecordMap(salaryAcctRecordMap).setSalaryAcctEmployees(incomeCategoryEntry.getValue()).setSalaryAcctResultValues(salaryAcctResultValues).setTaxDeclaration(taxDeclaration).setSalarySobTaxReportRuleMap(salarySobTaxReportRuleMap).setSalarySobAddUpRuleMap(salarySobAddUpRuleMap).setTaxReportColumns(taxReportColumnMap.get(incomeCategoryEntry.getKey())).setSalaryItems(salaryItems); + TaxDeclareContext taxDeclareContext = new TaxDeclareContext() + .setSalaryAcctRecordMap(salaryAcctRecordMap) + .setSalaryAcctEmployees(incomeCategoryEntry.getValue()) + .setSalaryAcctResultValues(salaryAcctResultValues) + .setTaxDeclaration(taxDeclaration) + .setSalarySobTaxReportRuleMap(salarySobTaxReportRuleMap) + .setSalarySobAddUpRuleMap(salarySobAddUpRuleMap) + .setTaxReportColumns(taxReportColumnMap.get(incomeCategoryEntry.getKey())) + .setSalaryItems(salaryItems); TaxDeclarationStrategy taxDeclarationStrategy = new TaxDeclarationCommon(); TaxDeclarationGenerateResult generateResult = taxDeclarationStrategy.generate(taxDeclareContext, (long) user.getUID()); taxDeclarationValues.addAll(generateResult.getTaxDeclarationValues()); @@ -760,6 +779,7 @@ public class TaxDeclareRecordServiceImpl extends Service implements TaxDeclareRe // 申报类型 taxDeclareRecord.setTaxPayAmount(Util.null2String(declareTaxFeedbackResponse.getBody().get("ykjse"))); taxDeclareRecord.setPersonNum(Integer.parseInt(Optional.ofNullable(declareTaxFeedbackResponse.getBody().get("nsrc")).orElse("0").toString())); + taxDeclareRecord.setDeclareRequestId(taxDeclareRecord.getRequestId()); taxDeclareRecord.setRequestId(""); taxDeclareRecord.setUpdateTime(new Date()); BigDecimal purePaidAmount = SalaryEntityUtil.empty2Zero(taxDeclareRecord.getTaxPurePaidAmount()); @@ -924,22 +944,23 @@ public class TaxDeclareRecordServiceImpl extends Service implements TaxDeclareRe TaxDeclareRecordPO taxDeclareRecord = taxDeclareRequest.getTaxDeclareRecord(); DeclareClient declareClient = new DeclareClient(taxDeclareRecord.getTaxAgentId()); - return declareClient.getDeclareTaxResultFeedback(taxDeclareRecord.getRequestId()); + return declareClient.getDeclareTaxResultFeedback(taxDeclareRecord.getDeclareRequestId()); } @Override - public XSSFWorkbook exportGetDeclareTaxResultFeedback(Long id, String requestId) { + public XSSFWorkbook exportGetDeclareTaxResultFeedback(DeclareTaxResultFeedbackQueryParam param) { + Long id = param.getId(); + String requestId = param.getRequestId(); TaxDeclareRequest taxDeclareRequest = buildTaxDeclareRequest(id); TaxDeclareRecordPO taxDeclareRecord = taxDeclareRequest.getTaxDeclareRecord(); DeclareClient declareClient = new DeclareClient(taxDeclareRecord.getTaxAgentId()); - GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse = declareClient.getDeclareTaxResultFeedback(StringUtils.isEmpty(requestId) ? taxDeclareRecord.getRequestId() : requestId); - List sscglb = declareTaxResultFeedbackResponse.getBody().getZhsd().getZcgzxj().getSscglb(); + GetDeclareTaxResultFeedbackResponse declareTaxResultFeedbackResponse = declareClient.getDeclareTaxResultFeedback(StringUtils.isEmpty(requestId) ? taxDeclareRecord.getDeclareRequestId() : requestId); - // 需要导出的数据 - List> excelSheetData = ExcelUtil.getExcelSheetData(GetDeclareTaxResultFeedbackResponse.Body.zhsd.zcgzxj.zhsdscjgbw.class, sscglb); - - return ExcelUtil.genWorkbookV2(excelSheetData, "申报内置算税结果"); + Map>> map = new HashMap<>(); + List list = getTaxDeclarationService(user).listByTaxDeclareRecordId(id); + list.stream().map(TaxDeclarationPO::getIncomeCategory).map(IncomeCategoryEnum::parseByValue).forEach(e -> e.parseGetDeclareTaxResultFeedbackResponse(map, declareTaxResultFeedbackResponse)); + return ExcelUtil.genWorkbookV2(map); } diff --git a/src/com/engine/salary/util/excel/DataTypeEnum.java b/src/com/engine/salary/util/excel/DataTypeEnum.java new file mode 100644 index 000000000..15e845cd9 --- /dev/null +++ b/src/com/engine/salary/util/excel/DataTypeEnum.java @@ -0,0 +1,32 @@ +package com.engine.salary.util.excel; + +import java.util.Arrays; +import java.util.Objects; + +public enum DataTypeEnum { + string("string", "字符类型"), + number("string", "数字类型"), + date("string", "日期类型"); + + private String value; + private String name; + + DataTypeEnum(String value, String name) { + this.value = value; + this.name = name; + } + + public String getValue() { + return value; + } + + public String getName() { + return name; + } + + + public static DataTypeEnum parseByValue(String value) { + return Arrays.stream(DataTypeEnum.values()).filter(typeEnum -> Objects.equals(typeEnum.getValue(), value)).findFirst().orElse(null); + } + +} diff --git a/src/com/engine/salary/util/excel/ExcelHead.java b/src/com/engine/salary/util/excel/ExcelHead.java new file mode 100644 index 000000000..cec7da51d --- /dev/null +++ b/src/com/engine/salary/util/excel/ExcelHead.java @@ -0,0 +1,28 @@ +package com.engine.salary.util.excel; + +import java.lang.annotation.*; + +/** + * 数据列表表头 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ExcelHead { + + String title() default ""; + + String dataIndex() default ""; + + DataTypeEnum dataType() default DataTypeEnum.string; + + int labelId() default -1; + + String width() default ""; + +} diff --git a/src/com/engine/salary/util/excel/ExcelUtil.java b/src/com/engine/salary/util/excel/ExcelUtil.java index b9a0c5d2c..b47077c33 100644 --- a/src/com/engine/salary/util/excel/ExcelUtil.java +++ b/src/com/engine/salary/util/excel/ExcelUtil.java @@ -4,6 +4,7 @@ import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryDateUtil; import com.google.common.collect.Lists; +import com.engine.salary.util.SalaryI18nUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.FillPatternType; @@ -14,6 +15,8 @@ import org.apache.poi.xssf.usermodel.*; import java.awt.*; import java.lang.reflect.Field; import java.util.*; +import java.lang.reflect.Field; +import java.util.Date; import java.util.List; public class ExcelUtil { @@ -272,6 +275,71 @@ public class ExcelUtil { return workbook; } + public static XSSFWorkbook genWorkbookV2(Map>> map) { + XSSFWorkbook workbook = new XSSFWorkbook(); + + map.entrySet().forEach(en->{ + + String sheetName = en.getKey(); + List> rowList = en.getValue(); + // 设置title样式 + XSSFCellStyle titleCellStyle = workbook.createCellStyle(); + XSSFFont titleFont = workbook.createFont(); + titleFont.setFontName("仿宋"); + titleFont.setFontHeightInPoints((short) 15); + titleCellStyle.setFont(titleFont); + titleCellStyle.setAlignment(HorizontalAlignment.CENTER); + titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//背景色 + titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + + // 设置主体样式 + XSSFCellStyle cellStyle = workbook.createCellStyle(); + XSSFFont font = workbook.createFont(); + font.setFontName("宋体"); + font.setFontHeightInPoints((short) 10);// 设置字体大小 + cellStyle.setFont(font);// 选择需要用到的字体格式 + cellStyle.setWrapText(true); + + XSSFSheet sheet = workbook.createSheet(sheetName); + //自适应宽度 + sheet.autoSizeColumn(0, true); + //默认列宽 + sheet.setDefaultColumnWidth(20); + //默认行高 + sheet.setDefaultRowHeightInPoints(18); + + for (int rowIndex = 0; rowIndex < rowList.size(); rowIndex++) { + List infoList = rowList.get(rowIndex); + XSSFRow row = sheet.createRow(rowIndex); + for (int cellIndex = 0; cellIndex < infoList.size(); cellIndex++) { + XSSFCell cell = row.createCell(cellIndex); + if (rowIndex == 0) { + cell.setCellStyle(titleCellStyle); + } else { + cell.setCellStyle(cellStyle); + } + Object o = infoList.get(cellIndex); + if (o instanceof String) { + cell.setCellType(CellType.STRING); + cell.setCellValue(String.valueOf(o)); + } else if (o instanceof Boolean) { + cell.setCellType(CellType.BOOLEAN); + cell.setCellValue(String.valueOf(o)); + } else if (o instanceof Date) { + cell.setCellType(CellType.STRING); + cell.setCellValue(SalaryDateUtil.getFormatLocalDate((Date) o)); + } else { + cell.setCellType(CellType.STRING); + cell.setCellValue(o == null ? "" : o.toString()); + } + } + } + }); + + return workbook; + } + public static XSSFWorkbook genWorkbook(ExcelSheetData excelSheetData) { List> list = new ArrayList<>(); list.add(excelSheetData.getHeaders()); @@ -314,4 +382,24 @@ public class ExcelUtil { return rows; } + + /** + * 解析表头 + * + * @param clazz + * @param headerList + * @param dataIndexList + * @param + */ + public static void parseHeader(Class clazz, List headerList, List dataIndexList) { + Field[] declaredFields = clazz.getDeclaredFields(); + for (Field declaredField : declaredFields) { + if (!declaredField.isAnnotationPresent(ExcelHead.class)) { + continue; + } + ExcelHead annotation = declaredField.getAnnotation(ExcelHead.class); + headerList.add(SalaryI18nUtil.getI18nLabel(annotation.labelId(), annotation.title())); + dataIndexList.add(declaredField.getName()); + } + } } diff --git a/src/com/engine/salary/web/EmployeeDeclareController.java b/src/com/engine/salary/web/EmployeeDeclareController.java index c2c2703e6..fa54d79f3 100644 --- a/src/com/engine/salary/web/EmployeeDeclareController.java +++ b/src/com/engine/salary/web/EmployeeDeclareController.java @@ -305,12 +305,41 @@ public class EmployeeDeclareController { } /** - * 人员报送-导出全部人员 + * 人员报送-导入预览 * * @param queryParam 导出参数 * @return */ @POST + @Path("/preview") + @Produces(MediaType.APPLICATION_JSON) + public String preview(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareImportParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::preview, queryParam); + } + + /** + * 人员报送-导入 + * + * @param queryParam 导出参数 + * @return + */ + @POST + @Path("/importData") + @Produces(MediaType.APPLICATION_JSON) + public String importData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareImportParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::importData, queryParam); + } + + + /** + * 人员报送-导出全部人员 + * + * @param param 导出参数 + * @return + */ + @POST @Path("/export") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response export(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareListQueryParam param) { diff --git a/src/com/engine/salary/web/TaxDeclarationController.java b/src/com/engine/salary/web/TaxDeclarationController.java index f3e0a89e5..dc61a0458 100644 --- a/src/com/engine/salary/web/TaxDeclarationController.java +++ b/src/com/engine/salary/web/TaxDeclarationController.java @@ -222,14 +222,14 @@ public class TaxDeclarationController { * * @return */ - @GET + @POST @Path("/exportGetDeclareTaxResultFeedback") @Produces(MediaType.APPLICATION_OCTET_STREAM) - public Response exportGetDeclareTaxResultFeedback(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id, @QueryParam(value = "requestId") String requestId) { + public Response exportGetDeclareTaxResultFeedback(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody DeclareTaxResultFeedbackQueryParam param) { try { User user = HrmUserVarify.getUser(request, response); - XSSFWorkbook workbook = getTaxDeclareRecordWrapper(user).exportGetDeclareTaxResultFeedback(id ,requestId); + XSSFWorkbook workbook = getTaxDeclareRecordWrapper(user).exportGetDeclareTaxResultFeedback(param); String fileName = "申报内置算税结果-" + LocalDate.now(); try { fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); @@ -334,6 +334,70 @@ public class TaxDeclarationController { return new ResponseResult(user).run(getTaxDeclareRecordWrapper(user)::refreshData, taxDeclareRecordParam.getTaxDeclareRecordId()); } + /** + * 新增表单 + * + * @param param + * @return + */ + @POST + @Path("/getAddForm") + @Produces(MediaType.APPLICATION_JSON) + public String getAddForm(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclareRecordDetailFormParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getTaxDeclareRecordWrapper(user)::getAddForm, param); + } + + /** + * 新增 + * + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/add") + @Produces(MediaType.APPLICATION_JSON) + public String add(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclareRecordDetailSaveParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getTaxDeclareRecordWrapper(user)::add, param); + } + + + /** + * 编辑 + * + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/edit") + @Produces(MediaType.APPLICATION_JSON) + public String edit(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclareRecordDetailSaveParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getTaxDeclareRecordWrapper(user)::edit, param); + } + + /** + * 获取详细详细 + * + * @param request + * @param response + * @param id + * @return + */ + @GET + @Path("/detailInfo") + @Produces(MediaType.APPLICATION_JSON) + public String edit(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getTaxDeclareRecordWrapper(user)::detailInfo, id); + } + + /** * 个税申报表详情列表 * @@ -378,9 +442,7 @@ public class TaxDeclarationController { }; response.setContentType("application/octet-stream"); - return Response.ok(output) - .header("Content-disposition", "attachment;filename=" + fileName) - .header("Cache-Control", "no-cache").build(); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); } catch (Exception e) { log.error("个税申报表明细导出异常", e); throw e; @@ -515,9 +577,7 @@ public class TaxDeclarationController { }; response.setContentType("application/octet-stream"); - return Response.ok(output) - .header("Content-disposition", "attachment;filename=" + fileName) - .header("Cache-Control", "no-cache").build(); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); } catch (Exception e) { log.error("未报送的人员导出异常", e); throw e; @@ -552,9 +612,7 @@ public class TaxDeclarationController { }; response.setContentType("application/octet-stream"); - return Response.ok(output) - .header("Content-disposition", "attachment;filename=" + fileName) - .header("Cache-Control", "no-cache").build(); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); } catch (Exception e) { log.error("缺少申报数据的人员导出异常", e); throw e; @@ -588,13 +646,57 @@ public class TaxDeclarationController { }; response.setContentType("application/octet-stream"); - return Response.ok(output) - .header("Content-disposition", "attachment;filename=" + fileName) - .header("Cache-Control", "no-cache").build(); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); } catch (Exception e) { log.error("申报失败人员导出异常", e); throw e; } } + @POST + @Path("/downloadTemplate") + @Produces(MediaType.APPLICATION_OCTET_STREAM) + public Response downloadTemplate(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody DownloadTemplateParam param) { + try { + User user = HrmUserVarify.getUser(request, response); + + XSSFWorkbook workbook = getTaxDeclareRecordWrapper(user).downloadTemplate(param); + + String fileName = "申报表导入模板" + LocalDate.now(); + + try { + fileName = URLEncoder.encode(fileName + ".xlsx", "UTF-8"); + } catch (UnsupportedEncodingException e) { + log.error(e.getMessage(), e); + } + + StreamingOutput output = outputStream -> { + workbook.write(outputStream); + outputStream.flush(); + }; + response.setContentType("application/octet-stream"); + return Response.ok(output).header("Content-disposition", "attachment;filename=" + fileName).header("Cache-Control", "no-cache").build(); + + } catch (Exception e) { + log.error("申报表导入模板导出异常", e); + throw e; + } + } + + @POST + @Path("/preview") + @Produces(MediaType.APPLICATION_JSON) + public String preview(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody DownloadTemplateParam importParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getTaxDeclareRecordWrapper(user)::preview, importParam); + } + + @POST + @Path("/importData") + @Produces(MediaType.APPLICATION_JSON) + public String importAddUpDeduction(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody DownloadTemplateParam importParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getTaxDeclareRecordWrapper(user)::importData, importParam); + } + } diff --git a/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java b/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java index 399286e63..39623bb5a 100644 --- a/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java +++ b/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java @@ -567,6 +567,26 @@ public class EmployeeDeclareWrapper extends Service { return getEmployeeDeclareExcelService(user).exportTemplate(param); } + /** + * 人员报送-导入数据 + * + * @param param + * @return + */ + public Map preview(EmployeeDeclareImportParam param) { + return getEmployeeDeclareExcelService(user).preview(param); + } + + /** + * 人员报送-导入数据 + * + * @param param + * @return + */ + public Map importData(EmployeeDeclareImportParam param) { + return getEmployeeDeclareExcelService(user).importData(param); + } + /** * 人员报送-导出本月全部的人员 * diff --git a/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java b/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java index edd3900df..fed3fbe32 100644 --- a/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java +++ b/src/com/engine/salary/wrapper/TaxDeclareRecordWrapper.java @@ -4,13 +4,16 @@ import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.employeedeclare.param.EmployeeDeclareListQueryParam; +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationDetailBO; import com.engine.salary.entity.taxdeclaration.dto.*; -import com.engine.salary.entity.taxdeclaration.param.AbnormalEmployeeListQueryParam; -import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam; -import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam; -import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQueryParam; +import com.engine.salary.entity.taxdeclaration.param.*; import com.engine.salary.entity.taxdeclaration.po.*; +import com.engine.salary.enums.employeedeclare.CardTypeEnum; +import com.engine.salary.enums.employeedeclare.DeclareStatusEnum; +import com.engine.salary.enums.employeedeclare.EmploymentStatusEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.enums.taxdeclaration.TaxDeclareStatusEnum; import com.engine.salary.enums.taxdeclaration.TaxDeclareTypeEnum; @@ -33,7 +36,6 @@ import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.springframework.stereotype.Component; import weaver.general.Util; import weaver.hrm.User; @@ -49,7 +51,6 @@ import java.util.stream.Collectors; * @version 1.0 **/ @Slf4j -@Component public class TaxDeclareRecordWrapper extends Service { @@ -89,6 +90,15 @@ public class TaxDeclareRecordWrapper extends Service { return ServiceUtil.getService(TaxDeclareFailServiceImpl.class, user); } + private TaxReportColumnService getTaxReportColumnService(User user) { + return ServiceUtil.getService(TaxReportColumnServiceImpl.class, user); + } + + private EmployeeDeclareService getEmployeeDeclareService(User user) { + return ServiceUtil.getService(EmployeeDeclareServiceImpl.class, user); + } + + /** * 个税申报记录列表 * @@ -463,12 +473,12 @@ public class TaxDeclareRecordWrapper extends Service { public Object getDeclareTaxResultFeedback(Long id) { - return getTaxDeclareRecordService(user).getDeclareTaxResultFeedback(id); + return getTaxDeclareRecordService(user).getDeclareTaxResultFeedback(id); } - public XSSFWorkbook exportGetDeclareTaxResultFeedback(Long id,String requestId) { - return getTaxDeclareRecordService(user).exportGetDeclareTaxResultFeedback(id, requestId); + public XSSFWorkbook exportGetDeclareTaxResultFeedback(DeclareTaxResultFeedbackQueryParam param) { + return getTaxDeclareRecordService(user).exportGetDeclareTaxResultFeedback(param); } /** @@ -660,4 +670,101 @@ public class TaxDeclareRecordWrapper extends Service { return getTaxDeclarationExcelService(user).exportEmployee4Fail(queryParam); } + public TaxDeclareRecordDetailFormDTO getAddForm(TaxDeclareRecordDetailFormParam param) { + TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); + + if (taxDeclaration == null) { + throw new SalaryRunTimeException("申报表不存在!"); + } + + // 查询个税申报表列 + List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(taxDeclaration.getIncomeCategory())); + //当前税款所属期报送成功且状态正常的人员 + List employeeDeclarePOS = getEmployeeDeclareService(user).listByParam( + EmployeeDeclareListQueryParam + .builder() + .taxCycle(taxDeclaration.getTaxCycle()) + .taxAgentId(taxDeclaration.getTaxAgentId()) + .declareStatus(DeclareStatusEnum.DECLARE_SUCCESS) + .employmentStatus(EmploymentStatusEnum.NORMAL) + .build() + ); + + //过滤申报表中已存在的人员 + List taxDeclarationValuePOS = getTaxDeclarationValueService(user).listByTaxDeclarationIds(Collections.singletonList(param.getTaxDeclarationId())); + Set empIds = SalaryEntityUtil.properties(taxDeclarationValuePOS, TaxDeclarationValuePO::getEmployeeId); + + employeeDeclarePOS = employeeDeclarePOS.stream().filter(emp -> !empIds.contains(emp.getEmployeeId())).collect(Collectors.toList()); + + return TaxDeclareRecordDetailFormDTO.builder() + .taxReportColumns(TaxDeclarationDetailBO.convert2ListTaxReportColumn(taxReportColumns)) + .employeeDeclares(employeeDeclarePOS) + .taxDeclarationId(taxDeclaration.getTaxAgentId()) + .build(); + } + + /** + * 新增 + * + * @param param + */ + public void add(TaxDeclareRecordDetailSaveParam param) { + getTaxDeclarationValueService(user).save(param); + } + + /** + * 编辑 + * + * @param param + */ + public void edit(TaxDeclareRecordDetailSaveParam param) { + getTaxDeclarationValueService(user).edit(param); + } + + public TaxDeclareRecordDetailFormDTO detailInfo(Long id) { + TaxDeclarationValuePO declarationValuePO = getTaxDeclarationValueService(user).getById(id); + TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(declarationValuePO.getTaxDeclarationId()); + + List employeeDeclarePOS = getEmployeeDeclareService(user).listByParam( + EmployeeDeclareListQueryParam + .builder() + .taxCycle(taxDeclarationPO.getTaxCycle()) + .taxAgentId(taxDeclarationPO.getTaxAgentId()) + .employeeId(declarationValuePO.getEmployeeId()) + .build() + ); + + if (CollectionUtils.isEmpty(employeeDeclarePOS)) { + throw new SalaryRunTimeException("当前人员未报送!"); + } + EmployeeDeclarePO employeeDeclarePO = employeeDeclarePOS.get(0); + // 查询个税申报表列 + List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.parseByValue(taxDeclarationPO.getIncomeCategory())); + return TaxDeclareRecordDetailFormDTO + .builder() + .id(id) + .employeeId(employeeDeclarePO.getEmployeeId()) + .employeeType(employeeDeclarePO.getEmployeeType()) + .taxDeclarationId(taxDeclarationPO.getId()) + .incomeCategory(IncomeCategoryEnum.parseByValue(taxDeclarationPO.getIncomeCategory()).getDefaultLabel()) + .cardNum(employeeDeclarePO.getCardNum()) + .cardType(SalaryEnumUtil.enumMatchByValue(employeeDeclarePO.getCardType(), CardTypeEnum.class).getDefaultLabel()) + .username(employeeDeclarePO.getEmployeeName()) + .jobNum(employeeDeclarePO.getJobNum()) + .taxReportColumns(TaxDeclarationDetailBO.convert2ListTaxReportColumn(taxReportColumns)) + .resultValue(declarationValuePO.getResultValue()) + .build(); + } + + public XSSFWorkbook downloadTemplate(DownloadTemplateParam param) { + return getTaxDeclarationExcelService(user).downloadTemplate(param); + } + + public Map preview(DownloadTemplateParam param) { + return getTaxDeclarationExcelService(user).preview(param); + } + + public Map importData(DownloadTemplateParam param) { + return getTaxDeclarationExcelService(user).importData(param); + } }