From 171f726bd372f65bc5a58e5d841f6f9952e936b6 Mon Sep 17 00:00:00 2001 From: fcli Date: Wed, 2 Nov 2022 17:27:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=93=E9=A1=B9=E9=99=84=E5=8A=A0?= =?UTF-8?q?=E6=89=A3=E9=99=A4=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/biz/SpecialAddDeductionBiz.java | 190 ++-- .../SpecialAddDeductionMapper.xml | 792 ++++++++++++----- .../impl/SpecialAddDeductionServiceImpl.java | 810 ++++++++++++++++++ 3 files changed, 1477 insertions(+), 315 deletions(-) create mode 100644 src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java diff --git a/src/com/engine/salary/biz/SpecialAddDeductionBiz.java b/src/com/engine/salary/biz/SpecialAddDeductionBiz.java index b9b8cc9d0..c505a964e 100644 --- a/src/com/engine/salary/biz/SpecialAddDeductionBiz.java +++ b/src/com/engine/salary/biz/SpecialAddDeductionBiz.java @@ -1,12 +1,9 @@ package com.engine.salary.biz; -import com.engine.salary.encrypt.datacollection.OtherDeductionPOEncrypt; -import com.engine.salary.encrypt.datacollection.OtherDeductionRecordDTOEncrypt; -import com.engine.salary.entity.datacollection.dto.OtherDeductionRecordDTO; -import com.engine.salary.entity.datacollection.param.OtherDeductionQueryParam; -import com.engine.salary.entity.datacollection.po.OtherDeductionPO; +import com.engine.salary.encrypt.datacollection.SpecialAddDeductionEncrypt; +import com.engine.salary.entity.datacollection.dto.SpecialAddDeductionRecordDTO; +import com.engine.salary.entity.datacollection.param.SpecialAddDeductionQueryParam; import com.engine.salary.entity.datacollection.po.SpecialAddDeductionPO; -import com.engine.salary.mapper.datacollection.OtherDeductionMapper; import com.engine.salary.mapper.datacollection.SpecialAddDeductionMapper; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; @@ -18,58 +15,53 @@ import java.util.*; import java.util.stream.Collectors; public class SpecialAddDeductionBiz extends BaseBean { - - - - /** - * 条件查询 - * - * @param param - * @return - */ - public List listSome(SpecialAddDeductionPO param) { - SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); - try { - SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); - List list = mapper.insertSelective(param); - return OtherDeductionPOEncrypt.decryptOtherDeductionPOList(otherDeductionPOS); - } finally { - sqlSession.close(); - } - } - - /** * 根据id获取 * * @param id * @return */ - public OtherDeductionPO getById(Long id) { - SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); - try { - OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); - OtherDeductionPO byId = mapper.getById(id); - return OtherDeductionPOEncrypt.decryptOtherDeductionPO(byId); - } finally { - sqlSession.close(); + public SpecialAddDeductionPO getById(Long id) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); + SpecialAddDeductionPO byId = mapper.getById(id); + return SpecialAddDeductionEncrypt.decrypt(byId); } } + public List listDTOByParam(SpecialAddDeductionQueryParam param) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); + List specialAddDeductionRecordDTOS = mapper.listDtoByParam(param); + return SpecialAddDeductionEncrypt.decrypt(specialAddDeductionRecordDTOS); + } + } + + public List listByDeclareMonthAndTaxAgentIds(Date declareMonth, List taxAgentIds) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); + List pos = mapper.listByDeclareMonthAndTaxAgentIds(declareMonth, taxAgentIds); + return SpecialAddDeductionEncrypt.decrypt(pos); + } + } + + /** - * 详情列表 + * 批量插入 * * @param param * @return */ - public List recordList(OtherDeductionQueryParam param) { - SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); - try { - OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); - List otherDeductionRecordDTOS = mapper.recordList(param); - return OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(otherDeductionRecordDTOS); - } finally { - sqlSession.close(); + public void batchSave(List param) { + if (CollectionUtils.isEmpty(param)) { + return; + } + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); + SpecialAddDeductionEncrypt.encrypt(param); + List> partition = Lists.partition(param, 100); + partition.forEach(mapper::batchInsert); + sqlSession.commit(); } } @@ -79,84 +71,55 @@ public class SpecialAddDeductionBiz extends BaseBean { * @param param * @return */ - public void batchSave(List param) { - if(CollectionUtils.isEmpty(param)){ + public void batchUpdate(List param) { + if (CollectionUtils.isEmpty(param)) { return; } SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { - OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); - OtherDeductionPOEncrypt.encryptOtherDeductionPOList(param); - List> partition = Lists.partition(param, 100); - partition.forEach(mapper::insertData); + SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); + SpecialAddDeductionEncrypt.encrypt(param); + List> partition = Lists.partition(param, 100); + partition.forEach(mapper::updateBatchSelective); sqlSession.commit(); } finally { sqlSession.close(); } } - /** - * 批量插入 - * - * @param param - * @return - */ - public void batchUpdate(List param) { - if(CollectionUtils.isEmpty(param)){ - return; - } - SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); - try { - OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); - OtherDeductionPOEncrypt.encryptOtherDeductionPOList(param); - List> partition = Lists.partition(param, 100); - partition.forEach(mapper::updateData); - sqlSession.commit(); - } finally { - sqlSession.close(); - } - } - - - - - /** * 处理导入数据 * * @param pos */ - public void handleImportData(List pos) { + public void handleImportData(List pos) { if (CollectionUtils.isEmpty(pos)) { return; } - OtherDeductionPO po = pos.get(0); + SpecialAddDeductionPO po = pos.get(0); // 多条相同人的则以第一条为准,如果逆序排列(用于重复的则以最后一条为准)Collections.reverse(pos); // 去重(通过记录的唯一条件(申报月份,人员id,个税扣缴义务人id)拼接) - List finalPos = pos.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getEmployeeId() + "-" + f.getTaxAgentId()))), ArrayList::new)); + List finalPos = pos.stream() + .collect(Collectors.collectingAndThen( + Collectors.toCollection(() -> + new TreeSet<>(Comparator.comparing(f -> f.getEmployeeId() + "-" + f.getTaxAgentId()))), + ArrayList::new) + ); // 查询已有数据 - List list = listSome(OtherDeductionPO.builder().declareMonth(po.getDeclareMonth()).build()); + List list = listByDeclareMonthAndTaxAgentIds(po.getDeclareMonth(), null); // 待修改的 本地已存在则更新【交集】 - List updateList = list.stream().map(m -> { - Optional optional = finalPos.stream().filter(p -> (p.getEmployeeId() + "-" + p.getTaxAgentId()).equals(m.getEmployeeId() + "-" + m.getTaxAgentId())).findFirst(); - OtherDeductionPO temp = null; - if (optional.isPresent()) { - temp = optional.get(); - // 换成本地库的id - temp.setId(m.getId()); - } - return temp; - }).filter(Objects::nonNull).collect(Collectors.toList()); + List updateList = list.stream() + .map(m -> finalPos.stream() + .filter(p -> (p.getEmployeeId() + "-" + p.getTaxAgentId()).equals(m.getEmployeeId() + "-" + m.getTaxAgentId())) + .findFirst() + .map(t -> t.setId(m.getId())) + .orElse(null) + ).filter(Objects::nonNull).collect(Collectors.toList()); // 待新增的 导入比本地多,则新增【差集(导入 - local)】 - List saveList = finalPos.stream().map(m -> { - Optional optional = list.stream().filter(p -> (p.getEmployeeId() + "-" + p.getTaxAgentId()).equals(m.getEmployeeId() + "-" + m.getTaxAgentId())).findFirst(); - OtherDeductionPO temp = null; - if (!optional.isPresent()) { - temp = m; - } - return temp; - }).filter(Objects::nonNull).collect(Collectors.toList()); + List saveList = finalPos.stream() + .filter(m -> list.stream().noneMatch(p -> (p.getEmployeeId() + "-" + p.getTaxAgentId()).equals(m.getEmployeeId() + "-" + m.getTaxAgentId())) + ).filter(Objects::nonNull).collect(Collectors.toList()); // 修改 if (CollectionUtils.isNotEmpty(updateList)) { @@ -166,43 +129,22 @@ public class SpecialAddDeductionBiz extends BaseBean { if (CollectionUtils.isNotEmpty(saveList)) { batchSave(saveList); } - // 记录操作日志 -// saveList.addAll(updateList); -// -// if (CollectionUtils.isNotEmpty(saveList)) { -// LoggerContext loggerContext = new LoggerContext(); -// loggerContext.setTargetName(SalaryI18nUtil.getI18nLabel(message.getTenantKey(), message.getUserId(), 100351, "导入累计专项附加扣除")); -// loggerContext.setOperateType(OperateTypeEnum.ADD.getValue()); -// loggerContext.setOperateTypeName(SalaryI18nUtil.getI18nLabel(message.getTenantKey(), message.getUserId(), 100351, "导入累计专项附加扣除")); -// loggerContext.setOperatedesc(SalaryI18nUtil.getI18nLabel(message.getTenantKey(), message.getUserId(), 100351, "导入累计专项附加扣除")); -// loggerContext.setNewValueList(saveList); -// loggerContext.setTenant_key(message.getTenantKey()); -// loggerContext.setOperator(message.getUserId().toString()); -// loggerContext.setOperatorName(message.getOpreator()); -// loggerContext.setClientIp(message.getClientIp()); -// addUpDeductionLoggerTemplate.write(loggerContext); -// } } /** - * @description 批量删除 * @return void - * @author Harryxzy - * @date 2022/10/27 16:07 + * @description 批量删除 */ - public void batchDeleteByIDS(List deleteIds) { + public void batchDeleteByIds(List deleteIds) { if (CollectionUtils.isEmpty(deleteIds)) { return; } - SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); - try { - OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); List> partition = Lists.partition(deleteIds, 100); - partition.forEach(mapper::deleteData); + partition.forEach(mapper::deleteByIds); sqlSession.commit(); - } finally { - sqlSession.close(); } } } diff --git a/src/com/engine/salary/mapper/datacollection/SpecialAddDeductionMapper.xml b/src/com/engine/salary/mapper/datacollection/SpecialAddDeductionMapper.xml index 44916d521..01cdbc987 100644 --- a/src/com/engine/salary/mapper/datacollection/SpecialAddDeductionMapper.xml +++ b/src/com/engine/salary/mapper/datacollection/SpecialAddDeductionMapper.xml @@ -1,197 +1,607 @@ - - - - - - - - - - - - - - - - - - - - - - - id, employee_id, tax_agent_id, declare_month, children_education, continuing_education, - housing_loan_interest, housing_rent, supporting_elder, serious_illness_treatment, - infant_care, create_time, update_time, creator, delete_type, tenant_key - - - - - insert into hrsa_special_add_deduction - - - employee_id, - - - tax_agent_id, - - - declare_month, - - - children_education, - - - continuing_education, - - - housing_loan_interest, - - - housing_rent, - - - supporting_elder, - - - serious_illness_treatment, - - - infant_care, - - - create_time, - - - update_time, - - - creator, - - - delete_type, - - - tenant_key, - - - - - #{employeeId,jdbcType=BIGINT}, - - - #{taxAgentId,jdbcType=BIGINT}, - - - #{declareMonth,jdbcType=TIMESTAMP}, - - - #{childrenEducation,jdbcType=VARCHAR}, - - - #{continuingEducation,jdbcType=VARCHAR}, - - - #{housingLoanInterest,jdbcType=VARCHAR}, - - - #{housingRent,jdbcType=VARCHAR}, - - - #{supportingElder,jdbcType=VARCHAR}, - - - #{seriousIllnessTreatment,jdbcType=VARCHAR}, - - - #{infantCare,jdbcType=VARCHAR}, - - - #{createTime,jdbcType=TIMESTAMP}, - - - #{updateTime,jdbcType=TIMESTAMP}, - - - #{creator,jdbcType=BIGINT}, - - - #{deleteType,jdbcType=INTEGER}, - - - #{tenantKey,jdbcType=VARCHAR}, - - - - - - update hrsa_special_add_deduction - - - employee_id = #{employeeId,jdbcType=BIGINT}, - - - tax_agent_id = #{taxAgentId,jdbcType=BIGINT}, - - - declare_month = #{declareMonth,jdbcType=TIMESTAMP}, - - - children_education = #{childrenEducation,jdbcType=VARCHAR}, - - - continuing_education = #{continuingEducation,jdbcType=VARCHAR}, - - - housing_loan_interest = #{housingLoanInterest,jdbcType=VARCHAR}, - - - housing_rent = #{housingRent,jdbcType=VARCHAR}, - - - supporting_elder = #{supportingElder,jdbcType=VARCHAR}, - - - serious_illness_treatment = #{seriousIllnessTreatment,jdbcType=VARCHAR}, - - - infant_care = #{infantCare,jdbcType=VARCHAR}, - - - create_time = #{createTime,jdbcType=TIMESTAMP}, - - - update_time = #{updateTime,jdbcType=TIMESTAMP}, - - - creator = #{creator,jdbcType=BIGINT}, - - - delete_type = #{deleteType,jdbcType=INTEGER}, - - - tenant_key = #{tenantKey,jdbcType=VARCHAR}, - - - where id = #{id,jdbcType=BIGINT} - + + + + + + + + + + + + + + + + + + + + - + + t1.id, + t1.declare_month, + t1.employee_id, + t2.id AS tax_agent_id, + t2.name AS tax_agent_name, + e.lastname as username, + e.certificatenum as idNo, + d.departmentname AS departmentName, + e.mobile, + e.workcode as job_num, + e.companystartdate as hiredate, + t1.children_education, + t1.continuing_education, + t1.housing_loan_interest, + t1.housing_rent, + t1.serious_illness_treatment, + t1.supporting_elder, + t1.infant_care + + + + + AND t1.id IN + + #{id} + + + + AND t1.employee_id = #{param.employeeId} + + + + AND + ( + e.lastname like CONCAT('%',#{param.keyword},'%') + OR d.departmentname like CONCAT('%',#{param.keyword},'%') + OR e.workcode like CONCAT('%',#{param.keyword},'%') + ) + + + + + AND t1.declare_month = #{param.declareMonthDate[0]} + + + AND (t1.declare_month BETWEEN #{param.declareMonthDate[0]} AND #{param.declareMonthDate[1]}) + + + + + AND e.lastname like CONCAT('%',#{param.username},'%') + + + + AND t1.tax_agent_id = #{param.taxAgentId} + + + AND t1.tax_agent_id IN + + #{id} + + + + + AND d.id IN + + #{id} + + + + + AND e.workcode like CONCAT('%',#{param.jobNum},'%') + + + + AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + + + + AND e.mobile like CONCAT('%',#{param.mobile},'%') + + + + + AND t1.id IN + + #{id} + + + + AND t1.employee_id = #{param.employeeId} + + + + AND + ( + e.lastname like '%'||#{param.keyword}||'%' + OR d.departmentname like '%'||#{param.keyword}||'%' + OR e.workcode like '%'||#{param.keyword}||'%' + ) + + + + + AND t1.declare_month = #{param.declareMonthDate[0]} + + + AND (t1.declare_month BETWEEN #{param.declareMonthDate[0]} AND #{param.declareMonthDate[1]}) + + + + + AND e.lastname like '%'||#{param.username}||'%' + + + + AND t1.tax_agent_id = #{param.taxAgentId} + + + AND t1.tax_agent_id IN + + #{id} + + + + AND d.id IN + + #{id} + + + + + AND e.workcode like '%'||#{param.jobNum}||'%' + + + + AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + + + + AND e.mobile like '%'||#{param.mobile}||'%' + + + + + AND t1.id IN + + #{id} + + + + AND t1.employee_id = #{param.employeeId} + + + + AND + ( + e.lastname like '%'+#{param.keyword}+'%' + OR d.departmentname like '%'+#{param.keyword}+'%' + OR e.workcode like '%'+#{param.keyword}+'%' + ) + + + + + AND t1.declare_month = #{param.declareMonthDate[0]} + + + AND (t1.declare_month BETWEEN #{param.declareMonthDate[0]} AND #{param.declareMonthDate[1]}) + + + + + AND e.lastname like '%'+#{param.username}+'%' + + + + AND t1.tax_agent_id = #{param.taxAgentId} + + + AND t1.tax_agent_id IN + + #{id} + + + + AND d.id IN + + #{id} + + + + + AND e.workcode like '%'+#{param.jobNum}+'%' + + + + AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + + + + AND e.mobile like '%'+#{param.mobile}+'%' + + + + + + + + + + + insert into hrsa_special_add_deduction + + + employee_id, + + + tax_agent_id, + + + declare_month, + + + children_education, + + + continuing_education, + + + housing_loan_interest, + + + housing_rent, + + + supporting_elder, + + + serious_illness_treatment, + + + infant_care, + + + create_time, + + + update_time, + + + creator, + + delete_type, + + tenant_key, + + + + + #{employeeId,jdbcType=BIGINT}, + + + #{taxAgentId,jdbcType=BIGINT}, + + + #{declareMonth,jdbcType=TIMESTAMP}, + + + #{childrenEducation,jdbcType=VARCHAR}, + + + #{continuingEducation,jdbcType=VARCHAR}, + + + #{housingLoanInterest,jdbcType=VARCHAR}, + + + #{housingRent,jdbcType=VARCHAR}, + + + #{supportingElder,jdbcType=VARCHAR}, + + + #{seriousIllnessTreatment,jdbcType=VARCHAR}, + + + #{infantCare,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{creator,jdbcType=BIGINT}, + + 0, + + #{tenantKey,jdbcType=VARCHAR}, + + + + + + update hrsa_special_add_deduction + + + employee_id = #{employeeId,jdbcType=BIGINT}, + + + tax_agent_id = #{taxAgentId,jdbcType=BIGINT}, + + + declare_month = #{declareMonth,jdbcType=TIMESTAMP}, + + + children_education = #{childrenEducation,jdbcType=VARCHAR}, + + + continuing_education = #{continuingEducation,jdbcType=VARCHAR}, + + + housing_loan_interest = #{housingLoanInterest,jdbcType=VARCHAR}, + + + housing_rent = #{housingRent,jdbcType=VARCHAR}, + + + supporting_elder = #{supportingElder,jdbcType=VARCHAR}, + + + serious_illness_treatment = #{seriousIllnessTreatment,jdbcType=VARCHAR}, + + + infant_care = #{infantCare,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + creator = #{creator,jdbcType=BIGINT}, + + + delete_type = #{deleteType,jdbcType=INTEGER}, + + + tenant_key = #{tenantKey,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + + + update hrsa_special_add_deduction + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.employeeId,jdbcType=BIGINT} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.taxAgentId,jdbcType=BIGINT} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.declareMonth,jdbcType=TIMESTAMP} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.childrenEducation,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.continuingEducation,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.housingLoanInterest,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.housingRent,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.supportingElder,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.seriousIllnessTreatment,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.infantCare,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.createTime,jdbcType=TIMESTAMP} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.updateTime,jdbcType=TIMESTAMP} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.creator,jdbcType=BIGINT} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.deleteType,jdbcType=INTEGER} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.tenantKey,jdbcType=VARCHAR} + + + + + where id in + + #{item.id,jdbcType=BIGINT} + + + + + + insert into hrsa_special_add_deduction + (employee_id, tax_agent_id, declare_month, children_education, continuing_education, + housing_loan_interest, housing_rent, supporting_elder, serious_illness_treatment, + infant_care, create_time, update_time, creator, delete_type, tenant_key) + values + + (#{item.employeeId,jdbcType=BIGINT}, #{item.taxAgentId,jdbcType=BIGINT}, + #{item.declareMonth,jdbcType=TIMESTAMP}, + #{item.childrenEducation,jdbcType=VARCHAR}, #{item.continuingEducation,jdbcType=VARCHAR}, + #{item.housingLoanInterest,jdbcType=VARCHAR}, #{item.housingRent,jdbcType=VARCHAR}, + #{item.supportingElder,jdbcType=VARCHAR}, #{item.seriousIllnessTreatment,jdbcType=VARCHAR}, + #{item.infantCare,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, + #{item.updateTime,jdbcType=TIMESTAMP}, + #{item.creator,jdbcType=BIGINT}, 0, #{item.tenantKey,jdbcType=VARCHAR}) + + + + + + + + + + + update hrsa_special_add_deduction + set delete_type = 1 + where id in ( + + #{id} + + ) and delete_type = 0 + \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java b/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java new file mode 100644 index 000000000..f658c66cb --- /dev/null +++ b/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java @@ -0,0 +1,810 @@ +package com.engine.salary.service.impl; + +import com.api.formmode.mybatis.util.SqlProxyHandle; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.biz.EmployBiz; +import com.engine.salary.biz.SpecialAddDeductionBiz; +import com.engine.salary.encrypt.datacollection.SpecialAddDeductionEncrypt; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.datacollection.dto.SpecialAddDeductionListDTO; +import com.engine.salary.entity.datacollection.dto.SpecialAddDeductionRecordDTO; +import com.engine.salary.entity.datacollection.param.AddUpDeductionRecordDeleteParam; +import com.engine.salary.entity.datacollection.param.SpecialAddDeductionImportParam; +import com.engine.salary.entity.datacollection.param.SpecialAddDeductionParam; +import com.engine.salary.entity.datacollection.param.SpecialAddDeductionQueryParam; +import com.engine.salary.entity.datacollection.po.SpecialAddDeductionPO; +import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; +import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.UserStatusEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.datacollection.SpecialAddDeductionMapper; +import com.engine.salary.mapper.sys.SalarySysConfMapper; +import com.engine.salary.service.AddUpDeductionService; +import com.engine.salary.service.SalaryEmployeeService; +import com.engine.salary.service.SpecialAddDeductionService; +import com.engine.salary.service.TaxAgentService; +import com.engine.salary.sys.entity.po.SalarySysConfPO; +import com.engine.salary.sys.entity.vo.OrderRuleVO; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.excel.ExcelComment; +import com.engine.salary.util.excel.ExcelParseHelper; +import com.engine.salary.util.excel.ExcelUtil; +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 org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +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.io.InputStream; +import java.text.SimpleDateFormat; +import java.time.YearMonth; +import java.util.*; +import java.util.stream.Collectors; + +import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; + +public class SpecialAddDeductionServiceImpl extends Service implements SpecialAddDeductionService { + + private SpecialAddDeductionMapper getSpecialAddDeductionMapper() { + return MapperProxyFactory.getProxy(SpecialAddDeductionMapper.class); + } + + private TaxAgentService getTaxAgentService(User user) { + return ServiceUtil.getService(TaxAgentServiceImpl.class, user); + } + + private AddUpDeductionService getAddUpDeductionService(User user) { + return ServiceUtil.getService(AddUpDeductionServiceImpl.class, user); + } + + private SalaryEmployeeService getSalaryEmployeeService(User user) { + return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); + } + + private SalarySysConfMapper getSalarySysConfMapper() { + return SqlProxyHandle.getProxy(SalarySysConfMapper.class); + } + + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + + @Override + public SpecialAddDeductionPO getById(Long id) { + return getSpecialAddDeductionMapper().getById(id); + } + + + @Override + public PageInfo listPage(SpecialAddDeductionQueryParam queryParam) { + //申报月份 + List declareMonth = queryParam.getDeclareMonth(); + if (CollectionUtils.isNotEmpty(declareMonth)) { + queryParam.setDeclareMonth(declareMonth.stream().map(e -> e + "-01 00:00:00").collect(Collectors.toList())); + queryParam.setDeclareMonthDate(declareMonth.stream().map(e -> e + "-01 00:00:00").map(SalaryDateUtil::dateStrToLocalTime).collect(Collectors.toList())); + } + + //排序配置 + OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); + queryParam.setOrderRule(orderRule); + + long employeeId = user.getUID(); + + Boolean needAuth = getTaxAgentService(user).isNeedAuth(employeeId); + if (needAuth) { + List taxAgentIdsAsAdmin = getTaxAgentService(user) + .listAllTaxAgentsAsAdmin(employeeId).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(taxAgentIdsAsAdmin)) { + return new PageInfo<>(SpecialAddDeductionListDTO.class); + } + queryParam.setTaxAgentIds(taxAgentIdsAsAdmin); + } + SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); + List list = getSpecialAddDeductionMapper().listByParam(queryParam); + SpecialAddDeductionEncrypt.decrypt(list); + return new PageInfo<>(list, SpecialAddDeductionListDTO.class); + } + + @Override + public PageInfo recordListPage(SpecialAddDeductionQueryParam queryParam) { + long employeeId = user.getUID(); + + //申报月份 + List declareMonth = queryParam.getDeclareMonth(); + if (CollectionUtils.isNotEmpty(declareMonth)) { + queryParam.setDeclareMonth(declareMonth.stream().map(e -> e + "-01 00:00:00").collect(Collectors.toList())); + queryParam.setDeclareMonthDate(declareMonth.stream().map(e -> e + "-01 00:00:00").map(SalaryDateUtil::dateStrToLocalTime).collect(Collectors.toList())); + } + + Boolean needAuth = getTaxAgentService(user).isNeedAuth(employeeId); + if (needAuth) { + List taxAgentIdsAsAdmin = getTaxAgentService(user) + .listAllTaxAgentsAsAdmin(employeeId).stream().map(TaxAgentPO::getId) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(taxAgentIdsAsAdmin)) { + return new PageInfo<>(SpecialAddDeductionRecordDTO.class); + } + queryParam.setTaxAgentIds(taxAgentIdsAsAdmin); + } + SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); + List list = getSpecialAddDeductionMapper().listDtoByParam(queryParam); + SpecialAddDeductionEncrypt.decrypt(list); + return new PageInfo<>(list, SpecialAddDeductionRecordDTO.class); + } + + + @Override + public Map preview(SpecialAddDeductionImportParam importParam) { + Map apidatas = new HashMap(); + + //excel文件id + String imageId = Util.null2String(importParam.getImageId()); + Validate.notBlank(imageId, "imageId为空"); + + InputStream fileInputStream = null; + try { + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId)); + List SpecialAddDeductions = + ExcelParseHelper.parse2Map(fileInputStream, SpecialAddDeductionListDTO.class, 0, 1, 11, + "SpecialAddDeductionTemplate.xlsx"); + apidatas.put("preview", SpecialAddDeductions); + } finally { + IOUtils.closeQuietly(fileInputStream); + } + return apidatas; + } + + + public Map importData(SpecialAddDeductionImportParam importParam) { + + Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); + + long currentEmployeeId = user.getUID(); + Map apidatas = new HashMap(); + EmployBiz employBiz = new EmployBiz(); + SpecialAddDeductionBiz SpecialAddDeductionBiz = new SpecialAddDeductionBiz(); + + //查询对于人员信息导入筛选的全局配置 + SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); + String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; + + //检验参数 + checkImportParam(importParam); + + //excel文件id + String imageId = Util.null2String(importParam.getImageId()); + Validate.notBlank(imageId, "imageId为空"); + //税款所属期 + String declareMonthStr = Util.null2String(importParam.getDeclareMonth()); + //个税扣缴义务人 + String taxAgentId = Util.null2String(importParam.getTaxAgentId()); + + InputStream fileInputStream = null; + try { + fileInputStream = ImageFileManager.getInputStreamById(Integer.parseInt(imageId)); + List SpecialAddDeductions = ExcelParseHelper.parse2Map(fileInputStream, SpecialAddDeductionListDTO.class, 0, 1, 14, "SpecialAddDeductionTemplate.xlsx"); + + int total = SpecialAddDeductions.size(); + int index = 0; + int successCount = 0; + int errorCount = 0; + + //人员信息 + List employees = employBiz.listEmployee(); + // 获取所有个税扣缴义务人 + Collection taxAgentList = getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId); + //税款所属期 + Date declareMonth = SalaryDateUtil.stringToDate(declareMonthStr + "-01"); + // 获取已经核算的数据 + List salaryAcctEmployees = getAddUpDeductionService(user) + .getAccountedEmployeeData(declareMonthStr); + // 查询已有数据 + List list = getSpecialAddDeductionMapper() + .listByDeclareMonthAndTaxAgentIds(declareMonth, null); + + // 错误excel内容 + List errorData = new ArrayList<>(); + //合规数据 + List eligibleData = new ArrayList<>(); + + for (int i = 0; i < SpecialAddDeductions.size(); i++) { + SpecialAddDeductionListDTO dto = SpecialAddDeductions.get(i); + + Date now = new Date(); + //待插入数据库对象 + SpecialAddDeductionPO po = SpecialAddDeductionPO.builder() + .tenantKey(DEFAULT_TENANT_KEY) + .createTime(now) + .updateTime(now) + .creator((long) user.getUID()) + .declareMonth(declareMonth).build(); + + //异常点数量 + int errorSum = 0; + + //行号 + String rowIndex = String.format("第%s行", i + 2); + + //相同的姓名 + String userName = dto.getUsername(); + String deparmentName = dto.getDepartmentName(); + String mobile = dto.getMobile(); + String workcode = dto.getJobNum(); + List employeeSameIds = new ArrayList<>(); + + //筛选导入人员信息可以在人力资源池中匹配到的人员信息 + List emps = getSalaryEmployeeService(user) + .matchImportEmployee(employees, userName, deparmentName, mobile, workcode, null); + //含在职和离职,选在职数据 + if (CollectionUtils.isNotEmpty(emps) && emps.size() > 1) { + employeeSameIds = emps.stream() + .filter(e -> UserStatusEnum.getNormalStatus().contains(e.getStatus())) + .map(DataCollectionEmployee::getEmployeeId) + .collect(Collectors.toList()); + } + if (CollectionUtils.isNotEmpty(emps) && emps.size() == 1) { + employeeSameIds = emps.stream() + .map(DataCollectionEmployee::getEmployeeId) + .collect(Collectors.toList()); + } + + //当人员信息导入筛选的全局配置为"0"时,姓名才是必填项 + if (StringUtils.isBlank(userName) && "0".equals(confValue)) { + //姓名 不能为空 + //错误消息对象 + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + "姓名不能为空"); + errorData.add(errorMessageMap); + errorSum += 1; + } else if (CollectionUtils.isEmpty(employeeSameIds) || employeeSameIds.size() > 1) { + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowIndex + "员工信息不存在或者存在多个员工"); + errorData.add(errorMessageMap); + errorSum += 1; + } else { + Long employeeId = CollectionUtils.isNotEmpty(employeeSameIds) && employeeSameIds.size() == 1 ? employeeSameIds.get(0) : null; + if (employeeId != null && employeeId > 0) { + po.setEmployeeId(employeeId); + } else { + //姓名错误,系统内不存在该姓名 + Map errorMessageMap = new HashMap<>(); + errorMessageMap.put("message", rowIndex + "姓名错误,系统内不存在该姓名"); + errorData.add(errorMessageMap); + errorSum += 1; + } + } + + + String taxAgentName = dto.getTaxAgentName(); + if (StringUtils.isBlank(taxAgentName)) { + //个税扣缴义务人不能为空 + Map errorMessageMap = new HashMap<>(); + errorMessageMap.put("message", rowIndex + "个税扣缴义务人不能为空"); + errorData.add(errorMessageMap); + errorSum += 1; + } else { + Optional optionalTemp = taxAgentList.stream().filter(m -> m.getTaxAgentName().equals(taxAgentName)).findFirst(); + if (optionalTemp.isPresent()) { + if (StringUtils.isNotEmpty(taxAgentId) && !optionalTemp.get().getTaxAgentId().equals(Long.valueOf(taxAgentId))) { + //个税扣缴义务人与导入时选择的不一致 + Map errorMessageMap = new HashMap<>(); + errorMessageMap.put("message", rowIndex + "个税扣缴义务人与导入时选择的不一致"); + errorData.add(errorMessageMap); + errorSum += 1; + } else { + po.setTaxAgentId(optionalTemp.get().getTaxAgentId()); + } + } else { + //个税扣缴义务人不存在 + Map errorMessageMap = new HashMap<>(); + errorMessageMap.put("message", rowIndex + "个税扣缴义务人不存在或不在权限范围内"); + errorData.add(errorMessageMap); + errorSum += 1; + } + } + + // 核心字段 + po.setInfantCare(dto.getInfantCare()) + .setSeriousIllnessTreatment(dto.getSeriousIllnessTreatment()) + .setSupportingElder(dto.getSupportingElder()) + .setHousingRent(dto.getHousingRent()) + .setHousingLoanInterest(dto.getHousingLoanInterest()) + .setContinuingEducation(dto.getContinuingEducation()) + .setChildrenEducation(dto.getChildrenEducation()); + + + //fixme 分权判断 +// + // 判断是否有核算过 + if (CollectionUtils.isNotEmpty(salaryAcctEmployees)) { + SpecialAddDeductionPO finalPo = po; + Optional optionalAcctEmp = + salaryAcctEmployees.stream() + .filter(f -> f.getEmployeeId().equals(finalPo.getEmployeeId()) && f.getTaxAgentId().equals(finalPo.getTaxAgentId())) + .findFirst(); + boolean isExist = list.stream() + .anyMatch(f -> f.getEmployeeId().equals(finalPo.getEmployeeId()) && f.getTaxAgentId().equals(finalPo.getTaxAgentId())); + if (optionalAcctEmp.isPresent() && isExist) { + Map errorMessageMap = new HashMap(); + errorMessageMap.put("message", rowIndex + "该年月这条数据已经核算过,不可导入"); + errorData.add(errorMessageMap); + errorSum += 1; + } + } + + + if (errorSum == 0) { + successCount += 1; + // 合格数据 + eligibleData.add(po); + } else { + errorCount += 1; + // 添加错误数据 + } + } + + //入库 + SpecialAddDeductionBiz.handleImportData(eligibleData); + + apidatas.put("successCount", successCount); + apidatas.put("errorCount", errorCount); + apidatas.put("errorData", errorData); + + } finally { + IOUtils.closeQuietly(fileInputStream); + } + return apidatas; + } + + private void checkImportParam(SpecialAddDeductionImportParam importParam) { + //excel文件id + String imageId = Util.null2String(importParam.getImageId()); + //税款所属期 + String declareMonthStr = Util.null2String(importParam.getDeclareMonth()); + //个税扣缴义务人 + String taxAgentId = Util.null2String(importParam.getTaxAgentId()); + + if (StringUtils.isBlank(imageId)) { + throw new SalaryRunTimeException("文件不存在"); + } + if (StringUtils.isBlank(declareMonthStr)) { + throw new SalaryRunTimeException("税款所属期为空"); + } + } + + + /** + * 导出 + * + * @param param + * @return + */ + public XSSFWorkbook export(SpecialAddDeductionQueryParam param) { + + //获取操作按钮资源 + List> rowList = getExcelRowList(param); + + //获取excel + return ExcelUtil.genWorkbook(rowList, "其他免税扣除"); + } + + + /** + * 获取excel数据行 + * + * @return 导出数据行集合 + */ + private List> getExcelRowList(SpecialAddDeductionQueryParam param) { + long employeeId = user.getUID(); + //excel标题 + List title = Arrays.asList("姓名", "个税扣缴义务人", "部门", "手机号", "工号", "证件号码", "入职日期", "子女教育", "继续教育", "住房贷款利息", "住房租金", "赡养老人", "大病医疗", "婴幼儿照护"); + //排序配置 + OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); + param.setOrderRule(orderRule); + + //申报月份 + List declareMonth = param.getDeclareMonth(); + if (CollectionUtils.isNotEmpty(declareMonth)) { + param.setDeclareMonth(declareMonth.stream().map(e -> e + "-01 00:00:00").collect(Collectors.toList())); + param.setDeclareMonthDate(declareMonth.stream().map(e -> e + "-01 00:00:00").map(SalaryDateUtil::dateStrToLocalTime).collect(Collectors.toList())); + } + + List list = getSpecialAddDeductionMapper().listByParam(param); + SpecialAddDeductionEncrypt.decrypt(list); + // 开启分权并且不是薪酬模块总管理员 + if (getTaxAgentService(user).isOpenDevolution() && !getTaxAgentService(user).isChief(employeeId)) { + List taxAgentIdsAsAdmin = getTaxAgentService(user).listAllTaxAgentsAsAdmin(employeeId).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + list = list.stream().filter(f -> + // 作为管理员 + taxAgentIdsAsAdmin.contains(f.getTaxAgentId()) + ).collect(Collectors.toList()); + } + + + final List> dataRowList = Optional.ofNullable(list) + .map(List::stream) + .map(operatorStream -> operatorStream.map(dto -> { + List cellList = new ArrayList<>(); + cellList.add(Util.null2String(dto.getUsername())); + cellList.add(Util.null2String(dto.getTaxAgentName())); + cellList.add(Util.null2String(dto.getDepartmentName())); + cellList.add(Util.null2String(dto.getMobile())); + cellList.add(Util.null2String(dto.getJobNum())); + cellList.add(Util.null2String(dto.getIdNo())); + cellList.add(Util.null2String(dto.getHiredate())); + cellList.add(Util.null2String(dto.getChildrenEducation())); + cellList.add(Util.null2String(dto.getContinuingEducation())); + cellList.add(Util.null2String(dto.getHousingLoanInterest())); + cellList.add(Util.null2String(dto.getHousingRent())); + cellList.add(Util.null2String(dto.getSupportingElder())); + cellList.add(Util.null2String(dto.getSeriousIllnessTreatment())); + cellList.add(Util.null2String(dto.getInfantCare())); + return cellList; + }).collect(Collectors.toList())) + .orElse(Collections.emptyList()); + + List> rowList = new ArrayList<>(); + rowList.add(title); + rowList.addAll(dataRowList); + return rowList; + } + + + /** + * 导出详情列表 + * + * @param param + * @return + */ + public XSSFWorkbook exportDetail(SpecialAddDeductionQueryParam param) { + + SpecialAddDeductionBiz biz = new SpecialAddDeductionBiz(); + EmployBiz employBiz = new EmployBiz(); + + Long id = param.getSpecialAddDeductionId(); + if (id == null) { + throw new SalaryRunTimeException("id不能为空"); + } + + SpecialAddDeductionPO po = biz.getById(id); + if (po == null) { + throw new SalaryRunTimeException(String.format("专项附加扣除不存在" + "[id:%s]", id)); + } + + List employeeList = employBiz.getEmployeeByIds(Collections.singletonList(po.getEmployeeId())); + if (CollectionUtils.isEmpty(employeeList)) { + throw new SalaryRunTimeException("员工信息不存在"); + } + + //构建参数 + param.setEmployeeId(po.getEmployeeId()); + //申报月份 + List declareMonth = param.getDeclareMonth(); + if (CollectionUtils.isNotEmpty(declareMonth)) { + param.setDeclareMonth(declareMonth.stream().map(e -> e + "-01 00:00:00").collect(Collectors.toList())); + param.setDeclareMonthDate(declareMonth.stream().map(e -> e + "-01 00:00:00").map(SalaryDateUtil::dateStrToLocalTime).collect(Collectors.toList())); + } + + + //获取操作按钮资源 + List> rowList = getExcelRowDetailList(param); + + //获取excel + return ExcelUtil.genWorkbook(rowList, "其他免税扣除明细"); + } + + + /** + * 导出详情 + * + * @param param + * @return + */ + private List> getExcelRowDetailList(SpecialAddDeductionQueryParam param) { + //excel标题 + List title = Arrays.asList("姓名", "申报月份", "个税扣缴义务人", "部门", "手机号", "工号", "子女教育", "继续教育", "住房贷款利息", "住房租金", "赡养老人", "大病医疗", "婴幼儿照护"); + + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); + //查询详细信息 + List list = getSpecialAddDeductionMapper().listDtoByParam(param); + SpecialAddDeductionEncrypt.decrypt(list); + final List> dataRowList = Optional.ofNullable(list) + .map(List::stream) + .map(operatorStream -> operatorStream.map(dto -> { + List cellList = new ArrayList<>(); + cellList.add(Util.null2String(dto.getUsername())); + cellList.add(Util.null2String(dto.getDeclareMonth() == null ? "" : formatter.format(dto.getDeclareMonth()))); + cellList.add(Util.null2String(dto.getTaxAgentName())); + cellList.add(Util.null2String(dto.getDepartmentName())); + cellList.add(Util.null2String(dto.getMobile())); + cellList.add(Util.null2String(dto.getJobNum())); + cellList.add(Util.null2String(dto.getChildrenEducation())); + cellList.add(Util.null2String(dto.getContinuingEducation())); + cellList.add(Util.null2String(dto.getHousingLoanInterest())); + cellList.add(Util.null2String(dto.getHousingRent())); + cellList.add(Util.null2String(dto.getSupportingElder())); + cellList.add(Util.null2String(dto.getSeriousIllnessTreatment())); + cellList.add(Util.null2String(dto.getInfantCare())); + return cellList; + }).collect(Collectors.toList())) + .orElse(Collections.emptyList()); + + List> rowList = new ArrayList<>(); + rowList.add(title); + rowList.addAll(dataRowList); + return rowList; + } + + + @Override + public List getSpecialAddDeductionList(YearMonth declareMonth, List employeeIds, Long taxAgentId) { + if (declareMonth == null) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100342, "参数有误:申报月份必传")); + } + SpecialAddDeductionBiz SpecialAddDeductionBiz = new SpecialAddDeductionBiz(); + return SpecialAddDeductionBiz.listByDeclareMonthAndTaxAgentIds(SalaryDateUtil.toDateStartOfMonth(declareMonth), null); + } + + @Override + public void editData(SpecialAddDeductionParam specialAddDeductionParam) { + String declareMonthStr = specialAddDeductionParam.getDeclareMonth(); + SpecialAddDeductionBiz SpecialAddDeductionBiz = new SpecialAddDeductionBiz(); + + Long currentEmployeeId = (long) user.getUID(); + // 获取所有个税扣缴义务人 + Collection taxAgentList = + getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId); + SpecialAddDeductionPO byId = SpecialAddDeductionBiz.getById(specialAddDeductionParam.getId()); + if (byId == null) { + throw new SalaryRunTimeException("该数据不存在!"); + } + Long taxAgentId = byId.getTaxAgentId(); + boolean canEdit = taxAgentList.stream().anyMatch(t -> t.getTaxAgentId() == taxAgentId); + if (!canEdit) { + //没有编辑权限 + throw new SalaryRunTimeException("该个税扣缴义务人无权限编辑此数据!"); + } + // 获取已经核算的数据 + List salaryAcctEmployees = + getAddUpDeductionService(user).getAccountedEmployeeData(declareMonthStr); + // 判断是否有核算过 + if (CollectionUtils.isNotEmpty(salaryAcctEmployees)) { + Optional optionalAcctEmp = + salaryAcctEmployees.stream() + .filter(f -> f.getEmployeeId().equals(specialAddDeductionParam.getEmployeeId()) && f.getTaxAgentId().equals(specialAddDeductionParam.getTaxAgentId())) + .findFirst(); + if (optionalAcctEmp.isPresent()) { + throw new SalaryRunTimeException("该年月这条数据已经核算过,不可进行编辑!"); + } + } + ArrayList updateList = new ArrayList<>(); + SpecialAddDeductionPO build = SpecialAddDeductionPO.builder() + .id(specialAddDeductionParam.getId()) + .childrenEducation(specialAddDeductionParam.getChildrenEducation()) + .continuingEducation(specialAddDeductionParam.getContinuingEducation()) + .housingLoanInterest(specialAddDeductionParam.getHousingLoanInterest()) + .housingRent(specialAddDeductionParam.getHousingRent()) + .build(); + updateList.add(build); + SpecialAddDeductionBiz.batchUpdate(updateList); + } + + @Override + public void createData(SpecialAddDeductionParam specialAddDeductionParam) { + long currentEmployeeId = user.getUID(); + Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); + SpecialAddDeductionBiz SpecialAddDeductionBiz = new SpecialAddDeductionBiz(); + EmployBiz employBiz = new EmployBiz(); + //查询对于人员信息导入筛选的全局配置 + SalarySysConfPO salarySysConfPO = getSalarySysConfMapper().getOneByCode("matchEmployeeMode"); + String confValue = (salarySysConfPO != null && salarySysConfPO.getConfValue() != null && !"".equals(salarySysConfPO.getConfValue())) ? salarySysConfPO.getConfValue() : "0"; + + //税款所属期 + String declareMonthStr = Util.null2String(specialAddDeductionParam.getDeclareMonth()); + //人员信息 + List employees = employBiz.listEmployee(); + // 获取所有个税扣缴义务人 + Collection taxAgentList = getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId); + //税款所属期 + Date declareMonth = SalaryDateUtil.stringToDate(declareMonthStr + "-01"); + // 获取已经核算的数据 + List salaryAcctEmployees = getAddUpDeductionService(user).getAccountedEmployeeData(declareMonthStr); + // 查询已有数据 + List list = getSpecialAddDeductionMapper().listByDeclareMonthAndTaxAgentIds(declareMonth, null); + //合规数据 + List insertData = new ArrayList<>(); + Date now = new Date(); + //待插入数据库对象 + SpecialAddDeductionPO po = SpecialAddDeductionPO.builder() + .tenantKey(DEFAULT_TENANT_KEY) + .createTime(now) + .updateTime(now) + .creator((long) user.getUID()) + .declareMonth(declareMonth).build(); + + //筛选导入人员信息可以在人力资源池中匹配到的人员信息 + boolean employeeSameId = employees.stream() + .anyMatch(e -> Objects.equals(e.getEmployeeId(), specialAddDeductionParam.getEmployeeId())); + if (!employeeSameId) { + throw new SalaryRunTimeException("员工信息不存在"); + } + po.setEmployeeId(specialAddDeductionParam.getEmployeeId()); + String taxAgentName = specialAddDeductionParam.getTaxAgentName(); + if (StringUtils.isBlank(taxAgentName)) { + //个税扣缴义务人不能为空 + throw new SalaryRunTimeException("个税扣缴义务人不能为空"); + } else { + Optional optionalTemp = taxAgentList.stream().filter(m -> m.getTaxAgentName().equals(taxAgentName)).findFirst(); + if (optionalTemp.isPresent()) { + po.setTaxAgentId(optionalTemp.get().getTaxAgentId()); + } else { + //个税扣缴义务人不存在或不在权限范围内 + throw new SalaryRunTimeException("个税扣缴义务人不存在或不在权限范围内"); + } + } + + //商业健康保险 + po.setContinuingEducation(specialAddDeductionParam.getContinuingEducation()) + .setChildrenEducation(specialAddDeductionParam.getChildrenEducation()) + .setHousingLoanInterest(specialAddDeductionParam.getHousingLoanInterest()) + .setHousingRent(specialAddDeductionParam.getHousingRent()) + .setSupportingElder(specialAddDeductionParam.getSupportingElder()) + .setSeriousIllnessTreatment(specialAddDeductionParam.getSeriousIllnessTreatment()) + .setInfantCare(specialAddDeductionParam.getInfantCare()); + //fixme 分权判断 + + // 判断是否有核算过 + if (CollectionUtils.isNotEmpty(salaryAcctEmployees)) { + SpecialAddDeductionPO finalPo = po; + Optional optionalAcctEmp = + salaryAcctEmployees.stream() + .filter(f -> f.getEmployeeId().equals(finalPo.getEmployeeId()) && f.getTaxAgentId().equals(finalPo.getTaxAgentId())) + .findFirst(); + boolean isExist = list.stream() + .anyMatch(f -> f.getEmployeeId().equals(finalPo.getEmployeeId()) && f.getTaxAgentId().equals(finalPo.getTaxAgentId())); + if (optionalAcctEmp.isPresent() && isExist) { + throw new SalaryRunTimeException("该年月这条数据已经核算过,不可导入"); + } + } + insertData.add(po); + //入库 + SpecialAddDeductionBiz.handleImportData(insertData); + } + + @Override + public void deleteSelectData(AddUpDeductionRecordDeleteParam deleteParam) { + long currentEmployeeId = user.getUID(); + // 获取所有个税扣缴义务人 + Collection taxAgentList = + getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId); + SpecialAddDeductionBiz SpecialAddDeductionBiz = new SpecialAddDeductionBiz(); + String declareMonthStr = deleteParam.getDeclareMonth(); + List deleteIds = deleteParam.getIds(); + // 已经核算过的不可操作 + // 获取已经核算的数据 + List salaryAcctEmployees = + getAddUpDeductionService(user).getAccountedEmployeeData(declareMonthStr); + // 判断是否有核算过 + List deleteList = new ArrayList<>(); + for (Long id : deleteIds) { + SpecialAddDeductionPO byId = SpecialAddDeductionBiz.getById(id); + if (byId == null) { + throw new SalaryRunTimeException("数据不存在或已被删除!"); + } + // 判断是否在个税扣缴义务人范围内 + boolean isNotInRegion = + taxAgentList.stream() + .noneMatch(m -> Objects.equals(m.getTaxAgentId(), byId.getTaxAgentId())); + if (isNotInRegion) { + throw new SalaryRunTimeException("个税扣缴义务人不存在或不在权限范围内"); + } + // 判断用户是否存在 + if (CollectionUtils.isNotEmpty(salaryAcctEmployees)) { + Optional optionalAcctEmp = + salaryAcctEmployees.stream().filter(f -> f.getEmployeeId().equals(byId.getEmployeeId()) && f.getTaxAgentId().equals(byId.getTaxAgentId())).findFirst(); + if (optionalAcctEmp.isPresent()) { + throw new SalaryRunTimeException("所选数据在该年月中已经核算过并归档,不可进行删除!"); + } + } + deleteList.add(byId.getId()); + } + SpecialAddDeductionBiz.batchDeleteByIds(deleteList); + } + + @Override + public void deleteAllData(AddUpDeductionRecordDeleteParam deleteParam) { + String declareMonthStr = deleteParam.getDeclareMonth(); + long currentEmployeeId = user.getUID(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 获取所有个税扣缴义务人 + Collection taxAgentList = + getTaxAgentService(user).listTaxAgentAndEmployeeTree(currentEmployeeId); + List taxAgentIds = taxAgentList.stream() + .map(TaxAgentManageRangeEmployeeDTO::getTaxAgentId) + .collect(Collectors.toList()); + SpecialAddDeductionBiz specialAddDeductionBiz = new SpecialAddDeductionBiz(); + Date declareMonthDate = null; + try { + declareMonthDate = sdf.parse(declareMonthStr + "-01"); + } catch (Exception e) { + throw new SalaryRunTimeException("日期异常"); + } + + if (deleteParam.getTaxAgentId() != null && (!deleteParam.getTaxAgentId().equals(""))) { + // 设置了个税扣缴义务人 + Long taxAgentId = SalaryEntityUtil.string2Long(deleteParam.getTaxAgentId()); + boolean canDelete = taxAgentIds.stream().anyMatch(t -> Objects.equals(t, taxAgentId)); + if (!canDelete) { + throw new SalaryRunTimeException("个税扣缴义务人不存在或不在权限范围内!"); + } + ArrayList tai = new ArrayList<>(); + tai.add(taxAgentId); + taxAgentIds = tai; + } + // 获取所有想要删除的数据 + List list = specialAddDeductionBiz.listByDeclareMonthAndTaxAgentIds(declareMonthDate, taxAgentIds); + // 获取已经核算的数据 + List salaryAcctEmployees = getAddUpDeductionService(user) + .getAccountedEmployeeData(declareMonthStr); + for (SpecialAddDeductionPO item : list) { + if (CollectionUtils.isNotEmpty(salaryAcctEmployees)) { + Optional optionalAcctEmp = salaryAcctEmployees.stream().filter(f -> f.getEmployeeId().equals(item.getEmployeeId()) && f.getTaxAgentId().equals(item.getTaxAgentId())).findFirst(); + if (optionalAcctEmp.isPresent()) { + throw new SalaryRunTimeException("有员工在该年月中已经完成核算并归档,不能进行一键清空!"); + } + } + } + List deleteIds = list.stream().map(SpecialAddDeductionPO::getId).collect(Collectors.toList()); + specialAddDeductionBiz.batchDeleteByIds(deleteIds); + } + + @Override + public XSSFWorkbook downloadTemplate(SpecialAddDeductionQueryParam param) { + // 1.工作簿名称 + String sheetName = SalaryI18nUtil.getI18nLabel(101604, "其他免税扣除导入模板"); + String[] header = { + SalaryI18nUtil.getI18nLabel(85429, "姓名"), + SalaryI18nUtil.getI18nLabel(86184, "个税扣缴义务人"), + SalaryI18nUtil.getI18nLabel(86185, "部门"), + SalaryI18nUtil.getI18nLabel(86186, "手机号"), + SalaryI18nUtil.getI18nLabel(86317, "工号"), + SalaryI18nUtil.getI18nLabel(86318, "证件号码"), + SalaryI18nUtil.getI18nLabel(86319, "入职日期"), + SalaryI18nUtil.getI18nLabel(91238, "商业健康保险"), + SalaryI18nUtil.getI18nLabel(91239, "税延养老保险"), + SalaryI18nUtil.getI18nLabel(84500, "其他"), + SalaryI18nUtil.getI18nLabel(91240, "准予扣除的捐赠额") + }; + // 2.表头 + List> rows = new ArrayList<>(); + List headerList = Arrays.asList(header); + rows.add(headerList); + + // 4.注释 + List excelComments = Lists.newArrayList(); + excelComments.add(new ExcelComment(0, 0, 3, 2, SalaryI18nUtil.getI18nLabel(100344, "必填"))); + excelComments.add(new ExcelComment(1, 0, 4, 2, SalaryI18nUtil.getI18nLabel(100344, "必填"))); + excelComments.add(new ExcelComment(7, 0, 10, 2, SalaryI18nUtil.getI18nLabel(100344, "输入数字"))); + excelComments.add(new ExcelComment(8, 0, 11, 2, SalaryI18nUtil.getI18nLabel(100344, "输入数字"))); + excelComments.add(new ExcelComment(9, 0, 12, 2, SalaryI18nUtil.getI18nLabel(100344, "输入数字"))); + excelComments.add(new ExcelComment(10, 0, 13, 2, SalaryI18nUtil.getI18nLabel(100344, "输入数字"))); + + XSSFWorkbook book = ExcelUtil.genWorkbookV2(rows, sheetName, excelComments); + return book; + } + +}