Merge branch 'feature/250101_编辑个税申报表' into custom/西部信托

# Conflicts:
#	src/com/engine/salary/service/impl/TaxDeclarationDetailServiceImpl.java
This commit is contained in:
Harryxzy 2025-06-12 13:27:06 +08:00
commit 2135989cdb
9 changed files with 251 additions and 4 deletions

View File

@ -1,6 +1,9 @@
package com.engine.salary.entity.taxdeclaration.dto; package com.engine.salary.entity.taxdeclaration.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
/** /**
* 个税申报表中的人员组织架构中的人员+外部人员 * 个税申报表中的人员组织架构中的人员+外部人员
@ -10,6 +13,9 @@ import lombok.Data;
* @author qiantao * @author qiantao
* @version 1.0 * @version 1.0
**/ **/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data @Data
public class TaxDeclarationEmployeeDTO { public class TaxDeclarationEmployeeDTO {

View File

@ -0,0 +1,27 @@
package com.engine.salary.entity.taxdeclaration.param;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Map;
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class TaxDeclarationDetailFormEditParam {
//"个税申报记录id")
private Long taxDeclarationId;
private Long employeeId;
private String taxDeclarationIdStr;
private Map<String, Object> valueMap;
}

View File

@ -0,0 +1,23 @@
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 TaxDeclarationDetailFormQueryParam {
//"个税申报记录id")
private Long taxDeclarationId;
private String taxDeclarationIdStr;
private Long employeeId;
}

View File

@ -70,4 +70,6 @@ public interface TaxDeclarationDetailMapper {
List<TaxDeclarationDetailPO> listAll(); List<TaxDeclarationDetailPO> listAll();
int batchUpdate(@Param("collection") List<TaxDeclarationDetailPO> taxDeclarationDetailPos); int batchUpdate(@Param("collection") List<TaxDeclarationDetailPO> taxDeclarationDetailPos);
void deleteByTaxDeclarationIdAndEmployeeId(@Param("taxDeclarationId") Long taxDeclarationId, @Param("employeeId") Long employeeId);
} }

View File

@ -31,6 +31,13 @@
, t.update_time , t.update_time
, t.employee_type , t.employee_type
</sql> </sql>
<update id="deleteByTaxDeclarationIdAndEmployeeId">
UPDATE hrsa_tax_declaration_detail
SET delete_type = 1
WHERE delete_type = 0
AND tax_declaration_id = #{taxDeclarationId}
AND employee_id = #{employeeId}
</update>
<resultMap id="resultMap" type="com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationEmployeeDTO"> <resultMap id="resultMap" type="com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationEmployeeDTO">
@ -39,7 +46,7 @@
</resultMap> </resultMap>
<select id="listPage4EmployeeId" resultMap="resultMap"> <select id="listPage4EmployeeId" resultMap="resultMap">
SELECT employee_type, employee_id SELECT employee_type, employee_id
FROM hrsa_tax_declaration_detail t FROM hrsa_tax_declaration_detail t
LEFT JOIN hrmresource e ON e.id = t.employee_id LEFT JOIN hrmresource e ON e.id = t.employee_id
LEFT JOIN hrmdepartment d ON d.id = e.DEPARTMENTID LEFT JOIN hrmdepartment d ON d.id = e.DEPARTMENTID

View File

@ -1,12 +1,15 @@
package com.engine.salary.service; package com.engine.salary.service;
import com.engine.salary.entity.taxdeclaration.dto.*; import com.engine.salary.entity.taxdeclaration.dto.*;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormEditParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.PageInfo;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 个税申报表明细 * 个税申报表明细
@ -84,4 +87,8 @@ public interface TaxDeclarationDetailService {
* @param taxDeclarationIds 个税申报表id * @param taxDeclarationIds 个税申报表id
*/ */
void deleteByTaxDeclarationIds(Collection<Long> taxDeclarationIds); void deleteByTaxDeclarationIds(Collection<Long> taxDeclarationIds);
Map<String, Object> getTaxDeclarationDetailForm(TaxDeclarationDetailFormQueryParam param);
void editTaxDeclarationDetailData(TaxDeclarationDetailFormEditParam param);
} }

View File

@ -2,15 +2,19 @@ package com.engine.salary.service.impl;
import com.engine.common.util.ServiceUtil; import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service; import com.engine.core.impl.Service;
import com.engine.salary.constant.SalaryDefaultTenantConstant;
import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.EncryptUtil;
import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.DataCollectionEmployee;
import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationBO; import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationBO;
import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationDetailBO; import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationDetailBO;
import com.engine.salary.entity.taxdeclaration.dto.*; import com.engine.salary.entity.taxdeclaration.dto.*;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormEditParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.mapper.taxdeclaration.TaxDeclarationDetailMapper; import com.engine.salary.mapper.taxdeclaration.TaxDeclarationDetailMapper;
import com.engine.salary.service.SalaryEmployeeService; import com.engine.salary.service.SalaryEmployeeService;
@ -21,12 +25,17 @@ import com.engine.salary.sys.entity.vo.OrderRuleVO;
import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.SalarySysConfService;
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.db.IdGenerator;
import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.db.MapperProxyFactory;
import com.engine.salary.util.page.Column;
import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.PageInfo;
import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.page.SalaryPageUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.math.NumberUtils;
import weaver.hrm.User; import weaver.hrm.User;
import weaver.wechat.util.Utils;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -202,6 +211,45 @@ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDecla
return TaxDeclarationDetailBO.convert2ListDTO4Annual(taxDeclarationDetailPOS, taxDeclarationEmployees, simpleEmployees); return TaxDeclarationDetailBO.convert2ListDTO4Annual(taxDeclarationDetailPOS, taxDeclarationEmployees, simpleEmployees);
} }
/**
* 根据权限范围过滤
*
* @param taxDeclarationPO
* @param taxDeclarationEmployeeDTOS
* @return
*/
private List<TaxDeclarationEmployeeDTO> filterByAuthority(TaxDeclarationPO taxDeclarationPO, List<TaxDeclarationEmployeeDTO> taxDeclarationEmployeeDTOS) {
long employeeId = user.getUID();
if (CollectionUtils.isEmpty(taxDeclarationEmployeeDTOS)) {
return Collections.emptyList();
}
// 判断是否开启了分权
Boolean openDevolution = getTaxAgentService(user).isOpenDevolution();
// 是否是总管理员
Boolean isChief = getTaxAgentService(user).isChief(employeeId);
if (BooleanUtils.isFalse(openDevolution) || isChief) {
return taxDeclarationEmployeeDTOS;
}
// 查询权限范围内的人员
List<TaxAgentEmployeeDTO> taxAgentEmployeeDTOS = getTaxAgentService(user).listTaxAgentAndEmployee(employeeId);
Set<String> simpleEmployeeKeySet = SalaryEntityUtil.properties(taxAgentEmployeeDTOS, taxAgentEmployeeDTO -> taxAgentEmployeeDTO.getEmployeeId() + "-" + taxAgentEmployeeDTO.getTaxAgentId());
// 查询权限范围内的外部人员
// List<ExtEmployeePO> extEmployeePOS = extEmployeeService.listCanUseByEmployeeId(employeeId, tenantKey);
// Set<String> extEmployeeKeySet = SalaryEntityUtil.properties(extEmployeePOS, extEmployeePO -> extEmployeePO.getId() + "-" + extEmployeePO.getTaxAgentId());
// 根据权限范围过滤
return taxDeclarationEmployeeDTOS.stream().filter(taxDeclarationEmployeeDTO -> {
if (taxDeclarationEmployeeDTO.getEmployeeType() == null || Objects.equals(taxDeclarationEmployeeDTO.getEmployeeType(), EmployeeTypeEnum.ORGANIZATION.getValue())
&& simpleEmployeeKeySet.contains(taxDeclarationEmployeeDTO.getEmployeeId() + "-" + taxDeclarationPO.getTaxAgentId())) {
return true;
}
// if (Objects.equals(taxDeclarationEmployeeDTO.getEmployeeType(), EmployeeTypeEnum.EXT_EMPLOYEE.getValue())
// && extEmployeeKeySet.contains(taxDeclarationEmployeeDTO.getEmployeeId() + "-" + taxDeclarationPO.getTaxAgentId())) {
// return true;
// }
return false;
}).collect(Collectors.toList());
}
@Override @Override
public PageInfo<TaxDeclarationWageListDTO> listDtoPageByParam4Wage(TaxDeclarationDetailListQueryParam queryParam) { public PageInfo<TaxDeclarationWageListDTO> listDtoPageByParam4Wage(TaxDeclarationDetailListQueryParam queryParam) {
@ -254,4 +302,102 @@ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDecla
public void deleteByTaxDeclarationIds(Collection<Long> taxDeclarationIds) { public void deleteByTaxDeclarationIds(Collection<Long> taxDeclarationIds) {
getTaxDeclarationDetailMapper().deleteByTaxDeclarationIds(taxDeclarationIds); getTaxDeclarationDetailMapper().deleteByTaxDeclarationIds(taxDeclarationIds);
} }
@Override
public Map<String, Object> getTaxDeclarationDetailForm(TaxDeclarationDetailFormQueryParam param) {
Map<String, Object> resultMap = new HashMap<>();
if (param.getTaxDeclarationId() == null || param.getEmployeeId() == null) {
return resultMap;
}
// 查询个税申报主表
TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(param.getTaxDeclarationId());
if (taxDeclarationPO == null) {
return resultMap;
}
List<TaxDeclarationDetailPO> taxDeclarationDetailPOS = listByTaxDeclarationIdAndEmployeeIds(param.getTaxDeclarationId(), Collections.singletonList(param.getEmployeeId()));
if (CollectionUtils.isEmpty(taxDeclarationDetailPOS)) {
return resultMap;
}
Integer employeeType = taxDeclarationDetailPOS.stream().map(TaxDeclarationDetailPO::getEmployeeType).findFirst().orElse(0);
List<TaxDeclarationEmployeeDTO> taxDeclarationEmployeeDTOS = Collections.singletonList(TaxDeclarationEmployeeDTO.builder().employeeType(employeeType).employeeId(param.getEmployeeId()).build());
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIds(Collections.singletonList(param.getEmployeeId()));
// 正常工资薪金所得
if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) {
List<TaxDeclarationWageListDTO> taxDeclarationWageListDTOS = TaxDeclarationDetailBO.convert2ListDTO4Wage(taxDeclarationDetailPOS, taxDeclarationEmployeeDTOS, simpleEmployees);
PageInfo<TaxDeclarationWageListDTO> pageInfo = new PageInfo<>(TaxDeclarationWageListDTO.class);
List<Column> columns = pageInfo.getColumns();
resultMap.put("column", columns);
if (CollectionUtils.isNotEmpty(taxDeclarationWageListDTOS)) {
resultMap.put("data", taxDeclarationWageListDTOS.get(0));
}
}
// 劳务报酬所得
if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.REMUNERATION_FOR_LABOR.getValue())) {
List<TaxDeclarationLaborListDTO> taxDeclarationLaborListDTOS = listDto4Labor(param.getTaxDeclarationId(), taxDeclarationEmployeeDTOS);
PageInfo<TaxDeclarationLaborListDTO> pageInfo = new PageInfo<>(TaxDeclarationLaborListDTO.class);
List<Column> columns = pageInfo.getColumns();
resultMap.put("column", columns);
if (CollectionUtils.isNotEmpty(taxDeclarationLaborListDTOS)) {
resultMap.put("data", taxDeclarationLaborListDTOS.get(0));
}
}
// 全年一次性奖金收入
if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.ONETIME_ANNUAL_BONUS.getValue())) {
List<TaxDeclarationAnnualListDTO> taxDeclarationLaborListDTOS = listDto4Annual(param.getTaxDeclarationId(), taxDeclarationEmployeeDTOS);
PageInfo<TaxDeclarationAnnualListDTO> pageInfo = new PageInfo<>(TaxDeclarationAnnualListDTO.class);
List<Column> columns = pageInfo.getColumns();
resultMap.put("column", columns);
if (CollectionUtils.isNotEmpty(taxDeclarationLaborListDTOS)) {
resultMap.put("data", taxDeclarationLaborListDTOS.get(0));
}
}
return resultMap;
}
@Override
public void editTaxDeclarationDetailData(TaxDeclarationDetailFormEditParam param) {
if (param.getTaxDeclarationId() == null || param.getEmployeeId() == null || param.getValueMap() == null || param.getValueMap().isEmpty()) {
return;
}
// 查询个税申报主表
TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(param.getTaxDeclarationId());
if (taxDeclarationPO == null) {
throw new SalaryRunTimeException("个税申报表不存在,请刷新页面后重试");
}
List<TaxDeclarationDetailPO> taxDeclarationDetailPOS = getTaxDeclarationDetailMapper().listByTaxDeclarationIdAndEmployeeIds(param.getTaxDeclarationId(), Collections.singletonList(param.getEmployeeId()));
Integer employeeType = taxDeclarationDetailPOS.stream().map(TaxDeclarationDetailPO::getEmployeeType).distinct().collect(Collectors.toList()).get(0);
// 插入数据
List<TaxDeclarationDetailPO> needInsertList = Lists.newArrayListWithExpectedSize(param.getValueMap().size());
param.getValueMap().forEach((fieldCode, fieldValue) -> {
TaxDeclarationDetailPO taxDeclarationDetailPO = TaxDeclarationDetailPO.builder()
.id(IdGenerator.generate())
.taxDeclarationId(param.getTaxDeclarationId())
.employeeType(employeeType)
.employeeId(param.getEmployeeId())
.fieldCode(fieldCode)
.fieldValue(Utils.null2String(fieldValue))
.creator(Long.valueOf(user.getUID()))
.createTime(new Date())
.updateTime(new Date())
.deleteType(NumberUtils.INTEGER_ZERO)
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
.build();
needInsertList.add(taxDeclarationDetailPO);
});
if (CollectionUtils.isNotEmpty(needInsertList)) {
// 先删除原有数据
deleteByTaxDeclarationIdAndEmployeeId(param.getTaxDeclarationId(), param.getEmployeeId());
batchSave(needInsertList);
}
}
private void deleteByTaxDeclarationIdAndEmployeeId(Long taxDeclarationId, Long employeeId) {
if (taxDeclarationId == null || employeeId == null) {
return;
}
getTaxDeclarationDetailMapper().deleteByTaxDeclarationIdAndEmployeeId(taxDeclarationId, employeeId);
}
} }

View File

@ -4,9 +4,7 @@ import com.engine.common.util.ServiceUtil;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationFormDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationFormDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationInfoDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationInfoDTO;
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationListDTO; import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationListDTO;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam; import com.engine.salary.entity.taxdeclaration.param.*;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam;
import com.engine.salary.service.TaxDeclarationExcelService; import com.engine.salary.service.TaxDeclarationExcelService;
import com.engine.salary.service.TaxDeclarationService; import com.engine.salary.service.TaxDeclarationService;
import com.engine.salary.service.impl.TaxDeclarationExcelServiceImpl; import com.engine.salary.service.impl.TaxDeclarationExcelServiceImpl;
@ -32,6 +30,7 @@ import javax.ws.rs.core.StreamingOutput;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Map;
@Slf4j @Slf4j
@ -109,6 +108,25 @@ public class TaxDeclarationController {
return new ResponseResult<TaxDeclarationDetailListQueryParam, PageInfo>(user).run(getTaxDeclarationDetailWrapper(user)::listPage, param); return new ResponseResult<TaxDeclarationDetailListQueryParam, PageInfo>(user).run(getTaxDeclarationDetailWrapper(user)::listPage, param);
} }
//个税申报表 表单数据
@POST
@Path("/detail/getFormData")
@Produces(MediaType.APPLICATION_JSON)
public String getTaxDeclarationDetailFormData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationDetailFormQueryParam param) {
User user = HrmUserVarify.getUser(request, response);
param.setTaxDeclarationId(Long.parseLong(param.getTaxDeclarationIdStr()));
return new ResponseResult<TaxDeclarationDetailFormQueryParam, Map<String, Object>>(user).run(getTaxDeclarationDetailWrapper(user)::getTaxDeclarationDetailFormData, param);
}
@POST
@Path("/detail/editFormData")
@Produces(MediaType.APPLICATION_JSON)
public String editTaxDeclarationDetailData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationDetailFormEditParam param) {
User user = HrmUserVarify.getUser(request, response);
param.setTaxDeclarationId(Long.parseLong(param.getTaxDeclarationIdStr()));
return new ResponseResult<TaxDeclarationDetailFormEditParam, String>(user).run(getTaxDeclarationDetailWrapper(user)::editTaxDeclarationDetailData, param);
}
//个税申报表相关信息 //个税申报表相关信息
@GET @GET
@Path("/export") @Path("/export")

View File

@ -2,6 +2,8 @@ package com.engine.salary.wrapper;
import com.engine.common.util.ServiceUtil; import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service; import com.engine.core.impl.Service;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormEditParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormQueryParam;
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam; import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
@ -13,6 +15,7 @@ import com.engine.salary.util.page.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import weaver.hrm.User; import weaver.hrm.User;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -62,4 +65,12 @@ public class TaxDeclarationDetailWrapper extends Service {
return new PageInfo(); return new PageInfo();
} }
public Map<String, Object> getTaxDeclarationDetailFormData(TaxDeclarationDetailFormQueryParam param) {
return getTaxDeclarationDetailService(user).getTaxDeclarationDetailForm(param);
}
public void editTaxDeclarationDetailData(TaxDeclarationDetailFormEditParam param) {
getTaxDeclarationDetailService(user).editTaxDeclarationDetailData(param);
}
} }