From daa3d4ca9fa1a6e4146bca17c795dd9ee6d5be19 Mon Sep 17 00:00:00 2001 From: fcli Date: Tue, 15 Nov 2022 09:19:57 +0800 Subject: [PATCH 01/77] =?UTF-8?q?feat:=20=E8=96=AA=E8=B5=84=E5=8F=91?= =?UTF-8?q?=E6=94=BE=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryBill/po/SalarySendRangeObj.java | 68 ++++ .../salaryBill/po/SalarySendRangePO.java | 56 ++++ .../salarysend/SalarySendOperateTypeEnum.java | 32 ++ .../SalarySendRangeTargetTypeEnum.java | 33 ++ .../salarysend/SalarySendRangeTypeEnum.java | 28 ++ .../salarybill/SalarySendRangeMapper.java | 24 ++ .../salarybill/SalarySendRangeMapper.xml | 220 ++++++++++++ .../salarybill/SalarySendRangeObjMapper.java | 24 ++ .../salarybill/SalarySendRangeObjMapper.xml | 317 ++++++++++++++++++ .../service/SalarySendRangeService.java | 31 ++ 10 files changed, 833 insertions(+) create mode 100644 src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java create mode 100644 src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java create mode 100644 src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java create mode 100644 src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java create mode 100644 src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java create mode 100644 src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java create mode 100644 src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml create mode 100644 src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java create mode 100644 src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml create mode 100644 src/com/engine/salary/service/SalarySendRangeService.java diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java new file mode 100644 index 000000000..b29818b32 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java @@ -0,0 +1,68 @@ +package com.engine.salary.entity.salaryBill.po; + +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 工资单发放范围项目表 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SalarySendRangeObj { + /** + * 主键id + */ + private Long id; + + /** + * 发放id + */ + private Long salarySendId; + + private Long salarySendRangeId; + + /** + * 范围类型;对象=1;对象中排除=2 + */ + private Integer rangeType; + + /** + * 目标类型,人员=1,部门=2,分部=3,岗位=4,个税扣缴义务人=5,所有人=0 + */ + private Integer targetType; + + /** + * 目标id + */ + private Long targetId; + + /** + * 创建人 + */ + private Long creator; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否已删除。0:未删除、1:已删除 + */ + private Integer deleteType; + + /** + * 租户ID + */ + private String tenantKey; +} \ No newline at end of file diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java new file mode 100644 index 000000000..f2e0675f5 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java @@ -0,0 +1,56 @@ +package com.engine.salary.entity.salaryBill.po; + +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 工资单发放范围表 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SalarySendRangePO { + /** + * 主键id + */ + private Long id; + + /** + * 发放id + */ + private Long salarySendId; + + /** + * 发放=grant;撤回=withdraw + */ + private String grantType; + + /** + * 创建人 + */ + private Long creator; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否已删除。0:未删除、1:已删除 + */ + private Integer deleteType; + + /** + * 租户ID + */ + private String tenantKey; +} \ No newline at end of file diff --git a/src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java new file mode 100644 index 000000000..30e674b12 --- /dev/null +++ b/src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java @@ -0,0 +1,32 @@ +package com.engine.salary.enums.salarysend; + +import com.engine.salary.enums.BaseEnum; +import com.engine.salary.util.SalaryI18nUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +/** + * @Description: 范围类型 + * @Author: lfc + * @Date: 2022/11/14 09:33 + */ +@AllArgsConstructor +@Getter +public enum SalarySendOperateTypeEnum implements BaseEnum { + GRANT("grant", "发放", 98590), + WITHDRAW("withdraw", "撤回", 93351); + + private final String value; + + private final String defaultLabel; + + private final int labelId; + + public static String getDefaultLabelByValue(String value, Long employeeId, String tenantKey) { + Optional optional = Arrays.stream(SalarySendOperateTypeEnum.values()).filter(r->r.getValue().equals(value)).findFirst(); + return optional.isPresent()? SalaryI18nUtil.getI18nLabel(optional.get().getLabelId(), optional.get().getDefaultLabel()):""; + } +} \ No newline at end of file diff --git a/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java new file mode 100644 index 000000000..cff60f34d --- /dev/null +++ b/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java @@ -0,0 +1,33 @@ +package com.engine.salary.enums.salarysend; + +import com.engine.salary.enums.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +@AllArgsConstructor +@Getter +public enum SalarySendRangeTargetTypeEnum implements BaseEnum { + USER(1, "人员", 100133), + DEPT(2, "部门", 86185), + SUB_COMPANY(3, "分部", 107369), + POSITION(4, "岗位", 90633), + TAX_AGENT(5, "个税扣缴义务人", 86184), + ALL(0, "所有人", 107729); + + private final int value; + + private final String defaultLabel; + + private final int labelId; + + public static SalarySendRangeTargetTypeEnum parseByValue(Integer value) { + for (SalarySendRangeTargetTypeEnum targetTypeEnum : SalarySendRangeTargetTypeEnum.values()) { + if (Objects.equals(targetTypeEnum.getValue(), value)) { + return targetTypeEnum; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java new file mode 100644 index 000000000..00cf96618 --- /dev/null +++ b/src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java @@ -0,0 +1,28 @@ +package com.engine.salary.enums.salarysend; + +import com.engine.salary.enums.BaseEnum; +import com.engine.salary.util.SalaryI18nUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; + +@AllArgsConstructor +@Getter +public enum SalarySendRangeTypeEnum implements BaseEnum { + + INCLUDE_OBJ(1, "对象", 90396), + EXCLUDE_OBJ(2, "对象中排除", 142728); + + private final int value; + + private final String defaultLabel; + + private final int labelId; + + public static String getDefaultLabelByValue(Integer value, Long employeeId, String tenantKey) { + Optional optional = Arrays.stream(SalarySendRangeTypeEnum.values()).filter(r->Integer.valueOf(r.getValue()).equals(value)).findFirst(); + return optional.isPresent()? SalaryI18nUtil.getI18nLabel(optional.get().getLabelId(), optional.get().getDefaultLabel()):""; + } +} diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java new file mode 100644 index 000000000..00a7be206 --- /dev/null +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java @@ -0,0 +1,24 @@ +package com.engine.salary.mapper.salarybill; + +import com.engine.salary.entity.salaryBill.po.SalarySendRangePO; + +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface SalarySendRangeMapper { + int deleteByPrimaryKey(Long id); + + int insertSelective(SalarySendRangePO record); + + SalarySendRangePO selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SalarySendRangePO record); + + List selectByAll(SalarySendRangePO salarySendRangePO); + + List selectAllBySalarySendIdAndGrantType(@Param("salarySendId") Long salarySendId, @Param("grantType") String grantType); + + int updateBatchSelective(List list); + + int batchInsert(@Param("list") List list); +} \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml new file mode 100644 index 000000000..cdbc77602 --- /dev/null +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + id, salary_send_id, grant_type, creator, create_time, update_time, delete_type, tenant_key + + + + + delete from hrsa_salary_send_range + where id = #{id,jdbcType=BIGINT} + + + + insert into hrsa_salary_send_range + + + salary_send_id, + + + grant_type, + + + creator, + + + create_time, + + + update_time, + + + delete_type, + + + tenant_key, + + + + + #{salarySendId,jdbcType=BIGINT}, + + + #{grantType,jdbcType=VARCHAR}, + + + #{creator,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{deleteType,jdbcType=INTEGER}, + + + #{tenantKey,jdbcType=VARCHAR}, + + + + + + update hrsa_salary_send_range + + + salary_send_id = #{salarySendId,jdbcType=BIGINT}, + + + grant_type = #{grantType,jdbcType=VARCHAR}, + + + creator = #{creator,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + delete_type = #{deleteType,jdbcType=INTEGER}, + + + tenant_key = #{tenantKey,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + + + + update hrsa_salary_send_range + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.salarySendId,jdbcType=BIGINT} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.grantType,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.creator,jdbcType=BIGINT} + + + + + + + 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.deleteType,jdbcType=INTEGER} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.tenantKey,jdbcType=VARCHAR} + + + + + where id in + + #{item.id,jdbcType=BIGINT} + + + + + insert into hrsa_salary_send_range + (salary_send_id, grant_type, creator, create_time, update_time, delete_type, tenant_key + ) + values + + (#{item.salarySendId,jdbcType=BIGINT}, #{item.grantType,jdbcType=VARCHAR}, #{item.creator,jdbcType=BIGINT}, + #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.deleteType,jdbcType=INTEGER}, + #{item.tenantKey,jdbcType=VARCHAR}) + + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java new file mode 100644 index 000000000..56c6a8a4e --- /dev/null +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java @@ -0,0 +1,24 @@ +package com.engine.salary.mapper.salarybill; + +import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; +import java.util.Date; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface SalarySendRangeObjMapper { + int deleteByPrimaryKey(Long id); + + int insertSelective(SalarySendRangeObj record); + + SalarySendRangeObj selectByPrimaryKey(Long id); + + int updateByPrimaryKeySelective(SalarySendRangeObj record); + + List selectByAll(SalarySendRangeObj salarySendRangeObj); + + List selectBySalarySendIdAndSalarySendRangeId(@Param("salarySendId") Long salarySendId, @Param("salarySendRangeId") Long salarySendRangeId); + + int updateBatchSelective(List list); + + int batchInsert(@Param("list") List list); +} \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml new file mode 100644 index 000000000..13367c472 --- /dev/null +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + + + id, salary_send_id, salary_send_range_id, range_type, target_type, target_id, creator, + create_time, update_time, delete_type, tenant_key + + + + + + + delete from hrsa_salary_send_range_obj + where id = #{id,jdbcType=BIGINT} + + + + + insert into hrsa_salary_send_range_obj + + + salary_send_id, + + + salary_send_range_id, + + + range_type, + + + target_type, + + + target_id, + + + creator, + + + create_time, + + + update_time, + + + delete_type, + + + tenant_key, + + + + + #{salarySendId,jdbcType=BIGINT}, + + + #{salarySendRangeId,jdbcType=BIGINT}, + + + #{rangeType,jdbcType=INTEGER}, + + + #{targetType,jdbcType=INTEGER}, + + + #{targetId,jdbcType=BIGINT}, + + + #{creator,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{deleteType,jdbcType=INTEGER}, + + + #{tenantKey,jdbcType=VARCHAR}, + + + + + + + update hrsa_salary_send_range_obj + + + salary_send_id = #{salarySendId,jdbcType=BIGINT}, + + + salary_send_range_id = #{salarySendRangeId,jdbcType=BIGINT}, + + + range_type = #{rangeType,jdbcType=INTEGER}, + + + target_type = #{targetType,jdbcType=INTEGER}, + + + target_id = #{targetId,jdbcType=BIGINT}, + + + creator = #{creator,jdbcType=BIGINT}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + delete_type = #{deleteType,jdbcType=INTEGER}, + + + tenant_key = #{tenantKey,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + + + + + + + update hrsa_salary_send_range_obj + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.salarySendId,jdbcType=BIGINT} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.salarySendRangeId,jdbcType=BIGINT} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.rangeType,jdbcType=INTEGER} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.targetType,jdbcType=INTEGER} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.targetId,jdbcType=BIGINT} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.creator,jdbcType=BIGINT} + + + + + + + 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.deleteType,jdbcType=INTEGER} + + + + + + + when id = #{item.id,jdbcType=BIGINT} then #{item.tenantKey,jdbcType=VARCHAR} + + + + + where id in + + #{item.id,jdbcType=BIGINT} + + + + + insert into hrsa_salary_send_range_obj + (salary_send_id, salary_send_range_id, range_type, target_type, target_id, creator, + create_time, update_time, delete_type, tenant_key) + values + + (#{item.salarySendId,jdbcType=BIGINT}, #{item.salarySendRangeId,jdbcType=BIGINT}, + #{item.rangeType,jdbcType=INTEGER}, #{item.targetType,jdbcType=INTEGER}, #{item.targetId,jdbcType=BIGINT}, + #{item.creator,jdbcType=BIGINT}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP}, + #{item.deleteType,jdbcType=INTEGER}, #{item.tenantKey,jdbcType=VARCHAR}) + + + + + insert into hrsa_salary_send_range_obj + (salary_send_id, salary_send_range_id, range_type, target_type, target_id, creator, + create_time, update_time, delete_type, tenant_key) + values (#{item.salarySendId,jdbcType=BIGINT}, #{item.salarySendRangeId,jdbcType=BIGINT}, + #{item.rangeType,jdbcType=INTEGER}, #{item.targetType,jdbcType=INTEGER}, + #{item.targetId,jdbcType=BIGINT}, + #{item.creator,jdbcType=BIGINT}, #{item.createTime,jdbcType=TIMESTAMP}, + #{item.updateTime,jdbcType=TIMESTAMP}, + #{item.deleteType,jdbcType=INTEGER}, #{item.tenantKey,jdbcType=VARCHAR}) + + + + insert into hrsa_salary_send_range_obj + (salary_send_id, salary_send_range_id, range_type, target_type, target_id, creator, + create_time, update_time, delete_type, tenant_key) + + select + #{item.salarySendId,jdbcType=BIGINT}, #{item.salarySendRangeId,jdbcType=BIGINT}, + #{item.rangeType,jdbcType=INTEGER}, #{item.targetType,jdbcType=INTEGER}, #{item.targetId,jdbcType=BIGINT}, + #{item.creator,jdbcType=BIGINT}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP}, + #{item.deleteType,jdbcType=INTEGER}, #{item.tenantKey,jdbcType=VARCHAR} + from dual + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/SalarySendRangeService.java b/src/com/engine/salary/service/SalarySendRangeService.java new file mode 100644 index 000000000..5f5ba97a5 --- /dev/null +++ b/src/com/engine/salary/service/SalarySendRangeService.java @@ -0,0 +1,31 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.salaryBill.dto.*; +import com.engine.salary.entity.salaryBill.param.*; +import com.engine.salary.entity.salaryBill.po.SalarySendPO; +import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.util.page.PageInfo; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * @Description: 工资单发放范围 + */ +public interface SalarySendRangeService { + void save(); + + void listPage(); + + void listDTO(); + + void listByIds(); + + void getById(Long id); + + void deleteBySalarySendIds(Collection sendIds); + + void getSendInfoIdsBySendId(Collection sendIds); +} From e8347b88ccb8ffeab7f752a5201d4c6e59089081 Mon Sep 17 00:00:00 2001 From: fcli Date: Thu, 17 Nov 2022 11:11:58 +0800 Subject: [PATCH 02/77] =?UTF-8?q?feat:=20=E8=96=AA=E8=B5=84=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salarybill/SalarySendRangeObjMapper.java | 8 ++- .../salarybill/SalarySendRangeObjMapper.xml | 9 ++- .../mapper/sischeme/InsuranceSchemeMapper.xml | 2 +- .../service/SalarySendRangeObjService.java | 60 +++++++++++++++++++ .../impl/SalarySendRangeObjServiceImpl.java | 54 +++++++++++++++++ .../impl/SalarySendRangeServiceImpl.java | 43 +++++++++++++ 6 files changed, 169 insertions(+), 7 deletions(-) create mode 100644 src/com/engine/salary/service/SalarySendRangeObjService.java create mode 100644 src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java create mode 100644 src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java index 56c6a8a4e..606b70c5c 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java @@ -1,10 +1,10 @@ package com.engine.salary.mapper.salarybill; import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; -import java.util.Date; -import java.util.List; import org.apache.ibatis.annotations.Param; +import java.util.List; + public interface SalarySendRangeObjMapper { int deleteByPrimaryKey(Long id); @@ -16,7 +16,9 @@ public interface SalarySendRangeObjMapper { List selectByAll(SalarySendRangeObj salarySendRangeObj); - List selectBySalarySendIdAndSalarySendRangeId(@Param("salarySendId") Long salarySendId, @Param("salarySendRangeId") Long salarySendRangeId); + List selectBySalarySendIdAndSalarySendRangeId(@Param("salarySendId") Long salarySendId, + @Param("salarySendRangeIds") List salarySendRangeId, + @Param("tenantKey") String tenantKey); int updateBatchSelective(List list); diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml index 13367c472..d986c9b09 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml @@ -187,12 +187,15 @@ diff --git a/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml b/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml index 9643d377d..e69a245c3 100644 --- a/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml +++ b/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml @@ -32,7 +32,7 @@ , t.creator , t.delete_type , t.tenant_key - , t.shared_type + , t.1】 , t.tax_agent_ids diff --git a/src/com/engine/salary/service/SalarySendRangeObjService.java b/src/com/engine/salary/service/SalarySendRangeObjService.java new file mode 100644 index 000000000..2f6fa1b78 --- /dev/null +++ b/src/com/engine/salary/service/SalarySendRangeObjService.java @@ -0,0 +1,60 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; + +import java.util.Collection; +import java.util.List; + +/** + * @Description: 工资单发放撤回筛选范围对象 + * @Author: LFC + */ +public interface SalarySendRangeObjService { + + /** + * 根据名称和工资单发放id获取列表 + * + * @param salarySendId + * @param rangeIds + * @param currentTenantKey + * @return + */ + List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, String currentTenantKey); + + /** + * 保存筛选范围对象 + * + * @param listObj + * @param currentEmployeeId + * @param currentTenantKey + */ + void batchInsert(List listObj, Long currentEmployeeId, String currentTenantKey); + + /** + * 根据工资饭发放id删除 + * + * @param salarySendIds + * @param currentTenantKey + */ + void deleteBySalarySendIds(Collection salarySendIds, String currentTenantKey); + + /** + * 根据范围id删除 + * + * @param rangeIds + * @param currentEmployeeId + * @param currentTenantKey + */ + void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId, String currentTenantKey); + + /** + * 根据发放id和范围id获取发放信息id + * + * @param salarySendId + * @param rangeIds + * @param employeeId + * @param tenantKey + * @return + */ + List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId, String tenantKey); +} \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java new file mode 100644 index 000000000..fb97c1658 --- /dev/null +++ b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java @@ -0,0 +1,54 @@ +package com.engine.salary.service.impl; + +import com.engine.core.impl.Service; +import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; +import com.engine.salary.mapper.salarybill.SalarySendRangeObjMapper; +import com.engine.salary.service.SalarySendRangeObjService; +import org.apache.ibatis.session.SqlSession; +import weaver.conn.mybatis.MyBatisFactory; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +public class SalarySendRangeObjServiceImpl extends Service implements SalarySendRangeObjService { + + private R runSalarySendRangeObjMapper(Function mapper) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()){ + final SalarySendRangeObjMapper salarySendRangeObjMapper = sqlSession.getMapper(SalarySendRangeObjMapper.class); + return mapper.apply(salarySendRangeObjMapper); + } + } + + @Override + public List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, String currentTenantKey) { + if (salarySendId == null) { + return Collections.emptyList(); + } + runSalarySendRangeObjMapper(mapper-> + mapper.selectBySalarySendIdAndSalarySendRangeId(salarySendId, rangeIds, currentTenantKey) + ); + return null; + } + + @Override + public void batchInsert(List listObj, Long currentEmployeeId, String currentTenantKey) { + + } + + @Override + public void deleteBySalarySendIds(Collection salarySendIds, String currentTenantKey) { + + } + + @Override + public void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId, String currentTenantKey) { + + } + + @Override + public List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId, String tenantKey) { + return null; + } +} diff --git a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java new file mode 100644 index 000000000..bfa89b7be --- /dev/null +++ b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java @@ -0,0 +1,43 @@ +package com.engine.salary.service.impl; + +import com.engine.core.impl.Service; +import com.engine.salary.service.SalarySendRangeService; + +import java.util.Collection; + +public class SalarySendRangeServiceImpl extends Service implements SalarySendRangeService { + @Override + public void save() { + + } + + @Override + public void listPage() { + + } + + @Override + public void listDTO() { + + } + + @Override + public void listByIds() { + + } + + @Override + public void getById(Long id) { + + } + + @Override + public void deleteBySalarySendIds(Collection sendIds) { + + } + + @Override + public void getSendInfoIdsBySendId(Collection sendIds) { + + } +} From 0aabfcd68af15f595e8eeeb00acb4b6d60f4f1ae Mon Sep 17 00:00:00 2001 From: fcli Date: Thu, 17 Nov 2022 14:25:10 +0800 Subject: [PATCH 03/77] =?UTF-8?q?feat:=20=E8=96=AA=E8=B5=84=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salarybill/SalarySendRangeObjMapper.java | 11 +++-- .../salarybill/SalarySendRangeObjMapper.xml | 14 +++++- .../service/SalarySendRangeObjService.java | 15 +++---- .../impl/SalarySendRangeObjServiceImpl.java | 45 +++++++++++-------- 4 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java index 606b70c5c..4d4836eb6 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java @@ -3,6 +3,7 @@ import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; import org.apache.ibatis.annotations.Param; +import java.util.Collection; import java.util.List; public interface SalarySendRangeObjMapper { @@ -16,11 +17,15 @@ public interface SalarySendRangeObjMapper { List selectByAll(SalarySendRangeObj salarySendRangeObj); - List selectBySalarySendIdAndSalarySendRangeId(@Param("salarySendId") Long salarySendId, - @Param("salarySendRangeIds") List salarySendRangeId, - @Param("tenantKey") String tenantKey); + List listBySalarySendIdAndRangeIds(@Param("salarySendId") Long salarySendId, + @Param("salarySendRangeIds") List salarySendRangeId, + @Param("tenantKey") String tenantKey); int updateBatchSelective(List list); int batchInsert(@Param("list") List list); + + int deleteBySalarySendIds(@Param("salarySendIds") Collection salarySendIds); + + } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml index d986c9b09..46e6cb0b9 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml @@ -186,11 +186,12 @@ - select from hrsa_salary_send_range_obj where salary_send_id=#{salarySendId,jdbcType=BIGINT} + and delete_type = 0 and tenant_key = #{tenantKey} salary_send_range_id=#{salarySendRangeId,jdbcType=BIGINT} @@ -317,4 +318,15 @@ from dual + + + update hrsa_salary_send_range_obj + set delete_type = 1 + where salary_send_id in ( + + #{salarySendId} + + ) + and delete_type = 0 + \ No newline at end of file diff --git a/src/com/engine/salary/service/SalarySendRangeObjService.java b/src/com/engine/salary/service/SalarySendRangeObjService.java index 2f6fa1b78..4f623ee32 100644 --- a/src/com/engine/salary/service/SalarySendRangeObjService.java +++ b/src/com/engine/salary/service/SalarySendRangeObjService.java @@ -16,27 +16,23 @@ public interface SalarySendRangeObjService { * * @param salarySendId * @param rangeIds - * @param currentTenantKey * @return */ - List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, String currentTenantKey); + List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds); /** * 保存筛选范围对象 * * @param listObj - * @param currentEmployeeId - * @param currentTenantKey */ - void batchInsert(List listObj, Long currentEmployeeId, String currentTenantKey); + void batchInsert(List listObj); /** * 根据工资饭发放id删除 * * @param salarySendIds - * @param currentTenantKey */ - void deleteBySalarySendIds(Collection salarySendIds, String currentTenantKey); + void deleteBySalarySendIds(Collection salarySendIds); /** * 根据范围id删除 @@ -45,7 +41,7 @@ public interface SalarySendRangeObjService { * @param currentEmployeeId * @param currentTenantKey */ - void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId, String currentTenantKey); + void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId); /** * 根据发放id和范围id获取发放信息id @@ -53,8 +49,7 @@ public interface SalarySendRangeObjService { * @param salarySendId * @param rangeIds * @param employeeId - * @param tenantKey * @return */ - List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId, String tenantKey); + List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId); } \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java index fb97c1658..9b71f5e3b 100644 --- a/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java @@ -4,6 +4,8 @@ import com.engine.core.impl.Service; import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; import com.engine.salary.mapper.salarybill.SalarySendRangeObjMapper; import com.engine.salary.service.SalarySendRangeObjService; +import com.google.common.collect.Lists; +import org.apache.commons.collections4.CollectionUtils; import org.apache.ibatis.session.SqlSession; import weaver.conn.mybatis.MyBatisFactory; @@ -12,43 +14,48 @@ import java.util.Collections; import java.util.List; import java.util.function.Function; +import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; + public class SalarySendRangeObjServiceImpl extends Service implements SalarySendRangeObjService { private R runSalarySendRangeObjMapper(Function mapper) { - try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()){ - final SalarySendRangeObjMapper salarySendRangeObjMapper = sqlSession.getMapper(SalarySendRangeObjMapper.class); + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + final SalarySendRangeObjMapper salarySendRangeObjMapper = sqlSession.getMapper(SalarySendRangeObjMapper.class); return mapper.apply(salarySendRangeObjMapper); } } @Override - public List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, String currentTenantKey) { - if (salarySendId == null) { + public List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds) { + if (salarySendId == null || CollectionUtils.isEmpty(rangeIds)) { return Collections.emptyList(); } - runSalarySendRangeObjMapper(mapper-> - mapper.selectBySalarySendIdAndSalarySendRangeId(salarySendId, rangeIds, currentTenantKey) + return runSalarySendRangeObjMapper(mapper -> + mapper.listBySalarySendIdAndRangeIds(salarySendId, rangeIds, DEFAULT_TENANT_KEY) ); - return null; } @Override - public void batchInsert(List listObj, Long currentEmployeeId, String currentTenantKey) { + public void batchInsert(List listObj) { + if (listObj == null) { + return; + } + List> p = Lists.partition(listObj, 150); + p.forEach(list-> runSalarySendRangeObjMapper(m->m.batchInsert(list))); + } + + @Override + public void deleteBySalarySendIds(Collection salarySendIds) { + runSalarySendRangeObjMapper(mapper->mapper.deleteBySalarySendIds(salarySendIds)); + } + + @Override + public void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId) { } @Override - public void deleteBySalarySendIds(Collection salarySendIds, String currentTenantKey) { - - } - - @Override - public void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId, String currentTenantKey) { - - } - - @Override - public List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId, String tenantKey) { + public List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId) { return null; } } From d81883e3d2ca5519f2a7fb5767974675b2fcea00 Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 23 Nov 2022 14:49:44 +0800 Subject: [PATCH 04/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=B0=83=E5=B7=AE?= =?UTF-8?q?v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/hrm/param/HrmQueryParam.java | 5 +- .../siaccount/param/CompensationParam.java | 48 ++++++ .../salary/service/SICompensationService.java | 18 ++ .../impl/SICompensationServiceImpl.java | 159 ++++++++++++++++++ 4 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 src/com/engine/salary/entity/siaccount/param/CompensationParam.java create mode 100644 src/com/engine/salary/service/SICompensationService.java create mode 100644 src/com/engine/salary/service/impl/SICompensationServiceImpl.java diff --git a/src/com/engine/salary/entity/hrm/param/HrmQueryParam.java b/src/com/engine/salary/entity/hrm/param/HrmQueryParam.java index 03787f33e..0e6da1aa6 100644 --- a/src/com/engine/salary/entity/hrm/param/HrmQueryParam.java +++ b/src/com/engine/salary/entity/hrm/param/HrmQueryParam.java @@ -18,10 +18,13 @@ import java.util.Collection; @AllArgsConstructor public class HrmQueryParam { - String userName; + private String userName; private int pageNum; private int pageSize; private Collection ids; + + private String billMonth; + private Long paymentOrganization; } diff --git a/src/com/engine/salary/entity/siaccount/param/CompensationParam.java b/src/com/engine/salary/entity/siaccount/param/CompensationParam.java new file mode 100644 index 000000000..0aca6d1a3 --- /dev/null +++ b/src/com/engine/salary/entity/siaccount/param/CompensationParam.java @@ -0,0 +1,48 @@ +package com.engine.salary.entity.siaccount.param; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: sy + * @Description: 福利台账-调差请求参数 + * @Date: 2022/11/23 + **/ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CompensationParam { + + /** + * 缴纳组织 + */ + private Long paymentOrganization; + + /** + * 对象,指InsuranceAccountDetailPO.id + */ + private Long target; + + /** + * 前端rowId,指被调差的人员id + */ + private String rowId; + + /** + * 账单月份 + */ + private String billMonth; + + /** + * 统计调差福利 + */ + private Integer welfareType; + + /** + * 统计调差福利项,即社保、公积金、其他福利类型下的具体项目 + */ + private String categoryType; +} diff --git a/src/com/engine/salary/service/SICompensationService.java b/src/com/engine/salary/service/SICompensationService.java new file mode 100644 index 000000000..8aa89a649 --- /dev/null +++ b/src/com/engine/salary/service/SICompensationService.java @@ -0,0 +1,18 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.hrm.dto.HrmInfoDTO; +import com.engine.salary.entity.hrm.param.HrmQueryParam; +import com.engine.salary.entity.siaccount.param.CompensationParam; +import com.engine.salary.util.page.PageInfo; + +import java.util.List; +import java.util.Map; + +public interface SICompensationService { + + PageInfo getEmployeeListToCompensation(HrmQueryParam param); + + List> compensationCategoryType(Long id); + + Map>> compensationComTotal(Map> param); +} diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java new file mode 100644 index 000000000..17179f22d --- /dev/null +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -0,0 +1,159 @@ +package com.engine.salary.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alipay.oceanbase.jdbc.StringUtils; +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; +import com.engine.salary.entity.hrm.dto.HrmInfoDTO; +import com.engine.salary.entity.hrm.param.HrmQueryParam; +import com.engine.salary.entity.siaccount.param.CompensationParam; +import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; +import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; +import com.engine.salary.mapper.datacollection.EmployMapper; +import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; +import com.engine.salary.service.SICategoryService; +import com.engine.salary.service.SICompensationService; +import com.engine.salary.util.SalaryAssert; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.util.SalaryI18nUtil; +import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; +import com.google.common.collect.Lists; +import weaver.hrm.User; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: sy + * @Description: 福利台账-调差实现类 + * @Date: 2022/11/23 + **/ +public class SICompensationServiceImpl extends Service implements SICompensationService { + + private InsuranceAccountDetailMapper getInsuranceAccountDetailMapper() { + return MapperProxyFactory.getProxy(InsuranceAccountDetailMapper.class); + } + + private EmployMapper getEmployMapper() { + return MapperProxyFactory.getProxy(EmployMapper.class); + } + + public SICategoryService getSICategoryService(User user) { + return ServiceUtil.getService(SICategoryServiceImpl.class, user); + } + + /** + * 可调差人员 + */ + @Override + public PageInfo getEmployeeListToCompensation(HrmQueryParam param) { + // 当前登录人员 + Long currentEmployeeId = (long) user.getUID(); + + //查询账单月份+个税扣缴义务人下的社保福利正常缴纳人员列表 + List normalDataList = getInsuranceAccountDetailMapper().queryNormalListByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); + List empIds = normalDataList.stream().map(InsuranceAccountDetailPO::getEmployeeId).collect(Collectors.toList()); + + List resultData = new ArrayList<>(); + if (empIds.size() > 0) { + List> partition = Lists.partition(empIds, 1000); + partition.forEach(p -> { + param.setIds(p); + resultData.addAll(getEmployMapper().listHrmInfoByIdAndName(param)); + }); + + } + + // 分页 + PageInfo page = new PageInfo<>(); + if (null == resultData) { + return page; + } + page.setTotal(resultData.size()); + + page.setList(SalaryPageUtil.subList(param.getPageNum(), param.getPageSize(), resultData)); + page.setPageSize(param.getPageSize()); + page.setPageNum(param.getPageNum()); + + + return page; + } + + /** + * 调差福利项 + * @param id InsuranceAccountDetailPO.id + */ + @Override + public List> compensationCategoryType(Long id) { + SalaryAssert.notNull(id, SalaryI18nUtil.getI18nLabel(120999, "调差对象必选")); + InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(id); + if (insuranceAccountDetailPO == null) { + return Lists.newArrayList(); + } + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + List> result = new ArrayList<>(); + String socialComJson = insuranceAccountDetailPO.getSocialComJson(); + if (StringUtils.isNotBlank(socialComJson)) { + Map categoryIdNameMap = getSICategoryService(user).categoryIdNameMap(); + Map socialJson = JSON.parseObject(socialComJson, new HashMap().getClass()); + for (Map.Entry entry : socialJson.entrySet()) { + Map temp = new HashMap<>(); + String insuranceId = entry.getKey(); + if (StringUtils.isNotBlank(categoryIdNameMap.get(insuranceId))) { + temp.put("id", insuranceId); + temp.put("content", categoryIdNameMap.get(insuranceId)); + result.add(temp); + } + } + } + return result; + } + + /** + * 获取当前调差福利类型-公司方支出总计 + */ + @Override + public Map>> compensationComTotal(Map> param) { + Map>> result = new HashMap<>(); + param.forEach((paymentAgencyId, compensationList) -> { + List> paymentList = new ArrayList<>(); + compensationList.forEach(compensation -> { + Map temp = new HashMap<>(); + temp.put("rowId", compensation.getRowId()); + if (StringUtils.isBlank(compensation.getCategoryType()) || compensation.getTarget() == null) { + temp.put("error", SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + temp.put("totalNum", "0"); + } else { + + InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(compensation.getTarget()); + if (insuranceAccountDetailPO == null) { + temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); + } + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + BigDecimal total = new BigDecimal("0"); + List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); + + if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { + Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); + for (Map.Entry entry : socialJson.entrySet()) { + String insuranceId = entry.getKey(); + String num = entry.getValue(); + if (categoryTypeList.contains(insuranceId)) { + total = total.add(new BigDecimal(num)); + } + } + } + + temp.put("totalNum", total.toPlainString()); + } + paymentList.add(temp); + }); + result.put(paymentAgencyId, paymentList); + }); + return result; + } +} From f1bd574c81563ad910ee953cf30a4a7ecdaa1131 Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 23 Nov 2022 15:39:42 +0800 Subject: [PATCH 05/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=B0=83=E5=B7=AE?= =?UTF-8?q?v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SICompensationServiceImpl.java | 2 +- .../service/impl/SIRecessionServiceImpl.java | 2 +- .../salary/web/SIAccountController.java | 40 +++++++++++++++++++ .../salary/wrapper/SIAccountWrapper.java | 36 +++++++++++++++++ 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 17179f22d..84b72b4c6 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -70,7 +70,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation // 分页 PageInfo page = new PageInfo<>(); - if (null == resultData) { + if (resultData.size() == 0) { return page; } page.setTotal(resultData.size()); diff --git a/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java b/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java index 09cfd8b0b..9cec4e79a 100644 --- a/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java @@ -331,7 +331,7 @@ public class SIRecessionServiceImpl extends Service implements SIRecessionServic // 分页 PageInfo page = new PageInfo<>(); - if (null == resultData) { + if (resultData.size() == 0) { return page; } page.setTotal(resultData.size()); diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index 053219066..fcc78dbf0 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -698,4 +698,44 @@ public class SIAccountController { } // **********************************退差 end*********************************/ + + // **********************************调差 start*********************************/ + /** + * 获取当前登录人所控制的人员范围 + */ + @POST + @Path("/getEmployeeListToCompensation") + @Produces(MediaType.APPLICATION_JSON) + public String getEmployeeListToCompensation(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody HrmQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSIAccountWrapper(user)::getEmployeeListToCompensation, param); + } + + /** + * 通过id获取InsuranceAccountDetailPO中的社保福利项 + */ + @GET + @Path("/compensationCategoryType") + @Produces(MediaType.APPLICATION_JSON) + public String compensationCategoryType(@Context HttpServletRequest request, @Context HttpServletResponse response, + @QueryParam("id") Long id) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>>(user).run(getSIAccountWrapper(user)::compensationCategoryType, id); + } + + /** + * 获取当前调差福利类型-公司方支出总计 + */ + @POST + @Path("/compensationComTotal") + @Produces(MediaType.APPLICATION_JSON) + public String compensationComTotal(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody Map> param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>, Map>>>(user).run(getSIAccountWrapper(user)::compensationComTotal, param); + } + + + // **********************************调差 end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SIAccountWrapper.java b/src/com/engine/salary/wrapper/SIAccountWrapper.java index 6f3b6e134..c8c50a02f 100644 --- a/src/com/engine/salary/wrapper/SIAccountWrapper.java +++ b/src/com/engine/salary/wrapper/SIAccountWrapper.java @@ -5,13 +5,18 @@ import com.engine.core.impl.Service; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; +import com.engine.salary.entity.siaccount.param.CompensationParam; import com.engine.salary.entity.siaccount.param.RecessionParam; +import com.engine.salary.service.SICompensationService; import com.engine.salary.service.SIRecessionService; +import com.engine.salary.service.impl.SICompensationServiceImpl; import com.engine.salary.service.impl.SIRecessionServiceImpl; import com.engine.salary.util.page.PageInfo; import weaver.hrm.User; import java.util.Collection; +import java.util.List; +import java.util.Map; /** * @Author weaver_cl @@ -24,6 +29,10 @@ public class SIAccountWrapper extends Service { return (SIRecessionService) ServiceUtil.getService(SIRecessionServiceImpl.class, user); } + private SICompensationService getSICompensationService(User user) { + return (SICompensationService) ServiceUtil.getService(SICompensationServiceImpl.class, user); + } + /** * 新增退差数据 * @param param 退差请求体 @@ -42,8 +51,35 @@ public class SIAccountWrapper extends Service { getSIRecessionService(user).del(ids, currentEmployeeId); } + /** + * 可退差人员列表 + */ public PageInfo getEmployeeListByTaxAgent(HrmQueryParam param) { return getSIRecessionService(user).getEmployeeListByTaxAgent(param); } + + /** + * 可调差人员列表 + */ + public PageInfo getEmployeeListToCompensation(HrmQueryParam hrmQueryParam) { + + return getSICompensationService(user).getEmployeeListToCompensation(hrmQueryParam); + } + + /** + * 获取社保福利项 + */ + public List> compensationCategoryType(Long id) { + + return getSICompensationService(user).compensationCategoryType(id); + } + + /** + * 获取当前调差福利类型-公司方支出总计 + */ + public Map>> compensationComTotal(Map> param) { + + return getSICompensationService(user).compensationComTotal(param); + } } From 27dd8b4450f19fe95a943884b4d8af6268415809 Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 24 Nov 2022 09:17:08 +0800 Subject: [PATCH 06/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=B0=83=E5=B7=AE?= =?UTF-8?q?=E4=BF=9D=E5=AD=98v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/InsuranceCompensationDTO.java | 97 +++++++++++++++++ .../siaccount/po/InsuranceCompensationPO.java | 101 ++++++++++++++++++ .../salary/service/SICompensationService.java | 3 + .../impl/SICompensationServiceImpl.java | 79 ++++++++++++++ 4 files changed, 280 insertions(+) create mode 100644 src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java create mode 100644 src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java diff --git a/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java b/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java new file mode 100644 index 000000000..445c6b40c --- /dev/null +++ b/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java @@ -0,0 +1,97 @@ +package com.engine.salary.entity.siaccount.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * @Author: sy + * @Description: 福利台账-调差 + * @Date: 2022/11/23 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InsuranceCompensationDTO { + + /** + * 主键id + */ + private Long id; + + /** + * 前端自定义id + */ + private String originId; + + /** + * 只读 + * + */ + private Boolean status; + + /** + * 缴纳组织 + */ + private Long paymentOrganization; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 统计调差福利 + */ + private String welfareType; + + /** + * 统计调差福利类型 + */ + private String categoryType; + + /** + * 统计调差福利类型选项 + */ + private List> categoryTypeOptions; + + /** + * 国家核算金额 + */ + private String countryTotal; + + /** + * 公司核算金额 + */ + private String companyTotal; + + /** + * 应调差额 + */ + private String adjustmentTotal; + + /** + * 调差到 + */ + private Long adjustTo; + + /** + * 对象 + */ + private Long target; + + /** + * 对象选项 + */ + private List> targetOptions; + + /** + * 账单月份 + */ + private String billMonth; +} diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java new file mode 100644 index 000000000..a361a5b65 --- /dev/null +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java @@ -0,0 +1,101 @@ +package com.engine.salary.entity.siaccount.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * @Author: sy + * @Description: 社保福利台账-调差历史记录表 + * @Date: 2022/11/23 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +//hrsa_compensation_log +public class InsuranceCompensationPO { + + /** + * 主键id + */ + private Long id; + + /** + * 缴纳组织 + */ + private Long paymentAgency; + + /** + * 个税扣缴义务人 + */ + private Long paymentOrganization; + + /** + * 创建人id + */ + private Long creator; + + /** + * 是否删除 + */ + private Integer deleteType; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 租户key + */ + private String tenantKey; + + /** + * 员工id + */ + private Long employeeId; + + /** + * 统计调差福利 + */ + private Integer welfareType; + + /** + * 统计调差福利类型 + */ + private String categoryType; + + /** + * 国家核算金额 + */ + private String countryTotal; + + /** + * 公司核算金额 + */ + private String companyTotal; + + /** + * 应调差额 + */ + private String adjustmentTotal; + + /** + * 调差到 + */ + private Long adjustTo; + + /** + * 账单月份 + */ + private String billMonth; +} diff --git a/src/com/engine/salary/service/SICompensationService.java b/src/com/engine/salary/service/SICompensationService.java index 8aa89a649..7ac42f21c 100644 --- a/src/com/engine/salary/service/SICompensationService.java +++ b/src/com/engine/salary/service/SICompensationService.java @@ -2,6 +2,7 @@ package com.engine.salary.service; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; +import com.engine.salary.entity.siaccount.dto.InsuranceCompensationDTO; import com.engine.salary.entity.siaccount.param.CompensationParam; import com.engine.salary.util.page.PageInfo; @@ -15,4 +16,6 @@ public interface SICompensationService { List> compensationCategoryType(Long id); Map>> compensationComTotal(Map> param); + + Map compensationAccount(List list); } diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 84b72b4c6..dd59b6fa4 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -4,12 +4,16 @@ import com.alibaba.fastjson.JSON; import com.alipay.oceanbase.jdbc.StringUtils; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; +import com.engine.salary.entity.siaccount.dto.InsuranceCompensationDTO; import com.engine.salary.entity.siaccount.param.CompensationParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; +import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; +import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.service.SICategoryService; @@ -21,9 +25,11 @@ 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 dm.jdbc.util.IdGenerator; import weaver.hrm.User; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -156,4 +162,77 @@ public class SICompensationServiceImpl extends Service implements SICompensation }); return result; } + + @Override + public Map compensationAccount(List list) { + + long currentEmployeeId = user.getUID(); + + Map result = new HashMap<>(); + for (InsuranceCompensationDTO param : list) { + if (StringUtils.isBlank(param.getAdjustmentTotal()) || "0".equals(param.getAdjustmentTotal())) { + continue; + } + InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(param.getTarget()); + SalaryAssert.notNull(insuranceAccountDetailPO, SalaryI18nUtil.getI18nLabel(138849, "调差对象不存在")); + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { + Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); + for (Map.Entry entry : socialJson.entrySet()) { + String insuranceId = entry.getKey(); + String num = entry.getValue(); + if (Objects.equals(String.valueOf(param.getAdjustTo()), insuranceId)) { + BigDecimal adjustmentTo = new BigDecimal(param.getAdjustmentTotal()); + // 调差单位缴纳明细 + BigDecimal insuranceNum = new BigDecimal(num); + insuranceNum = insuranceNum.add(adjustmentTo); + socialJson.replace(insuranceId, insuranceNum.toPlainString()); + insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialJson)); + // 调差单位合计 + BigDecimal comSum = new BigDecimal(insuranceAccountDetailPO.getComSum()); + comSum = comSum.add(adjustmentTo); + insuranceAccountDetailPO.setComSum(comSum.toPlainString()); + // 调差社保单位合计 + BigDecimal socialComSum = new BigDecimal(insuranceAccountDetailPO.getSocialComSum()); + socialComSum = socialComSum.add(adjustmentTo); + insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); + // 调差社保合计 + BigDecimal socialSum = new BigDecimal(insuranceAccountDetailPO.getSocialSum()); + socialSum = socialSum.add(adjustmentTo); + insuranceAccountDetailPO.setSocialSum(socialSum.toPlainString()); + // 调差合计 + BigDecimal totalSum = new BigDecimal(insuranceAccountDetailPO.getTotal()); + totalSum = totalSum.add(adjustmentTo); + insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); + //更新社保调差后的明细 + getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); + //新建调差记录 + InsuranceCompensationPO insuranceCompensationPO = new InsuranceCompensationPO(); + insuranceCompensationPO.setId(IdGenerator.generate()); + insuranceCompensationPO.setAdjustmentTotal(param.getAdjustmentTotal()); + insuranceCompensationPO.setAdjustTo(param.getAdjustTo()); + insuranceCompensationPO.setBillMonth(param.getBillMonth()); + insuranceCompensationPO.setCompanyTotal(param.getCompanyTotal()); + insuranceCompensationPO.setCreator(currentEmployeeId); + insuranceCompensationPO.setCategoryType(param.getCategoryType()); + insuranceCompensationPO.setCreateTime(LocalDateTime.now()); + insuranceCompensationPO.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue()); + insuranceCompensationPO.setCountryTotal(param.getCountryTotal()); + insuranceCompensationPO.setEmployeeId(insuranceAccountDetailPO.getEmployeeId()); +// insuranceCompensationPO.setPaymentAgency(insuranceAccountDetailPO.getPaymentAgency()); + insuranceCompensationPO.setPaymentOrganization(insuranceAccountDetailPO.getPaymentOrganization()); + insuranceCompensationPO.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); + insuranceCompensationPO.setWelfareType(Integer.valueOf(param.getWelfareType())); + insuranceCompensationPO.setUpdateTime(LocalDateTime.now()); +// insuranceCompensationMapper.insert(insuranceCompensationPO); + //刷新bill_detail统计数据 + + result.put(param.getOriginId(), insuranceCompensationPO.getId().toString()); + + } + } + } + } + return result; + } } From bbc58281f3ac7e480470755525ae04941d7f7751 Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 24 Nov 2022 13:29:40 +0800 Subject: [PATCH 07/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=B0=83=E5=B7=AE?= =?UTF-8?q?=E4=BF=9D=E5=AD=98v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/impl/SICompensationServiceImpl.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index dd59b6fa4..1dc8f4e73 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -16,6 +16,7 @@ import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; +import com.engine.salary.service.SIAccountService; import com.engine.salary.service.SICategoryService; import com.engine.salary.service.SICompensationService; import com.engine.salary.util.SalaryAssert; @@ -52,6 +53,10 @@ public class SICompensationServiceImpl extends Service implements SICompensation return ServiceUtil.getService(SICategoryServiceImpl.class, user); } + private SIAccountService getSIAccountService(User user) { + return ServiceUtil.getService(SIAccountServiceImpl.class, user); + } + /** * 可调差人员 */ @@ -225,7 +230,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation insuranceCompensationPO.setWelfareType(Integer.valueOf(param.getWelfareType())); insuranceCompensationPO.setUpdateTime(LocalDateTime.now()); // insuranceCompensationMapper.insert(insuranceCompensationPO); - //刷新bill_detail统计数据 + result.put(param.getOriginId(), insuranceCompensationPO.getId().toString()); @@ -233,6 +238,8 @@ public class SICompensationServiceImpl extends Service implements SICompensation } } } + //刷新bill_detail统计数据 + getSIAccountService(user).refreshBillBatch(list.get(0).getPaymentOrganization(), list.get(0).getBillMonth()); return result; } } From fc81955b1578369cd335b1019e52bb200c16b1aa Mon Sep 17 00:00:00 2001 From: fcli Date: Fri, 25 Nov 2022 10:53:23 +0800 Subject: [PATCH 08/77] =?UTF-8?q?feat:=20=E5=85=A8=E9=83=A8=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E9=83=A8=E5=88=86=E5=8F=91=E6=94=BE=E6=92=A4=E5=9B=9E?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/web/SalarySendRangeController.java | 8 + .../salary/biz/SalarySendRangeObjBiz.java | 71 +++++++ .../salaryBill/bo/SalarySendRangeBO.java | 186 +++++++++++++++++ .../dto/SalarySendRangeListDTO.java | 36 ++++ .../salaryBill/dto/SalarySendRangeObjDTO.java | 44 ++++ .../salaryBill/dto/SalarySendUserInfoDTO.java | 38 ++++ .../param/SalarySendGrantParam.java | 6 + .../param/SalarySendRangeQueryParam.java | 30 +++ .../param/SalarySendRangeSaveParam.java | 122 +++++++++++ .../param/SalarySendWithdrawParam.java | 3 + .../salaryBill/po/SalarySendRangeObj.java | 7 +- .../salaryBill/po/SalarySendRangePO.java | 5 +- .../salarysend/SalarySendGrantTypeEnum.java | 50 +++++ .../salarysend/SalarySendOperateTypeEnum.java | 32 --- .../SalarySendRangeTargetTypeEnum.java | 19 +- .../salarysend/SalarySendRangeTypeEnum.java | 27 ++- .../salarybill/SalarySendRangeMapper.java | 16 +- .../salarybill/SalarySendRangeMapper.xml | 152 +++++++++++++- .../salarybill/SalarySendRangeObjMapper.java | 8 +- .../salarybill/SalarySendRangeObjMapper.xml | 32 ++- .../service/SalarySendRangeObjService.java | 23 +-- .../service/SalarySendRangeService.java | 25 +-- .../salary/service/SalarySendService.java | 1 + .../impl/SalarySendRangeObjServiceImpl.java | 92 ++++++--- .../impl/SalarySendRangeServiceImpl.java | 190 ++++++++++++++++-- .../service/impl/SalarySendServiceImpl.java | 21 ++ .../salary/web/SalarySendRangeController.java | 58 ++++++ .../wrapper/SalarySendRangeWrapper.java | 36 ++++ 28 files changed, 1208 insertions(+), 130 deletions(-) create mode 100644 src/com/api/salary/web/SalarySendRangeController.java create mode 100644 src/com/engine/salary/biz/SalarySendRangeObjBiz.java create mode 100644 src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java create mode 100644 src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeListDTO.java create mode 100644 src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeObjDTO.java create mode 100644 src/com/engine/salary/entity/salaryBill/dto/SalarySendUserInfoDTO.java create mode 100644 src/com/engine/salary/entity/salaryBill/param/SalarySendRangeQueryParam.java create mode 100644 src/com/engine/salary/entity/salaryBill/param/SalarySendRangeSaveParam.java create mode 100644 src/com/engine/salary/enums/salarysend/SalarySendGrantTypeEnum.java delete mode 100644 src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java create mode 100644 src/com/engine/salary/web/SalarySendRangeController.java create mode 100644 src/com/engine/salary/wrapper/SalarySendRangeWrapper.java diff --git a/src/com/api/salary/web/SalarySendRangeController.java b/src/com/api/salary/web/SalarySendRangeController.java new file mode 100644 index 000000000..94d817da2 --- /dev/null +++ b/src/com/api/salary/web/SalarySendRangeController.java @@ -0,0 +1,8 @@ +package com.api.salary.web; + +import javax.ws.rs.Path; + +@Path("/bs/hrmsalary/salarySendRange") +public class SalarySendRangeController extends com.engine.salary.web.SalarySendRangeController{ + +} diff --git a/src/com/engine/salary/biz/SalarySendRangeObjBiz.java b/src/com/engine/salary/biz/SalarySendRangeObjBiz.java new file mode 100644 index 000000000..05ccaaadb --- /dev/null +++ b/src/com/engine/salary/biz/SalarySendRangeObjBiz.java @@ -0,0 +1,71 @@ +package com.engine.salary.biz; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryBill.dto.SalarySendUserInfoDTO; +import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; +import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeTaxAgentDTO; +import com.engine.salary.mapper.salarybill.SalarySendRangeObjMapper; +import com.engine.salary.service.TaxAgentService; +import com.engine.salary.service.impl.TaxAgentServiceImpl; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.ibatis.session.SqlSession; +import weaver.conn.mybatis.MyBatisFactory; + +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; + +public class SalarySendRangeObjBiz { + private TaxAgentService getTaxAgentService() { + return ServiceUtil.getService(TaxAgentServiceImpl.class); + } + + public R applyMapper(Function mapper) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + final SalarySendRangeObjMapper salarySendRangeObjMapper = sqlSession.getMapper(SalarySendRangeObjMapper.class); + R apply = mapper.apply(salarySendRangeObjMapper); + sqlSession.commit(); + return apply; + } + } + + public void runMapper(Consumer mapper) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + final SalarySendRangeObjMapper salarySendRangeObjMapper = sqlSession.getMapper(SalarySendRangeObjMapper.class); + mapper.accept(salarySendRangeObjMapper); + sqlSession.commit(); + } + } + + public List getSalarySendUserInfoDTOs(List employees) { + List userDTOs = applyMapper(mapper -> mapper.getUserInfoByEmployeeIds(employees)); + Map userMap = userDTOs.stream() + .collect(Collectors.toMap(SalarySendUserInfoDTO::getResourceId, Function.identity())); + + List employeeIds = userDTOs.stream() + .map(SalarySendUserInfoDTO::getResourceId) + .collect(Collectors.toList()); + Collection employeeAgents + = getTaxAgentService().listAllTaxAgentsAsRange(employeeIds); + for (TaxAgentEmployeeTaxAgentDTO employeeAgent : employeeAgents) { + SalarySendUserInfoDTO info = userMap.get(employeeAgent.getEmployeeId()); + if (info != null) { + if (CollectionUtils.isEmpty(info.getTaxAgentIds())) { + info.setTaxAgentIds(new ArrayList<>()); + } + info.getTaxAgentIds().addAll(Optional.ofNullable(employeeAgent.getTaxAgentIds()).orElse(Collections.emptyList())); + } + } + return userDTOs; + } + + public void replaceAllByRangeId(Long rangeId, List rangeObjs) { + runMapper(mapper -> { + mapper.deleteByRangeIds(Collections.singletonList(rangeId), DEFAULT_TENANT_KEY); + mapper.batchInsert(rangeObjs); + }); + } +} diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java new file mode 100644 index 000000000..cc3f5831b --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java @@ -0,0 +1,186 @@ +package com.engine.salary.entity.salaryBill.bo; + +import com.engine.salary.entity.salaryBill.dto.SalarySendUserInfoDTO; +import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; +import com.engine.salary.enums.salarysend.SalarySendRangeTargetTypeEnum; +import com.engine.salary.enums.salarysend.SalarySendRangeTypeEnum; +import com.google.common.collect.Sets; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.*; + +/** + * @Description: 工资单发放范围 + */ +@NoArgsConstructor +public class SalarySendRangeBO { + private static final SalarySendRangeItem EMPTY_ITEM = new SalarySendRangeItem(null, null, Collections.emptySet()); + + private static final Integer INCLUDED = 1; + private static final Integer EXCLUDED = -1; + private static final Integer NOT_IN = 0; + + /** + * 索引map + */ + private final Map> indexMap + = new HashMap<>(6); + + /** + * 排除所有人 + */ + private boolean isExcludeAll = false; + + /** + * 增加所有人 + */ + private boolean isIncludeAll = false; + + public boolean putNew(SalarySendRangeObj salarySendRangeObj) { + //如果已经设置了排除所有人 或者 添加所有人, 直接跳过处理 + if (isExcludeAll || isIncludeAll) { + return true; + } + Integer rangeType = salarySendRangeObj.getRangeType(); + SalarySendRangeTypeEnum rangeTypeE = SalarySendRangeTypeEnum.fromValue(rangeType); + + Integer targetType = salarySendRangeObj.getTargetType(); + SalarySendRangeTargetTypeEnum targetTypeE = SalarySendRangeTargetTypeEnum.fromValue(targetType); + + if (rangeTypeE == null || targetTypeE == null) { + return false; + } + //所有人 筛选 + if (targetTypeE == SalarySendRangeTargetTypeEnum.ALL) { + isIncludeAll = rangeTypeE == SalarySendRangeTypeEnum.INCLUDE_OBJ; + isExcludeAll = rangeTypeE == SalarySendRangeTypeEnum.EXCLUDE_OBJ; + } + //未存入时插入 + indexMap.computeIfAbsent(targetTypeE, k -> { + Map value = new HashMap<>(); + SalarySendRangeItem rangeItem = + new SalarySendRangeItem(rangeTypeE, targetTypeE, Sets.newHashSet(salarySendRangeObj.getTargetId())); + value.put(rangeTypeE, rangeItem); + return value; + }); + //已存在时更新 + indexMap.computeIfPresent(targetTypeE, (k, v) -> { + SalarySendRangeItem item = v.get(rangeTypeE); + if (null == item) { + item = new SalarySendRangeItem(rangeTypeE, targetTypeE, Sets.newHashSet(salarySendRangeObj.getTargetId())); + } else { + item.getTargetIds().add(salarySendRangeObj.getTargetId()); + } + v.put(rangeTypeE, item); + return v; + }); + return true; + } + + private Set getTargetIds(SalarySendRangeTargetTypeEnum targetType, SalarySendRangeTypeEnum rangeType) { + Map itemMap = indexMap.get(targetType); + if (itemMap != null) { + SalarySendRangeItem item = itemMap.getOrDefault(rangeType, EMPTY_ITEM); + return item.getTargetIds(); + } + return Collections.emptySet(); + } + + /** + * 判断是否在人员范围内 + * 如果已经有 所有人 的范围设置,不判断是否有其他范围直接返回 + * + * @param targetType 目标类型 + * @param targetId 目标id + * @return 是否在范围内 + */ + private int doJudgeInRange(SalarySendRangeTargetTypeEnum targetType, Long targetId) { + //如果所有人范围已经设置 + if (isExcludeAll) { + return EXCLUDED; + } + Set includeTargetIds = getTargetIds(targetType, SalarySendRangeTypeEnum.INCLUDE_OBJ); + Set excludeTargetIds = getTargetIds(targetType, SalarySendRangeTypeEnum.EXCLUDE_OBJ); + if (excludeTargetIds.contains(targetId)) { + return EXCLUDED; + } else if (includeTargetIds.contains(targetId)) { + return INCLUDED; + } else { + //默认值是是否选择所有人 + return isIncludeAll ? INCLUDED : NOT_IN; + } + } + + private int doJudgeInRange(SalarySendRangeTargetTypeEnum targetType, Collection targetIds) { + if (CollectionUtils.isEmpty(targetIds)) { + return NOT_IN; + } + //如果所有人范围已经设置 + if (isExcludeAll) { + return EXCLUDED; + } + if (isIncludeAll) { + return INCLUDED; + } + Set includeTargetIds = getTargetIds(targetType, SalarySendRangeTypeEnum.INCLUDE_OBJ); + Set excludeTargetIds = getTargetIds(targetType, SalarySendRangeTypeEnum.EXCLUDE_OBJ); + if (targetIds.stream().anyMatch(excludeTargetIds::contains)) { + return EXCLUDED; + } else if (targetIds.stream().anyMatch(includeTargetIds::contains)) { + return INCLUDED; + } else { + return NOT_IN; + } + } + + public boolean judgeInRange(SalarySendUserInfoDTO dto) { + //如果所有人范围已经设置 + if (isExcludeAll) { + return false; + } + Integer isInRange = NOT_IN; + // 默认值为是否选择所有人 + boolean result = isIncludeAll; + for (SalarySendRangeTargetTypeEnum targetType : SalarySendRangeTargetTypeEnum.values()) { + switch (targetType) { + case DEPT: + isInRange = doJudgeInRange(targetType, dto.getDepartmentId()); + break; + case USER: + isInRange = doJudgeInRange(targetType, dto.getResourceId()); + break; + case POSITION: + isInRange = doJudgeInRange(targetType, dto.getJobTitle()); + break; + case TAX_AGENT: + isInRange = doJudgeInRange(targetType, dto.getTaxAgentIds()); + break; + case SUB_COMPANY: + isInRange = doJudgeInRange(targetType, dto.getSubCompanyId()); + break; + } + if (isInRange.equals(EXCLUDED)) { + //如果被排除,返回false + return false; + } else { + // 只要没有被排除,在范围内即为true + result |= isInRange.equals(INCLUDED); + } + } + return result; + } + + @AllArgsConstructor + @NoArgsConstructor + @Data + private static class SalarySendRangeItem { + private SalarySendRangeTypeEnum rangeType; + + private SalarySendRangeTargetTypeEnum targetType; + + private Set targetIds; + } +} diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeListDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeListDTO.java new file mode 100644 index 000000000..4a407645b --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeListDTO.java @@ -0,0 +1,36 @@ +package com.engine.salary.entity.salaryBill.dto; + +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.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; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@SalaryTable(pageId = "a4fa2487-d36a82d0dc050a5465f1252f9ecaa107", + tableType = WeaTableType.CHECKBOX) +public class SalarySendRangeListDTO { + @JsonSerialize(using = ToStringSerializer.class) + @SalaryTableColumn(column = "id", display = false) + private Long id; + + private String grantType; + + @SalaryTableColumn(text = "对象", width = "50%", column = "includeObj") + @TableTitle(title = "对象", key = "includeObj", dataIndex = "includeObj") + private List includeObj; + + @SalaryTableColumn(text = "对象中排除", width = "50%", column = "excludeObj") + @TableTitle(title = "对象中排除", key = "excludeObj", dataIndex = "excludeObj") + private List excludeObj; +} diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeObjDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeObjDTO.java new file mode 100644 index 000000000..e6a85c9ed --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendRangeObjDTO.java @@ -0,0 +1,44 @@ +package com.engine.salary.entity.salaryBill.dto; + +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; + +/** + * 工资单发放撤回筛选范围对象 + */ +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class SalarySendRangeObjDTO { + + /** + * id + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long targetId; + + /** + * 名称 + */ + private String targetName; + + /** + * 类型 + */ + private Integer targetType; + + /** + * 类型名称 + */ + private String targetTypeName; + + /** + * @see com.engine.salary.enums.salarysend.SalarySendRangeTypeEnum + */ + private Integer rangeType; +} \ No newline at end of file diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendUserInfoDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendUserInfoDTO.java new file mode 100644 index 000000000..0b2648af0 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendUserInfoDTO.java @@ -0,0 +1,38 @@ +package com.engine.salary.entity.salaryBill.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@AllArgsConstructor +@NoArgsConstructor +@Data +public class SalarySendUserInfoDTO { + /** + * 岗位 + */ + private Long jobTitle; + + /** + * 部门 + */ + private Long departmentId; + + /** + * 分部 + */ + private Long subCompanyId; + + + /** + * 人员id + */ + private Long resourceId; + + /** + * 个税扣缴义务人id + */ + private List taxAgentIds; +} diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java index a61f1eef4..12268806f 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.Collection; +import java.util.List; /** * @Description: 工资单发放参数 @@ -26,6 +27,11 @@ public class SalarySendGrantParam { // @ApiModelProperty("工资单发放Id") private Long salarySendId; + /** + * 工资单发放范围id + */ + private List salarySendRangeIds; + public static String checkParam(SalarySendGrantParam param, Long employeeId, String tenantKey) { if (param.getSalarySendId() == null) { throw new SalaryRunTimeException("工资单发放Id必传"); diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendRangeQueryParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendRangeQueryParam.java new file mode 100644 index 000000000..65a4bb257 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendRangeQueryParam.java @@ -0,0 +1,30 @@ +package com.engine.salary.entity.salaryBill.param; + +import com.engine.salary.common.BaseQueryParam; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +//@ApiModel("工资单发放范围查询参数") +public class SalarySendRangeQueryParam extends BaseQueryParam { + /** + * 发放类型 + * @see com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum + */ + private String grantType; + + /** + * 发放单id + */ + private Long salarySendId; + + /** + * 对象名称关键字 + */ + private String targetName; +} diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendRangeSaveParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendRangeSaveParam.java new file mode 100644 index 000000000..7b4edd800 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendRangeSaveParam.java @@ -0,0 +1,122 @@ +package com.engine.salary.entity.salaryBill.param; + +import com.alibaba.nacos.client.naming.utils.CollectionUtils; +import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; +import com.engine.salary.entity.salaryBill.po.SalarySendRangePO; +import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum; +import com.engine.salary.enums.salarysend.SalarySendRangeTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import weaver.hrm.User; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SalarySendRangeSaveParam { + /** + * 发放id + */ + private Long salarySendId; + + + /** + * 发放范围id + */ + private Long salarySendRangeId; + + + /** + * 发放/撤回 + * + * @see SalarySendGrantTypeEnum + */ + private String grantType; + + + private List includeObjParams; + + + private List excludeObjParams; + + public static void checkParam(SalarySendRangeSaveParam saveParam, Long employeeId, String tenantKey) { + if (saveParam.getSalarySendId() == null) { + throw new SalaryRunTimeException("工资单发放id不能为空"); + } + + if (saveParam.getGrantType() == null) { + throw new SalaryRunTimeException("操作类型不能为空"); + } + + if (CollectionUtils.isEmpty(saveParam.getIncludeObjParams())) { + throw new SalaryRunTimeException("对象不能为空"); + } + } + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class SalarySendRangeTargetParam { + + /** + * 对象不能为空 + */ + private Long targetId; + + /** + * 对象类型不能为空 + * @see com.engine.salary.enums.salarysend.SalarySendRangeTargetTypeEnum + */ + private Integer targetType; + } + + public SalarySendRangePO toSalarySendRangePO(User user) { + return SalarySendRangePO.builder() + .id(salarySendRangeId) + .grantType(grantType) + .salarySendId(salarySendId) + .updateTime(new Date()) + .creator((long) user.getUID()) + .deleteType(0) + .tenantKey(DEFAULT_TENANT_KEY) + .createTime(salarySendId == null ? new Date() : null) + .build(); + } + + public List toSalarySendRangeObj(User user) { + List includeObjs = includeObjParams.stream() + .map(obj -> mapObj(user, obj)) + .map(obj->obj.setRangeType(SalarySendRangeTypeEnum.INCLUDE_OBJ.getValue())) + .collect(Collectors.toList()); + List excludeObjs = excludeObjParams.stream() + .map(obj -> mapObj(user, obj)) + .map(obj -> obj.setRangeType(SalarySendRangeTypeEnum.EXCLUDE_OBJ.getValue())) + .collect(Collectors.toList()); + List rangeObjs = new ArrayList<>(); + rangeObjs.addAll(includeObjs); + rangeObjs.addAll(excludeObjs); + return rangeObjs; + } + + private SalarySendRangeObj mapObj(User user, SalarySendRangeTargetParam obj) { + return SalarySendRangeObj.builder() + .salarySendRangeId(salarySendRangeId) + .salarySendId(salarySendId) + .targetId(obj.getTargetId()) + .targetType(obj.getTargetType()) + .deleteType(0) + .tenantKey(DEFAULT_TENANT_KEY) + .updateTime(new Date()) + .createTime(new Date()) + .creator((long) user.getUID()) + .build(); + } +} \ No newline at end of file diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java index 6e3573beb..df4808dbc 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendWithdrawParam.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.Collection; +import java.util.List; /** * @Description: 工资单撤回参数 @@ -26,6 +27,8 @@ public class SalarySendWithdrawParam { // @ApiModelProperty("工资单发放Id") private Long salarySendId; + private List salarySendRangeIds; + public static String checkParam(SalarySendWithdrawParam param, Long employeeId, String tenantKey) { if (param.getSalarySendId() == null) { throw new SalaryRunTimeException("工资单发放Id必传"); diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java index b29818b32..f3f682063 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangeObj.java @@ -1,10 +1,12 @@ -package com.engine.salary.entity.salaryBill.po; +package com.engine.salary.entity.salaryBill.po; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.Date; /** * 工资单发放范围项目表 @@ -13,6 +15,7 @@ import lombok.NoArgsConstructor; @Builder @AllArgsConstructor @NoArgsConstructor +@Accessors(chain = true) public class SalarySendRangeObj { /** * 主键id diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java index f2e0675f5..0831b153b 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendRangePO.java @@ -1,11 +1,12 @@ -package com.engine.salary.entity.salaryBill.po; +package com.engine.salary.entity.salaryBill.po; -import java.util.Date; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + /** * 工资单发放范围表 */ diff --git a/src/com/engine/salary/enums/salarysend/SalarySendGrantTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendGrantTypeEnum.java new file mode 100644 index 000000000..36d9114c8 --- /dev/null +++ b/src/com/engine/salary/enums/salarysend/SalarySendGrantTypeEnum.java @@ -0,0 +1,50 @@ +package com.engine.salary.enums.salarysend; + +import cn.hutool.core.util.StrUtil; + +import java.util.Arrays; +import java.util.Objects; + +public enum SalarySendGrantTypeEnum { + GRANT("grant", "发放", 98590), + WITHDRAW("withdraw", "撤回", 93351); + + private String value; + + private String defaultLabel; + + private int labelId; + + SalarySendGrantTypeEnum(String value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + public String getValue() { + return value; + } + + public String getDefaultLabel() { + return defaultLabel; + } + + public int getLabelId() { + return labelId; + } + + public static String getDefaultLabelByValue(String value, Long employeeId, String tenantKey) { + return Arrays.stream(SalarySendGrantTypeEnum.values()).filter(r -> r.getValue().equals(value)).findFirst() + .map(SalarySendGrantTypeEnum::getDefaultLabel) + .orElse(StrUtil.EMPTY); + } + + public SalarySendGrantTypeEnum fromValue(String value) { + for (SalarySendGrantTypeEnum salarySendGrantTypeEnum : values()) { + if (Objects.equals(salarySendGrantTypeEnum.getValue(), value)) { + return salarySendGrantTypeEnum; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java deleted file mode 100644 index 30e674b12..000000000 --- a/src/com/engine/salary/enums/salarysend/SalarySendOperateTypeEnum.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.engine.salary.enums.salarysend; - -import com.engine.salary.enums.BaseEnum; -import com.engine.salary.util.SalaryI18nUtil; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; -import java.util.Optional; - -/** - * @Description: 范围类型 - * @Author: lfc - * @Date: 2022/11/14 09:33 - */ -@AllArgsConstructor -@Getter -public enum SalarySendOperateTypeEnum implements BaseEnum { - GRANT("grant", "发放", 98590), - WITHDRAW("withdraw", "撤回", 93351); - - private final String value; - - private final String defaultLabel; - - private final int labelId; - - public static String getDefaultLabelByValue(String value, Long employeeId, String tenantKey) { - Optional optional = Arrays.stream(SalarySendOperateTypeEnum.values()).filter(r->r.getValue().equals(value)).findFirst(); - return optional.isPresent()? SalaryI18nUtil.getI18nLabel(optional.get().getLabelId(), optional.get().getDefaultLabel()):""; - } -} \ No newline at end of file diff --git a/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java index cff60f34d..39f9f76f6 100644 --- a/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java +++ b/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java @@ -1,4 +1,4 @@ -package com.engine.salary.enums.salarysend; +package com.engine.salary.enums.salarysend; import com.engine.salary.enums.BaseEnum; import lombok.AllArgsConstructor; @@ -22,7 +22,22 @@ public enum SalarySendRangeTargetTypeEnum implements BaseEnum { private final int labelId; - public static SalarySendRangeTargetTypeEnum parseByValue(Integer value) { + @Override + public Integer getLabelId() { + return labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + public static SalarySendRangeTargetTypeEnum fromValue(Integer value) { for (SalarySendRangeTargetTypeEnum targetTypeEnum : SalarySendRangeTargetTypeEnum.values()) { if (Objects.equals(targetTypeEnum.getValue(), value)) { return targetTypeEnum; diff --git a/src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java index 00cf96618..a604013b3 100644 --- a/src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java +++ b/src/com/engine/salary/enums/salarysend/SalarySendRangeTypeEnum.java @@ -1,4 +1,4 @@ -package com.engine.salary.enums.salarysend; +package com.engine.salary.enums.salarysend; import com.engine.salary.enums.BaseEnum; import com.engine.salary.util.SalaryI18nUtil; @@ -21,8 +21,33 @@ public enum SalarySendRangeTypeEnum implements BaseEnum { private final int labelId; + @Override + public Integer getLabelId() { + return labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + public static String getDefaultLabelByValue(Integer value, Long employeeId, String tenantKey) { Optional optional = Arrays.stream(SalarySendRangeTypeEnum.values()).filter(r->Integer.valueOf(r.getValue()).equals(value)).findFirst(); return optional.isPresent()? SalaryI18nUtil.getI18nLabel(optional.get().getLabelId(), optional.get().getDefaultLabel()):""; } + + public static SalarySendRangeTypeEnum fromValue(int value) { + for (SalarySendRangeTypeEnum salarySendRangeTypeEnum : values()) { + boolean equals = salarySendRangeTypeEnum.getValue().equals(value); + if (equals) { + return salarySendRangeTypeEnum; + } + } + return null; + } } diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java index 00a7be206..aee1b22aa 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.java @@ -1,9 +1,11 @@ -package com.engine.salary.mapper.salarybill; +package com.engine.salary.mapper.salarybill; +import com.engine.salary.entity.salaryBill.dto.SalarySendRangeListDTO; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeQueryParam; import com.engine.salary.entity.salaryBill.po.SalarySendRangePO; +import org.apache.ibatis.annotations.Param; import java.util.List; -import org.apache.ibatis.annotations.Param; public interface SalarySendRangeMapper { int deleteByPrimaryKey(Long id); @@ -16,9 +18,17 @@ public interface SalarySendRangeMapper { List selectByAll(SalarySendRangePO salarySendRangePO); - List selectAllBySalarySendIdAndGrantType(@Param("salarySendId") Long salarySendId, @Param("grantType") String grantType); + List selectBySendIdAndGrantType(@Param("salarySendId") Long salarySendId, + @Param("grantType") String grantType); + + List selectIdsBySendIdAndGrantType(@Param("salarySendId") Long salarySendId, + @Param("grantType") String grantType); int updateBatchSelective(List list); int batchInsert(@Param("list") List list); + + List selectByParam(@Param("queryParam") SalarySendRangeQueryParam queryParam); + + } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml index cdbc77602..b3b46a54c 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeMapper.xml @@ -13,6 +13,12 @@ + + + + + + id, salary_send_id, grant_type, creator, create_time, update_time, delete_type, tenant_key @@ -25,11 +31,15 @@ where id = #{id,jdbcType=BIGINT} - - delete from hrsa_salary_send_range - where id = #{id,jdbcType=BIGINT} + update hrsa_salary_send_range + set delete_type = 1 + where id = #{id,jdbcType=BIGINT} and delete_type = 0 - + + + insert into hrsa_salary_send_range @@ -79,6 +89,64 @@ + + + + select HRSA_S_S_R_ID.currval from dual + + insert into hrsa_salary_send_range + + id, + + salary_send_id, + + + grant_type, + + + creator, + + + create_time, + + + update_time, + + + delete_type, + + + tenant_key, + + + + #{id,jdbcType=BIGINT}, + + #{salarySendId,jdbcType=BIGINT}, + + + #{grantType,jdbcType=VARCHAR}, + + + #{creator,jdbcType=BIGINT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{deleteType,jdbcType=INTEGER}, + + + #{tenantKey,jdbcType=VARCHAR}, + + + + + update hrsa_salary_send_range @@ -107,6 +175,8 @@ where id = #{id,jdbcType=BIGINT} + + - select from hrsa_salary_send_range - where salary_send_id=#{salarySendId,jdbcType=BIGINT} and grant_type=#{grantType,jdbcType=VARCHAR} + + delete_type = 0 + and salary_send_id=#{salarySendId,jdbcType=BIGINT} + + and grant_type=#{grantType,jdbcType=VARCHAR} + + + + update hrsa_salary_send_range @@ -205,6 +284,8 @@ #{item.id,jdbcType=BIGINT} + + insert into hrsa_salary_send_range @@ -217,4 +298,61 @@ #{item.tenantKey,jdbcType=VARCHAR}) + + + insert into hrsa_salary_send_range + (salary_send_id, grant_type, creator, create_time, update_time, delete_type, tenant_key + ) + values + (#{item.salarySendId,jdbcType=BIGINT}, #{item.grantType,jdbcType=VARCHAR}, #{item.creator,jdbcType=BIGINT}, + #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.deleteType,jdbcType=INTEGER}, + #{item.tenantKey,jdbcType=VARCHAR}) + + + + + insert into hrsa_salary_send_range + (salary_send_id, grant_type, creator, create_time, update_time, delete_type, tenant_key + ) + select + + #{item.salarySendId,jdbcType=BIGINT}, #{item.grantType,jdbcType=VARCHAR}, #{item.creator,jdbcType=BIGINT}, + #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateTime,jdbcType=TIMESTAMP}, #{item.deleteType,jdbcType=INTEGER}, + #{item.tenantKey,jdbcType=VARCHAR} + + from dual + + + + + + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java index 4d4836eb6..ad98471c9 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.java @@ -1,5 +1,6 @@ -package com.engine.salary.mapper.salarybill; +package com.engine.salary.mapper.salarybill; +import com.engine.salary.entity.salaryBill.dto.SalarySendUserInfoDTO; import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; import org.apache.ibatis.annotations.Param; @@ -23,9 +24,12 @@ public interface SalarySendRangeObjMapper { int updateBatchSelective(List list); + void deleteByRangeIds(@Param("salarySendRangeIds") List salarySendRangeIds, + @Param("tenantKey") String tenantKey); + int batchInsert(@Param("list") List list); int deleteBySalarySendIds(@Param("salarySendIds") Collection salarySendIds); - + List getUserInfoByEmployeeIds(@Param("employeeIds") List employeeIds); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml index 46e6cb0b9..fd10b04c0 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendRangeObjMapper.xml @@ -293,7 +293,7 @@ - + insert into hrsa_salary_send_range_obj (salary_send_id, salary_send_range_id, range_type, target_type, target_id, creator, create_time, update_time, delete_type, tenant_key) @@ -329,4 +329,34 @@ ) and delete_type = 0 + + + update hrsa_salary_send_range_obj + set delete_type = 1 + where delete_type = 0 + and salary_send_range_id in ( + + #{salarySendId} + + ) + + + + + + + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/SalarySendRangeObjService.java b/src/com/engine/salary/service/SalarySendRangeObjService.java index 4f623ee32..dd3d5355c 100644 --- a/src/com/engine/salary/service/SalarySendRangeObjService.java +++ b/src/com/engine/salary/service/SalarySendRangeObjService.java @@ -1,4 +1,4 @@ -package com.engine.salary.service; +package com.engine.salary.service; import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; @@ -20,13 +20,6 @@ public interface SalarySendRangeObjService { */ List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds); - /** - * 保存筛选范围对象 - * - * @param listObj - */ - void batchInsert(List listObj); - /** * 根据工资饭发放id删除 * @@ -34,22 +27,16 @@ public interface SalarySendRangeObjService { */ void deleteBySalarySendIds(Collection salarySendIds); - /** - * 根据范围id删除 - * - * @param rangeIds - * @param currentEmployeeId - * @param currentTenantKey - */ - void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId); + void replaceAllByRangeIds(Long rangeIds, List rangeObjs); /** * 根据发放id和范围id获取发放信息id * * @param salarySendId * @param rangeIds - * @param employeeId * @return */ - List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId); + List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds); + + void deleteBySalarySendRangeIds(List salarySendRangeIds); } \ No newline at end of file diff --git a/src/com/engine/salary/service/SalarySendRangeService.java b/src/com/engine/salary/service/SalarySendRangeService.java index 5f5ba97a5..e3d82f4c0 100644 --- a/src/com/engine/salary/service/SalarySendRangeService.java +++ b/src/com/engine/salary/service/SalarySendRangeService.java @@ -1,31 +1,24 @@ -package com.engine.salary.service; +package com.engine.salary.service; -import com.engine.salary.entity.salaryBill.dto.*; -import com.engine.salary.entity.salaryBill.param.*; -import com.engine.salary.entity.salaryBill.po.SalarySendPO; -import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.entity.salaryBill.dto.SalarySendRangeListDTO; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeQueryParam; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeSaveParam; import com.engine.salary.util.page.PageInfo; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.util.Collection; import java.util.List; -import java.util.Map; /** * @Description: 工资单发放范围 */ public interface SalarySendRangeService { - void save(); + void save(SalarySendRangeSaveParam param); - void listPage(); - - void listDTO(); - - void listByIds(); - - void getById(Long id); + PageInfo listPage(SalarySendRangeQueryParam queryParam); void deleteBySalarySendIds(Collection sendIds); - void getSendInfoIdsBySendId(Collection sendIds); + void deleteByIds(List sendRangeIds); + + List getSendInfoIdsBySendId(Long sendId, List sendRangeIds); } diff --git a/src/com/engine/salary/service/SalarySendService.java b/src/com/engine/salary/service/SalarySendService.java index c6f0b89cd..5f8184184 100644 --- a/src/com/engine/salary/service/SalarySendService.java +++ b/src/com/engine/salary/service/SalarySendService.java @@ -84,6 +84,7 @@ public interface SalarySendService { */ PageInfo salarySendInfoListPage(SalarySendInfoQueryParam queryParam); + List salarySendInfoList(Long salarySendId); /** * 我的工资单列表详情 * diff --git a/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java index 9b71f5e3b..38da21b98 100644 --- a/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java @@ -1,61 +1,101 @@ -package com.engine.salary.service.impl; +package com.engine.salary.service.impl; +import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.hrm.service.RolesMembersService; +import com.engine.hrm.service.impl.RolesMembersServiceImpl; +import com.engine.salary.biz.SalarySendRangeObjBiz; +import com.engine.salary.entity.salaryBill.bo.SalarySendRangeBO; +import com.engine.salary.entity.salaryBill.dto.SalarySendInfoListDTO; +import com.engine.salary.entity.salaryBill.dto.SalarySendUserInfoDTO; import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; -import com.engine.salary.mapper.salarybill.SalarySendRangeObjMapper; +import com.engine.salary.enums.salarysend.SalarySendRangeTargetTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.SalarySendRangeObjService; -import com.google.common.collect.Lists; +import com.engine.salary.service.SalarySendService; import org.apache.commons.collections4.CollectionUtils; -import org.apache.ibatis.session.SqlSession; -import weaver.conn.mybatis.MyBatisFactory; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.function.Function; +import java.util.Set; +import java.util.stream.Collectors; import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; public class SalarySendRangeObjServiceImpl extends Service implements SalarySendRangeObjService { - private R runSalarySendRangeObjMapper(Function mapper) { - try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { - final SalarySendRangeObjMapper salarySendRangeObjMapper = sqlSession.getMapper(SalarySendRangeObjMapper.class); - return mapper.apply(salarySendRangeObjMapper); - } + private SalarySendService getSalarySendService() { + return ServiceUtil.getService(SalarySendServiceImpl.class, user); } + private RolesMembersService getRolesMembersService() { + return ServiceUtil.getService(RolesMembersServiceImpl.class, user); + } + + private final SalarySendRangeObjBiz salarySendRangeObjBiz = new SalarySendRangeObjBiz(); + @Override public List listBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds) { if (salarySendId == null || CollectionUtils.isEmpty(rangeIds)) { return Collections.emptyList(); } - return runSalarySendRangeObjMapper(mapper -> + return salarySendRangeObjBiz.applyMapper(mapper -> mapper.listBySalarySendIdAndRangeIds(salarySendId, rangeIds, DEFAULT_TENANT_KEY) ); } - @Override - public void batchInsert(List listObj) { - if (listObj == null) { - return; - } - List> p = Lists.partition(listObj, 150); - p.forEach(list-> runSalarySendRangeObjMapper(m->m.batchInsert(list))); - } - @Override public void deleteBySalarySendIds(Collection salarySendIds) { - runSalarySendRangeObjMapper(mapper->mapper.deleteBySalarySendIds(salarySendIds)); + salarySendRangeObjBiz.runMapper(mapper -> mapper.deleteBySalarySendIds(salarySendIds)); } @Override - public void deleteByRangeIds(Collection rangeIds, Long currentEmployeeId) { - + public void replaceAllByRangeIds(Long rangeIds, List rangeObjs) { + for (SalarySendRangeObj rangeObj : rangeObjs) { + SalarySendRangeTargetTypeEnum targetEnum = SalarySendRangeTargetTypeEnum.fromValue(rangeObj.getTargetType()); + if (targetEnum == null) { + throw new SalaryRunTimeException("传入范围类型非法"); + } + if (rangeObj.getTargetType().equals(SalarySendRangeTargetTypeEnum.ALL.getValue())) { + rangeObj.setTargetId(0L); + } + } + salarySendRangeObjBiz.replaceAllByRangeId(rangeIds, rangeObjs); } @Override - public List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds, Long employeeId) { - return null; + public List getSendInfoIdsBySalarySendIdAndRangeIds(Long salarySendId, List rangeIds) { + // 获取范围 + List rangeList = + salarySendRangeObjBiz.applyMapper(mapper -> mapper.listBySalarySendIdAndRangeIds(salarySendId, rangeIds, DEFAULT_TENANT_KEY)); + + // 初始化范围操作类 + SalarySendRangeBO rangeBO = new SalarySendRangeBO(); + for (SalarySendRangeObj rangeObj : rangeList) { + rangeBO.putNew(rangeObj); + } + // 获取当前发放单人员详情 + List sendInfoList = getSalarySendService().salarySendInfoList(salarySendId); + // 获取全部人员id + List employeeIds = sendInfoList.stream().map(SalarySendInfoListDTO::getEmployeeId) + .distinct().collect(Collectors.toList()); + // 查找人员的多维度关联id + List userInfos = + salarySendRangeObjBiz.getSalarySendUserInfoDTOs(employeeIds); + // 筛选在范围中的人员id + Set empIds = userInfos.stream() + .filter(rangeBO::judgeInRange) + .map(SalarySendUserInfoDTO::getResourceId) + .distinct().collect(Collectors.toSet()); + // 返回发放详情的id + return sendInfoList.stream().filter(s -> empIds.contains(s.getEmployeeId())) + .map(SalarySendInfoListDTO::getId) + .collect(Collectors.toList()); + } + + @Override + public void deleteBySalarySendRangeIds(List salarySendRangeIds) { + salarySendRangeObjBiz.runMapper(mapper -> mapper.deleteByRangeIds(salarySendRangeIds, DEFAULT_TENANT_KEY)); } } diff --git a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java index bfa89b7be..6c7d102e4 100644 --- a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java @@ -1,34 +1,172 @@ -package com.engine.salary.service.impl; +package com.engine.salary.service.impl; +import cn.hutool.core.util.StrUtil; +import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.biz.EmployBiz; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; +import com.engine.salary.entity.hrm.DeptInfo; +import com.engine.salary.entity.hrm.PositionInfo; +import com.engine.salary.entity.hrm.SubCompanyInfo; +import com.engine.salary.entity.salaryBill.dto.SalarySendRangeListDTO; +import com.engine.salary.entity.salaryBill.dto.SalarySendRangeObjDTO; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeQueryParam; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeSaveParam; +import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; +import com.engine.salary.entity.salaryBill.po.SalarySendRangePO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.salarysend.SalarySendRangeTargetTypeEnum; +import com.engine.salary.enums.salarysend.SalarySendRangeTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.mapper.salarybill.SalarySendRangeMapper; +import com.engine.salary.service.SalaryEmployeeService; +import com.engine.salary.service.SalarySendRangeObjService; import com.engine.salary.service.SalarySendRangeService; +import com.engine.salary.service.TaxAgentService; +import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.util.page.SalaryPageUtil; +import org.apache.ibatis.session.SqlSession; +import weaver.conn.mybatis.MyBatisFactory; -import java.util.Collection; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; public class SalarySendRangeServiceImpl extends Service implements SalarySendRangeService { - @Override - public void save() { + private SalaryEmployeeService getSalaryEmployeeService() { + return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); + } + private TaxAgentService getTaxAgentService() { + return ServiceUtil.getService(TaxAgentServiceImpl.class, user); + } + + private EmployBiz employBiz = new EmployBiz(); + + private R applyMapper(Function mapper) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + final SalarySendRangeMapper salarySendRangeMapper = sqlSession.getMapper(SalarySendRangeMapper.class); + R apply = mapper.apply(salarySendRangeMapper); + sqlSession.commit(); + return apply; + } + } + + private void runMapper(Consumer mapper) { + try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { + final SalarySendRangeMapper salarySendRangeMapper = sqlSession.getMapper(SalarySendRangeMapper.class); + mapper.accept(salarySendRangeMapper); + sqlSession.commit(); + } + } + + private SalarySendRangeObjService getSalarySendRangeObjService() { + return ServiceUtil.getService(SalarySendRangeObjServiceImpl.class, user); } @Override - public void listPage() { + public void save(SalarySendRangeSaveParam param) { + SalarySendRangeSaveParam.checkParam(param, (long) user.getUID(), DEFAULT_TENANT_KEY); + SalarySendRangePO salarySendRangePO = param.toSalarySendRangePO(user); + // 如果传入id, 则做查询后更新 + if (salarySendRangePO.getId() != null) { + SalarySendRangePO oldInfo = applyMapper(mapper -> mapper.selectByPrimaryKey(salarySendRangePO.getId())); + if (oldInfo == null) { + throw new SalaryRunTimeException("传入发放范围不存在"); + } + runMapper(mapper -> mapper.updateByPrimaryKeySelective(salarySendRangePO)); + } else { + runMapper(mapper -> mapper.insertSelective(salarySendRangePO)); + } + param.setSalarySendRangeId(salarySendRangePO.getId()); + + List rangeObjs = param.toSalarySendRangeObj(user); + getSalarySendRangeObjService().replaceAllByRangeIds(salarySendRangePO.getId(), rangeObjs); } @Override - public void listDTO() { - - } - - @Override - public void listByIds() { - - } - - @Override - public void getById(Long id) { - + public PageInfo listPage(SalarySendRangeQueryParam queryParam) { + if (StrUtil.isEmpty(queryParam.getTargetName())) { + SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); + } + SalarySendRangeMapper mapper = MapperProxyFactory.getProxy(SalarySendRangeMapper.class); + List listDTOs = mapper.selectByParam(queryParam); + PageInfo page = new PageInfo<>(listDTOs, SalarySendRangeListDTO.class); + listDTOs = listDTOs.stream().map(s -> { + List rangeObjs = getSalarySendRangeObjService().listBySalarySendIdAndRangeIds(queryParam.getSalarySendId(), + Collections.singletonList(s.getId())); + Map> groupedMap = rangeObjs.stream() + .map(rangeObj -> { + SalarySendRangeTargetTypeEnum typeEnum = SalarySendRangeTargetTypeEnum.fromValue(rangeObj.getTargetType()); + if (typeEnum == null) { + return null; + } + String targetName = null; + switch (typeEnum) { + case USER: + DataCollectionEmployee employee = + getSalaryEmployeeService().getEmployeeById(rangeObj.getTargetId()); + targetName = Optional.ofNullable(employee) + .map(DataCollectionEmployee::getUsername) + .orElse(null); + break; + case DEPT: + targetName = employBiz.getDeptInfoList(Collections.singletonList(rangeObj.getTargetId())) + .stream().findFirst() + .map(DeptInfo::getName).orElse(null); + break; + case SUB_COMPANY: + targetName = employBiz.getSubCompanyInfoList(Collections.singletonList(rangeObj.getTargetId())) + .stream().findFirst() + .map(SubCompanyInfo::getName).orElse(null); + break; + case POSITION: + targetName = employBiz.listPositionInfo(Collections.singletonList(rangeObj.getTargetId())) + .stream().findFirst() + .map(PositionInfo::getName).orElse(null); + break; + case TAX_AGENT: + targetName = Optional.ofNullable(getTaxAgentService().getById(rangeObj.getTargetId())) + .map(TaxAgentPO::getName).orElse(null); + break; + } + return SalarySendRangeObjDTO.builder() + .targetType(rangeObj.getTargetType()) + .targetTypeName(typeEnum.getDefaultLabel()) + .targetName(targetName) + .rangeType(rangeObj.getRangeType()) + .targetId(rangeObj.getTargetId()) + .build(); + }).filter(Objects::nonNull) + .collect(Collectors.groupingBy(SalarySendRangeObjDTO::getRangeType)); + //如果有查询,则做筛选 + if (StrUtil.isNotEmpty(queryParam.getTargetName())) { + boolean nameLike = false; + for (List value : groupedMap.values()) { + nameLike |= value.stream() + .anyMatch(item -> Optional.ofNullable(item.getTargetName()).orElse("") + .contains(queryParam.getTargetName())); + } + if (!nameLike) { + return null; + } + } + s.setIncludeObj(groupedMap.getOrDefault(SalarySendRangeTypeEnum.INCLUDE_OBJ.getValue(), Collections.emptyList())); + s.setExcludeObj(groupedMap.getOrDefault(SalarySendRangeTypeEnum.EXCLUDE_OBJ.getValue(), Collections.emptyList())); + return s; + }).filter(Objects::nonNull) + .collect(Collectors.toList()); + if (StrUtil.isNotEmpty(queryParam.getTargetName())) { + page.setTotal(listDTOs.size()); + List list = SalaryPageUtil.subList(queryParam.getCurrent(), queryParam.getPageSize(), listDTOs); + page.setList(list); + } + return page; } @Override @@ -37,7 +175,23 @@ public class SalarySendRangeServiceImpl extends Service implements SalarySendRan } @Override - public void getSendInfoIdsBySendId(Collection sendIds) { + public void deleteByIds(List sendRangeIds) { + runMapper(mapper-> { + for (Long sendRangeId : sendRangeIds) { + mapper.deleteByPrimaryKey(sendRangeId); + } + }); + getSalarySendRangeObjService().deleteBySalarySendRangeIds(sendRangeIds); + } + @Override + public List getSendInfoIdsBySendId(Long sendId, List sendRangeIds) { + List rangeIdList = + applyMapper(mapper -> mapper.selectIdsBySendIdAndGrantType(sendId, null)); + + rangeIdList = rangeIdList.stream() + .filter(sendRangeIds::contains) + .collect(Collectors.toList()); + return getSalarySendRangeObjService().getSendInfoIdsBySalarySendIdAndRangeIds(sendId, rangeIdList); } } diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index e9126f8a6..fcf053795 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -76,6 +76,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService private SalarySendBiz mapper = new SalarySendBiz(); private SalarySendInfoBiz salarySendInfoMapper = new SalarySendInfoBiz(); + private SalarySendRangeService getSalarySendRangeService(User user) { + return ServiceUtil.getService(SalarySendRangeServiceImpl.class, user); + } + private SalaryTemplateService getSalaryTemplateService(User user) { return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); @@ -453,6 +457,11 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return result; } + @Override + public List salarySendInfoList(Long salarySendId) { + return salarySendInfoMapper.list(SalarySendInfoQueryParam.builder().salarySendId(salarySendId).build()); + } + @Override public PageInfo mySalaryBillListPage(SalaryBillQueryParam queryParam) { List list = salarySendInfoMapper.mySalaryBillList(queryParam); @@ -659,6 +668,12 @@ public class SalarySendServiceImpl extends Service implements SalarySendService Long salarySendId = param.getSalarySendId(); Collection ids = param.getIds(); + if (param.getSalarySendRangeIds() != null) { + //如果传了范围id,则使用范围id发放 + ids = getSalarySendRangeService(user) + .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds()); + } + SalarySendPO salarySend = mapper.getById(salarySendId); if (salarySend == null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); @@ -916,6 +931,12 @@ public class SalarySendServiceImpl extends Service implements SalarySendService Long salarySendId = param.getSalarySendId(); Collection ids = param.getIds(); + if (param.getSalarySendRangeIds() != null) { + //如果传了范围id,则使用范围id撤回 + ids = getSalarySendRangeService(user) + .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds()); + } + SalarySendPO salarySend = mapper.getById(salarySendId); if (salarySend == null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100512, "工资单发放不存在")); diff --git a/src/com/engine/salary/web/SalarySendRangeController.java b/src/com/engine/salary/web/SalarySendRangeController.java new file mode 100644 index 000000000..aaf00002a --- /dev/null +++ b/src/com/engine/salary/web/SalarySendRangeController.java @@ -0,0 +1,58 @@ +package com.engine.salary.web; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryBill.dto.SalarySendRangeListDTO; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeQueryParam; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeSaveParam; +import com.engine.salary.util.ResponseResult; +import com.engine.salary.util.page.PageInfo; +import com.engine.salary.wrapper.SalarySendRangeWrapper; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import java.util.Collection; + +/** + * @Description: 工资单范围 + */ +public class SalarySendRangeController { + private SalarySendRangeWrapper getSalarySendRangeWrapper(User user) { + return ServiceUtil.getService(SalarySendRangeWrapper.class, user); + } + + @POST + @Path("/save") + @Produces(MediaType.APPLICATION_JSON) + public String save(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody SalarySendRangeSaveParam saveParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalarySendRangeWrapper(user)::save, saveParam); + } + + @POST + @Path("/deleteByIds") + @Produces(MediaType.APPLICATION_JSON) + public String deleteByIds(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody Collection ids) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, Void>(user).run(getSalarySendRangeWrapper(user)::deleteByIds, ids); + } + + @POST + @Path("/listPage") + @Produces(MediaType.APPLICATION_JSON) + public String save(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody SalarySendRangeQueryParam queryParam) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalarySendRangeWrapper(user)::listPage, queryParam); + } + +} diff --git a/src/com/engine/salary/wrapper/SalarySendRangeWrapper.java b/src/com/engine/salary/wrapper/SalarySendRangeWrapper.java new file mode 100644 index 000000000..a4edde955 --- /dev/null +++ b/src/com/engine/salary/wrapper/SalarySendRangeWrapper.java @@ -0,0 +1,36 @@ +package com.engine.salary.wrapper; + +import com.engine.common.util.ServiceUtil; +import com.engine.core.impl.Service; +import com.engine.salary.entity.salaryBill.dto.SalarySendRangeListDTO; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeQueryParam; +import com.engine.salary.entity.salaryBill.param.SalarySendRangeSaveParam; +import com.engine.salary.service.SalarySendRangeService; +import com.engine.salary.service.impl.SalarySendRangeServiceImpl; +import com.engine.salary.util.page.PageInfo; +import weaver.hrm.User; + +import java.util.ArrayList; +import java.util.Collection; + +public class SalarySendRangeWrapper extends Service { + private SalarySystemConfigWrapper getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySystemConfigWrapper.class, user); + } + + private SalarySendRangeService getSalarySendRangeService(User user) { + return ServiceUtil.getService(SalarySendRangeServiceImpl.class, user); + } + + public PageInfo listPage(SalarySendRangeQueryParam queryParam) { + return getSalarySendRangeService(user).listPage(queryParam); + } + + public void save(SalarySendRangeSaveParam saveParam) { + getSalarySendRangeService(user).save(saveParam); + } + + public void deleteByIds(Collection ids) { + getSalarySendRangeService(user).deleteByIds(new ArrayList<>(ids)); + } +} From ff20acd15adb37fca14b614da3fd6a83de96f760 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 28 Nov 2022 09:55:29 +0800 Subject: [PATCH 09/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=B0=83=E5=B7=AE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E8=A1=A8po=E5=92=8C=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=A1=A8po?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../po/InsuranceCompensationConfigPO.java | 75 +++++++++++++++++++ .../siaccount/po/InsuranceCompensationPO.java | 6 +- 2 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java new file mode 100644 index 000000000..0cd4da439 --- /dev/null +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java @@ -0,0 +1,75 @@ +package com.engine.salary.entity.siaccount.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * @Author: sy + * @Description: 社保福利台账-调差配置表 + * @Date: 2022/11/28 + **/ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +//hrsa_compensation_config +public class InsuranceCompensationConfigPO { + /** + * 主键id + */ + private Long id; + + /** + * 缴纳组织 + */ + private Long paymentAgency; + + /** + * 创建人id + */ + private Long creator; + + /** + * 是否删除 + */ + private Integer deleteType; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 租户key + */ + private String tenantKey; + + /** + * 统计调差福利 + */ + private Integer welfareType; + + /** + * 统计调差福利类型 + */ + private String categoryType; + + /** + * 调差到 + */ + private Long adjustTo; + + /** + * 员工id + */ + private Long employeeId; +} diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java index a361a5b65..dbd00ae12 100644 --- a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; +import java.util.Date; /** * @Author: sy @@ -47,12 +47,12 @@ public class InsuranceCompensationPO { /** * 创建时间 */ - private LocalDateTime createTime; + private Date createTime; /** * 更新时间 */ - private LocalDateTime updateTime; + private Date updateTime; /** * 租户key From 8f75380f67633a77c927ac3f893784e60660f601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 28 Nov 2022 10:39:46 +0800 Subject: [PATCH 10/77] =?UTF-8?q?=E6=89=A9=E5=B1=95sql=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/impl/SalaryFormulaServiceImpl.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java index 65cb918c8..a012a2f4d 100644 --- a/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryFormulaServiceImpl.java @@ -146,14 +146,19 @@ public class SalaryFormulaServiceImpl extends Service implements SalaryFormulaSe //将select因XSS过滤造成的异常字符转换回来 param.setFormula(param.getFormula().replaceAll("select", "select")); - param.setFormula(param.getFormula().replaceAll("SELECT", "select")); + param.setFormula(param.getFormula().replaceAll("SELECT", "SELECT")); param.setFormula(param.getFormula().replaceAll("join", "join")); - param.setFormula(param.getFormula().replaceAll("JOIN ", "join")); + param.setFormula(param.getFormula().replaceAll("JOIN", "JOIN")); param.setFormula(param.getFormula().replaceAll("and", "and")); + param.setFormula(param.getFormula().replaceAll("AND", "AND")); param.setFormula(param.getFormula().replaceAll("or", "or")); + param.setFormula(param.getFormula().replaceAll("OR", "OR")); param.setFormula(param.getFormula().replaceAll("in", "in")); + param.setFormula(param.getFormula().replaceAll("IN", "IN")); param.setFormula(param.getFormula().replaceAll("like", "like")); - param.setFormula(param.getFormula().replaceAll("LIKE ", "like")); + param.setFormula(param.getFormula().replaceAll("LIKE", "like")); + param.setFormula(param.getFormula().replaceAll("exists", "exists")); + param.setFormula(param.getFormula().replaceAll("EXISTS", "EXISTS")); } //试运行公式 From 8d211c7db06081d665fd776dc645727c974404fa Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 28 Nov 2022 11:35:05 +0800 Subject: [PATCH 11/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E4=BF=9D=E5=AD=98v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../po/InsuranceCompensationConfigPO.java | 5 + .../InsuranceCompensationConfigMapper.java | 13 ++ .../InsuranceCompensationConfigMapper.xml | 155 ++++++++++++++ .../InsuranceCompensationMapper.java | 13 ++ .../siaccount/InsuranceCompensationMapper.xml | 196 ++++++++++++++++++ .../impl/SICompensationServiceImpl.java | 13 +- .../salary/web/SIAccountController.java | 13 ++ .../salary/wrapper/SIAccountWrapper.java | 9 + 8 files changed, 413 insertions(+), 4 deletions(-) create mode 100644 src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java create mode 100644 src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml create mode 100644 src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java create mode 100644 src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java index 0cd4da439..7a64efe2e 100644 --- a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java @@ -28,6 +28,11 @@ public class InsuranceCompensationConfigPO { */ private Long paymentAgency; + /** + * 个税扣缴义务人 + */ + private Long paymentOrganization; + /** * 创建人id */ diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java new file mode 100644 index 000000000..d16747376 --- /dev/null +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java @@ -0,0 +1,13 @@ +package com.engine.salary.mapper.siaccount; + +import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; + +public interface InsuranceCompensationConfigMapper { + + void bathInsert(@Param("collection") Collection compensationConfigPOS); + + void insert(InsuranceCompensationConfigPO compensationConfigPO); +} diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml new file mode 100644 index 000000000..20671d11b --- /dev/null +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + t.id + , t.payment_agency + , t.employee_id + , t.payment_organization + , t.welfare_type + , t.category_type + , t.adjust_to + , t.create_time + , t.update_time + , t.creator + , t.delete_type + , t.tenant_key + + + + INSERT INTO hrsa_compensation_config( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + adjust_to, + create_time, + update_time, + creator, + delete_type, + tenant_key + ) + VALUES + + ( + #{item.id}, + #{item.employeeId}, + #{item.paymentOrganization}, + #{item.welfareType}, + #{item.categoryType}, + #{item.adjustTo}, + #{item.createTime}, + #{item.updateTime}, + #{item.creator}, + #{item.deleteType}, + #{item.tenantKey} + ) + + + + INSERT INTO hrsa_compensation_config( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + adjust_to, + create_time, + update_time, + creator, + delete_type, + tenant_key + ) + + + select + #{item.id,jdbcType=DOUBLE}, + #{item.employeeId,jdbcType=DOUBLE}, + #{item.paymentOrganization,jdbcType=DOUBLE}, + #{item.welfareType,jdbcType=INTEGER}, + #{item.categoryType,jdbcType=VARCHAR}, + #{item.adjustTo,jdbcType=DOUBLE}, + #{item.createTime,jdbcType=DATE}, + #{item.updateTime,jdbcType=DATE}, + #{item.creator,jdbcType=DOUBLE}, + #{item.deleteType,jdbcType=INTEGER}, + #{item.tenantKey,jdbcType=VARCHAR} + + from dual + + + + + INSERT INTO hrsa_compensation_config( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + adjust_to, + create_time, + update_time, + creator, + delete_type, + tenant_key + ) + VALUES + ( + #{item.id}, + #{item.employeeId}, + #{item.paymentOrganization}, + #{item.welfareType}, + #{item.categoryType}, + #{item.adjustTo}, + #{item.createTime}, + #{item.updateTime}, + #{item.creator}, + #{item.deleteType}, + #{item.tenantKey} + ) + + + + + insert into hrsa_compensation_config ( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + adjust_to, + create_time, + update_time, + creator, + delete_type, + tenant_key) + VALUES ( + #{id}, + #{employeeId}, + #{paymentOrganization}, + #{welfareType}, + #{categoryType}, + #{adjustTo}, + #{createTime}, + #{updateTime}, + #{creator}, + #{deleteType}, + #{tenantKey}) + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java new file mode 100644 index 000000000..a021cc4a9 --- /dev/null +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java @@ -0,0 +1,13 @@ +package com.engine.salary.mapper.siaccount; + +import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; + +public interface InsuranceCompensationMapper { + + void bathInsert(@Param("collection") Collection insuranceCompensationPOS); + + void insert(InsuranceCompensationPO insuranceCompensationPO); +} diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml new file mode 100644 index 000000000..dece492ec --- /dev/null +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + t.id + , t.payment_agency + , t.employee_id + , t.payment_organization + , t.welfare_type + , t.category_type + , t.country_total + , t.company_total + , t.adjustment_total + , t.adjust_to + , t.bill_month + , t.create_time + , t.update_time + , t.creator + , t.delete_type + , t.tenant_key + + + + INSERT INTO hrsa_compensation_log( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + country_total, + company_total, + adjustment_total, + adjust_to, + bill_month, + create_time, + update_time, + creator, + delete_type, + tenant_key + ) + VALUES + + ( + #{item.id}, + #{item.employeeId}, + #{item.paymentOrganization}, + #{item.welfareType}, + #{item.categoryType}, + #{item.countryTotal}, + #{item.companyTotal}, + #{item.adjustmentTotal}, + #{item.adjustTo}, + #{item.billMonth}, + #{item.createTime}, + #{item.updateTime}, + #{item.creator}, + #{item.deleteType}, + #{item.tenantKey} + ) + + + + INSERT INTO hrsa_compensation_log( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + country_total, + company_total, + adjustment_total, + adjust_to, + bill_month, + create_time, + update_time, + creator, + delete_type, + tenant_key + ) + + + select + #{item.id,jdbcType=DOUBLE}, + #{item.employeeId,jdbcType=DOUBLE}, + #{item.paymentOrganization,jdbcType=DOUBLE}, + #{item.welfareType,jdbcType=INTEGER}, + #{item.categoryType,jdbcType=VARCHAR}, + #{item.countryTotal,jdbcType=VARCHAR}, + #{item.companyTotal,jdbcType=VARCHAR}, + #{item.adjustmentTotal,jdbcType=VARCHAR}, + #{item.adjustTo,jdbcType=DOUBLE}, + #{item.billMonth,jdbcType=VARCHAR}, + #{item.createTime,jdbcType=DATE}, + #{item.updateTime,jdbcType=DATE}, + #{item.creator,jdbcType=DOUBLE}, + #{item.deleteType,jdbcType=INTEGER}, + #{item.tenantKey,jdbcType=VARCHAR} + + from dual + + + + + INSERT INTO hrsa_compensation_log( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + country_total, + company_total, + adjustment_total, + adjust_to, + bill_month, + create_time, + update_time, + creator, + delete_type, + tenant_key + ) + VALUES + ( + #{item.id}, + #{item.employeeId}, + #{item.paymentOrganization}, + #{item.welfareType}, + #{item.categoryType}, + #{item.countryTotal}, + #{item.companyTotal}, + #{item.adjustmentTotal}, + #{item.adjustTo}, + #{item.billMonth}, + #{item.createTime}, + #{item.updateTime}, + #{item.creator}, + #{item.deleteType}, + #{item.tenantKey} + ) + + + + + insert into hrsa_compensation_log ( + id, + employee_id, + payment_organization, + welfare_type, + category_type, + country_total, + company_total, + adjustment_total, + adjust_to, + bill_month, + create_time, + update_time, + creator, + delete_type, + tenant_key) + VALUES ( + #{id}, + #{employeeId}, + #{paymentOrganization}, + #{welfareType}, + #{categoryType}, + #{countryTotal}, + #{companyTotal}, + #{adjustmentTotal}, + #{adjustTo}, + #{billMonth}, + #{createTime}, + #{updateTime}, + #{creator}, + #{deleteType}, + #{tenantKey}) + + \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 1dc8f4e73..ca94b5635 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -16,6 +16,7 @@ import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; +import com.engine.salary.mapper.siaccount.InsuranceCompensationMapper; import com.engine.salary.service.SIAccountService; import com.engine.salary.service.SICategoryService; import com.engine.salary.service.SICompensationService; @@ -57,6 +58,10 @@ public class SICompensationServiceImpl extends Service implements SICompensation return ServiceUtil.getService(SIAccountServiceImpl.class, user); } + private InsuranceCompensationMapper getInsuranceCompensationMapper() { + return MapperProxyFactory.getProxy(InsuranceCompensationMapper.class); + } + /** * 可调差人员 */ @@ -220,16 +225,16 @@ public class SICompensationServiceImpl extends Service implements SICompensation insuranceCompensationPO.setCompanyTotal(param.getCompanyTotal()); insuranceCompensationPO.setCreator(currentEmployeeId); insuranceCompensationPO.setCategoryType(param.getCategoryType()); - insuranceCompensationPO.setCreateTime(LocalDateTime.now()); + insuranceCompensationPO.setCreateTime(new Date()); insuranceCompensationPO.setDeleteType(DeleteTypeEnum.NOT_DELETED.getValue()); insuranceCompensationPO.setCountryTotal(param.getCountryTotal()); insuranceCompensationPO.setEmployeeId(insuranceAccountDetailPO.getEmployeeId()); -// insuranceCompensationPO.setPaymentAgency(insuranceAccountDetailPO.getPaymentAgency()); + insuranceCompensationPO.setPaymentOrganization(insuranceAccountDetailPO.getPaymentOrganization()); insuranceCompensationPO.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); insuranceCompensationPO.setWelfareType(Integer.valueOf(param.getWelfareType())); - insuranceCompensationPO.setUpdateTime(LocalDateTime.now()); -// insuranceCompensationMapper.insert(insuranceCompensationPO); + insuranceCompensationPO.setUpdateTime(new Date()); + getInsuranceCompensationMapper().insert(insuranceCompensationPO); result.put(param.getOriginId(), insuranceCompensationPO.getId().toString()); diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index fcc78dbf0..7d8215025 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -7,6 +7,7 @@ import com.engine.salary.entity.hrm.param.HrmQueryParam; import com.engine.salary.entity.siaccount.dto.InsuranceAccountTabDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAcctDetailImportFieldDTO; +import com.engine.salary.entity.siaccount.dto.InsuranceCompensationDTO; import com.engine.salary.entity.siaccount.param.*; import com.engine.salary.entity.siaccount.po.InsuranceAccountBatchPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; @@ -736,6 +737,18 @@ public class SIAccountController { return new ResponseResult>, Map>>>(user).run(getSIAccountWrapper(user)::compensationComTotal, param); } + /** + * 社保调差保存 + */ + @POST + @Path("/compensationSave") + @Produces(MediaType.APPLICATION_JSON) + public String compensationSave(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody List param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, Map>(user).run(getSIAccountWrapper(user)::compensationSave, param); + } + // **********************************调差 end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SIAccountWrapper.java b/src/com/engine/salary/wrapper/SIAccountWrapper.java index c8c50a02f..7d3f2f52b 100644 --- a/src/com/engine/salary/wrapper/SIAccountWrapper.java +++ b/src/com/engine/salary/wrapper/SIAccountWrapper.java @@ -5,6 +5,7 @@ import com.engine.core.impl.Service; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; +import com.engine.salary.entity.siaccount.dto.InsuranceCompensationDTO; import com.engine.salary.entity.siaccount.param.CompensationParam; import com.engine.salary.entity.siaccount.param.RecessionParam; import com.engine.salary.service.SICompensationService; @@ -82,4 +83,12 @@ public class SIAccountWrapper extends Service { return getSICompensationService(user).compensationComTotal(param); } + + /** + * 社保调差保存 + */ + public Map compensationSave(List param) { + + return getSICompensationService(user).compensationAccount(param); + } } From 49466f9f3b9332dc46f96619c631031beeb1046c Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 28 Nov 2022 13:42:53 +0800 Subject: [PATCH 12/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E9=BB=98=E8=AE=A4=E9=85=8D=E7=BD=AE=E4=BF=9D?= =?UTF-8?q?=E5=AD=98v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InsuranceCompensationConfigMapper.java | 2 ++ .../InsuranceCompensationConfigMapper.xml | 7 ++++ .../salary/service/SICompensationService.java | 5 +++ .../impl/SICompensationServiceImpl.java | 34 +++++++++++++++++++ .../salary/web/SIAccountController.java | 11 ++++++ .../salary/wrapper/SIAccountWrapper.java | 8 +++++ 6 files changed, 67 insertions(+) diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java index d16747376..211404c34 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java @@ -10,4 +10,6 @@ public interface InsuranceCompensationConfigMapper { void bathInsert(@Param("collection") Collection compensationConfigPOS); void insert(InsuranceCompensationConfigPO compensationConfigPO); + + void deleteByPayOrg(Long paymentOrganization); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml index 20671d11b..d4a39d697 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml @@ -152,4 +152,11 @@ #{deleteType}, #{tenantKey}) + + + UPDATE hrsa_compensation_config + SET delete_type = 1 + WHERE payment_organization = #{paymentOrganization} + AND delete_type = 0 + \ No newline at end of file diff --git a/src/com/engine/salary/service/SICompensationService.java b/src/com/engine/salary/service/SICompensationService.java index 7ac42f21c..032d21275 100644 --- a/src/com/engine/salary/service/SICompensationService.java +++ b/src/com/engine/salary/service/SICompensationService.java @@ -18,4 +18,9 @@ public interface SICompensationService { Map>> compensationComTotal(Map> param); Map compensationAccount(List list); + + /** + * 保存社保调差默认配置 + */ + String compensationConfigSave(List param); } diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index ca94b5635..ccb89bf82 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -11,11 +11,13 @@ import com.engine.salary.entity.hrm.param.HrmQueryParam; import com.engine.salary.entity.siaccount.dto.InsuranceCompensationDTO; import com.engine.salary.entity.siaccount.param.CompensationParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; +import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; +import com.engine.salary.mapper.siaccount.InsuranceCompensationConfigMapper; import com.engine.salary.mapper.siaccount.InsuranceCompensationMapper; import com.engine.salary.service.SIAccountService; import com.engine.salary.service.SICategoryService; @@ -62,6 +64,9 @@ public class SICompensationServiceImpl extends Service implements SICompensation return MapperProxyFactory.getProxy(InsuranceCompensationMapper.class); } + private InsuranceCompensationConfigMapper getInsuranceCompensationConfigMapper() { + return MapperProxyFactory.getProxy(InsuranceCompensationConfigMapper.class); + } /** * 可调差人员 */ @@ -247,4 +252,33 @@ public class SICompensationServiceImpl extends Service implements SICompensation getSIAccountService(user).refreshBillBatch(list.get(0).getPaymentOrganization(), list.get(0).getBillMonth()); return result; } + + @Override + public String compensationConfigSave(List param) { + long currentEmployeeId = user.getUID(); + + SalaryAssert.notEmpty(param, SalaryI18nUtil.getI18nLabel(143746, "默认调差配置数据为空")); + // 清除历史默认配置 + getInsuranceCompensationConfigMapper().deleteByPayOrg(param.get(0).getPaymentOrganization()); + // 保存历史默认配置 + List configList = param.stream().map(config -> { + InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(config.getTarget()); + SalaryAssert.notNull(insuranceAccountDetailPO, SalaryI18nUtil.getI18nLabel(138849, "调差对象不存在")); + return InsuranceCompensationConfigPO.builder() + .id(IdGenerator.generate()) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .employeeId(insuranceAccountDetailPO.getEmployeeId()) + .adjustTo(config.getAdjustTo()) + .createTime(LocalDateTime.now()) + .updateTime(LocalDateTime.now()) + .categoryType(config.getCategoryType()) + .paymentOrganization(config.getPaymentOrganization()) + .welfareType(Integer.valueOf(config.getWelfareType())) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .creator(currentEmployeeId).build(); + }).collect(Collectors.toList()); + configList.forEach(config -> getInsuranceCompensationConfigMapper().insert(config)); + + return "配置成功"; + } } diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index 7d8215025..307d69ee5 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -749,6 +749,17 @@ public class SIAccountController { return new ResponseResult, Map>(user).run(getSIAccountWrapper(user)::compensationSave, param); } + /** + * 社保调差默认配置保存 + */ + @POST + @Path("/compensationConfigSave") + @Produces(MediaType.APPLICATION_JSON) + public String compensationConfigSave(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody List param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, String>(user).run(getSIAccountWrapper(user)::compensationConfigSave, param); + } // **********************************调差 end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SIAccountWrapper.java b/src/com/engine/salary/wrapper/SIAccountWrapper.java index 7d3f2f52b..09bb1e97d 100644 --- a/src/com/engine/salary/wrapper/SIAccountWrapper.java +++ b/src/com/engine/salary/wrapper/SIAccountWrapper.java @@ -91,4 +91,12 @@ public class SIAccountWrapper extends Service { return getSICompensationService(user).compensationAccount(param); } + + /** + * 社保调差默认配置保存 + */ + public String compensationConfigSave(List param) { + + return getSICompensationService(user).compensationConfigSave(param); + } } From 1747a613dd8073aa87daf67f1dc3f01dff0f5d0e Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 28 Nov 2022 14:57:29 +0800 Subject: [PATCH 13/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E6=92=A4=E5=9B=9Ev1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InsuranceAccountDetailMapper.java | 5 ++ .../InsuranceAccountDetailMapper.xml | 16 +++++ .../InsuranceCompensationMapper.java | 4 ++ .../siaccount/InsuranceCompensationMapper.xml | 15 +++++ .../salary/service/SICompensationService.java | 5 ++ .../impl/SICompensationServiceImpl.java | 59 +++++++++++++++++++ .../salary/web/SIAccountController.java | 12 ++++ .../salary/wrapper/SIAccountWrapper.java | 8 +++ 8 files changed, 124 insertions(+) diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java index 030d68d5f..6c2643c6a 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java @@ -168,4 +168,9 @@ public interface InsuranceAccountDetailMapper { * 删除退差数据(账单月份+退差月份+缴纳状态+人员id+个税扣缴义务人) */ void deleteRecessionData(InsuranceAccountDetailPO po); + + /** + * 获取数据(账单月份+缴纳状态+人员id+个税扣缴义务人) + */ + InsuranceAccountDetailPO getOneByBpep(InsuranceAccountDetailPO po); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml index 71b1b07c0..182b26111 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml @@ -1195,4 +1195,20 @@ AND supplementary_month = #{supplementaryMonth} AND employee_id = #{employeeId} + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java index a021cc4a9..65015dc3d 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java @@ -10,4 +10,8 @@ public interface InsuranceCompensationMapper { void bathInsert(@Param("collection") Collection insuranceCompensationPOS); void insert(InsuranceCompensationPO insuranceCompensationPO); + + InsuranceCompensationPO getById(Long id); + + void deleteById(Long id); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml index dece492ec..1fd899ae5 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -193,4 +193,19 @@ #{deleteType}, #{tenantKey}) + + + + + + UPDATE hrsa_compensation_log + SET delete_type = 1 + WHERE id = #{id} + AND delete_type = 0 + \ No newline at end of file diff --git a/src/com/engine/salary/service/SICompensationService.java b/src/com/engine/salary/service/SICompensationService.java index 032d21275..fdd8265a2 100644 --- a/src/com/engine/salary/service/SICompensationService.java +++ b/src/com/engine/salary/service/SICompensationService.java @@ -23,4 +23,9 @@ public interface SICompensationService { * 保存社保调差默认配置 */ String compensationConfigSave(List param); + + /** + * 社保调差撤回 + */ + String compensationRevert(InsuranceCompensationDTO param); } diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index ccb89bf82..0491ecc45 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -14,6 +14,7 @@ import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; +import com.engine.salary.enums.siaccount.PaymentStatusEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; @@ -281,4 +282,62 @@ public class SICompensationServiceImpl extends Service implements SICompensation return "配置成功"; } + + /** + * 社保调差撤回 + */ + @Override + public String compensationRevert(InsuranceCompensationDTO param) { + InsuranceCompensationPO insuranceCompensationPO = getInsuranceCompensationMapper().getById(param.getId()); + SalaryAssert.notNull(insuranceCompensationPO, SalaryI18nUtil.getI18nLabel(121112, "当前补差记录不存在")); + InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getOneByBpep(InsuranceAccountDetailPO.builder() + .billMonth(insuranceCompensationPO.getBillMonth()) + .paymentStatus(PaymentStatusEnum.COMMON.getValue()) + .employeeId(insuranceCompensationPO.getEmployeeId()) + .paymentOrganization(insuranceCompensationPO.getPaymentOrganization()) + .build()); + + SalaryAssert.notNull(insuranceAccountDetailPO, SalaryI18nUtil.getI18nLabel(121108, "补差对象不存在")); + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { + Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); + for (Map.Entry entry : socialJson.entrySet()) { + String insuranceId = entry.getKey(); + String num = entry.getValue(); + if (Objects.equals(String.valueOf(insuranceCompensationPO.getAdjustTo()), insuranceId)) { + BigDecimal adjustmentTo = new BigDecimal(insuranceCompensationPO.getAdjustmentTotal()); + //回退补单位缴纳明细 + BigDecimal insuranceNum = new BigDecimal(num); + insuranceNum = insuranceNum.subtract(adjustmentTo); + socialJson.replace(insuranceId, insuranceNum.toPlainString()); + insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialJson)); + //回退补差单位合计 + BigDecimal comSum = new BigDecimal(insuranceAccountDetailPO.getComSum()); + comSum = comSum.subtract(adjustmentTo); + insuranceAccountDetailPO.setComSum(comSum.toPlainString()); + //回退补差社保单位合计 + BigDecimal socialComSum = new BigDecimal(insuranceAccountDetailPO.getSocialComSum()); + socialComSum = socialComSum.subtract(adjustmentTo); + insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); + //回退补差社保合计 + BigDecimal socialSum = new BigDecimal(insuranceAccountDetailPO.getSocialSum()); + socialSum = socialSum.subtract(adjustmentTo); + insuranceAccountDetailPO.setSocialSum(socialSum.toPlainString()); + //回退补差合计 + BigDecimal totalSum = new BigDecimal(insuranceAccountDetailPO.getTotal()); + totalSum = totalSum.subtract(adjustmentTo); + insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); + //更新社保补差后的明细 + getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); + //删除补差记录 + getInsuranceCompensationMapper().deleteById(param.getId()); + + } + } + //刷新bill_detail统计数据 + getSIAccountService(user).refreshBillBatch(param.getPaymentOrganization(), param.getBillMonth()); + + } + return "撤回成功"; + } } diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index 307d69ee5..8257119ce 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -761,5 +761,17 @@ public class SIAccountController { return new ResponseResult, String>(user).run(getSIAccountWrapper(user)::compensationConfigSave, param); } + /** + * 社保调差撤回 + */ + @POST + @Path("/compensationBack") + @Produces(MediaType.APPLICATION_JSON) + public String compensationBack(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody InsuranceCompensationDTO param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSIAccountWrapper(user)::compensationBack, param); + } + // **********************************调差 end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SIAccountWrapper.java b/src/com/engine/salary/wrapper/SIAccountWrapper.java index 09bb1e97d..b20840943 100644 --- a/src/com/engine/salary/wrapper/SIAccountWrapper.java +++ b/src/com/engine/salary/wrapper/SIAccountWrapper.java @@ -99,4 +99,12 @@ public class SIAccountWrapper extends Service { return getSICompensationService(user).compensationConfigSave(param); } + + /** + * 社保调差撤回 + */ + public String compensationBack(InsuranceCompensationDTO param) { + + return getSICompensationService(user).compensationRevert(param); + } } From d9c7a6c0e3631440840b050e6587601d0cc09f8f Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 28 Nov 2022 15:50:52 +0800 Subject: [PATCH 14/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E6=92=A4=E5=9B=9Ev2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/mapper/siaccount/InsuranceCompensationMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml index 1fd899ae5..573e403d0 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -199,7 +199,7 @@ SELECT FROM hrsa_compensation_log t - WHERE id = #{id} AND delete_type = 0 + WHERE t.id = #{id} AND t.delete_type = 0 From 5486d3f849e947c295193de5bcae9a09c7eace94 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 28 Nov 2022 16:25:52 +0800 Subject: [PATCH 15/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../siaccount/po/InsuranceCompensationConfigPO.java | 6 +++--- .../siaccount/InsuranceCompensationConfigMapper.java | 2 +- .../siaccount/InsuranceCompensationConfigMapper.xml | 8 ++++---- .../mapper/siaccount/InsuranceCompensationMapper.java | 2 +- .../mapper/siaccount/InsuranceCompensationMapper.xml | 9 ++++----- .../salary/service/impl/SICompensationServiceImpl.java | 4 ++-- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java index 7a64efe2e..7bf4e8a79 100644 --- a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationConfigPO.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; +import java.util.Date; /** * @Author: sy @@ -46,12 +46,12 @@ public class InsuranceCompensationConfigPO { /** * 创建时间 */ - private LocalDateTime createTime; + private Date createTime; /** * 更新时间 */ - private LocalDateTime updateTime; + private Date updateTime; /** * 租户key diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java index 211404c34..5aa6e5863 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java @@ -7,7 +7,7 @@ import java.util.Collection; public interface InsuranceCompensationConfigMapper { - void bathInsert(@Param("collection") Collection compensationConfigPOS); + void batchInsert(@Param("collection") Collection compensationConfigPOS); void insert(InsuranceCompensationConfigPO compensationConfigPO); diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml index d4a39d697..690d59f57 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml @@ -31,7 +31,7 @@ , t.tenant_key - + INSERT INTO hrsa_compensation_config( id, employee_id, @@ -62,7 +62,7 @@ ) - + INSERT INTO hrsa_compensation_config( id, employee_id, @@ -94,7 +94,7 @@ from dual - + INSERT INTO hrsa_compensation_config( id, @@ -126,7 +126,7 @@ - + insert into hrsa_compensation_config ( id, employee_id, diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java index 65015dc3d..c3aa3ee20 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java @@ -7,7 +7,7 @@ import java.util.Collection; public interface InsuranceCompensationMapper { - void bathInsert(@Param("collection") Collection insuranceCompensationPOS); + void batchInsert(@Param("collection") Collection insuranceCompensationPOS); void insert(InsuranceCompensationPO insuranceCompensationPO); diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml index 573e403d0..1dae2c343 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -40,7 +40,7 @@ , t.tenant_key - + INSERT INTO hrsa_compensation_log( id, employee_id, @@ -79,7 +79,7 @@ ) - + INSERT INTO hrsa_compensation_log( id, employee_id, @@ -115,11 +115,10 @@ #{item.creator,jdbcType=DOUBLE}, #{item.deleteType,jdbcType=INTEGER}, #{item.tenantKey,jdbcType=VARCHAR} - from dual - + INSERT INTO hrsa_compensation_log( id, @@ -159,7 +158,7 @@ - + insert into hrsa_compensation_log ( id, employee_id, diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 0491ecc45..a097da227 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -270,8 +270,8 @@ public class SICompensationServiceImpl extends Service implements SICompensation .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .employeeId(insuranceAccountDetailPO.getEmployeeId()) .adjustTo(config.getAdjustTo()) - .createTime(LocalDateTime.now()) - .updateTime(LocalDateTime.now()) + .createTime(new Date()) + .updateTime(new Date()) .categoryType(config.getCategoryType()) .paymentOrganization(config.getPaymentOrganization()) .welfareType(Integer.valueOf(config.getWelfareType())) From f68219ff87314ff2463d2d868b2e475eea7e2ae0 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 28 Nov 2022 16:58:20 +0800 Subject: [PATCH 16/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E6=A1=A3=E6=A1=88=EF=BC=8C=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=88=86=E9=83=A8=E9=80=BB=E8=BE=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIArchivesBiz.java | 5 +++++ .../entity/siarchives/param/InsuranceArchivesListParam.java | 1 + 2 files changed, 6 insertions(+) diff --git a/src/com/engine/salary/biz/SIArchivesBiz.java b/src/com/engine/salary/biz/SIArchivesBiz.java index dc4529180..62fa5fc76 100644 --- a/src/com/engine/salary/biz/SIArchivesBiz.java +++ b/src/com/engine/salary/biz/SIArchivesBiz.java @@ -884,6 +884,11 @@ public class SIArchivesBiz { request.setDepartmentIds(Arrays.stream(param.getDepartmentIdsStr().split(",")).map(BigDecimal::new).collect(Collectors.toList())); } + if (StringUtils.isNotBlank(param.getSubcompanyIdsStr())) { + request.setSubcompanyIds(Arrays.stream(param.getSubcompanyIdsStr().split(",")).map(BigDecimal::new).collect(Collectors.toList())); + } + + if (StringUtils.isNotBlank(param.getPositionsStr())) { request.setPositions(Arrays.stream(param.getPositionsStr().split(",")).map(BigDecimal::new).collect(Collectors.toList())); } diff --git a/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java b/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java index 5bac5a942..2fd3bf1cc 100644 --- a/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java +++ b/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java @@ -34,6 +34,7 @@ public class InsuranceArchivesListParam extends BaseQueryParam { private List subcompanyIds; private String departmentIdsStr; + private String subcompanyIdsStr; //状态(多线)") private List statuses; From 4f9e2d8f80a2713698ea9ec45f3e63634d38acb8 Mon Sep 17 00:00:00 2001 From: fcli Date: Tue, 29 Nov 2022 14:36:37 +0800 Subject: [PATCH 17/77] =?UTF-8?q?feat:=20=E8=B7=AF=E5=BE=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=8E=A5=E8=BF=91e10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/api/salary/web/SalarySendRangeController.java | 2 +- .../salary/entity/salaryBill/bo/SalarySendRangeBO.java | 2 +- src/com/engine/salary/service/SalarySendRangeService.java | 3 ++- .../salary/service/impl/SalarySendRangeServiceImpl.java | 8 ++++++-- .../engine/salary/service/impl/SalarySendServiceImpl.java | 8 ++++++-- src/com/engine/salary/web/SalarySendRangeController.java | 4 ++-- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/com/api/salary/web/SalarySendRangeController.java b/src/com/api/salary/web/SalarySendRangeController.java index 94d817da2..f55f91346 100644 --- a/src/com/api/salary/web/SalarySendRangeController.java +++ b/src/com/api/salary/web/SalarySendRangeController.java @@ -2,7 +2,7 @@ package com.api.salary.web; import javax.ws.rs.Path; -@Path("/bs/hrmsalary/salarySendRange") +@Path("/bs/hrmsalary/salaryBill/send/range/") public class SalarySendRangeController extends com.engine.salary.web.SalarySendRangeController{ } diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java index cc3f5831b..2c7787fbf 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java @@ -41,7 +41,7 @@ public class SalarySendRangeBO { public boolean putNew(SalarySendRangeObj salarySendRangeObj) { //如果已经设置了排除所有人 或者 添加所有人, 直接跳过处理 - if (isExcludeAll || isIncludeAll) { + if (isExcludeAll) { return true; } Integer rangeType = salarySendRangeObj.getRangeType(); diff --git a/src/com/engine/salary/service/SalarySendRangeService.java b/src/com/engine/salary/service/SalarySendRangeService.java index e3d82f4c0..22e891383 100644 --- a/src/com/engine/salary/service/SalarySendRangeService.java +++ b/src/com/engine/salary/service/SalarySendRangeService.java @@ -3,6 +3,7 @@ package com.engine.salary.service; import com.engine.salary.entity.salaryBill.dto.SalarySendRangeListDTO; import com.engine.salary.entity.salaryBill.param.SalarySendRangeQueryParam; import com.engine.salary.entity.salaryBill.param.SalarySendRangeSaveParam; +import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum; import com.engine.salary.util.page.PageInfo; import java.util.Collection; @@ -20,5 +21,5 @@ public interface SalarySendRangeService { void deleteByIds(List sendRangeIds); - List getSendInfoIdsBySendId(Long sendId, List sendRangeIds); + List getSendInfoIdsBySendId(Long sendId, List sendRangeIds, SalarySendGrantTypeEnum grantType); } diff --git a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java index 6c7d102e4..e78b3dab2 100644 --- a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java @@ -15,6 +15,7 @@ import com.engine.salary.entity.salaryBill.param.SalarySendRangeSaveParam; import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; import com.engine.salary.entity.salaryBill.po.SalarySendRangePO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; +import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum; import com.engine.salary.enums.salarysend.SalarySendRangeTargetTypeEnum; import com.engine.salary.enums.salarysend.SalarySendRangeTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; @@ -70,6 +71,9 @@ public class SalarySendRangeServiceImpl extends Service implements SalarySendRan @Override public void save(SalarySendRangeSaveParam param) { + if (user == null) { + throw new SalaryRunTimeException("您没有此操作的权限"); + } SalarySendRangeSaveParam.checkParam(param, (long) user.getUID(), DEFAULT_TENANT_KEY); SalarySendRangePO salarySendRangePO = param.toSalarySendRangePO(user); @@ -185,9 +189,9 @@ public class SalarySendRangeServiceImpl extends Service implements SalarySendRan } @Override - public List getSendInfoIdsBySendId(Long sendId, List sendRangeIds) { + public List getSendInfoIdsBySendId(Long sendId, List sendRangeIds, SalarySendGrantTypeEnum grantType) { List rangeIdList = - applyMapper(mapper -> mapper.selectIdsBySendIdAndGrantType(sendId, null)); + applyMapper(mapper -> mapper.selectIdsBySendIdAndGrantType(sendId, grantType.getValue())); rangeIdList = rangeIdList.stream() .filter(sendRangeIds::contains) diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index fcf053795..5c2062651 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -29,6 +29,7 @@ import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum; import com.engine.salary.enums.salarybill.SalarySendStatusEnum; +import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salaryacct.SalaryAcctEmployeeMapper; import com.engine.salary.mapper.salaryacct.SalaryAcctRecordMapper; @@ -671,7 +672,10 @@ public class SalarySendServiceImpl extends Service implements SalarySendService if (param.getSalarySendRangeIds() != null) { //如果传了范围id,则使用范围id发放 ids = getSalarySendRangeService(user) - .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds()); + .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT); + if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 + throw new SalaryRunTimeException("工资发放范围内没有员工"); + } } SalarySendPO salarySend = mapper.getById(salarySendId); @@ -934,7 +938,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService if (param.getSalarySendRangeIds() != null) { //如果传了范围id,则使用范围id撤回 ids = getSalarySendRangeService(user) - .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds()); + .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.WITHDRAW); } SalarySendPO salarySend = mapper.getById(salarySendId); diff --git a/src/com/engine/salary/web/SalarySendRangeController.java b/src/com/engine/salary/web/SalarySendRangeController.java index aaf00002a..11a8730a0 100644 --- a/src/com/engine/salary/web/SalarySendRangeController.java +++ b/src/com/engine/salary/web/SalarySendRangeController.java @@ -38,7 +38,7 @@ public class SalarySendRangeController { } @POST - @Path("/deleteByIds") + @Path("/delete") @Produces(MediaType.APPLICATION_JSON) public String deleteByIds(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) { @@ -47,7 +47,7 @@ public class SalarySendRangeController { } @POST - @Path("/listPage") + @Path("/list") @Produces(MediaType.APPLICATION_JSON) public String save(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySendRangeQueryParam queryParam) { From 2ceeeb165f513f1349bb5e1ee045170dfdec7c51 Mon Sep 17 00:00:00 2001 From: sy Date: Tue, 29 Nov 2022 15:33:57 +0800 Subject: [PATCH 18/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E5=88=97=E8=A1=A8v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/InsuranceCompensationDTO.java | 4 +- .../InsuranceCompensationConfigMapper.java | 4 + .../InsuranceCompensationConfigMapper.xml | 9 ++ .../InsuranceCompensationMapper.java | 3 + .../siaccount/InsuranceCompensationMapper.xml | 9 ++ .../salary/service/ColumnBuildService.java | 6 + .../salary/service/SICompensationService.java | 5 + .../service/impl/ColumnBuildServiceImpl.java | 19 +++ .../impl/SICompensationServiceImpl.java | 127 ++++++++++++++++-- .../salary/web/SIAccountController.java | 12 ++ .../salary/wrapper/SIAccountWrapper.java | 7 + 11 files changed, 194 insertions(+), 11 deletions(-) diff --git a/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java b/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java index 445c6b40c..e100e69ed 100644 --- a/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java +++ b/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java @@ -30,7 +30,7 @@ public class InsuranceCompensationDTO { private String originId; /** - * 只读 + * 只读,true为实际调差记录,false为调差配置数据(非实际调差记录) * */ private Boolean status; @@ -88,7 +88,7 @@ public class InsuranceCompensationDTO { /** * 对象选项 */ - private List> targetOptions; + private Map targetOptions; /** * 账单月份 diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java index 5aa6e5863..2228e7f37 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java @@ -4,6 +4,7 @@ import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; import org.apache.ibatis.annotations.Param; import java.util.Collection; +import java.util.List; public interface InsuranceCompensationConfigMapper { @@ -12,4 +13,7 @@ public interface InsuranceCompensationConfigMapper { void insert(InsuranceCompensationConfigPO compensationConfigPO); void deleteByPayOrg(Long paymentOrganization); + + List queryByBillMonthAndPayOrg(String billMonth, Long paymentOrganization); + } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml index 690d59f57..8153657d8 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml @@ -159,4 +159,13 @@ WHERE payment_organization = #{paymentOrganization} AND delete_type = 0 + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java index c3aa3ee20..2ee45f10d 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java @@ -4,6 +4,7 @@ import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import org.apache.ibatis.annotations.Param; import java.util.Collection; +import java.util.List; public interface InsuranceCompensationMapper { @@ -13,5 +14,7 @@ public interface InsuranceCompensationMapper { InsuranceCompensationPO getById(Long id); + List queryByBillMonthAndPayOrg(String billMonth, Long paymentOrganization); + void deleteById(Long id); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml index 1dae2c343..2a62fcc5e 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -201,6 +201,15 @@ WHERE t.id = #{id} AND t.delete_type = 0 + + UPDATE hrsa_compensation_log SET delete_type = 1 diff --git a/src/com/engine/salary/service/ColumnBuildService.java b/src/com/engine/salary/service/ColumnBuildService.java index 9ec02d2e6..c1aec0b1b 100644 --- a/src/com/engine/salary/service/ColumnBuildService.java +++ b/src/com/engine/salary/service/ColumnBuildService.java @@ -3,6 +3,7 @@ package com.engine.salary.service; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceAccountInspectPO; +import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import java.util.List; @@ -26,5 +27,10 @@ public interface ColumnBuildService { List buildCommonColumns(List pos); List buildInspectColumns(List pos, Long paymentOrganization); + + /** + * 调差详情表头元素 + */ + List buildCompensationColumns(); } diff --git a/src/com/engine/salary/service/SICompensationService.java b/src/com/engine/salary/service/SICompensationService.java index fdd8265a2..a4ade6b5f 100644 --- a/src/com/engine/salary/service/SICompensationService.java +++ b/src/com/engine/salary/service/SICompensationService.java @@ -28,4 +28,9 @@ public interface SICompensationService { * 社保调差撤回 */ String compensationRevert(InsuranceCompensationDTO param); + + /** + * 社保调差历史记录列表 + */ + Map compensationList(String billMonth, Long paymentOrganization); } diff --git a/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java b/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java index 93eedcbd7..9c008d7a2 100644 --- a/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java +++ b/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java @@ -388,4 +388,23 @@ public class ColumnBuildServiceImpl extends Service implements ColumnBuildServic result.put(WelfareTypeEnum.OTHER.getValue(), otherColumns); return result; } + + @Override + public List buildCompensationColumns() { + List list = new ArrayList<>(); + + WeaTableColumn weaTableNameColumn = new WeaTableColumn("300px",SalaryI18nUtil.getI18nLabel( 87000, "调差对象"), "target"); + weaTableNameColumn.setFixed("left"); + + list.add(new WeaTableColumn("100px",SalaryI18nUtil.getI18nLabel( 87001, "统计调差福利"), "welfareType")); + list.add(new WeaTableColumn("200px",SalaryI18nUtil.getI18nLabel( 87001, "统计调差福利类型(单位)"), "categoryType")); + list.add(new WeaTableColumn("200px",SalaryI18nUtil.getI18nLabel( 87002, "国家核算金额(单位)"), "countryTotal")); + list.add(new WeaTableColumn("200px",SalaryI18nUtil.getI18nLabel( 87003, "公司核算金额(单位)"), "companyTotal")); + list.add(new WeaTableColumn("100px",SalaryI18nUtil.getI18nLabel( 87004, "应调差金额"), "adjustmentTotal")); + list.add(new WeaTableColumn("200px",SalaryI18nUtil.getI18nLabel( 87005, "调差到(单位)"), "adjustTo")); + + + return list; + } + } diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index a097da227..92407ad33 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -2,10 +2,12 @@ package com.engine.salary.service.impl; import com.alibaba.fastjson.JSON; import com.alipay.oceanbase.jdbc.StringUtils; +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.siaccount.InsuranceAccountDetailPOEncrypt; +import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; import com.engine.salary.entity.siaccount.dto.InsuranceCompensationDTO; @@ -13,13 +15,16 @@ import com.engine.salary.entity.siaccount.param.CompensationParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; -import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; +import com.engine.salary.entity.sicategory.po.ICategoryPO; import com.engine.salary.enums.siaccount.PaymentStatusEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.mapper.siaccount.InsuranceCompensationConfigMapper; import com.engine.salary.mapper.siaccount.InsuranceCompensationMapper; +import com.engine.salary.mapper.sicategory.ICategoryMapper; +import com.engine.salary.service.ColumnBuildService; import com.engine.salary.service.SIAccountService; import com.engine.salary.service.SICategoryService; import com.engine.salary.service.SICompensationService; @@ -31,11 +36,12 @@ import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import dm.jdbc.util.IdGenerator; +import org.springframework.beans.BeanUtils; import weaver.hrm.User; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -68,6 +74,11 @@ public class SICompensationServiceImpl extends Service implements SICompensation private InsuranceCompensationConfigMapper getInsuranceCompensationConfigMapper() { return MapperProxyFactory.getProxy(InsuranceCompensationConfigMapper.class); } + + public ColumnBuildService getColumnBuildService(User user) { + return ServiceUtil.getService(ColumnBuildServiceImpl.class, user); + } + /** * 可调差人员 */ @@ -306,30 +317,30 @@ public class SICompensationServiceImpl extends Service implements SICompensation String num = entry.getValue(); if (Objects.equals(String.valueOf(insuranceCompensationPO.getAdjustTo()), insuranceId)) { BigDecimal adjustmentTo = new BigDecimal(insuranceCompensationPO.getAdjustmentTotal()); - //回退补单位缴纳明细 + //回退调差单位缴纳明细 BigDecimal insuranceNum = new BigDecimal(num); insuranceNum = insuranceNum.subtract(adjustmentTo); socialJson.replace(insuranceId, insuranceNum.toPlainString()); insuranceAccountDetailPO.setSocialComJson(JSON.toJSONString(socialJson)); - //回退补差单位合计 + //回退调差单位合计 BigDecimal comSum = new BigDecimal(insuranceAccountDetailPO.getComSum()); comSum = comSum.subtract(adjustmentTo); insuranceAccountDetailPO.setComSum(comSum.toPlainString()); - //回退补差社保单位合计 + //回退调差社保单位合计 BigDecimal socialComSum = new BigDecimal(insuranceAccountDetailPO.getSocialComSum()); socialComSum = socialComSum.subtract(adjustmentTo); insuranceAccountDetailPO.setSocialComSum(socialComSum.toPlainString()); - //回退补差社保合计 + //回退调差社保合计 BigDecimal socialSum = new BigDecimal(insuranceAccountDetailPO.getSocialSum()); socialSum = socialSum.subtract(adjustmentTo); insuranceAccountDetailPO.setSocialSum(socialSum.toPlainString()); - //回退补差合计 + //回退调差合计 BigDecimal totalSum = new BigDecimal(insuranceAccountDetailPO.getTotal()); totalSum = totalSum.subtract(adjustmentTo); insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); - //更新社保补差后的明细 + //更新社保调差后的明细 getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); - //删除补差记录 + //删除调差记录 getInsuranceCompensationMapper().deleteById(param.getId()); } @@ -340,4 +351,102 @@ public class SICompensationServiceImpl extends Service implements SICompensation } return "撤回成功"; } + + @Override + public Map compensationList(String billMonth, Long paymentOrganization) { + + Map datas = new HashMap<>(); + + //入参判断 + if (paymentOrganization == null || StringUtils.isBlank(billMonth)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + } + + //设置调差详情列表头 + List weaTableColumn = getColumnBuildService(user).buildCompensationColumns(); + + //处理调差数据 + List compensationDTOList = dealCompensationData(billMonth, paymentOrganization); + + datas.put("columns", weaTableColumn); + datas.put("data", compensationDTOList); + + return datas; + } + + private List dealCompensationData(String billMonth, Long paymentOrganization) { + + //获取调差历史记录数据 + List compensationPOList = getInsuranceCompensationMapper().queryByBillMonthAndPayOrg(billMonth, paymentOrganization); + //获取调差配置数据 + List compensationConfigPOList = getInsuranceCompensationConfigMapper().queryByBillMonthAndPayOrg(billMonth, paymentOrganization); + + List compensationDTOList = new ArrayList<>(); + + List detailPOList = getInsuranceAccountDetailMapper().queryNormalListByBillMonth(billMonth, paymentOrganization); + Map detailPOMap = detailPOList.stream().collect(Collectors.toMap(InsuranceAccountDetailPO::getEmployeeId, Function.identity())); + + List allEmployees = getEmployMapper().listAll(); + Map usernameMap = SalaryEntityUtil.convert2Map(allEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); + + List allCategoryList = MapperProxyFactory.getProxy(ICategoryMapper.class).listAll(); + Map categoryNameMap = SalaryEntityUtil.convert2Map(allCategoryList, ICategoryPO::getId, ICategoryPO::getInsuranceName); + + boolean haveCompensation = compensationPOList != null && compensationPOList.size() > 0; + //存在调差历史记录时,输出记录数据 + if (haveCompensation) { + for (InsuranceCompensationPO po : compensationPOList) { + InsuranceCompensationDTO dto = new InsuranceCompensationDTO(); + BeanUtils.copyProperties(po, dto); + dto.setStatus(true); + //设置targetOptions + Map targetOptions = new HashMap<>(); + targetOptions.put("name", usernameMap.get(po.getEmployeeId())); + targetOptions.put("id", detailPOMap.get(po.getEmployeeId()).getId().toString()); + + dto.setTargetOptions(targetOptions); + + //设置categoryTypeOptions + List> categoryTypeOptions = new ArrayList<>(); + List categoryTypeList = Arrays.asList(po.getCategoryType().split(",")); + Map categoryTypeMap = new HashMap<>(); + for (String categoryType : categoryTypeList) { + categoryTypeMap.put("id", categoryType); + categoryTypeMap.put("content", categoryNameMap.get(Long.valueOf(categoryType))); + categoryTypeOptions.add(categoryTypeMap); + } + + dto.setCategoryTypeOptions(categoryTypeOptions); + } + } + //不存在调差历史记录时,输出调差配置数据 + if (!haveCompensation && compensationConfigPOList.size() > 0) { + for (InsuranceCompensationConfigPO configPO : compensationConfigPOList) { + InsuranceCompensationDTO dto = new InsuranceCompensationDTO(); + BeanUtils.copyProperties(configPO, dto); + dto.setStatus(false); + //设置targetOptions + Map targetOptions = new HashMap<>(); + targetOptions.put("name", usernameMap.get(configPO.getEmployeeId())); + targetOptions.put("id", detailPOMap.get(configPO.getEmployeeId()).getId().toString()); + + dto.setTargetOptions(targetOptions); + + //设置categoryTypeOptions + List> categoryTypeOptions = new ArrayList<>(); + List categoryTypeList = Arrays.asList(configPO.getCategoryType().split(",")); + Map categoryTypeMap = new HashMap<>(); + for (String categoryType : categoryTypeList) { + categoryTypeMap.put("id", categoryType); + categoryTypeMap.put("content", categoryNameMap.get(Long.valueOf(categoryType))); + categoryTypeOptions.add(categoryTypeMap); + } + + dto.setCategoryTypeOptions(categoryTypeOptions); + } + } + + return compensationDTOList; + } + } diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index 8257119ce..bf4515621 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -773,5 +773,17 @@ public class SIAccountController { return new ResponseResult(user).run(getSIAccountWrapper(user)::compensationBack, param); } + /** + * 社保调差列表 + */ + @POST + @Path("/compensationList") + @Produces(MediaType.APPLICATION_JSON) + public String compensationList(@Context HttpServletRequest request, @Context HttpServletResponse response, + @RequestBody InsuranceCompensationDTO param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSIAccountWrapper(user)::compensationList, param); + } + // **********************************调差 end*********************************/ } diff --git a/src/com/engine/salary/wrapper/SIAccountWrapper.java b/src/com/engine/salary/wrapper/SIAccountWrapper.java index b20840943..f5bdc8678 100644 --- a/src/com/engine/salary/wrapper/SIAccountWrapper.java +++ b/src/com/engine/salary/wrapper/SIAccountWrapper.java @@ -107,4 +107,11 @@ public class SIAccountWrapper extends Service { return getSICompensationService(user).compensationRevert(param); } + + /** + * 社保调差列表 + */ + public Map compensationList(InsuranceCompensationDTO param) { + return getSICompensationService(user).compensationList(param.getBillMonth(), param.getPaymentOrganization()); + } } From a0bda933a161662ef3840b810daeb72a0bc6744d Mon Sep 17 00:00:00 2001 From: sy Date: Tue, 29 Nov 2022 17:36:18 +0800 Subject: [PATCH 19/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E9=A1=B9=E5=85=AC=E5=8F=B8=E6=94=AF=E5=87=BA?= =?UTF-8?q?=E8=B4=B9=E7=94=A8=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../siaccount/param/CompensationParam.java | 4 +- .../salary/service/SICompensationService.java | 2 +- .../impl/SICompensationServiceImpl.java | 95 ++++++++++++------- .../salary/web/SIAccountController.java | 4 +- .../salary/wrapper/SIAccountWrapper.java | 4 +- 5 files changed, 70 insertions(+), 39 deletions(-) diff --git a/src/com/engine/salary/entity/siaccount/param/CompensationParam.java b/src/com/engine/salary/entity/siaccount/param/CompensationParam.java index 0aca6d1a3..7eeb7cb8f 100644 --- a/src/com/engine/salary/entity/siaccount/param/CompensationParam.java +++ b/src/com/engine/salary/entity/siaccount/param/CompensationParam.java @@ -27,9 +27,9 @@ public class CompensationParam { private Long target; /** - * 前端rowId,指被调差的人员id + * 指被调差的人员id */ - private String rowId; + private String employeeId; /** * 账单月份 diff --git a/src/com/engine/salary/service/SICompensationService.java b/src/com/engine/salary/service/SICompensationService.java index a4ade6b5f..7ffc6a916 100644 --- a/src/com/engine/salary/service/SICompensationService.java +++ b/src/com/engine/salary/service/SICompensationService.java @@ -15,7 +15,7 @@ public interface SICompensationService { List> compensationCategoryType(Long id); - Map>> compensationComTotal(Map> param); + List> compensationComTotal(List paramList); Map compensationAccount(List list); diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 92407ad33..4f8e34e60 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -150,44 +150,75 @@ public class SICompensationServiceImpl extends Service implements SICompensation * 获取当前调差福利类型-公司方支出总计 */ @Override - public Map>> compensationComTotal(Map> param) { - Map>> result = new HashMap<>(); - param.forEach((paymentAgencyId, compensationList) -> { - List> paymentList = new ArrayList<>(); - compensationList.forEach(compensation -> { - Map temp = new HashMap<>(); - temp.put("rowId", compensation.getRowId()); - if (StringUtils.isBlank(compensation.getCategoryType()) || compensation.getTarget() == null) { - temp.put("error", SalaryI18nUtil.getI18nLabel(84026, "参数错误")); - temp.put("totalNum", "0"); - } else { + public List> compensationComTotal(List paramList) { + List> resultList = new ArrayList<>(); + paramList.forEach(compensation -> { + Map temp = new HashMap<>(); + temp.put("employeeId", compensation.getEmployeeId()); + if (StringUtils.isBlank(compensation.getCategoryType()) || compensation.getTarget() == null) { + temp.put("error", SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + temp.put("totalNum", "0"); + } else { - InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(compensation.getTarget()); - if (insuranceAccountDetailPO == null) { - temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); - } - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); - BigDecimal total = new BigDecimal("0"); - List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); + InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(compensation.getTarget()); + if (insuranceAccountDetailPO == null) { + temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); + } + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + BigDecimal total = new BigDecimal("0"); + List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); - if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { - Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); - for (Map.Entry entry : socialJson.entrySet()) { - String insuranceId = entry.getKey(); - String num = entry.getValue(); - if (categoryTypeList.contains(insuranceId)) { - total = total.add(new BigDecimal(num)); - } + if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { + Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); + for (Map.Entry entry : socialJson.entrySet()) { + String insuranceId = entry.getKey(); + String num = entry.getValue(); + if (categoryTypeList.contains(insuranceId)) { + total = total.add(new BigDecimal(num)); } } - - temp.put("totalNum", total.toPlainString()); } - paymentList.add(temp); - }); - result.put(paymentAgencyId, paymentList); + + temp.put("totalNum", total.toPlainString()); + } + resultList.add(temp); }); - return result; +// paramList.forEach((paymentOrganization, compensationList) -> { +// List> paymentList = new ArrayList<>(); +// compensationList.forEach(compensation -> { +// Map temp = new HashMap<>(); +// temp.put("employeeId", compensation.getEmployeeId()); +// if (StringUtils.isBlank(compensation.getCategoryType()) || compensation.getTarget() == null) { +// temp.put("error", SalaryI18nUtil.getI18nLabel(84026, "参数错误")); +// temp.put("totalNum", "0"); +// } else { +// +// InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(compensation.getTarget()); +// if (insuranceAccountDetailPO == null) { +// temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); +// } +// InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); +// BigDecimal total = new BigDecimal("0"); +// List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); +// +// if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { +// Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); +// for (Map.Entry entry : socialJson.entrySet()) { +// String insuranceId = entry.getKey(); +// String num = entry.getValue(); +// if (categoryTypeList.contains(insuranceId)) { +// total = total.add(new BigDecimal(num)); +// } +// } +// } +// +// temp.put("totalNum", total.toPlainString()); +// } +// paymentList.add(temp); +// }); +// result.put(paymentOrganization, paymentList); +// }); + return resultList; } @Override diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index bf4515621..4660c6ea8 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -732,9 +732,9 @@ public class SIAccountController { @Path("/compensationComTotal") @Produces(MediaType.APPLICATION_JSON) public String compensationComTotal(@Context HttpServletRequest request, @Context HttpServletResponse response, - @RequestBody Map> param) { + @RequestBody List paramList) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult>, Map>>>(user).run(getSIAccountWrapper(user)::compensationComTotal, param); + return new ResponseResult, List>>(user).run(getSIAccountWrapper(user)::compensationComTotal, paramList); } /** diff --git a/src/com/engine/salary/wrapper/SIAccountWrapper.java b/src/com/engine/salary/wrapper/SIAccountWrapper.java index f5bdc8678..c898094bf 100644 --- a/src/com/engine/salary/wrapper/SIAccountWrapper.java +++ b/src/com/engine/salary/wrapper/SIAccountWrapper.java @@ -79,9 +79,9 @@ public class SIAccountWrapper extends Service { /** * 获取当前调差福利类型-公司方支出总计 */ - public Map>> compensationComTotal(Map> param) { + public List> compensationComTotal(List paramList) { - return getSICompensationService(user).compensationComTotal(param); + return getSICompensationService(user).compensationComTotal(paramList); } /** From d8f99abb184702e3b1c5ab22c51326887b798b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 30 Nov 2022 11:23:58 +0800 Subject: [PATCH 20/77] =?UTF-8?q?=E8=B0=83=E8=96=AA=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E8=96=AA=E6=A0=A1=E9=AA=8C=E6=B5=81=E7=A8=8B=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryarchive/bo/SalaryArchiveBO.java | 2 +- .../bo/SalaryArchiveExcelBO.java | 2 +- .../salaryArchive/SalaryArchiveActionAPI.java | 20 +++++++++++++++++++ .../salary/wrapper/SalaryArchiveWrapper.java | 14 +++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java index b07afe044..86ef24b4d 100644 --- a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java +++ b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java @@ -219,7 +219,7 @@ public class SalaryArchiveBO { if (fromDateItem.after(endTempItem) || endTempItem.before(startItem)) { continue; } - if ( endTempItem.equals(startItem) && flag == true) { + if ( endTempItem.equals(startItem) && flag) { continue; } SalaryArchiveItemDataDTO salaryArchiveItemData = new SalaryArchiveItemDataDTO(); diff --git a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java index 389f66a64..35916907d 100644 --- a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java +++ b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java @@ -369,7 +369,7 @@ public class SalaryArchiveExcelBO extends Service { } Long employeeId = CollectionUtils.isNotEmpty(employeeSameIds) && employeeSameIds.size() == 1 && employeeSameIds.get(0) > 0 ? employeeSameIds.get(0) : null; - //员工id 流程定薪使用 + //员工id 流程使用 String empId = Optional.ofNullable(map.get("员工id")).orElse("").toString(); if (StringUtils.isNotBlank(empId)) { employeeSameIds.clear(); diff --git a/src/com/engine/salary/process/salaryArchive/SalaryArchiveActionAPI.java b/src/com/engine/salary/process/salaryArchive/SalaryArchiveActionAPI.java index d8e082ba6..47fc5b3b3 100644 --- a/src/com/engine/salary/process/salaryArchive/SalaryArchiveActionAPI.java +++ b/src/com/engine/salary/process/salaryArchive/SalaryArchiveActionAPI.java @@ -78,6 +78,26 @@ public class SalaryArchiveActionAPI { return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::importSalaryArchiveInit, importData); } + @POST + @Path("/checkAdjustmentSalaryArchive") + @Produces(MediaType.APPLICATION_JSON) + public String checkAdjustmentSalaryArchive(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveImportActionParam importData) { + User user = HrmUserVarify.getUser(request, response); + importData.setImportType("salaryItemAdjust"); + importData.setAddData(true); + return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::checkAdjustmentSalaryArchive, importData); + } + + @POST + @Path("/adjustmentSalaryArchive") + @Produces(MediaType.APPLICATION_JSON) + public String adjustmentSalaryArchive(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryArchiveImportActionParam importData) { + User user = HrmUserVarify.getUser(request, response); + importData.setImportType("salaryItemAdjust"); + importData.setAddData(true); + return new ResponseResult>(user).run(getSalaryArchiveWrapper(user)::adjustmentSalaryArchive, importData); + } + // /** // * 导入薪资档案附件上传前置校验 // * @param importParam diff --git a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java index bd230481c..684552d0f 100644 --- a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java @@ -527,6 +527,20 @@ public class SalaryArchiveWrapper extends Service { return getSalaryArchiveExcelService(user).processInit(importData); } + public Map checkAdjustmentSalaryArchive(SalaryArchiveImportActionParam importData) { + importData.setImportType("salaryItemAdjust"); + importData.setListType("FIXED"); + importData.setAddData(false); + return getSalaryArchiveExcelService(user).processInit(importData); + } + + public Map adjustmentSalaryArchive(SalaryArchiveImportActionParam importData) { + importData.setImportType("salaryItemAdjust"); + importData.setListType("FIXED"); + importData.setAddData(true); + return getSalaryArchiveExcelService(user).processInit(importData); + } + /** * 停薪 * From a2ab9471bec05e9f5b039316c343d4b91303fba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 30 Nov 2022 14:06:01 +0800 Subject: [PATCH 21/77] =?UTF-8?q?=E6=A0=B8=E7=AE=97=E8=AE=B0=E5=BD=95id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java index 36b8800bd..fdea4f715 100644 --- a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java +++ b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctEmployeePO.java @@ -34,6 +34,7 @@ public class SalaryAcctEmployeePO { /** * 薪资核算的id */ + @SalaryFormulaVar(defaultLabel = "核算记录id", labelId = 86321, dataType = "number") private Long salaryAcctRecordId; /** From ee7309ffd15adf91bb28a9aec98e27327c5ce2ff Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 30 Nov 2022 14:07:28 +0800 Subject: [PATCH 22/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E9=A1=B9=E5=85=AC=E5=8F=B8=E6=94=AF=E5=87=BA?= =?UTF-8?q?=E8=B4=B9=E7=94=A8=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E5=AF=B9=E4=BA=8E=E5=B7=B2=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E9=A1=B9=EF=BC=8C=E7=BB=99=E5=87=BA=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=EF=BC=8C=E5=B9=B6=E4=B8=94=E4=B8=8D=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InsuranceCompensationMapper.java | 2 + .../siaccount/InsuranceCompensationMapper.xml | 11 ++++++ .../impl/SICompensationServiceImpl.java | 39 +++++++++++++------ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java index 2ee45f10d..fe0caa3f3 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java @@ -16,5 +16,7 @@ public interface InsuranceCompensationMapper { List queryByBillMonthAndPayOrg(String billMonth, Long paymentOrganization); + InsuranceCompensationPO getOneByBillMonthPayOrgEmpId(InsuranceCompensationPO insuranceCompensationPO); + void deleteById(Long id); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml index 2a62fcc5e..8cdd6992f 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -210,6 +210,17 @@ AND t.delete_type = 0 + + + UPDATE hrsa_compensation_log SET delete_type = 1 diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 4f8e34e60..ac2d22b84 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -163,23 +163,37 @@ public class SICompensationServiceImpl extends Service implements SICompensation InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(compensation.getTarget()); if (insuranceAccountDetailPO == null) { temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); - } - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); - BigDecimal total = new BigDecimal("0"); - List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); + temp.put("totalNum", "0"); + } else { + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + //判断是否已有调差数据(个税扣缴义务人+账单月份+人员id) + InsuranceCompensationPO nowCompensation = getInsuranceCompensationMapper().getOneByBillMonthPayOrgEmpId(InsuranceCompensationPO.builder() + .billMonth(insuranceAccountDetailPO.getBillMonth()) + .paymentOrganization(insuranceAccountDetailPO.getPaymentOrganization()) + .employeeId(insuranceAccountDetailPO.getEmployeeId()) + .build()); + if (nowCompensation != null) { + temp.put("error", SalaryI18nUtil.getI18nLabel(121039, "当前月在该缴纳组织下已存在调差数据")); + } - if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { - Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); - for (Map.Entry entry : socialJson.entrySet()) { - String insuranceId = entry.getKey(); - String num = entry.getValue(); - if (categoryTypeList.contains(insuranceId)) { - total = total.add(new BigDecimal(num)); + //处理调差数据 + BigDecimal total = new BigDecimal("0"); + List categoryTypeList = Arrays.asList(compensation.getCategoryType().split(",")); + + if (nowCompensation == null && StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { + Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); + for (Map.Entry entry : socialJson.entrySet()) { + String insuranceId = entry.getKey(); + String num = entry.getValue(); + if (categoryTypeList.contains(insuranceId)) { + total = total.add(new BigDecimal(num)); + } } } + + temp.put("totalNum", total.toPlainString()); } - temp.put("totalNum", total.toPlainString()); } resultList.add(temp); }); @@ -263,6 +277,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation totalSum = totalSum.add(adjustmentTo); insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); //更新社保调差后的明细 + InsuranceAccountDetailPOEncrypt.encryptItem(insuranceAccountDetailPO); getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //新建调差记录 InsuranceCompensationPO insuranceCompensationPO = new InsuranceCompensationPO(); From 4d01c324e05cb8e0cbadfaf48a9d59a1be18afea Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 30 Nov 2022 15:05:24 +0800 Subject: [PATCH 23/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E4=BF=9D=E5=AD=98=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/SICompensationService.java | 2 +- .../impl/SICompensationServiceImpl.java | 23 +++++++++++++++---- .../salary/web/SIAccountController.java | 2 +- .../salary/wrapper/SIAccountWrapper.java | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/com/engine/salary/service/SICompensationService.java b/src/com/engine/salary/service/SICompensationService.java index 7ffc6a916..6dfe429f2 100644 --- a/src/com/engine/salary/service/SICompensationService.java +++ b/src/com/engine/salary/service/SICompensationService.java @@ -17,7 +17,7 @@ public interface SICompensationService { List> compensationComTotal(List paramList); - Map compensationAccount(List list); + Map compensationAccount(List list); /** * 保存社保调差默认配置 diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index ac2d22b84..a61e27a44 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -236,17 +236,25 @@ public class SICompensationServiceImpl extends Service implements SICompensation } @Override - public Map compensationAccount(List list) { + public Map compensationAccount(List list) { long currentEmployeeId = user.getUID(); + List allEmployees = getEmployMapper().listAll(); + Map usernameMap = SalaryEntityUtil.convert2Map(allEmployees, DataCollectionEmployee::getEmployeeId, DataCollectionEmployee::getUsername); - Map result = new HashMap<>(); + Map result = new HashMap<>(); + List errorList = new ArrayList<>(); for (InsuranceCompensationDTO param : list) { if (StringUtils.isBlank(param.getAdjustmentTotal()) || "0".equals(param.getAdjustmentTotal())) { + errorList.add(usernameMap.get(param.getEmployeeId()) + "-调差失败:调差数额不正确!"); continue; } InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(param.getTarget()); - SalaryAssert.notNull(insuranceAccountDetailPO, SalaryI18nUtil.getI18nLabel(138849, "调差对象不存在")); + if (insuranceAccountDetailPO == null) { + errorList.add(usernameMap.get(param.getEmployeeId()) + "-调差失败:调差对象不存在!"); + continue; + } + InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); @@ -299,8 +307,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation insuranceCompensationPO.setUpdateTime(new Date()); getInsuranceCompensationMapper().insert(insuranceCompensationPO); - - result.put(param.getOriginId(), insuranceCompensationPO.getId().toString()); +// result.put(param.getOriginId(), insuranceCompensationPO.getId().toString()); } } @@ -308,6 +315,12 @@ public class SICompensationServiceImpl extends Service implements SICompensation } //刷新bill_detail统计数据 getSIAccountService(user).refreshBillBatch(list.get(0).getPaymentOrganization(), list.get(0).getBillMonth()); + if (errorList.size() == 0) { + result.put("data", "全部调差成功!"); + } else { + result.put("data", "存在调差失败项!"); + } + result.put("errorMessage", errorList); return result; } diff --git a/src/com/engine/salary/web/SIAccountController.java b/src/com/engine/salary/web/SIAccountController.java index 4660c6ea8..8b740d537 100644 --- a/src/com/engine/salary/web/SIAccountController.java +++ b/src/com/engine/salary/web/SIAccountController.java @@ -746,7 +746,7 @@ public class SIAccountController { public String compensationSave(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody List param) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult, Map>(user).run(getSIAccountWrapper(user)::compensationSave, param); + return new ResponseResult, Map>(user).run(getSIAccountWrapper(user)::compensationSave, param); } /** diff --git a/src/com/engine/salary/wrapper/SIAccountWrapper.java b/src/com/engine/salary/wrapper/SIAccountWrapper.java index c898094bf..cc886cb2f 100644 --- a/src/com/engine/salary/wrapper/SIAccountWrapper.java +++ b/src/com/engine/salary/wrapper/SIAccountWrapper.java @@ -87,7 +87,7 @@ public class SIAccountWrapper extends Service { /** * 社保调差保存 */ - public Map compensationSave(List param) { + public Map compensationSave(List param) { return getSICompensationService(user).compensationAccount(param); } From d3d2074aedeef0a632cbf162a0cfb1e4761ec5df Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 30 Nov 2022 15:55:23 +0800 Subject: [PATCH 24/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E5=9C=A8=E7=A4=BE?= =?UTF-8?q?=E4=BF=9D=E6=A0=B8=E7=AE=97=E6=9C=88=E6=95=B0=E6=8D=AE=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=B6=EF=BC=8C=E7=A4=BE=E4=BF=9D=E8=B0=83=E5=B7=AE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=A2=AB=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 7 +++++++ .../siaccount/InsuranceCompensationMapper.java | 4 +++- .../mapper/siaccount/InsuranceCompensationMapper.xml | 12 ++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 52b76d7dc..5e8c8a054 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -109,6 +109,10 @@ public class SIAccountBiz extends Service { return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); } + private InsuranceCompensationMapper getInsuranceCompensationMapper() { + return MapperProxyFactory.getProxy(InsuranceCompensationMapper.class); + } + public PageInfo listPage(InsuranceAccountBatchParam queryParam) { SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountBatchMapper().list(queryParam); @@ -903,6 +907,9 @@ public class SIAccountBiz extends Service { // } getInsuranceAccountBatchMapper().deleteById(insuranceAccountBatchPO.getId()); getInsuranceAccountDetailMapper().batchDeleteNotFile(param.getBillMonth(), param.getPaymentOrganization()); + + //删除账单月份+个税扣缴义务人下的调差数据 + getInsuranceCompensationMapper().deleteByBillMonthAndPayOrg(param.getBillMonth(), param.getPaymentOrganization()); // LoggerContext insuranceSchemeContext = new LoggerContext(); // insuranceSchemeContext.setTargetId(String.valueOf(insuranceAccountBatchPO.getId())); // insuranceSchemeContext.setTargetName(insuranceAccountBatchPO.getBillMonth()); diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java index fe0caa3f3..b407bdf50 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java @@ -14,9 +14,11 @@ public interface InsuranceCompensationMapper { InsuranceCompensationPO getById(Long id); - List queryByBillMonthAndPayOrg(String billMonth, Long paymentOrganization); + List queryByBillMonthAndPayOrg(@Param("billMonth") String billMonth, @Param("paymentOrganization") Long paymentOrganization); InsuranceCompensationPO getOneByBillMonthPayOrgEmpId(InsuranceCompensationPO insuranceCompensationPO); void deleteById(Long id); + + void deleteByBillMonthAndPayOrg(@Param("billMonth") String billMonth, @Param("paymentOrganization") Long paymentOrganization); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml index 8cdd6992f..1b87e7579 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -201,7 +201,7 @@ WHERE t.id = #{id} AND t.delete_type = 0 - SELECT FROM hrsa_compensation_log t @@ -225,6 +225,14 @@ UPDATE hrsa_compensation_log SET delete_type = 1 WHERE id = #{id} - AND delete_type = 0 + AND delete_type = 0 + + + + UPDATE hrsa_compensation_log + SET delete_type = 1 + WHERE bill_month = #{billMonth} + AND payment_organization = #{paymentOrganization} + AND delete_type = 0 \ No newline at end of file From 6cffbf4db7b1cd5d877676e377b09ddb58f92c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 30 Nov 2022 16:59:58 +0800 Subject: [PATCH 25/77] =?UTF-8?q?=E5=8F=96=E6=B6=88=E5=AE=89=E5=85=A8?= =?UTF-8?q?=E7=BA=A7=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/salarysob/param/SalarySobRangeSaveParam.java | 4 ++-- src/com/engine/salary/enums/salarysob/TargetTypeEnum.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/engine/salary/entity/salarysob/param/SalarySobRangeSaveParam.java b/src/com/engine/salary/entity/salarysob/param/SalarySobRangeSaveParam.java index 587e79190..b7b82adb7 100644 --- a/src/com/engine/salary/entity/salarysob/param/SalarySobRangeSaveParam.java +++ b/src/com/engine/salary/entity/salarysob/param/SalarySobRangeSaveParam.java @@ -49,9 +49,9 @@ public class SalarySobRangeSaveParam { private Long targetId; // 安全级别最小值 - private Long minSecLevel; +// private Long minSecLevel; // 安全级别最大值 - private Long maxSecLevel; +// private Long maxSecLevel; } } diff --git a/src/com/engine/salary/enums/salarysob/TargetTypeEnum.java b/src/com/engine/salary/enums/salarysob/TargetTypeEnum.java index 726d0d8c8..04c6497f3 100644 --- a/src/com/engine/salary/enums/salarysob/TargetTypeEnum.java +++ b/src/com/engine/salary/enums/salarysob/TargetTypeEnum.java @@ -20,9 +20,9 @@ public enum TargetTypeEnum implements BaseEnum { DEPT(2, "部门", 86185), SUBCOMPANY(3, "分部", 107369), POSITION(4, "岗位", 90633), - ALL(5, "所有人", 107729), + ALL(5, "所有人", 107729); - SECLEVE(6, "安全级别", 90382),; +// SECLEVE(6, "安全级别", 90382),; // EXT_EMPLOYEE(100, "外部人员", 0); private int value; From 5436742c748e594ceab5c1c1e97c1fdd5dcb8441 Mon Sep 17 00:00:00 2001 From: sy Date: Wed, 30 Nov 2022 17:57:25 +0800 Subject: [PATCH 26/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/InsuranceCompensationDTO.java | 2 +- .../InsuranceCompensationConfigMapper.java | 2 +- .../InsuranceCompensationConfigMapper.xml | 5 ++-- .../service/impl/ColumnBuildServiceImpl.java | 1 + .../impl/SICompensationServiceImpl.java | 26 +++++++++++++------ 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java b/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java index e100e69ed..312a52344 100644 --- a/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java +++ b/src/com/engine/salary/entity/siaccount/dto/InsuranceCompensationDTO.java @@ -48,7 +48,7 @@ public class InsuranceCompensationDTO { /** * 统计调差福利 */ - private String welfareType; + private Integer welfareType; /** * 统计调差福利类型 diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java index 2228e7f37..e9756492f 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.java @@ -14,6 +14,6 @@ public interface InsuranceCompensationConfigMapper { void deleteByPayOrg(Long paymentOrganization); - List queryByBillMonthAndPayOrg(String billMonth, Long paymentOrganization); + List queryByPayOrg(@Param("paymentOrganization") Long paymentOrganization); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml index 8153657d8..fda8f1f01 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationConfigMapper.xml @@ -160,12 +160,11 @@ AND delete_type = 0 - SELECT FROM hrsa_compensation_config t - WHERE t.bill_month = #{billMonth} - AND t.payment_organization = #{paymentOrganization} + WHERE t.payment_organization = #{paymentOrganization} AND t.delete_type = 0 \ No newline at end of file diff --git a/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java b/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java index 9c008d7a2..64a053093 100644 --- a/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java +++ b/src/com/engine/salary/service/impl/ColumnBuildServiceImpl.java @@ -395,6 +395,7 @@ public class ColumnBuildServiceImpl extends Service implements ColumnBuildServic WeaTableColumn weaTableNameColumn = new WeaTableColumn("300px",SalaryI18nUtil.getI18nLabel( 87000, "调差对象"), "target"); weaTableNameColumn.setFixed("left"); + list.add(weaTableNameColumn); list.add(new WeaTableColumn("100px",SalaryI18nUtil.getI18nLabel( 87001, "统计调差福利"), "welfareType")); list.add(new WeaTableColumn("200px",SalaryI18nUtil.getI18nLabel( 87001, "统计调差福利类型(单位)"), "categoryType")); diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index a61e27a44..8e9ff27b6 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -2,6 +2,7 @@ package com.engine.salary.service.impl; import com.alibaba.fastjson.JSON; import com.alipay.oceanbase.jdbc.StringUtils; +import com.cloudstore.eccom.pc.table.WeaTable; import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; @@ -32,6 +33,7 @@ import com.engine.salary.util.SalaryAssert; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; +import com.engine.salary.util.page.Column; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; @@ -303,7 +305,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation insuranceCompensationPO.setPaymentOrganization(insuranceAccountDetailPO.getPaymentOrganization()); insuranceCompensationPO.setTenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY); - insuranceCompensationPO.setWelfareType(Integer.valueOf(param.getWelfareType())); + insuranceCompensationPO.setWelfareType(param.getWelfareType()); insuranceCompensationPO.setUpdateTime(new Date()); getInsuranceCompensationMapper().insert(insuranceCompensationPO); @@ -344,7 +346,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation .updateTime(new Date()) .categoryType(config.getCategoryType()) .paymentOrganization(config.getPaymentOrganization()) - .welfareType(Integer.valueOf(config.getWelfareType())) + .welfareType(config.getWelfareType()) .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) .creator(currentEmployeeId).build(); }).collect(Collectors.toList()); @@ -423,11 +425,15 @@ public class SICompensationServiceImpl extends Service implements SICompensation //设置调差详情列表头 List weaTableColumn = getColumnBuildService(user).buildCompensationColumns(); + WeaTable table = new WeaTable(); + table.setPageUID(UUID.randomUUID().toString()); + table.setColumns(weaTableColumn); + List columns = weaTableColumn.stream().map(v -> new Column(v.getText(), v.getColumn(), v.getColumn())).collect(Collectors.toList()); //处理调差数据 List compensationDTOList = dealCompensationData(billMonth, paymentOrganization); - datas.put("columns", weaTableColumn); + datas.put("columns", columns); datas.put("data", compensationDTOList); return datas; @@ -438,7 +444,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation //获取调差历史记录数据 List compensationPOList = getInsuranceCompensationMapper().queryByBillMonthAndPayOrg(billMonth, paymentOrganization); //获取调差配置数据 - List compensationConfigPOList = getInsuranceCompensationConfigMapper().queryByBillMonthAndPayOrg(billMonth, paymentOrganization); + List compensationConfigPOList = getInsuranceCompensationConfigMapper().queryByPayOrg(paymentOrganization); List compensationDTOList = new ArrayList<>(); @@ -468,14 +474,16 @@ public class SICompensationServiceImpl extends Service implements SICompensation //设置categoryTypeOptions List> categoryTypeOptions = new ArrayList<>(); List categoryTypeList = Arrays.asList(po.getCategoryType().split(",")); - Map categoryTypeMap = new HashMap<>(); + for (String categoryType : categoryTypeList) { + Map categoryTypeMap = new HashMap<>(); categoryTypeMap.put("id", categoryType); categoryTypeMap.put("content", categoryNameMap.get(Long.valueOf(categoryType))); categoryTypeOptions.add(categoryTypeMap); } - dto.setCategoryTypeOptions(categoryTypeOptions); + + compensationDTOList.add(dto); } } //不存在调差历史记录时,输出调差配置数据 @@ -494,14 +502,16 @@ public class SICompensationServiceImpl extends Service implements SICompensation //设置categoryTypeOptions List> categoryTypeOptions = new ArrayList<>(); List categoryTypeList = Arrays.asList(configPO.getCategoryType().split(",")); - Map categoryTypeMap = new HashMap<>(); + for (String categoryType : categoryTypeList) { + Map categoryTypeMap = new HashMap<>(); categoryTypeMap.put("id", categoryType); categoryTypeMap.put("content", categoryNameMap.get(Long.valueOf(categoryType))); categoryTypeOptions.add(categoryTypeMap); } - dto.setCategoryTypeOptions(categoryTypeOptions); + + compensationDTOList.add(dto); } } From da7b9d8e6a68285657de092d9acf94d97b99807f Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 1 Dec 2022 10:22:47 +0800 Subject: [PATCH 27/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E6=95=B0=E6=8D=AE=E5=88=A0=E9=99=A4=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=9C=A8=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=A0=B8=E7=AE=97=E6=97=B6=EF=BC=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=B7=B2=E6=9C=89=E8=B0=83=E6=9F=A5=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 5e8c8a054..2d2d063ba 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -416,7 +416,10 @@ public class SIAccountBiz extends Service { for (List part : partitionIds) { getInsuranceAccountDetailMapper().batchDelAccountDetails(part, billMonth, param.getPaymentOrganization(), paymentStatus); } + //删除账单月份+个税扣缴义务人下的调差数据 + getInsuranceCompensationMapper().deleteByBillMonthAndPayOrg(param.getBillMonth(), param.getPaymentOrganization()); + //生成bill_detail入库数据 List collect = list.stream().map(item -> { InsuranceAccountDetailPO insuranceAccountDetailPO = new InsuranceAccountDetailPO(); BeanUtils.copyProperties(item, insuranceAccountDetailPO); From 119640e2729dceb654e37ea4444080d95942759a Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 1 Dec 2022 10:50:34 +0800 Subject: [PATCH 28/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E5=9C=A8=E7=A6=8F?= =?UTF-8?q?=E5=88=A9=E5=8F=B0=E8=B4=A6=E9=87=8D=E6=96=B0=E6=A0=B8=E7=AE=97?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=88=A0=E9=99=A4=E8=B0=83=E5=B7=AE=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=97=B6=E5=A2=9E=E5=8A=A0=E4=BA=BA=E5=91=98id?= =?UTF-8?q?=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 14 +++++---- .../siaccount/po/InsuranceCompensationPO.java | 5 +++ .../InsuranceCompensationMapper.java | 4 +++ .../siaccount/InsuranceCompensationMapper.xml | 31 +++++++++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 2d2d063ba..c285bbef3 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -16,10 +16,7 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.dto.SIAccountUtilDTO; import com.engine.salary.entity.siaccount.param.*; -import com.engine.salary.entity.siaccount.po.InsuranceAccountBatchPO; -import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; -import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailTempPO; -import com.engine.salary.entity.siaccount.po.InsuranceAccountInspectPO; +import com.engine.salary.entity.siaccount.po.*; import com.engine.salary.entity.siarchives.po.*; import com.engine.salary.entity.sicategory.po.ICategoryPO; import com.engine.salary.entity.sischeme.po.InsuranceSchemeDetailPO; @@ -415,9 +412,14 @@ public class SIAccountBiz extends Service { log.info("bill_detail入库前删除数据数量:{}", ids.size()); for (List part : partitionIds) { getInsuranceAccountDetailMapper().batchDelAccountDetails(part, billMonth, param.getPaymentOrganization(), paymentStatus); + + //删除账单月份+个税扣缴义务人+人员id下的调差数据 + getInsuranceCompensationMapper().deleteByBillMonthPayOrgEmpIds(InsuranceCompensationPO.builder() + .billMonth(billMonth) + .paymentOrganization(param.getPaymentOrganization()) + .employeeIds(part) + .build()); } - //删除账单月份+个税扣缴义务人下的调差数据 - getInsuranceCompensationMapper().deleteByBillMonthAndPayOrg(param.getBillMonth(), param.getPaymentOrganization()); //生成bill_detail入库数据 List collect = list.stream().map(item -> { diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java index dbd00ae12..24ebde645 100644 --- a/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceCompensationPO.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Collection; import java.util.Date; /** @@ -98,4 +99,8 @@ public class InsuranceCompensationPO { * 账单月份 */ private String billMonth; + + //---------条件------- + private Collection ids; + private Collection employeeIds; } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java index b407bdf50..e96a6b8bb 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.java @@ -18,7 +18,11 @@ public interface InsuranceCompensationMapper { InsuranceCompensationPO getOneByBillMonthPayOrgEmpId(InsuranceCompensationPO insuranceCompensationPO); + List getByBillMonthPayOrgEmpIds(InsuranceCompensationPO insuranceCompensationPO); + void deleteById(Long id); void deleteByBillMonthAndPayOrg(@Param("billMonth") String billMonth, @Param("paymentOrganization") Long paymentOrganization); + + void deleteByBillMonthPayOrgEmpIds(InsuranceCompensationPO insuranceCompensationPO); } diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml index 1b87e7579..7e3d4e321 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceCompensationMapper.xml @@ -221,6 +221,22 @@ AND t.delete_type = 0 + + + UPDATE hrsa_compensation_log SET delete_type = 1 @@ -235,4 +251,19 @@ AND payment_organization = #{paymentOrganization} AND delete_type = 0 + + + UPDATE hrsa_compensation_log + SET delete_type = 1 + WHERE bill_month = #{billMonth} + AND payment_organization = #{paymentOrganization} + AND delete_type = 0 + + AND employee_id IN + + #{employeeId} + + + + \ No newline at end of file From e462992206ed3996babe8ec54fd3c0fab6f553fa Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 1 Dec 2022 11:50:37 +0800 Subject: [PATCH 29/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A4=BE=E4=BF=9D?= =?UTF-8?q?=E8=B0=83=E5=B7=AE=E6=92=A4=E5=9B=9E=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/mapper/siaccount/InsuranceAccountDetailMapper.xml | 3 ++- .../engine/salary/service/impl/SICompensationServiceImpl.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml index 182b26111..b11229c8b 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml @@ -1202,7 +1202,8 @@ t.fund_per_json,t.fund_com_json,t.other_per_json, t.other_com_json,t.social_per_sum,t.social_com_sum, t.fund_per_sum,t.fund_com_sum,t.other_per_sum, - t.other_com_sum,t.per_sum,t.com_sum,t.payment_organization,t.total + t.other_com_sum,t.per_sum,t.com_sum,t.payment_organization, + t.total, t.social_sum, t.fund_sum, t.other_sum FROM hrsa_bill_detail t WHERE t.delete_type = 0 diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 8e9ff27b6..33cf6047d 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -400,6 +400,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation totalSum = totalSum.subtract(adjustmentTo); insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); //更新社保调差后的明细 + InsuranceAccountDetailPOEncrypt.encryptItem(insuranceAccountDetailPO); getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //删除调差记录 getInsuranceCompensationMapper().deleteById(param.getId()); From ac0b0a7e25318cc8d0ea1a398206bcd85f461eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 1 Dec 2022 13:59:38 +0800 Subject: [PATCH 30/77] =?UTF-8?q?=E5=85=AC=E5=BC=8F=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/entity/salarysob/bo/SalarySobItemAggregateBO.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java index 5dbadc876..78553c3e7 100644 --- a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java +++ b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java @@ -105,6 +105,7 @@ public class SalarySobItemAggregateBO { .salaryItemGroupId(k) .salaryItemId(salaryItemPO.getId()) .dateType(salaryItemPO.getDataType()) + .valueType(salaryItemPO.getValueType()) .name(salaryItemPO.getName()) .itemHide(salarySobItemPO.getItemHide()) .formulaId(salarySobItemPO.getFormulaId()) From 013f67469e10bfb8f5d7b08077f610a44cb63258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 1 Dec 2022 14:33:21 +0800 Subject: [PATCH 31/77] =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=AE=9A=E5=88=B6?= =?UTF-8?q?=E5=88=97=E7=9A=84=E5=85=A5=E8=81=8C=E6=97=A5=E6=9C=9F=E5=92=8C?= =?UTF-8?q?=E7=A6=BB=E8=81=8C=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/salaryarchive/bo/SalaryArchiveBO.java | 2 ++ .../entity/salaryarchive/dto/SalaryArchiveListDTO.java | 10 ++++++++++ .../salary/mapper/archive/SalaryArchiveMapper.xml | 3 +++ .../salary/service/impl/SalaryArchiveServiceImpl.java | 2 ++ 4 files changed, 17 insertions(+) diff --git a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java index 86ef24b4d..7ee01453b 100644 --- a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java +++ b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveBO.java @@ -80,6 +80,8 @@ public class SalaryArchiveBO { columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "员工状态"), "employeeStatus")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "起始发薪日期"), "payStartDate")); columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "最后发薪日期"), "payEndDate")); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "入职日期"), "companystartdate").setDisplay(WeaBoolAttr.FALSE)); + columns.add(new WeaTableColumn("100px", SalaryI18nUtil.getI18nLabel(86187, "离职日期"), "dismissdate").setDisplay(WeaBoolAttr.FALSE)); for (SalaryItemPO salaryItem : salaryItems) { columns.add(new WeaTableColumn("100px", salaryItem.getName(), salaryItem.getId() + SalaryItemConstant.DYNAMIC_SUFFIX)); } diff --git a/src/com/engine/salary/entity/salaryarchive/dto/SalaryArchiveListDTO.java b/src/com/engine/salary/entity/salaryarchive/dto/SalaryArchiveListDTO.java index e5d697e0d..00e64d7d6 100644 --- a/src/com/engine/salary/entity/salaryarchive/dto/SalaryArchiveListDTO.java +++ b/src/com/engine/salary/entity/salaryarchive/dto/SalaryArchiveListDTO.java @@ -67,6 +67,16 @@ public class SalaryArchiveListDTO { @TableTitle(title = "电话", dataIndex = "mobile", key = "mobile") private String mobile; + /** + * 入职日期 + */ + private String companystartdate; + + /** + * 离职日期 + */ + private String dismissdate; + /** * 工号 */ diff --git a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml index 22fa98c1a..309b3a926 100644 --- a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml +++ b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml @@ -92,6 +92,9 @@ , e.workcode , e.lastname as username , e.status AS employeeStatus + , e.companystartdate as companystartdate + , e.enddate as dismissdate + , e.status AS employeeStatus , d.departmentname AS departmentName , c.subcompanyname AS subcompanyName diff --git a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java index 9eccd455f..a55dc26bc 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java @@ -466,6 +466,8 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe map.put("employeeStatus", e.getEmployeeStatus()); map.put("payStartDate", SalaryDateUtil.getFormatLocalDate(e.getPayStartDate())); map.put("payEndDate", SalaryDateUtil.getFormatLocalDate(e.getPayEndDate())); + map.put("companystartdate", e.getCompanystartdate()); + map.put("dismissdate", e.getDismissdate()); // 薪资项目动态 Optional> optionalItem = salaryArchiveItemData.stream().filter(f -> f.get("salaryArchiveId").toString().equals(e.getId().toString())).findFirst(); From c7b3341a13a6f2e38fb05d6ca3df9b5cb19c58b5 Mon Sep 17 00:00:00 2001 From: fcli Date: Thu, 1 Dec 2022 17:41:10 +0800 Subject: [PATCH 32/77] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/salaryBill/param/SalarySendInfoQueryParam.java | 6 ++++++ .../salary/enums/salarybill/SalarySendStatusEnum.java | 7 ++++++- .../salary/mapper/salarybill/SalarySendInfoMapper.xml | 8 ++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendInfoQueryParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendInfoQueryParam.java index 3153759e3..2bac2f3c5 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalarySendInfoQueryParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendInfoQueryParam.java @@ -58,6 +58,12 @@ public class SalarySendInfoQueryParam extends BaseQueryParam { // @ApiModelProperty("发送状态") private SalarySendStatusEnum sendStatus; + /** + * true= [已发送] + * false= [未发送,已撤回] + */ + private Boolean isGranted; + /** * 发送状态 */ diff --git a/src/com/engine/salary/enums/salarybill/SalarySendStatusEnum.java b/src/com/engine/salary/enums/salarybill/SalarySendStatusEnum.java index d31bc3011..aa6ef65f7 100644 --- a/src/com/engine/salary/enums/salarybill/SalarySendStatusEnum.java +++ b/src/com/engine/salary/enums/salarybill/SalarySendStatusEnum.java @@ -1,5 +1,7 @@ package com.engine.salary.enums.salarybill; +import com.engine.salary.enums.BaseEnum; + import java.util.Arrays; /** @@ -7,7 +9,7 @@ import java.util.Arrays; * @Author: wangxiangzhong * @Date: 2021/12/9 15:56 */ -public enum SalarySendStatusEnum { +public enum SalarySendStatusEnum implements BaseEnum { UNSEND(0, "未发放", 93286), ALREADYSEND(1, "已发放", 93212), @@ -25,14 +27,17 @@ public enum SalarySendStatusEnum { this.labelId = 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/salarybill/SalarySendInfoMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml index 4cfd0cd94..412175d23 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml @@ -318,6 +318,14 @@ AND t1.send_status = #{param.sendStatusVal} + + + + and t1.send_status = 1 + + + and t1.send_status in (0, 2) + From 991338a10efc0fb66dce1c397fb1aacb34434ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Fri, 2 Dec 2022 16:58:19 +0800 Subject: [PATCH 33/77] =?UTF-8?q?=E5=90=88=E8=AE=A1=E8=A1=8C=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/TaxAgentService.java | 2 +- .../service/impl/TaxAgentServiceImpl.java | 46 +++++++++---------- .../salary/web/SalaryAcctController.java | 9 ++++ .../engine/salary/web/TaxAgentController.java | 4 +- .../wrapper/SalaryAcctResultWrapper.java | 28 +++++++++-- .../salary/wrapper/TaxAgentWrapper.java | 2 +- 6 files changed, 57 insertions(+), 34 deletions(-) diff --git a/src/com/engine/salary/service/TaxAgentService.java b/src/com/engine/salary/service/TaxAgentService.java index d228b6ace..99496013c 100644 --- a/src/com/engine/salary/service/TaxAgentService.java +++ b/src/com/engine/salary/service/TaxAgentService.java @@ -167,7 +167,7 @@ public interface TaxAgentService { * @param ids * @return */ - String delete(Collection ids); + String delete(List ids); /** * 获取个税扣缴义务人下拉列表 diff --git a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java index 31d274856..4ebc76662 100644 --- a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java @@ -12,6 +12,7 @@ import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO; +import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.bo.TaxAgentBO; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; @@ -410,7 +411,7 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { @Override - public String delete(Collection ids) { + public String delete(List ids) { if (org.springframework.util.CollectionUtils.isEmpty(ids)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); @@ -421,7 +422,7 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(85382, "要删除的个税扣缴义务人在不存在或已删除")); } // 正在使用的记录不允许删除 - boolean checkUsed = checkUsed(ids); + boolean checkUsed = checkUsed(ids.get(0)); if (checkUsed) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100570, "正在使用的记录不允许删除")); } @@ -448,21 +449,16 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { /** * 检查正在被使用的记录 * - * @param ids + * @param id * @return */ - private boolean checkUsed(Collection ids) { - //fixme 被薪资档案引用 -// List salaryArchiveList = new LambdaQueryChainWrapper<>(getSalaryArchiveMapper()) -// .eq(SalaryArchivePO::getDeleteType, 0) -// .eq(SalaryArchivePO::getTenantKey) -// .in(SalaryArchivePO::getTaxAgentId, ids) -// .list(); -// getSalaryArchiveMapper().listSome(SalaryArchivePO.builder().t); -// if (CollectionUtils.isNotEmpty(salaryArchiveList)) { -// return Boolean.TRUE; -// } - // todo 被社保福利档案引用 + private boolean checkUsed(Long id) { + //被薪资档案引用 + List salaryArchiveList =getSalaryArchiveMapper().listSome(SalaryArchivePO.builder().taxAgentId(id).build()); + if (CollectionUtils.isNotEmpty(salaryArchiveList)) { + throw new SalaryRunTimeException("存在薪资档案引用"); + } + //被社保福利档案引用 // List socialSchemePOList = new LambdaQueryChainWrapper<>(siArchivesSocialMapper) // .eq(InsuranceArchivesSocialSchemePO::getTenantKey) // .eq(InsuranceArchivesSocialSchemePO::getDeleteType, DeleteTypeEnum.NOT_DELETED.getValue()) @@ -496,28 +492,28 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { // } // 被累计专项附加扣除引用 - List addUpDeductionList = getAddUpDeductionMapper().listSome(AddUpDeduction.builder().taxAgentIds(ids).build()); + List addUpDeductionList = getAddUpDeductionMapper().listSome(AddUpDeduction.builder().taxAgentId(id).build()); AddUpDeductionEncrypt.decryptAddUpDeductionList(addUpDeductionList); if (CollectionUtils.isNotEmpty(addUpDeductionList)) { - return Boolean.TRUE; + throw new SalaryRunTimeException("存在累计专项附加扣除引用"); } // 被其他免税扣除引用 - List otherDeductionList = getOtherDeductionMapper().listSome(OtherDeductionPO.builder().taxAgentIds(ids).build()); + List otherDeductionList = getOtherDeductionMapper().listSome(OtherDeductionPO.builder().taxAgentId(id).build()); OtherDeductionPOEncrypt.decryptOtherDeductionPOList(otherDeductionList); if (CollectionUtils.isNotEmpty(otherDeductionList)) { - return Boolean.TRUE; + throw new SalaryRunTimeException("存在其他免税扣除引用"); } // 被往期累计情况引用 - List addUpSituationList = getAddUpSituationMapper().listSome(AddUpSituation.builder().taxAgentIds(ids).build()); + List addUpSituationList = getAddUpSituationMapper().listSome(AddUpSituation.builder().taxAgentId(id).build()); AddUpSituationEncrypt.decryptAddUpSituationList(addUpSituationList); if (CollectionUtils.isNotEmpty(addUpSituationList)) { - return Boolean.TRUE; + throw new SalaryRunTimeException("存在往期累计情况引用"); } //账套 - List salarySobPOS = getSalarySobMapper().listSome(SalarySobPO.builder().taxAgentIds(ids).build()); + List salarySobPOS = getSalarySobMapper().listSome(SalarySobPO.builder().taxAgentId(id).build()); if (CollectionUtils.isNotEmpty(salarySobPOS)) { - return Boolean.TRUE; + throw new SalaryRunTimeException("存在账套引用"); } return Boolean.FALSE; @@ -552,7 +548,7 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { * * @param taxAgents * @param currentEmployeeId - * @param chiefCanSeeAll 总管理员是否可见所有 + * @param chiefCanSeeAll 总管理员是否可见所有 * @return */ private List handleForDevolution(List taxAgents, Long currentEmployeeId, boolean chiefCanSeeAll) { @@ -740,7 +736,7 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { @Override public List listTaxAgentAndEmployee(SalaryEmployeeStatusEnum employeeStatus, Long employeeId) { List taxAgentEmployeeList = Lists.newArrayList(); - + List taxAgentManageRangeEmployeeList = listTaxAgentAndEmployeeTree(employeeStatus, employeeId); taxAgentManageRangeEmployeeList.forEach(m -> { List employeeList = m.getEmployeeList(); diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index 20eae426e..cf66111a1 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -373,6 +373,15 @@ public class SalaryAcctController { return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::listPage, param); } + //合计行 + @POST + @Path("/acctresult/sum") + @Produces(MediaType.APPLICATION_JSON) + public String sumSalaryAcctResult(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalaryAcctResultQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::sumSalaryAcctResult, param); + } + //薪资核算结果详情 @GET diff --git a/src/com/engine/salary/web/TaxAgentController.java b/src/com/engine/salary/web/TaxAgentController.java index 55c43b0d7..0b1272f47 100644 --- a/src/com/engine/salary/web/TaxAgentController.java +++ b/src/com/engine/salary/web/TaxAgentController.java @@ -198,9 +198,9 @@ public class TaxAgentController { @POST @Path("/delete") @Produces(MediaType.APPLICATION_JSON) - public String delete(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) { + public String delete(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody List ids) { User user = HrmUserVarify.getUser(request, response); - return new ResponseResult, String>(user).run(getTaxAgentWrapper(user)::delete, ids); + return new ResponseResult, String>(user).run(getTaxAgentWrapper(user)::delete, ids); } /** diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 6cfc09547..0d01aff15 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -18,7 +18,6 @@ import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.*; import com.engine.salary.service.impl.*; import com.engine.salary.sys.entity.po.SalarySysConfPO; -import com.engine.salary.sys.enums.OpenEnum; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryEntityUtil; @@ -105,12 +104,30 @@ public class SalaryAcctResultWrapper extends Service { datas.put("pageInfo", page); datas.put("columns", columns); +// //合计 +// SalarySysConfPO openSum = getSalarySysConfService(user).getOneByCode(OPEN_ACCT_RESULT_SUM); +// if (openSum != null && StringUtils.isNotBlank(openSum.getConfValue()) && OpenEnum.parseByValue(openSum.getConfValue()) == OpenEnum.OPEN) { +// Map sumRow = getSalaryAcctResultService(user).sumRow(queryParam); +// datas.put("sumRow", sumRow); +// } + return datas; + } + + /** + * 合计行 + * + * @param queryParam 列表查询条件 + * @return + */ + public Map sumSalaryAcctResult(SalaryAcctResultQueryParam queryParam) { + ValidUtil.doValidator(queryParam); + + Map datas = new HashMap<>(); + //合计 SalarySysConfPO openSum = getSalarySysConfService(user).getOneByCode(OPEN_ACCT_RESULT_SUM); - if (openSum != null && StringUtils.isNotBlank(openSum.getConfValue()) && OpenEnum.parseByValue(openSum.getConfValue()) == OpenEnum.OPEN) { - Map sumRow = getSalaryAcctResultService(user).sumRow(queryParam); - datas.put("sumRow", sumRow); - } + Map sumRow = getSalaryAcctResultService(user).sumRow(queryParam); + datas.put("sumRow", sumRow); return datas; } @@ -241,6 +258,7 @@ public class SalaryAcctResultWrapper extends Service { } + /** * 薪资核算-校验 * diff --git a/src/com/engine/salary/wrapper/TaxAgentWrapper.java b/src/com/engine/salary/wrapper/TaxAgentWrapper.java index ac7aab10b..c4bcd5851 100644 --- a/src/com/engine/salary/wrapper/TaxAgentWrapper.java +++ b/src/com/engine/salary/wrapper/TaxAgentWrapper.java @@ -277,7 +277,7 @@ public class TaxAgentWrapper extends Service { * @param ids * @return */ - public String delete(Collection ids) { + public String delete(List ids) { return getTaxAgentService(user).delete(ids); } From 22a7258229f4899257a2488001635d34fa250303 Mon Sep 17 00:00:00 2001 From: sy Date: Fri, 2 Dec 2022 17:08:35 +0800 Subject: [PATCH 34/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E7=A6=8F=E5=88=A9?= =?UTF-8?q?=E6=A0=B8=E7=AE=97=E6=B7=BB=E5=8A=A0=E6=A0=B8=E7=AE=97=E8=BF=9B?= =?UTF-8?q?=E5=BA=A6=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 46 ++++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index c285bbef3..752388f6f 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.TypeReference; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; +import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; @@ -30,8 +31,10 @@ import com.engine.salary.mapper.siarchives.InsuranceBaseInfoMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; import com.engine.salary.mapper.sischeme.InsuranceSchemeDetailMapper; import com.engine.salary.mapper.taxagent.TaxAgentMapper; +import com.engine.salary.service.SalaryAcctProgressService; import com.engine.salary.service.SalaryEmployeeService; import com.engine.salary.service.TaxAgentService; +import com.engine.salary.service.impl.SalaryAcctProgressServiceImpl; import com.engine.salary.service.impl.SalaryEmployeeServiceImpl; import com.engine.salary.service.impl.TaxAgentServiceImpl; import com.engine.salary.sys.entity.vo.OrderRuleVO; @@ -50,6 +53,7 @@ import com.wbi.util.StringUtil; import dm.jdbc.util.IdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import weaver.hrm.User; @@ -110,6 +114,10 @@ public class SIAccountBiz extends Service { return MapperProxyFactory.getProxy(InsuranceCompensationMapper.class); } + private SalaryAcctProgressService getSalaryAcctProgressService(User user) { + return (SalaryAcctProgressService) ServiceUtil.getService(SalaryAcctProgressServiceImpl.class, user); + } + public PageInfo listPage(InsuranceAccountBatchParam queryParam) { SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountBatchMapper().list(queryParam); @@ -222,10 +230,20 @@ public class SIAccountBiz extends Service { public void accounting(AccountParam param, Long employeeId, String tenantKey, String currentUserName) { //薪资核算进度暂未实现 -// SalaryAcctProgressDTO salaryAcctProgressDTO = salaryAcctProgressService.getProgress(tenantKey + param.getBillMonth(), employeeId, tenantKey); -// if (salaryAcctProgressDTO != null && salaryAcctProgressDTO.getProgress().compareTo(BigDecimal.ONE) < 0) { -// return; -// } + SalaryAcctProgressDTO salaryAcctProgressDTO = getSalaryAcctProgressService(user).getProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth()); + if (salaryAcctProgressDTO != null && salaryAcctProgressDTO.getProgress().compareTo(BigDecimal.ONE) < 0) { + return; + } + // 初始化进度 + SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO() + .setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")) + .setTitleLabelId(97515L) + .setTotalQuantity(NumberUtils.INTEGER_ONE) + .setCalculatedQuantity(NumberUtils.INTEGER_ZERO) + .setProgress(BigDecimal.ZERO) + .setStatus(true) + .setMessage(StringUtils.EMPTY); + getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth(), initProgress); doAccounting(param, employeeId, tenantKey, currentUserName); } @@ -291,11 +309,23 @@ public class SIAccountBiz extends Service { } if (CollectionUtils.isEmpty(ids)) { //salaryAcctProgressService.fail(tenantKey + param.getBillMonth(), SalaryI18nUtil.getI18nLabel( 100468, "无需要核算的人员")); + getSalaryAcctProgressService(user).fail(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth(), SalaryI18nUtil.getI18nLabel( 100468, "无需要核算的人员")); return; } - SalaryAcctProgressDTO salaryAcctProgressDTO = new SalaryAcctProgressDTO(SalaryI18nUtil.getI18nLabel(97515, "核算中"), 97515L, ids.size(), 0, - BigDecimal.ZERO, true, "", true); +// SalaryAcctProgressDTO salaryAcctProgressDTO = new SalaryAcctProgressDTO(SalaryI18nUtil.getI18nLabel(97515, "核算中"), 97515L, ids.size(), 0, +// BigDecimal.ZERO, true, "", true); //salaryAcctProgressService.initProgress(tenantKey + param.getBillMonth(), salaryAcctProgressDTO, employeeId, tenantKey); + + // 初始化进度 + SalaryAcctProgressDTO initProgress = new SalaryAcctProgressDTO() + .setTitle(SalaryI18nUtil.getI18nLabel(97515, "核算中")) + .setTitleLabelId(97515L) + .setTotalQuantity(ids.size()) + .setCalculatedQuantity(NumberUtils.INTEGER_ZERO) + .setProgress(BigDecimal.ZERO) + .setStatus(true) + .setMessage(StringUtils.EMPTY); + getSalaryAcctProgressService(user).initProgress(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth(), initProgress); /* List> partition = Lists.partition(ids, 100); CountDownLatch countDownLatch = new CountDownLatch(partition.size()); BlockingDeque results = new LinkedBlockingDeque<>(partition.size());*/ @@ -311,6 +341,8 @@ public class SIAccountBiz extends Service { handleData(ids, param, employeeId, tenantKey, currentUserName); /*}*/ MapperProxyFactory.getProxy(SIAccountDetailTempMapper.class).batchDelAccountTempDetails(ids, param.getBillMonth()); + + getSalaryAcctProgressService(user).finish(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth(), true); } catch (Exception e) { log.error("account run fail", e); List list = Lists.newArrayList(getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), param.getPaymentOrganization())); @@ -324,6 +356,7 @@ public class SIAccountBiz extends Service { //薪资核算进度暂未实现 //salaryAcctProgressService.del(tenantKey + param.getBillMonth(), employeeId, tenantKey); //logger.error("welfare account error:{}", e.getMessage(), e); + getSalaryAcctProgressService(user).fail(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth(), e.getMessage()); } } @@ -365,6 +398,7 @@ public class SIAccountBiz extends Service { count++; if (count % 50 == 0 || count >= ids.size()) { //salaryAcctProgressService.getAndAddCalculatedQty(tenantKey + billMonth, count >= ids.size() ? count % 50 : 50); + getSalaryAcctProgressService(user).getAndAddCalculatedQty(SalaryCacheKey.ACCT_PROGRESS + billMonth, count >= ids.size() ? count % 50 : 50); } } if (CollectionUtils.isNotEmpty(list)) { From 33aa8ea50768ad1681d2069a4c14b00a4a61bcf5 Mon Sep 17 00:00:00 2001 From: sy Date: Fri, 2 Dec 2022 17:57:09 +0800 Subject: [PATCH 35/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E6=A1=A3=E6=A1=88=EF=BC=8C=E6=A1=A3=E6=A1=88?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=80=9A=E8=BF=87=E5=AF=BC=E5=85=A5excel?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=89=8D=EF=BC=8C=E6=A0=B9=E6=8D=AE=E4=BA=BA?= =?UTF-8?q?=E5=91=98id=E5=92=8C=E4=B8=AA=E7=A8=8E=E6=89=A3=E7=BC=B4?= =?UTF-8?q?=E4=B9=89=E5=8A=A1=E4=BA=BA=E8=BF=9B=E8=A1=8C=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/impl/SISchemeServiceImpl.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java index e8c454de5..56c6a6b17 100644 --- a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java @@ -1226,6 +1226,10 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { // List socialEmployeeIds = socialSchemePOS.stream().map(InsuranceArchivesSocialSchemePO::getEmployeeId).collect(Collectors.toList()); // List> socialEmployeeIdPartition = Lists.partition(socialEmployeeIds, 100); // socialEmployeeIdPartition.forEach(getSocialSchemeMapper()::batchDeleteByEmployeeIds); + //去除员工id+个税扣缴义务人下重复的数据 + socialSchemePOS = socialSchemePOS.stream() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); + List insuranceArchivesSocialSchemePOS = InsuranceArchivesSocialSchemePOEncrypt.encryptList(socialSchemePOS); List> partition = Lists.partition(insuranceArchivesSocialSchemePOS, 100); partition.forEach(getSocialSchemeMapper()::batchSave); @@ -1239,6 +1243,10 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { // List fundEmployeeIds = fundSchemePOS.stream().map(InsuranceArchivesFundSchemePO::getEmployeeId).collect(Collectors.toList()); // List> fundEmployeeIdsPartition = Lists.partition(fundEmployeeIds, 100); // fundEmployeeIdsPartition.forEach(getFundSchemeMapper()::batchDeleteByEmployeeIds); + //去除员工id+个税扣缴义务人下重复的数据 + fundSchemePOS = fundSchemePOS.stream() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); + List insuranceArchivesFundSchemePOS = InsuranceArchivesFundSchemePOEncrypt.encryptList(fundSchemePOS); List> partition = Lists.partition(insuranceArchivesFundSchemePOS, 100); partition.forEach(getFundSchemeMapper()::batchSave); @@ -1252,6 +1260,10 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { // List otherEmployeeIds = otherSchemePOS.stream().map(InsuranceArchivesOtherSchemePO::getEmployeeId).collect(Collectors.toList()); // List> otherEmployeeIdsPartition = Lists.partition(otherEmployeeIds, 100); // otherEmployeeIdsPartition.forEach(getOtherSchemeMapper()::batchDeleteByEmployeeIds); + //去除员工id+个税扣缴义务人下重复的数据 + otherSchemePOS = otherSchemePOS.stream() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); + List insuranceArchivesOtherSchemePOS = InsuranceArchivesOtherSchemePOEncrypt.encryptList(otherSchemePOS); List> partition = Lists.partition(insuranceArchivesOtherSchemePOS, 100); partition.forEach(getOtherSchemeMapper()::batchSave); @@ -1260,6 +1272,9 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { List baseInfoPOS = insuranceArchivesAccountPOS.stream().filter(Objects::nonNull).map(InsuranceArchivesAccountPO::getBaseInfo).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(baseInfoPOS)) { // baseInfoPOS = baseInfoPOS.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(InsuranceArchivesBaseInfoPO::getEmployeeId))), ArrayList::new)); + //去除员工id+个税扣缴义务人下重复的数据 + baseInfoPOS = baseInfoPOS.stream() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); //根据人员id和个税扣缴义务人id删除对应档案 baseInfoPOS.forEach(getInsuranceBaseInfoMapper()::deleteByEmployeeIdAndPayOrg); //分批批量删除 From 4fa64c6a8f5ece003639f32b931a3444ae40ce13 Mon Sep 17 00:00:00 2001 From: fcli Date: Mon, 5 Dec 2022 09:52:05 +0800 Subject: [PATCH 36/77] =?UTF-8?q?feat:=20mapper=E5=BC=82=E5=B8=B8=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml b/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml index e69a245c3..9643d377d 100644 --- a/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml +++ b/src/com/engine/salary/mapper/sischeme/InsuranceSchemeMapper.xml @@ -32,7 +32,7 @@ , t.creator , t.delete_type , t.tenant_key - , t.1】 + , t.shared_type , t.tax_agent_ids From 6fe28ec41c97ccac253fe6dc489b0299969d7e77 Mon Sep 17 00:00:00 2001 From: Harryxzy Date: Mon, 5 Dec 2022 09:57:27 +0800 Subject: [PATCH 37/77] =?UTF-8?q?=E5=AE=9A=E8=96=AA=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=EF=BC=8C=E6=94=BE=E5=BC=80=E4=B8=AA=E7=A8=8E=E6=89=A3=E7=BC=B4?= =?UTF-8?q?=E4=B9=89=E5=8A=A1=E4=BA=BA=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/TaxAgentService.java | 2 ++ .../impl/SalaryArchiveExcelServiceImpl.java | 2 ++ .../service/impl/TaxAgentServiceImpl.java | 22 +++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/com/engine/salary/service/TaxAgentService.java b/src/com/engine/salary/service/TaxAgentService.java index d228b6ace..6f32c1ab7 100644 --- a/src/com/engine/salary/service/TaxAgentService.java +++ b/src/com/engine/salary/service/TaxAgentService.java @@ -199,6 +199,8 @@ public interface TaxAgentService { */ List listTaxAgentAndEmployeeTree(Long employeeId); + List listAllTaxAgentAndEmployeeTree(); + List listTaxAgentAndEmployeeTree(); /** diff --git a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java index 4a0036c55..cedfd24f6 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java @@ -554,6 +554,8 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // 2.构建导入需要的数据 SalaryArchiveImportHandleParam importHandleParam = buildImportHandleParam(listType, importType); + // 设置所有的个税扣缴义务人,由于定薪流程调用者不一定是个税扣缴义务人管理员,防止出现个税扣缴义务人不存在问题。 + importHandleParam.setTaxAgentList(getTaxAgentService(user).listAllTaxAgentAndEmployeeTree()); int total = 0; //excel数据 diff --git a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java index 31d274856..ef9849ad8 100644 --- a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java @@ -636,6 +636,8 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { } + + @Override public List listTaxAgentAndEmployeeTree() { List taxAgentManageRangeEmployeeList = Lists.newArrayList(); @@ -667,6 +669,26 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { return taxAgentManageRangeEmployeeList; } + @Override + public List listAllTaxAgentAndEmployeeTree() { + List taxAgentManageRangeEmployeeList = Lists.newArrayList(); + // 所有个税扣缴义务人 + List allTaxAgents = listAll(); + if (CollectionUtils.isEmpty(allTaxAgents)) { + return taxAgentManageRangeEmployeeList; + } + + List taxAgentIds = allTaxAgents.stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + List allEmployees = getTaxAgentMapper().listEmployee(); + + // 1.判断自己是否是管理员, 如果是管理员,就是能够操作所属个税扣缴义务人下的所有人的数据 + List taxAgentAdminList = getTaxAgentAdminService(user).listByTaxAgentIdsAndEmployeeId(taxAgentIds, (long) user.getUID()); + // 是管理员的列表 + List adminTaxAgentIds = taxAgentAdminList.stream().map(TaxAgentAdminPO::getTaxAgentId).collect(Collectors.toList()); + taxAgentManageRangeEmployeeList.addAll(getTaxAgentEmp(allTaxAgents, adminTaxAgentIds, allEmployees)); + return taxAgentManageRangeEmployeeList; + } + /** * 获取分管理员的关联人员 From 014190f6d0d9c1c0e5a704aca7b5e6232f0b5b52 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 5 Dec 2022 10:09:43 +0800 Subject: [PATCH 38/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=A1=A5=E7=BC=B4?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BC=B4=E7=BA=B3=E7=8A=B6=E6=80=81=E7=AD=9B?= =?UTF-8?q?=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/mapper/siaccount/InsuranceAccountDetailMapper.java | 2 -- .../salary/mapper/siaccount/InsuranceAccountDetailMapper.xml | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java index 6c2643c6a..738208c58 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.java @@ -1,11 +1,9 @@ package com.engine.salary.mapper.siaccount; -import com.engine.salary.entity.salarysob.po.SalarySobEmpFieldPO; import com.engine.salary.entity.siaccount.param.InsuranceAccountDetailParam; import com.engine.salary.entity.siaccount.param.SupplementAccountBaseParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; -import com.engine.salary.entity.siarchives.po.InsuranceArchivesOtherSchemePO; import org.apache.ibatis.annotations.Param; import java.util.Collection; diff --git a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml index b11229c8b..4901c5000 100644 --- a/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/InsuranceAccountDetailMapper.xml @@ -328,6 +328,7 @@ AND t.payment_organization = #{paymentOrganization} AND t.employee_id = #{employeeId} AND t.supplementary_month = #{supplementaryMonth} + AND t.payment_status = 1 diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 6bcf22390..429c166ca 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -939,13 +939,8 @@ public class SalarySendServiceImpl extends Service implements SalarySendService //如果传了范围id,则使用范围id撤回 ids = getSalarySendRangeService(user) .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.WITHDRAW); - if (param.getSalarySendRangeIds() != null) { - //如果传了范围id,则使用范围id发放 - ids = getSalarySendRangeService(user) - .getSendInfoIdsBySendId(salarySendId, param.getSalarySendRangeIds(), SalarySendGrantTypeEnum.GRANT); - if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 - throw new SalaryRunTimeException("工资撤回范围内没有匹配的员工"); - } + if (ids.isEmpty()) {// 由于查出来是空的,会导致全部发放,在此进行拦截 + throw new SalaryRunTimeException("工资撤回范围内没有匹配的员工"); } } From bea06f1d880a058ff6ad5c77a25c5c070fbc4fa3 Mon Sep 17 00:00:00 2001 From: sy Date: Mon, 5 Dec 2022 16:56:05 +0800 Subject: [PATCH 45/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E5=8F=AF=E8=B0=83?= =?UTF-8?q?=E5=B7=AE=E4=BA=BA=E5=91=98=E5=88=97=E8=A1=A8=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=A0=BC=E5=BC=8F=E5=A2=9E=E5=8A=A0target?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/entity/hrm/dto/HrmInfoDTO.java | 3 +++ .../salary/service/impl/SICompensationServiceImpl.java | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/entity/hrm/dto/HrmInfoDTO.java b/src/com/engine/salary/entity/hrm/dto/HrmInfoDTO.java index 21ec12013..f378fe85b 100644 --- a/src/com/engine/salary/entity/hrm/dto/HrmInfoDTO.java +++ b/src/com/engine/salary/entity/hrm/dto/HrmInfoDTO.java @@ -20,4 +20,7 @@ public class HrmInfoDTO { //姓名 private String username; + + + private Long target; } diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 7715b5d9b..26b010522 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -17,6 +17,7 @@ import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import com.engine.salary.entity.sicategory.po.ICategoryPO; +import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.siaccount.PaymentStatusEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; @@ -92,6 +93,8 @@ public class SICompensationServiceImpl extends Service implements SICompensation //查询账单月份+个税扣缴义务人下的社保福利正常缴纳人员列表 List normalDataList = getInsuranceAccountDetailMapper().queryNormalListByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); List empIds = normalDataList.stream().map(InsuranceAccountDetailPO::getEmployeeId).collect(Collectors.toList()); + //生成人员id和bill_detail.id的对应map + Map empIdToTargetMap = SalaryEntityUtil.convert2Map(normalDataList, InsuranceAccountDetailPO::getEmployeeId, InsuranceAccountDetailPO::getId); List resultData = new ArrayList<>(); if (empIds.size() > 0) { @@ -102,8 +105,13 @@ public class SICompensationServiceImpl extends Service implements SICompensation }); } + List finalResultData = new ArrayList<>(); + for (HrmInfoDTO dto : resultData) { + dto.setTarget(empIdToTargetMap.get(dto.getEmployeeId())); + finalResultData.add(dto); + } - return resultData; + return finalResultData; } // public PageInfo getEmployeeListToCompensation(HrmQueryParam param) { // // 当前登录人员 From 2877d58a1f02839a26299ca5ba43dfbb1f052ccf Mon Sep 17 00:00:00 2001 From: fcli Date: Mon, 5 Dec 2022 17:51:28 +0800 Subject: [PATCH 46/77] =?UTF-8?q?feat:=20sqlserver=20bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salarybill/SalarySendInfoMapper.xml | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml index 412175d23..536560045 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml @@ -318,7 +318,7 @@ AND t1.send_status = #{param.sendStatusVal} - + and t1.send_status = 1 @@ -347,9 +347,17 @@ WHERE t1.delete_type = 0 - - AND t1.send_status = #{param.sendStatusVal} - + + AND t1.send_status = #{param.sendStatusVal} + + + + and t1.send_status = 1 + + + and t1.send_status in (0, 2) + + @@ -367,11 +375,18 @@ LEFT JOIN hrmdepartment d ON d.id = e.DEPARTMENTID LEFT JOIN hrmsubcompany c ON c.id = e.subcompanyid1 LEFT JOIN hrsa_tax_agent t2 ON t2.id = t1.tax_agent_id - WHERE - t1.delete_type = 0 - - AND t1.send_status = #{param.sendStatusVal} - + WHERE t1.delete_type = 0 + + AND t1.send_status = #{param.sendStatusVal} + + + + and t1.send_status = 1 + + + and t1.send_status in (0, 2) + + From 5b1615675d8a4990608b865675e299e478018cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Dec 2022 09:41:26 +0800 Subject: [PATCH 47/77] =?UTF-8?q?=E6=89=B9=E9=87=8F=E8=B0=83=E8=96=AAactio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...kSalaryArchiveBatchAdjustmentByUpload.java | 72 +++++++++++++++++++ .../SalaryArchiveBatchAdjustmentByUpload.java | 59 +++++++++------ 2 files changed, 111 insertions(+), 20 deletions(-) create mode 100644 src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java diff --git a/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java b/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java new file mode 100644 index 000000000..e54ffe35e --- /dev/null +++ b/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java @@ -0,0 +1,72 @@ +package com.engine.salary.action; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportHandleParam; +import com.engine.salary.enums.salaryarchive.SalaryArchiveImportTypeEnum; +import com.engine.salary.enums.salaryarchive.SalaryArchiveListTypeEnum; +import com.engine.salary.service.SalaryArchiveExcelService; +import com.engine.salary.service.impl.SalaryArchiveExcelServiceImpl; +import lombok.extern.slf4j.Slf4j; +import weaver.conn.RecordSet; +import weaver.general.Util; +import weaver.hrm.User; +import weaver.interfaces.workflow.action.Action; +import weaver.soa.workflow.request.Property; +import weaver.soa.workflow.request.RequestInfo; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +public class CheckSalaryArchiveBatchAdjustmentByUpload implements Action { + + private SalaryArchiveExcelService getSalaryArchiveExcelService(User user) { + return ServiceUtil.getService(SalaryArchiveExcelServiceImpl.class, user); + } + + @Override + public String execute(RequestInfo requestInfo) { + try { + Property[] properties = requestInfo.getMainTableInfo().getProperty(); + Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, + property -> Util.null2String(property.getValue()))); + + String dxmd = fieldMap.get("dxmd"); + + RecordSet rs = new RecordSet(); + String queryImageId = "select imagefileid from docimagefile where docid = ?"; + rs.executeQuery(queryImageId, dxmd); + String imagefileid = null; + if (rs.next()) { + imagefileid = rs.getString("imagefileid"); + } + + SalaryArchiveImportHandleParam param = SalaryArchiveImportHandleParam.builder().imageId(imagefileid) + .listType(SalaryArchiveListTypeEnum.FIXED.getValue()) + .importType(SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getValue()) + .onlyCheck(true) + .isProcess(true) + .build(); + + Map map = getSalaryArchiveExcelService(new User()).batchImportEbatch(param); + int errorCount = (int) map.get("errorCount"); + if (errorCount > 0) { + log.error("批量调薪存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); + List> excelComments = (List>) map.get("errorNotice"); + StringBuilder message = new StringBuilder("excel中"); + for (Map comments : excelComments) { + message.append(comments.get("message")).append("\n"); + } + requestInfo.getRequestManager().setMessage(message.toString()); + return FAILURE_AND_CONTINUE; + } + } catch (Exception e) { + log.error("批量调薪异常", e); + requestInfo.getRequestManager().setMessage(e.getMessage()); + return FAILURE_AND_CONTINUE; + } + return SUCCESS; + } +} diff --git a/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java b/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java index 1bf2db8fe..2b8546d35 100644 --- a/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java +++ b/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java @@ -6,6 +6,7 @@ import com.engine.salary.enums.salaryarchive.SalaryArchiveImportTypeEnum; import com.engine.salary.enums.salaryarchive.SalaryArchiveListTypeEnum; import com.engine.salary.service.SalaryArchiveExcelService; import com.engine.salary.service.impl.SalaryArchiveExcelServiceImpl; +import lombok.extern.slf4j.Slf4j; import weaver.conn.RecordSet; import weaver.general.Util; import weaver.hrm.User; @@ -17,6 +18,7 @@ import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; +@Slf4j public class SalaryArchiveBatchAdjustmentByUpload implements Action { private SalaryArchiveExcelService getSalaryArchiveExcelService(User user) { @@ -25,29 +27,46 @@ public class SalaryArchiveBatchAdjustmentByUpload implements Action { @Override public String execute(RequestInfo requestInfo) { - Property[] properties = requestInfo.getMainTableInfo().getProperty(); - Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, - property -> Util.null2String(property.getValue()))); + try { - String dxmd = fieldMap.get("dxmd"); + Property[] properties = requestInfo.getMainTableInfo().getProperty(); + Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, + property -> Util.null2String(property.getValue()))); - RecordSet rs = new RecordSet(); - String queryImageId = "select imagefileid from docimagefile where docid = ?"; - rs.executeQuery(queryImageId, dxmd); - String imagefileid = null; - if (rs.next()) { - imagefileid = rs.getString("imagefileid"); + String dxmd = fieldMap.get("dxmd"); + + RecordSet rs = new RecordSet(); + String queryImageId = "select imagefileid from docimagefile where docid = ?"; + rs.executeQuery(queryImageId, dxmd); + String imagefileid = null; + if (rs.next()) { + imagefileid = rs.getString("imagefileid"); + } + + SalaryArchiveImportHandleParam param = SalaryArchiveImportHandleParam.builder().imageId(imagefileid) + .listType(SalaryArchiveListTypeEnum.FIXED.getValue()) + .importType(SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getValue()) + .onlyCheck(false) + .isProcess(true) + .build(); + + Map map = getSalaryArchiveExcelService(new User()).batchImportEbatch(param); + int errorCount = (int) map.get("errorCount"); + if (errorCount > 0) { + log.error("批量调薪存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); +// List> excelComments = (List>) map.get("errorNotice"); +// StringBuilder message = new StringBuilder(); +// for (Map comments : excelComments) { +// message.append(comments.get("message")).append("/n"); +// } +// requestInfo.getRequestManager().setMessage(message.toString()); +// return FAILURE_AND_CONTINUE; + } + } catch (Exception e) { + log.error("批量调薪异常", e); + requestInfo.getRequestManager().setMessage(e.getMessage()); + return FAILURE_AND_CONTINUE; } - - SalaryArchiveImportHandleParam param = SalaryArchiveImportHandleParam.builder().imageId(imagefileid) - .listType(SalaryArchiveListTypeEnum.FIXED.getValue()) - .importType(SalaryArchiveImportTypeEnum.SALARYITEMADJUST.getValue()) - .onlyCheck(false) - .isProcess(true) - .build(); - - Map map = getSalaryArchiveExcelService(new User()).batchImportEbatch(param); - return SUCCESS; } } From 2f8f5f299ec2b9563a5e1a32679373466e4d709d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Dec 2022 09:52:55 +0800 Subject: [PATCH 48/77] =?UTF-8?q?=E6=89=B9=E9=87=8F=E8=B0=83=E8=96=AAactio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CheckSalaryArchiveBatchAdjustmentByUpload.java | 14 ++++++++++++-- .../SalaryArchiveBatchAdjustmentByUpload.java | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java b/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java index e54ffe35e..145f56c74 100644 --- a/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java +++ b/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java @@ -26,6 +26,16 @@ public class CheckSalaryArchiveBatchAdjustmentByUpload implements Action { return ServiceUtil.getService(SalaryArchiveExcelServiceImpl.class, user); } + private String batSalaryExcelField; + + public String getBatSalaryExcelField() { + return batSalaryExcelField; + } + + public void setBatSalaryExcelField(String batSalaryExcelField) { + this.batSalaryExcelField = batSalaryExcelField; + } + @Override public String execute(RequestInfo requestInfo) { try { @@ -33,11 +43,11 @@ public class CheckSalaryArchiveBatchAdjustmentByUpload implements Action { Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, property -> Util.null2String(property.getValue()))); - String dxmd = fieldMap.get("dxmd"); + String docId = fieldMap.get(batSalaryExcelField); RecordSet rs = new RecordSet(); String queryImageId = "select imagefileid from docimagefile where docid = ?"; - rs.executeQuery(queryImageId, dxmd); + rs.executeQuery(queryImageId, docId); String imagefileid = null; if (rs.next()) { imagefileid = rs.getString("imagefileid"); diff --git a/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java b/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java index 2b8546d35..be538ad14 100644 --- a/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java +++ b/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java @@ -25,6 +25,16 @@ public class SalaryArchiveBatchAdjustmentByUpload implements Action { return ServiceUtil.getService(SalaryArchiveExcelServiceImpl.class, user); } + private String batSalaryExcelField; + + public String getBatSalaryExcelField() { + return batSalaryExcelField; + } + + public void setBatSalaryExcelField(String batSalaryExcelField) { + this.batSalaryExcelField = batSalaryExcelField; + } + @Override public String execute(RequestInfo requestInfo) { try { @@ -33,11 +43,11 @@ public class SalaryArchiveBatchAdjustmentByUpload implements Action { Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, property -> Util.null2String(property.getValue()))); - String dxmd = fieldMap.get("dxmd"); + String docId = fieldMap.get(batSalaryExcelField); RecordSet rs = new RecordSet(); String queryImageId = "select imagefileid from docimagefile where docid = ?"; - rs.executeQuery(queryImageId, dxmd); + rs.executeQuery(queryImageId, docId); String imagefileid = null; if (rs.next()) { imagefileid = rs.getString("imagefileid"); From 11d1ee1a21419f61943e00a3390620b7dd140ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Dec 2022 10:26:36 +0800 Subject: [PATCH 49/77] =?UTF-8?q?=E6=89=B9=E9=87=8F=E8=B0=83=E8=96=AAactio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tchAdjustmentByUpload.java => BatEditSalaryExcelAction.java} | 2 +- ...justmentByUpload.java => CheckBatEditSalaryExcelAction.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/com/engine/salary/action/{SalaryArchiveBatchAdjustmentByUpload.java => BatEditSalaryExcelAction.java} (97%) rename src/com/engine/salary/action/{CheckSalaryArchiveBatchAdjustmentByUpload.java => CheckBatEditSalaryExcelAction.java} (97%) diff --git a/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java b/src/com/engine/salary/action/BatEditSalaryExcelAction.java similarity index 97% rename from src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java rename to src/com/engine/salary/action/BatEditSalaryExcelAction.java index be538ad14..fbf7c7c85 100644 --- a/src/com/engine/salary/action/SalaryArchiveBatchAdjustmentByUpload.java +++ b/src/com/engine/salary/action/BatEditSalaryExcelAction.java @@ -19,7 +19,7 @@ import java.util.Map; import java.util.stream.Collectors; @Slf4j -public class SalaryArchiveBatchAdjustmentByUpload implements Action { +public class BatEditSalaryExcelAction implements Action { private SalaryArchiveExcelService getSalaryArchiveExcelService(User user) { return ServiceUtil.getService(SalaryArchiveExcelServiceImpl.class, user); diff --git a/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java b/src/com/engine/salary/action/CheckBatEditSalaryExcelAction.java similarity index 97% rename from src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java rename to src/com/engine/salary/action/CheckBatEditSalaryExcelAction.java index 145f56c74..67ba88f1b 100644 --- a/src/com/engine/salary/action/CheckSalaryArchiveBatchAdjustmentByUpload.java +++ b/src/com/engine/salary/action/CheckBatEditSalaryExcelAction.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.stream.Collectors; @Slf4j -public class CheckSalaryArchiveBatchAdjustmentByUpload implements Action { +public class CheckBatEditSalaryExcelAction implements Action { private SalaryArchiveExcelService getSalaryArchiveExcelService(User user) { return ServiceUtil.getService(SalaryArchiveExcelServiceImpl.class, user); From 70a5854dc74c64953e6873fc71d5f1014dd966f0 Mon Sep 17 00:00:00 2001 From: sy Date: Tue, 6 Dec 2022 15:40:40 +0800 Subject: [PATCH 50/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=B0=83=E5=B7=AE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=BF=9D=E5=AD=98=E6=97=B6=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=85=AC=E5=8F=B8=E8=B4=B9=E7=94=A8=E6=95=B0=E5=80=BC?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SICompensationServiceImpl.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 26b010522..9bffcc75b 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -274,11 +274,20 @@ public class SICompensationServiceImpl extends Service implements SICompensation Map result = new HashMap<>(); List errorList = new ArrayList<>(); + //过滤 + list = list.stream().collect(Collectors.collectingAndThen( + Collectors.toCollection(() -> + new TreeSet<>(Comparator.comparing(InsuranceCompensationDTO::getTarget))), ArrayList::new)); + for (InsuranceCompensationDTO param : list) { - if (StringUtils.isBlank(param.getAdjustmentTotal()) || "0".equals(param.getAdjustmentTotal())) { + if (StringUtils.isBlank(param.getAdjustmentTotal()) || "0".equals(param.getAdjustmentTotal()) || "0.00".equals(param.getAdjustmentTotal())) { errorList.add(usernameMap.get(param.getEmployeeId()) + "-调差失败:调差数额不正确!"); continue; } + if (StringUtils.isBlank(param.getCompanyTotal()) || "0".equals(param.getCompanyTotal()) || "0.00".equals(param.getCompanyTotal())) { + errorList.add(usernameMap.get(param.getEmployeeId()) + "-调差失败:公司核算金额为0,请检查数据是否属实或者当前人员已存在该月调差数据!"); + continue; + } InsuranceAccountDetailPO insuranceAccountDetailPO = getInsuranceAccountDetailMapper().getById(param.getTarget()); if (insuranceAccountDetailPO == null) { errorList.add(usernameMap.get(param.getEmployeeId()) + "-调差失败:调差对象不存在!"); From b39587e19de87974a47b4667618a19667efcd2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Tue, 6 Dec 2022 18:08:50 +0800 Subject: [PATCH 51/77] =?UTF-8?q?=E5=8D=95=E7=8B=AC=E8=B0=83=E8=96=AAactio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/action/EditSalaryAction.java | 127 ++++++++++++++++++ .../bo/SalaryArchiveExcelBO.java | 5 +- .../impl/SalaryArchiveExcelServiceImpl.java | 3 +- .../service/impl/TaxAgentServiceImpl.java | 6 +- .../salary/wrapper/SalaryArchiveWrapper.java | 12 -- 5 files changed, 136 insertions(+), 17 deletions(-) create mode 100644 src/com/engine/salary/action/EditSalaryAction.java diff --git a/src/com/engine/salary/action/EditSalaryAction.java b/src/com/engine/salary/action/EditSalaryAction.java new file mode 100644 index 000000000..2e0bb759f --- /dev/null +++ b/src/com/engine/salary/action/EditSalaryAction.java @@ -0,0 +1,127 @@ +package com.engine.salary.action; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportActionParam; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.wrapper.SalaryArchiveWrapper; +import lombok.extern.slf4j.Slf4j; +import weaver.conn.RecordSet; +import weaver.general.Util; +import weaver.hrm.User; +import weaver.interfaces.workflow.action.Action; +import weaver.soa.workflow.request.Property; +import weaver.soa.workflow.request.RequestInfo; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +public class EditSalaryAction implements Action { + + + private SalaryArchiveWrapper getSalaryArchiveWrapper(User user) { + return ServiceUtil.getService(SalaryArchiveWrapper.class, user); + } + + private String tableName; + + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + @Override + public String execute(RequestInfo requestInfo) { + try { + + Property[] properties = requestInfo.getMainTableInfo().getProperty(); + Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, + property -> Util.null2String(property.getValue()))); + + + RecordSet rs = new RecordSet(); + + String queryImageId = "select salaryname,processfield from " + tableName + " where workflowid = ?"; + rs.executeQuery(queryImageId, requestInfo.getWorkflowid()); + + List list = new ArrayList<>(); + while (rs.next()) { + String processField = rs.getString("processfield"); + String salaryName = rs.getString("salaryname"); + String value = fieldMap.get(processField); + list.add(new SalaryField(processField, salaryName, value)); + } + List> importData = new ArrayList<>(); + importData.add(SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue)); + + SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder() + .importDatas(importData) + .build(); + Map map = getSalaryArchiveWrapper(new User()).adjustmentSalaryArchive(build); + + int errorCount = (int) map.get("errorCount"); + if (errorCount > 0) { + log.error("调薪存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); + List> excelComments = (List>) map.get("errorNotice"); + StringBuilder message = new StringBuilder("excel中"); + for (Map comments : excelComments) { + message.append(comments.get("message")).append("\n"); + } + requestInfo.getRequestManager().setMessage(message.toString()); + return FAILURE_AND_CONTINUE; + } + } catch (Exception e) { + log.error("调薪异常", e); + requestInfo.getRequestManager().setMessage(e.getMessage()); + return FAILURE_AND_CONTINUE; + } + return SUCCESS; + } + + + class SalaryField { + + private String processField; + + private String salaryName; + + private String value; + + public String getProcessField() { + return processField; + } + + public void setProcessField(String processField) { + this.processField = processField; + } + + public String getSalaryName() { + return salaryName; + } + + public void setSalaryName(String salaryName) { + this.salaryName = salaryName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public SalaryField(String processField, String salaryName, String value) { + this.processField = processField; + this.salaryName = salaryName; + this.value = value; + } + } +} diff --git a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java index 35916907d..d13f84e82 100644 --- a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java +++ b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java @@ -180,7 +180,10 @@ public class SalaryArchiveExcelBO extends Service { List mustHeaders = Lists.newArrayList(); - mustHeaders.add(userNameI18n); + if (!importHandleParam.isProcess()) { + //流程中可以使用人员id + mustHeaders.add(userNameI18n); + } mustHeaders.add(taxAgentI18n); // mustHeaders.add(incomeCategoryI18n); // mustHeaders.add(salarySobI18n); diff --git a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java index cad57f7a4..e8dffa076 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java @@ -545,7 +545,7 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // 构建导入需要的数据 - SalaryArchiveImportHandleParam importHandleParam = buildImportHandleParam(SalaryArchiveImportHandleParam.builder().listType(param.getListType()).importType(param.getImportType()).build()); + SalaryArchiveImportHandleParam importHandleParam = buildImportHandleParam(SalaryArchiveImportHandleParam.builder().isProcess(true).listType(param.getListType()).importType(param.getImportType()).build()); int total = 0; @@ -698,6 +698,7 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // List hrmStatusList = hrmCommonHrmStatusService.list(tenantKey); return SalaryArchiveImportHandleParam.builder() + .isProcess(true) .listType(listType) .importType(importType) .currentEmployeeId((long) user.getUID()) diff --git a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java index e34a690af..8715d4f5e 100644 --- a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java @@ -492,19 +492,19 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { // } // 被累计专项附加扣除引用 - List addUpDeductionList = getAddUpDeductionMapper().listSome(AddUpDeduction.builder().taxAgentId(id).build()); + List addUpDeductionList = getAddUpDeductionMapper().listSome(AddUpDeduction.builder().taxAgentIds(Collections.singleton(id)).build()); AddUpDeductionEncrypt.decryptAddUpDeductionList(addUpDeductionList); if (CollectionUtils.isNotEmpty(addUpDeductionList)) { throw new SalaryRunTimeException("存在累计专项附加扣除引用"); } // 被其他免税扣除引用 - List otherDeductionList = getOtherDeductionMapper().listSome(OtherDeductionPO.builder().taxAgentId(id).build()); + List otherDeductionList = getOtherDeductionMapper().listSome(OtherDeductionPO.builder().taxAgentIds(Collections.singleton(id)).build()); OtherDeductionPOEncrypt.decryptOtherDeductionPOList(otherDeductionList); if (CollectionUtils.isNotEmpty(otherDeductionList)) { throw new SalaryRunTimeException("存在其他免税扣除引用"); } // 被往期累计情况引用 - List addUpSituationList = getAddUpSituationMapper().listSome(AddUpSituation.builder().taxAgentId(id).build()); + List addUpSituationList = getAddUpSituationMapper().listSome(AddUpSituation.builder().taxAgentIds(Collections.singleton(id)).build()); AddUpSituationEncrypt.decryptAddUpSituationList(addUpSituationList); if (CollectionUtils.isNotEmpty(addUpSituationList)) { throw new SalaryRunTimeException("存在往期累计情况引用"); diff --git a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java index 684552d0f..abf67792f 100644 --- a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java @@ -36,7 +36,6 @@ import com.google.common.collect.Maps; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import weaver.conn.RecordSet; import weaver.hrm.User; import java.util.*; @@ -466,17 +465,6 @@ public class SalaryArchiveWrapper extends Service { return getSalaryArchiveService(user).exportList(queryParam); } - public Map checkImportSalaryArchive(SalaryArchiveImportHandleParam param) { - String queryImageId = "select imagefileid from docimagefile where docid = ?"; - if (param.getImageId() != null && !"".equals(param.getImageId())) { - RecordSet rs = new RecordSet(); - rs.executeQuery(queryImageId, param.getImageId()); - if (rs.next()) { - param.setImageId(rs.getString("imagefileid")); - } - } - return getSalaryArchiveExcelService(user).batchImportEbatch(param); - } /** From 1e03eca7381a7ae60aa7125aafbe4dff8c9c0f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Dec 2022 09:17:31 +0800 Subject: [PATCH 52/77] =?UTF-8?q?=E5=8D=95=E7=8B=AC=E8=B0=83=E8=96=AA?= =?UTF-8?q?=E6=A3=80=E6=9F=A5action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/CheckBatEditSalaryExcelAction.java | 4 +- .../salary/action/CheckEditSalaryAction.java | 128 ++++++++++++++++++ .../salary/action/EditSalaryAction.java | 19 +-- 3 files changed, 140 insertions(+), 11 deletions(-) create mode 100644 src/com/engine/salary/action/CheckEditSalaryAction.java diff --git a/src/com/engine/salary/action/CheckBatEditSalaryExcelAction.java b/src/com/engine/salary/action/CheckBatEditSalaryExcelAction.java index 67ba88f1b..8d6313cd7 100644 --- a/src/com/engine/salary/action/CheckBatEditSalaryExcelAction.java +++ b/src/com/engine/salary/action/CheckBatEditSalaryExcelAction.java @@ -63,7 +63,7 @@ public class CheckBatEditSalaryExcelAction implements Action { Map map = getSalaryArchiveExcelService(new User()).batchImportEbatch(param); int errorCount = (int) map.get("errorCount"); if (errorCount > 0) { - log.error("批量调薪存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); + log.error("批量调薪检查存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); List> excelComments = (List>) map.get("errorNotice"); StringBuilder message = new StringBuilder("excel中"); for (Map comments : excelComments) { @@ -73,7 +73,7 @@ public class CheckBatEditSalaryExcelAction implements Action { return FAILURE_AND_CONTINUE; } } catch (Exception e) { - log.error("批量调薪异常", e); + log.error("批量调薪检查异常", e); requestInfo.getRequestManager().setMessage(e.getMessage()); return FAILURE_AND_CONTINUE; } diff --git a/src/com/engine/salary/action/CheckEditSalaryAction.java b/src/com/engine/salary/action/CheckEditSalaryAction.java new file mode 100644 index 000000000..3fe0f3f75 --- /dev/null +++ b/src/com/engine/salary/action/CheckEditSalaryAction.java @@ -0,0 +1,128 @@ +package com.engine.salary.action; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportActionParam; +import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.wrapper.SalaryArchiveWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import weaver.conn.RecordSet; +import weaver.general.Util; +import weaver.hrm.User; +import weaver.interfaces.workflow.action.Action; +import weaver.soa.workflow.request.Property; +import weaver.soa.workflow.request.RequestInfo; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +public class CheckEditSalaryAction implements Action { + + + private SalaryArchiveWrapper getSalaryArchiveWrapper(User user) { + return ServiceUtil.getService(SalaryArchiveWrapper.class, user); + } + + private String tableName; + + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + @Override + public String execute(RequestInfo requestInfo) { + try { + + Property[] properties = requestInfo.getMainTableInfo().getProperty(); + Map fieldMap = Arrays.stream(properties).collect(Collectors.toMap(Property::getName, + property -> Util.null2String(property.getValue()))); + + + RecordSet rs = new RecordSet(); + + String queryImageId = "select salaryname,processfield from " + tableName + " where workflowid = ?"; + rs.executeQuery(queryImageId, requestInfo.getWorkflowid()); + + List list = new ArrayList<>(); + while (rs.next()) { + String processField = rs.getString("processfield"); + String salaryName = rs.getString("salaryname"); + String value = fieldMap.get(processField); + list.add(new SalaryField(processField, salaryName, value)); + } + List> importData = new ArrayList<>(); + importData.add(SalaryEntityUtil.convert2Map(list, SalaryField::getSalaryName, SalaryField::getValue)); + + SalaryArchiveImportActionParam build = SalaryArchiveImportActionParam.builder() + .importDatas(importData) + .build(); + Map map = getSalaryArchiveWrapper(new User()).checkAdjustmentSalaryArchive(build); + + List errorNotice = (List) map.get("errorNotice"); + if (CollectionUtils.isNotEmpty(errorNotice)) { + log.error("调薪检查存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); + List> excelComments = (List>) map.get("errorNotice"); + StringBuilder message = new StringBuilder("excel中"); + for (Map comments : excelComments) { + message.append(comments.get("message")).append("\n"); + } + requestInfo.getRequestManager().setMessage(message.toString()); + return FAILURE_AND_CONTINUE; + } + } catch (Exception e) { + log.error("调薪检查异常", e); + requestInfo.getRequestManager().setMessage(e.getMessage()); + return FAILURE_AND_CONTINUE; + } + return SUCCESS; + } + + + class SalaryField { + + private String processField; + + private String salaryName; + + private String value; + + public String getProcessField() { + return processField; + } + + public void setProcessField(String processField) { + this.processField = processField; + } + + public String getSalaryName() { + return salaryName; + } + + public void setSalaryName(String salaryName) { + this.salaryName = salaryName; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public SalaryField(String processField, String salaryName, String value) { + this.processField = processField; + this.salaryName = salaryName; + this.value = value; + } + } +} diff --git a/src/com/engine/salary/action/EditSalaryAction.java b/src/com/engine/salary/action/EditSalaryAction.java index 2e0bb759f..49bb7e396 100644 --- a/src/com/engine/salary/action/EditSalaryAction.java +++ b/src/com/engine/salary/action/EditSalaryAction.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.salaryarchive.param.SalaryArchiveImportActionPar import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.wrapper.SalaryArchiveWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import weaver.conn.RecordSet; import weaver.general.Util; import weaver.hrm.User; @@ -66,16 +67,16 @@ public class EditSalaryAction implements Action { .build(); Map map = getSalaryArchiveWrapper(new User()).adjustmentSalaryArchive(build); - int errorCount = (int) map.get("errorCount"); - if (errorCount > 0) { + List errorNotice = (List) map.get("errorNotice"); + if (CollectionUtils.isNotEmpty(errorNotice)) { log.error("调薪存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); - List> excelComments = (List>) map.get("errorNotice"); - StringBuilder message = new StringBuilder("excel中"); - for (Map comments : excelComments) { - message.append(comments.get("message")).append("\n"); - } - requestInfo.getRequestManager().setMessage(message.toString()); - return FAILURE_AND_CONTINUE; +// List> excelComments = (List>) map.get("errorNotice"); +// StringBuilder message = new StringBuilder("excel中"); +// for (Map comments : excelComments) { +// message.append(comments.get("message")).append("\n"); +// } +// requestInfo.getRequestManager().setMessage(message.toString()); +// return FAILURE_AND_CONTINUE; } } catch (Exception e) { log.error("调薪异常", e); From cdb7f3a0a2626bfb8015d4ad6be1749e741c17b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Dec 2022 15:47:35 +0800 Subject: [PATCH 53/77] =?UTF-8?q?sql=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/web/SalaryFormulaController.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/com/engine/salary/web/SalaryFormulaController.java b/src/com/engine/salary/web/SalaryFormulaController.java index 449877334..5f0d41c80 100644 --- a/src/com/engine/salary/web/SalaryFormulaController.java +++ b/src/com/engine/salary/web/SalaryFormulaController.java @@ -1,5 +1,7 @@ package com.engine.salary.web; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; import com.engine.common.util.ServiceUtil; import com.engine.salary.entity.salaryformula.dto.ExpressFormulaDTO; import com.engine.salary.entity.salaryformula.param.SalaryFormulaFieldQueryParam; @@ -8,7 +10,11 @@ import com.engine.salary.entity.salaryformula.po.FormulaPO; import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.util.ResponseResult; import com.engine.salary.wrapper.SalaryFormulaWrapper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.parameters.RequestBody; +import lombok.extern.slf4j.Slf4j; +import weaver.conn.RecordSetDataSource; import weaver.hrm.HrmUserVarify; import weaver.hrm.User; @@ -18,9 +24,11 @@ import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +@Slf4j public class SalaryFormulaController { @@ -72,5 +80,51 @@ public class SalaryFormulaController { return new ResponseResult(user).run(getSalaryFormulaWrapper(user)::datasourceList); } + @GET + @Path("/checkSql") + @Produces(MediaType.APPLICATION_JSON) + public String save(@Context HttpServletRequest request, @Context HttpServletResponse response) { + User user = HrmUserVarify.getUser(request, response); + String result = ""; + Map map = new HashMap<>(); + + try { + String sql = request.getParameter("sql"); + String sqlReturnKey = request.getParameter("sqlReturnKey"); + String datasourceId = request.getParameter("datasourceId"); + RecordSetDataSource rs = new RecordSetDataSource(datasourceId); + log.info("sql run{},datasourceId:{},sqlReturnKey:{}", sql, datasourceId, sqlReturnKey); + map.put("sql",sql); + map.put("sqlReturnKey",sqlReturnKey); + map.put("datasourceId",datasourceId); + if (rs.executeSql(sql)) { + if (rs.next()) { + result = rs.getString(sqlReturnKey); + } + } + map.put("result",result); + } catch (Exception e) { + log.error("sql error", e); + Map apidatas = new HashMap<>(); + apidatas.put("status", false); + apidatas.put("errormsg", e.getMessage()); + return JSONObject.toJSONString(apidatas, SerializerFeature.DisableCircularReferenceDetect); + } + + Map apidatas = new HashMap<>(); + apidatas.put("status", true); + apidatas.put("data", map); + return getJsonString(apidatas); + } + + private static String getJsonString(Object apidatas) { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(apidatas); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return ""; + } } From f20cecf04235989d434046f6963dc4667af296c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Dec 2022 16:17:29 +0800 Subject: [PATCH 54/77] =?UTF-8?q?sql=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/action/CheckEditSalaryAction.java | 2 +- src/com/engine/salary/action/EditSalaryAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/engine/salary/action/CheckEditSalaryAction.java b/src/com/engine/salary/action/CheckEditSalaryAction.java index 3fe0f3f75..add09b62a 100644 --- a/src/com/engine/salary/action/CheckEditSalaryAction.java +++ b/src/com/engine/salary/action/CheckEditSalaryAction.java @@ -71,7 +71,7 @@ public class CheckEditSalaryAction implements Action { if (CollectionUtils.isNotEmpty(errorNotice)) { log.error("调薪检查存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); List> excelComments = (List>) map.get("errorNotice"); - StringBuilder message = new StringBuilder("excel中"); + StringBuilder message = new StringBuilder(""); for (Map comments : excelComments) { message.append(comments.get("message")).append("\n"); } diff --git a/src/com/engine/salary/action/EditSalaryAction.java b/src/com/engine/salary/action/EditSalaryAction.java index 49bb7e396..8ce5bc43a 100644 --- a/src/com/engine/salary/action/EditSalaryAction.java +++ b/src/com/engine/salary/action/EditSalaryAction.java @@ -71,7 +71,7 @@ public class EditSalaryAction implements Action { if (CollectionUtils.isNotEmpty(errorNotice)) { log.error("调薪存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); // List> excelComments = (List>) map.get("errorNotice"); -// StringBuilder message = new StringBuilder("excel中"); +// StringBuilder message = new StringBuilder(""); // for (Map comments : excelComments) { // message.append(comments.get("message")).append("\n"); // } From 5079753c34619c2a5efb79802ab1e2de7896850a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Dec 2022 16:19:22 +0800 Subject: [PATCH 55/77] =?UTF-8?q?sql=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/service/impl/FormulaRunServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java b/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java index 6beac534d..a4d41d813 100644 --- a/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java +++ b/src/com/engine/salary/service/impl/FormulaRunServiceImpl.java @@ -96,6 +96,7 @@ public class FormulaRunServiceImpl extends Service implements FormulaRunService //外部数据源 if (StringUtils.isNotBlank(datasourceId)) { RecordSetDataSource rs = new RecordSetDataSource(datasourceId); + log.error("执行外部sql,{},datasourceId{}", sql,datasourceId); if (rs.executeSql(sql)) { if (rs.next()) { result = rs.getString(sqlReturnKey); From 0d417f1e4950e59e1118b4b80490bd4ed3ad5027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Dec 2022 20:15:52 +0800 Subject: [PATCH 56/77] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bo/SalaryArchiveExcelBO.java | 47 ++++++- .../param/SalaryArchiveImportHandleParam.java | 6 + .../param/TaxAgentRangeSaveParam.java | 3 + .../salary/service/SalaryArchiveService.java | 6 + .../impl/SalaryArchiveExcelServiceImpl.java | 15 ++- .../impl/SalaryArchiveServiceImpl.java | 14 ++- .../impl/TaxAgentManageRangeServiceImpl.java | 116 ++++++++---------- 7 files changed, 129 insertions(+), 78 deletions(-) diff --git a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java index d13f84e82..744157514 100644 --- a/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java +++ b/src/com/engine/salary/entity/salaryarchive/bo/SalaryArchiveExcelBO.java @@ -13,10 +13,15 @@ import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO; import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; +import com.engine.salary.entity.taxagent.param.TaxAgentManageRangeSaveParam; +import com.engine.salary.entity.taxagent.param.TaxAgentRangeSaveParam; import com.engine.salary.enums.UserStatusEnum; import com.engine.salary.enums.salaryarchive.*; +import com.engine.salary.enums.salarysob.TargetTypeEnum; import com.engine.salary.service.SalaryEmployeeService; +import com.engine.salary.service.TaxAgentManageRangeService; import com.engine.salary.service.impl.SalaryEmployeeServiceImpl; +import com.engine.salary.service.impl.TaxAgentManageRangeServiceImpl; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.excel.ExcelComment; @@ -46,6 +51,10 @@ public class SalaryArchiveExcelBO extends Service { return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } + public TaxAgentManageRangeService getTaxAgentManageRangeService() { + return ServiceUtil.getService(TaxAgentManageRangeServiceImpl.class, user); + } + public static String userNameI18n; public static String departmentI18n; public static String jobNumI18n; @@ -342,6 +351,9 @@ public class SalaryArchiveExcelBO extends Service { * @return */ public static boolean singleRowCheck(List allTodoSalaryArchives, Map map, List headers, int effectiveTimeIndex, List> excelComments, int errorCount, SalaryArchiveImportHandleParam importHandleParam) { + //是否是流程 + boolean process = importHandleParam.isProcess(); + boolean isError = false; String rowindex = "第" + map.get("index") + "行"; // 1.姓名 @@ -380,6 +392,14 @@ public class SalaryArchiveExcelBO extends Service { employeeId = Long.valueOf(empId); } + if (employeeId == null) { + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowindex + "人员存在重复数据,请确定姓名、部门、手机号唯一"); + excelComments.add(errorMessageMap); + isError = true; + return isError; + } + // 用于初始化导入数据校验 map.put("employeeId", employeeId); @@ -411,12 +431,27 @@ public class SalaryArchiveExcelBO extends Service { } Optional optionalTaxAgentEmp = optionalTaxAgent.get().getEmployeeList().stream().filter(f -> finalEmployeeSameIds.contains(f.getEmployeeId())).findFirst(); if (!optionalTaxAgentEmp.isPresent()) { - Map errorMessageMap = Maps.newHashMap(); - errorMessageMap.put("message", rowindex + taxAgentRangeMsg); - excelComments.add(errorMessageMap); + if (process) { + //定薪流程中自动将人员添加进个税扣缴义务人中 + TaxAgentManageRangeSaveParam.TaxAgentSubAdminRangeTargetParam taxAgentSubAdminRangeTargetParam = new TaxAgentManageRangeSaveParam.TaxAgentSubAdminRangeTargetParam(); + taxAgentSubAdminRangeTargetParam.setTargetId(employeeId); + taxAgentSubAdminRangeTargetParam.setTargetType(TargetTypeEnum.EMPLOYEE); + + TaxAgentRangeSaveParam taxAgentRangeSaveParam = new TaxAgentRangeSaveParam(); + taxAgentRangeSaveParam.setTaxAgentId(taxAgentId); + taxAgentRangeSaveParam.setIncludeType(1); + taxAgentRangeSaveParam.setEmployeeStatus(Arrays.asList("0", "1", "2", "3", "4", "5", "6")); + taxAgentRangeSaveParam.setTargetParams(Collections.singletonList(taxAgentSubAdminRangeTargetParam)); + taxAgentRangeSaveParam.setSync(true); + importHandleParam.setTaxAgentRanges(Collections.singletonList(taxAgentRangeSaveParam)); + } else { + Map errorMessageMap = Maps.newHashMap(); + errorMessageMap.put("message", rowindex + taxAgentRangeMsg); + excelComments.add(errorMessageMap); // SalaryArchiveExcelBO.createExcelComment(excelComments, taxAgentRangeMsg, errorCount + 1, errorCount + 1, 0, 0); - isError = true; - return isError; + isError = true; + return isError; + } } else { employeeId = optionalTaxAgentEmp.get().getEmployeeId(); // 除了定薪中的初始化,其他导入存在相同的取第一条 @@ -477,7 +512,7 @@ public class SalaryArchiveExcelBO extends Service { // 必填判空 boolean isEmpty = StringUtils.isEmpty(cellVal) && - (userNameI18n.equals(key.toString()) || taxAgentI18n.equals(key.toString()) || incomeCategoryI18n.equals(key.toString()) || salarySobI18n.equals(key.toString()) + ((userNameI18n.equals(key.toString()) && !process) || taxAgentI18n.equals(key.toString()) || incomeCategoryI18n.equals(key.toString()) || salarySobI18n.equals(key.toString()) // 定薪列表初始化导入必填: 起始发薪日期、生效日期 || ((payStartDateI18n.equals(key.toString()) || effectiveTimeI18n.equals(key.toString())) && importHandleParam.isInit()) // 定薪列表调薪必填: 调整原因、生效日期 diff --git a/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveImportHandleParam.java b/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveImportHandleParam.java index e96ce617e..f3f0baf63 100644 --- a/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveImportHandleParam.java +++ b/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveImportHandleParam.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.salaryarchive.po.SalaryArchiveItemPO; import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; +import com.engine.salary.entity.taxagent.param.TaxAgentRangeSaveParam; import com.engine.salary.enums.salaryarchive.SalaryArchiveImportTypeEnum; import com.engine.salary.enums.salaryarchive.SalaryArchiveListTypeEnum; import lombok.AllArgsConstructor; @@ -145,6 +146,11 @@ public class SalaryArchiveImportHandleParam { */ List salaryArchiveItemDelSalaryItemIds; + /** + * 待生成的人员范围 + */ + List taxAgentRanges; + /** * 薪资账套 */ diff --git a/src/com/engine/salary/entity/taxagent/param/TaxAgentRangeSaveParam.java b/src/com/engine/salary/entity/taxagent/param/TaxAgentRangeSaveParam.java index 65903e463..25333e242 100644 --- a/src/com/engine/salary/entity/taxagent/param/TaxAgentRangeSaveParam.java +++ b/src/com/engine/salary/entity/taxagent/param/TaxAgentRangeSaveParam.java @@ -19,4 +19,7 @@ public class TaxAgentRangeSaveParam extends TaxAgentManageRangeSaveParam { */ @DataCheck(require = true,message = "个税扣缴义务人的id不允许为空") private Long taxAgentId; + + //是否同步/异步执行生成档案 + private boolean sync; } diff --git a/src/com/engine/salary/service/SalaryArchiveService.java b/src/com/engine/salary/service/SalaryArchiveService.java index 296a31fb7..9ef63a791 100644 --- a/src/com/engine/salary/service/SalaryArchiveService.java +++ b/src/com/engine/salary/service/SalaryArchiveService.java @@ -219,4 +219,10 @@ public interface SalaryArchiveService { * 处理异常数据 */ Map handleRepeatData(); + + /** + * 处理增量数据 + * @param currentEmployeeId + */ + void handleChangeData(Long currentEmployeeId); } diff --git a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java index e8dffa076..c5cac1001 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java @@ -16,6 +16,7 @@ import com.engine.salary.entity.salaryarchive.po.SalaryArchivePO; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; +import com.engine.salary.entity.taxagent.param.TaxAgentRangeSaveParam; import com.engine.salary.entity.taxagent.po.TaxAgentEmployeePO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.salaryarchive.SalaryArchiveImportTypeEnum; @@ -78,6 +79,10 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } + public TaxAgentManageRangeService getTaxAgentManageRangeService(User user) { + return ServiceUtil.getService(TaxAgentManageRangeServiceImpl.class, user); + } + private SalaryArchiveBiz salaryArchiveMapper = new SalaryArchiveBiz(); private EmployBiz employBiz = new EmployBiz(); private SalaryArchiveItemBiz salaryArchiveItemMapper = new SalaryArchiveItemBiz(); @@ -698,7 +703,7 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // List hrmStatusList = hrmCommonHrmStatusService.list(tenantKey); return SalaryArchiveImportHandleParam.builder() - .isProcess(true) + .isProcess(param.isProcess()) .listType(listType) .importType(importType) .currentEmployeeId((long) user.getUID()) @@ -740,6 +745,8 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch .salaryArchiveUpdates(Lists.newArrayList()) // 待删除薪资档案-薪资项目 .salaryArchiveItemDelSalaryItemIds(Lists.newArrayList()) + //人员范围 + .taxAgentRanges(Lists.newArrayList()) // 薪资账套 // .salarySobList(salaryArchiveService.getSalarySobList(employeeId, tenantKey)) // 待保存薪资档案-薪资账套 @@ -799,7 +806,13 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch List salaryArchiveUpdates = importHandleParam.getSalaryArchiveUpdates(); List salaryArchiveItemSaves = importHandleParam.getSalaryArchiveItemSaves(); List salaryArchiveItemDelSalaryItemIds = importHandleParam.getSalaryArchiveItemDelSalaryItemIds(); + List taxAgentRanges = importHandleParam.getTaxAgentRanges(); // List salaryArchiveSobSaves = importHandleParam.getSalaryArchiveSobSaves(); + + //新增人员范围 + if (CollectionUtils.isNotEmpty(taxAgentRanges)) { + taxAgentRanges.forEach(getTaxAgentManageRangeService(user)::save); + } // 新增薪资档案 if (CollectionUtils.isNotEmpty(salaryArchiveSaves)) { // 去除已经存在的,避免重复 diff --git a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java index a55dc26bc..74d338094 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java @@ -169,7 +169,7 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe // 2.待停薪自动处理 handleSuspendData(currentEmployeeId); // 3.增量数据处理 - handleChangeData(currentEmployeeId); +// handleChangeData(currentEmployeeId); Util_DataCache.setObjVal("salaryArchiveHandleable", "1"); } }.start(); @@ -284,10 +284,14 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe return; } // 当前可以管辖的人员 - Collection taxAgentList = getTaxAgentService(user).listAllTaxAgents(currentEmployeeId); - taxAgentEmpChangeList = taxAgentEmpChangeList.stream().filter(f -> taxAgentList.stream().anyMatch(e -> e.getId().equals(f.getTaxAgentId()))).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(taxAgentEmpChangeList)) { - return; + Collection taxAgentList = new ArrayList<>(); + if (currentEmployeeId != 1L) { + taxAgentList = getTaxAgentService(user).listAllTaxAgents(currentEmployeeId); + Collection finalTaxAgentList = taxAgentList; + taxAgentEmpChangeList = taxAgentEmpChangeList.stream().filter(f -> finalTaxAgentList.stream().anyMatch(e -> e.getId().equals(f.getTaxAgentId()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(taxAgentEmpChangeList)) { + return; + } } // 所有档案数据 List salaryArchiveList = getSalaryArchiveMapper().listAll(); diff --git a/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java b/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java index f7d8ed802..71feae8df 100644 --- a/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java @@ -20,6 +20,7 @@ import com.engine.salary.enums.taxagent.TaxAgentRangeTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.taxagent.TaxAgentManageRangeMapper; +import com.engine.salary.service.SalaryArchiveService; import com.engine.salary.service.TaxAgentEmpService; import com.engine.salary.service.TaxAgentManageRangeService; import com.engine.salary.service.TaxAgentService; @@ -68,6 +69,10 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM return ServiceUtil.getService(TaxAgentEmpServiceImpl.class, user); } + private SalaryArchiveService getSalaryArchiveService(User user) { + return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user); + } + private EmployMapper getEmployMapper() { return MapperProxyFactory.getProxy(EmployMapper.class); } @@ -123,9 +128,7 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM // 需要排除的人员范围 Set excludeEmployeeIds = SalaryEntityUtil.properties(excludeSalaryEmployees, DataCollectionEmployee::getEmployeeId); // 过滤人员 - includeSalaryEmployees = includeSalaryEmployees.stream() - .filter(salaryEmployee -> !excludeEmployeeIds.contains(salaryEmployee.getEmployeeId())) - .collect(Collectors.toList()); + includeSalaryEmployees = includeSalaryEmployees.stream().filter(salaryEmployee -> !excludeEmployeeIds.contains(salaryEmployee.getEmployeeId())).collect(Collectors.toList()); } return includeSalaryEmployees; } @@ -142,32 +145,27 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM } List salaryEmployeeList = Lists.newArrayList(); for (TaxAgentManageRangePO manageRange : taxAgentManageRanges) { - salaryEmployeeList.addAll(salaryEmployees.stream() - .filter(salaryEmployee -> { - if (StringUtils.isEmpty(manageRange.getEmployeeStatus()) || !manageRange.getEmployeeStatus().contains("\"" + salaryEmployee.getStatus() + "\"")) { - return false; - } - if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.ALL.getValue())) { - return true; - } - if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.EMPLOYEE.getValue()) - && Objects.equals(manageRange.getTargetId(), salaryEmployee.getEmployeeId())) { - return true; - } - if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.DEPT.getValue()) - && Objects.equals(manageRange.getTargetId(), salaryEmployee.getDepartmentId())) { - return true; - } - if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.SUBCOMPANY.getValue()) - && Objects.equals(manageRange.getTargetId(), salaryEmployee.getSubcompanyid())) { - return true; - } - if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.POSITION.getValue()) - && Objects.equals(manageRange.getTargetId(), salaryEmployee.getJobtitleId())) { - return true; - } - return false; - }).collect(Collectors.toList())); + salaryEmployeeList.addAll(salaryEmployees.stream().filter(salaryEmployee -> { + if (StringUtils.isEmpty(manageRange.getEmployeeStatus()) || !manageRange.getEmployeeStatus().contains("\"" + salaryEmployee.getStatus() + "\"")) { + return false; + } + if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.ALL.getValue())) { + return true; + } + if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.EMPLOYEE.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getEmployeeId())) { + return true; + } + if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.DEPT.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getDepartmentId())) { + return true; + } + if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.SUBCOMPANY.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getSubcompanyid())) { + return true; + } + if (Objects.equals(manageRange.getTargetType(), TargetTypeEnum.POSITION.getValue()) && Objects.equals(manageRange.getTargetId(), salaryEmployee.getJobtitleId())) { + return true; + } + return false; + }).collect(Collectors.toList())); } // 去重 salaryEmployeeList = salaryEmployeeList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(DataCollectionEmployee::getEmployeeId))), ArrayList::new)); @@ -213,30 +211,18 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM private PageInfo listPageByParamAndIncludeType(List taxAgentManageRanges, TaxAgentManageRangeQueryParam queryParam, Integer includeType) { // 查询人员信息 - List employeeIds = taxAgentManageRanges.stream() - .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.EMPLOYEE.getValue())) - .map(TaxAgentManageRangePO::getTargetId) - .collect(Collectors.toList()); + List employeeIds = taxAgentManageRanges.stream().filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.EMPLOYEE.getValue())).map(TaxAgentManageRangePO::getTargetId).collect(Collectors.toList()); // List employeeComInfos = comInfoCache.getCacheList(HrmEmployeeComInfo.class, employeeIds); List employeeComInfos = employBiz.getEmployeeByIdsAll(employeeIds); // 查询部门信息 - List departmentIds = taxAgentManageRanges.stream() - .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.DEPT.getValue())) - .map(TaxAgentManageRangePO::getTargetId) - .collect(Collectors.toList()); + List departmentIds = taxAgentManageRanges.stream().filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.DEPT.getValue())).map(TaxAgentManageRangePO::getTargetId).collect(Collectors.toList()); List departmentComInfos = employBiz.getDeptInfoList(departmentIds); // 查询分部信息 - List subDepartmentIds = taxAgentManageRanges.stream() - .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.SUBCOMPANY.getValue())) - .map(TaxAgentManageRangePO::getTargetId) - .collect(Collectors.toList()); + List subDepartmentIds = taxAgentManageRanges.stream().filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.SUBCOMPANY.getValue())).map(TaxAgentManageRangePO::getTargetId).collect(Collectors.toList()); List subDepartmentComInfos = employBiz.getSubCompanyInfoList(subDepartmentIds); // 查询岗位信息 - List positionIds = taxAgentManageRanges.stream() - .filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.POSITION.getValue())) - .map(TaxAgentManageRangePO::getTargetId) - .collect(Collectors.toList()); + List positionIds = taxAgentManageRanges.stream().filter(e -> Objects.equals(e.getTargetType(), TargetTypeEnum.POSITION.getValue())).map(TaxAgentManageRangePO::getTargetId).collect(Collectors.toList()); List positionComInfos = employBiz.listPositionInfo(positionIds); // 分页参数 PageInfo dtoPage = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), TaxAgentManageRangeListDTO.class); @@ -247,9 +233,7 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM List taxAgentManageRangeList = TaxAgentBO.convert2ListDTO(taxAgentManageRanges, employeeComInfos, departmentComInfos, subDepartmentComInfos, positionComInfos, hrmStatusList); // 根据对象名称过滤 if (StringUtils.isNotEmpty(queryParam.getTargetName())) { - taxAgentManageRangeList = taxAgentManageRangeList.stream() - .filter(f -> f.getTargetName().contains(queryParam.getTargetName())) - .collect(Collectors.toList()); + taxAgentManageRangeList = taxAgentManageRangeList.stream().filter(f -> f.getTargetName().contains(queryParam.getTargetName())).collect(Collectors.toList()); } // 填充总数和当页数据 dtoPage.setTotal(taxAgentManageRangeList.size()); @@ -310,9 +294,7 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM allRanges.addAll(result.getNeedInsertTaxAgentManageRanges()); allRanges.addAll(result.getNeedUpdateTaxAgentManageRanges()); // 去重 - allRanges = allRanges.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>( - Comparator.comparing(f -> f.getTaxAgentId() + "." + f.getRangeType() + "." + f.getTargetType() + "." + f.getTargetId() + "." + f.getEmployeeStatus() + "." + f.getIncludeType())) - ), ArrayList::new)); + allRanges = allRanges.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getTaxAgentId() + "." + f.getRangeType() + "." + f.getTargetType() + "." + f.getTargetId() + "." + f.getEmployeeStatus() + "." + f.getIncludeType()))), ArrayList::new)); List salaryEmployees = getEmployMapper().listAll(); List allSalaryEmployees = this.getManageRangeSalaryEmployees(saveParam.getTaxAgentId(), allRanges, salaryEmployees); @@ -326,15 +308,21 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM } /* 同步本地人员范围的关联人员=========================== */ - syncLocalEmp(saveParam.getTaxAgentId(), allSalaryEmployees, null); + if (saveParam.isSync()) { + //同步执行 + syncLocalEmp(saveParam.getTaxAgentId(), allSalaryEmployees, null); + } else { + taskExecutor.execute(() -> { + syncLocalEmp(saveParam.getTaxAgentId(), allSalaryEmployees, null); + }); + } } private void syncLocalEmp(Long taxAgentId, List allSalaryEmployees, List allSubAdminRanges) { - log.info("开始同步人员step"); - taskExecutor.execute(() -> { - syncLocalEmp(taxAgentId, allSalaryEmployees, allSubAdminRanges, (long) user.getUID()); - }); + syncLocalEmp(taxAgentId, allSalaryEmployees, allSubAdminRanges, (long) user.getUID()); + //生成档案 + getSalaryArchiveService(user).handleChangeData(1l); } @@ -449,6 +437,9 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM getTaxAgentEmpService(user).syncTaxAgentEmployee(taxAgentEmpSaveParamList, employeeId); // 同步分管理员的人员 // taxAgentSubAdminEmployeeService.syncTaxAgentSubAdminEmployee(subAdminEmpSaveParamList, employeeId, tenantKey); + + //生成档案 + getSalaryArchiveService(user).handleChangeData(1L); } /** @@ -459,10 +450,7 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM * @return */ private TaxAgentEmpSaveParam getTaxAgentEmpSyncParam(Long taxAgentId, List allSalaryEmployees) { - return TaxAgentEmpSaveParam.builder() - .taxAgentId(taxAgentId) - .salaryEmployeeList(allSalaryEmployees) - .build(); + return TaxAgentEmpSaveParam.builder().taxAgentId(taxAgentId).salaryEmployeeList(allSalaryEmployees).build(); } /** @@ -480,11 +468,7 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM List singSubAdminRanges = allSubAdminRanges.stream().filter(r -> e.equals(r.getTaxAgentSubAdminId())).collect(Collectors.toList()); List subAdminSalaryEmployees = this.getManageRangeSalaryEmployees(taxAgentId, singSubAdminRanges, salaryEmployees); - subAdminEmpSaveParamList.add(TaxAgentSubAdminEmpSaveParam.builder() - .taxAgentId(taxAgentId) - .subAdminId(e) - .salaryEmployeeList(subAdminSalaryEmployees) - .build()); + subAdminEmpSaveParamList.add(TaxAgentSubAdminEmpSaveParam.builder().taxAgentId(taxAgentId).subAdminId(e).salaryEmployeeList(subAdminSalaryEmployees).build()); }); return subAdminEmpSaveParamList; } @@ -519,7 +503,7 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM * @param taxAgentIds */ @Override - public void syncManageRange(List taxAgentIds,String index) { + public void syncManageRange(List taxAgentIds, String index) { // 开始同步 LocalRunnable localRunnable = new LocalRunnable() { @Override From fb39dbe0c444f68599e7162b4fc409629ce8b5bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Wed, 7 Dec 2022 20:16:14 +0800 Subject: [PATCH 57/77] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/impl/TaxAgentManageRangeServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java b/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java index 71feae8df..4e9483bf8 100644 --- a/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxAgentManageRangeServiceImpl.java @@ -322,7 +322,7 @@ public class TaxAgentManageRangeServiceImpl extends Service implements TaxAgentM private void syncLocalEmp(Long taxAgentId, List allSalaryEmployees, List allSubAdminRanges) { syncLocalEmp(taxAgentId, allSalaryEmployees, allSubAdminRanges, (long) user.getUID()); //生成档案 - getSalaryArchiveService(user).handleChangeData(1l); + getSalaryArchiveService(user).handleChangeData(1L); } From c94e28e68c3011572a6835f3870ae29931ba7aff Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 8 Dec 2022 10:10:48 +0800 Subject: [PATCH 58/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E6=A0=B8=E7=AE=97?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E7=9B=B8=E5=85=B3=E4=B8=B4=E6=97=B6=E8=A1=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=88=A0=E9=99=A4=E9=80=BB=E8=BE=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 11 ++++++++++- .../mapper/siaccount/SIAccountDetailTempMapper.java | 7 +++++++ .../mapper/siaccount/SIAccountDetailTempMapper.xml | 13 +++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 752388f6f..16828b51e 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -340,7 +340,10 @@ public class SIAccountBiz extends Service { /* if (allSuccess) {*/ handleData(ids, param, employeeId, tenantKey, currentUserName); /*}*/ - MapperProxyFactory.getProxy(SIAccountDetailTempMapper.class).batchDelAccountTempDetails(ids, param.getBillMonth()); + List> partition = Lists.partition((List) ids, 100); + partition.forEach(part -> { + MapperProxyFactory.getProxy(SIAccountDetailTempMapper.class).batchDelByEmpIdsAndMonthAndPayOrg(part, param.getBillMonth(), param.getPaymentOrganization()); + }); getSalaryAcctProgressService(user).finish(SalaryCacheKey.ACCT_PROGRESS + param.getBillMonth(), true); } catch (Exception e) { @@ -401,6 +404,12 @@ public class SIAccountBiz extends Service { getSalaryAcctProgressService(user).getAndAddCalculatedQty(SalaryCacheKey.ACCT_PROGRESS + billMonth, count >= ids.size() ? count % 50 : 50); } } + //临时表入库前先对(可能存在的)历史数据进行删除 + List> partition = Lists.partition((List) ids, 100); + partition.forEach(part -> { + MapperProxyFactory.getProxy(SIAccountDetailTempMapper.class).batchDelByEmpIdsAndMonthAndPayOrg(part, billMonth, paymentOrganization); + }); + //临时表数据入库 if (CollectionUtils.isNotEmpty(list)) { InsuranceAccountDetailTempPOEncrypt.encryptInsuranceAccountDetailTempPOList(list); List> lists = splitList(list, 40); diff --git a/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.java b/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.java index 539655d4c..75fbefcaa 100644 --- a/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.java +++ b/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.java @@ -21,6 +21,13 @@ public interface SIAccountDetailTempMapper { */ void batchDelAccountTempDetails(@Param("employeeIds") Collection employeeIds, @Param("billMonth") String billMonth); + /** + * 批量删除 + * @param employeeIds + * @param billMonth + */ + void batchDelByEmpIdsAndMonthAndPayOrg(@Param("employeeIds") Collection employeeIds, @Param("billMonth") String billMonth, @Param("paymentOrganization") Long paymentOrganization); + /** * 批量保存 * @param accounts diff --git a/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.xml b/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.xml index 4ff9acfea..f99461416 100644 --- a/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.xml +++ b/src/com/engine/salary/mapper/siaccount/SIAccountDetailTempMapper.xml @@ -111,6 +111,19 @@ + + + UPDATE hrsa_bill_detail_temp + SET delete_type = 1 + WHERE delete_type = 0 + AND bill_month = #{billMonth} + AND payment_organization = #{paymentOrganization} + AND employee_id IN + + #{employeeId} + + + INSERT INTO hrsa_bill_detail_temp From 979bb8266167593b432607e0ed11e7a612f134f4 Mon Sep 17 00:00:00 2001 From: sy Date: Thu, 8 Dec 2022 10:18:27 +0800 Subject: [PATCH 59/77] =?UTF-8?q?=E8=96=AA=E9=85=AC=E7=B3=BB=E7=BB=9F-?= =?UTF-8?q?=E7=A6=8F=E5=88=A9=E5=8F=B0=E8=B4=A6=EF=BC=8C=E8=B0=83=E5=B7=AE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=BF=9D=E5=AD=98=E6=97=B6=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=96=B0=E6=95=B0=E6=8D=AEid=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=9A=84=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/service/impl/SICompensationServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 9bffcc75b..18171a378 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -274,6 +274,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation Map result = new HashMap<>(); List errorList = new ArrayList<>(); + List idList = new ArrayList<>(); //过滤 list = list.stream().collect(Collectors.collectingAndThen( Collectors.toCollection(() -> @@ -346,6 +347,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation insuranceCompensationPO.setUpdateTime(new Date()); getInsuranceCompensationMapper().insert(insuranceCompensationPO); + idList.add(insuranceCompensationPO.getId()); // result.put(param.getOriginId(), insuranceCompensationPO.getId().toString()); } @@ -360,6 +362,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation result.put("data", "存在调差失败项!"); } result.put("errorMessage", errorList); + result.put("successIds", idList); return result; } From 399563088dd22806a6237632dd7d820789427097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 8 Dec 2022 10:49:51 +0800 Subject: [PATCH 60/77] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=94=9F=E6=88=90?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SalaryArchiveExcelServiceImpl.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java index c5cac1001..812613c04 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java @@ -809,10 +809,7 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch List taxAgentRanges = importHandleParam.getTaxAgentRanges(); // List salaryArchiveSobSaves = importHandleParam.getSalaryArchiveSobSaves(); - //新增人员范围 - if (CollectionUtils.isNotEmpty(taxAgentRanges)) { - taxAgentRanges.forEach(getTaxAgentManageRangeService(user)::save); - } + // 新增薪资档案 if (CollectionUtils.isNotEmpty(salaryArchiveSaves)) { // 去除已经存在的,避免重复 @@ -843,5 +840,11 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // if (CollectionUtils.isNotEmpty(salaryArchiveIds) && CollectionUtils.isNotEmpty(salaryArchiveSaves)) { // this.salaryArchiveSobService.saveBatchBySalaryArchiveIdsAndSaves(salaryArchiveIds, salaryArchiveSobSaves, message.getTenantKey()); // } + + + //新增人员范围(会自动生成人员档案) + if (CollectionUtils.isNotEmpty(taxAgentRanges)) { + taxAgentRanges.forEach(getTaxAgentManageRangeService(user)::save); + } } } From ea20dfb9ff96cb1a6fe6d9885749b4a96a3863a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 8 Dec 2022 10:53:51 +0800 Subject: [PATCH 61/77] =?UTF-8?q?fix=E8=B0=83=E8=96=AAaction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/action/CheckEditSalaryAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/engine/salary/action/CheckEditSalaryAction.java b/src/com/engine/salary/action/CheckEditSalaryAction.java index add09b62a..f6b2a7cd3 100644 --- a/src/com/engine/salary/action/CheckEditSalaryAction.java +++ b/src/com/engine/salary/action/CheckEditSalaryAction.java @@ -69,7 +69,7 @@ public class CheckEditSalaryAction implements Action { List errorNotice = (List) map.get("errorNotice"); if (CollectionUtils.isNotEmpty(errorNotice)) { - log.error("调薪检查存在异常 requestId:{} map:{}",requestInfo.getRequestid(), map); + log.error("调薪检查存在异常 requestId:{} ,参数:{}, map:{}", requestInfo.getRequestid(), build, map); List> excelComments = (List>) map.get("errorNotice"); StringBuilder message = new StringBuilder(""); for (Map comments : excelComments) { From fcca6950ac0b81525ae29f29c22f7d2d62000d39 Mon Sep 17 00:00:00 2001 From: fcli Date: Thu, 8 Dec 2022 15:45:15 +0800 Subject: [PATCH 62/77] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salaryBill/bo/SalarySendRangeBO.java | 6 +-- .../SalarySendRangeTargetTypeEnum.java | 2 +- .../impl/SalarySendRangeObjServiceImpl.java | 5 +++ .../impl/SalarySendRangeServiceImpl.java | 9 ++--- .../service/impl/SalarySendServiceImpl.java | 4 +- .../salary/wrapper/SalarySendWrapper.java | 37 ++++--------------- 6 files changed, 24 insertions(+), 39 deletions(-) diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java index 2c7787fbf..74fb8ef3e 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalarySendRangeBO.java @@ -155,9 +155,9 @@ public class SalarySendRangeBO { case POSITION: isInRange = doJudgeInRange(targetType, dto.getJobTitle()); break; - case TAX_AGENT: - isInRange = doJudgeInRange(targetType, dto.getTaxAgentIds()); - break; +// case TAX_AGENT: +// isInRange = doJudgeInRange(targetType, dto.getTaxAgentIds()); +// break; case SUB_COMPANY: isInRange = doJudgeInRange(targetType, dto.getSubCompanyId()); break; diff --git a/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java index 39f9f76f6..3cfe90888 100644 --- a/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java +++ b/src/com/engine/salary/enums/salarysend/SalarySendRangeTargetTypeEnum.java @@ -13,7 +13,7 @@ public enum SalarySendRangeTargetTypeEnum implements BaseEnum { DEPT(2, "部门", 86185), SUB_COMPANY(3, "分部", 107369), POSITION(4, "岗位", 90633), - TAX_AGENT(5, "个税扣缴义务人", 86184), +// TAX_AGENT(5, "个税扣缴义务人", 86184), ALL(0, "所有人", 107729); private final int value; diff --git a/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java index 38da21b98..0bb50b5be 100644 --- a/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendRangeObjServiceImpl.java @@ -13,6 +13,7 @@ import com.engine.salary.enums.salarysend.SalarySendRangeTargetTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.SalarySendRangeObjService; import com.engine.salary.service.SalarySendService; +import com.engine.salary.service.SalarySobService; import org.apache.commons.collections4.CollectionUtils; import java.util.Collection; @@ -33,6 +34,10 @@ public class SalarySendRangeObjServiceImpl extends Service implements SalarySend return ServiceUtil.getService(RolesMembersServiceImpl.class, user); } + private SalarySobService getSalarySobService() { + return ServiceUtil.getService(SalarySobServiceImpl.class, user); + } + private final SalarySendRangeObjBiz salarySendRangeObjBiz = new SalarySendRangeObjBiz(); @Override diff --git a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java index e78b3dab2..d1cd3db78 100644 --- a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java @@ -14,7 +14,6 @@ import com.engine.salary.entity.salaryBill.param.SalarySendRangeQueryParam; import com.engine.salary.entity.salaryBill.param.SalarySendRangeSaveParam; import com.engine.salary.entity.salaryBill.po.SalarySendRangeObj; import com.engine.salary.entity.salaryBill.po.SalarySendRangePO; -import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum; import com.engine.salary.enums.salarysend.SalarySendRangeTargetTypeEnum; import com.engine.salary.enums.salarysend.SalarySendRangeTypeEnum; @@ -134,10 +133,10 @@ public class SalarySendRangeServiceImpl extends Service implements SalarySendRan .stream().findFirst() .map(PositionInfo::getName).orElse(null); break; - case TAX_AGENT: - targetName = Optional.ofNullable(getTaxAgentService().getById(rangeObj.getTargetId())) - .map(TaxAgentPO::getName).orElse(null); - break; +// case TAX_AGENT: +// targetName = Optional.ofNullable(getTaxAgentService().getById(rangeObj.getTargetId())) +// .map(TaxAgentPO::getName).orElse(null); +// break; } return SalarySendRangeObjDTO.builder() .targetType(rangeObj.getTargetType()) diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 429c166ca..e90030326 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -44,6 +44,7 @@ import com.engine.salary.util.JsonUtil; 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.ExcelUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; @@ -493,7 +494,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService } } SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); - List list = salarySendInfoMapper.detailList(queryParam, otherSalaryAcctRecordIds); + List list = MapperProxyFactory.getProxy(SalarySendInfoMapper.class).detailList(queryParam, otherSalaryAcctRecordIds); PageInfo pageInfo = new PageInfo<>(list, SalarySendDetailListDTO.class); return pageInfo; } @@ -613,6 +614,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService SalaryAcctResultPO po = new SalaryAcctResultPO(); po.setDeleteType(0); po.setSalaryAcctRecordId(salaryAccountingId); + po.setEmployeeIds(list.stream().map(SalarySendDetailListDTO::getEmployeeId).collect(Collectors.toList())); List salaryAccountingResults = getSalaryAcctResultMapper().listSome(po); SalaryAcctResultPOEncrypt.decryptList(salaryAccountingResults); // 动态列 diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 572d61e0e..c0e4fb0f0 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -36,7 +36,6 @@ import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; -import com.engine.salary.util.valid.ValidUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; @@ -201,7 +200,7 @@ public class SalarySendWrapper extends Service { conditionItems.add(username); // 个税扣缴义务人 - SearchConditionItem taxAgent = conditionFactory.createCondition(ConditionType.SELECT, 25034, "taxAgent"); + SearchConditionItem taxAgent = conditionFactory.createCondition(ConditionType.SELECT, 25034, "taxAgentId"); taxAgent.setColSpan(2);//定义一行显示条件数,默认值为2,当值为1时标识该条件单独占一行 taxAgent.setFieldcol(16); //条件输入框所占宽度,默认值18 taxAgent.setLabelcol(8); @@ -215,7 +214,7 @@ public class SalarySendWrapper extends Service { conditionItems.add(taxAgent); // 部门 - SearchConditionItem departmentName = conditionFactory.createCondition(ConditionType.BROWSER, 502227, "department", "4"); + SearchConditionItem departmentName = conditionFactory.createCondition(ConditionType.BROWSER, 502227, "departmentIds", "4"); departmentName.setColSpan(2); departmentName.setFieldcol(16); departmentName.setLabelcol(8); @@ -226,7 +225,7 @@ public class SalarySendWrapper extends Service { conditionItems.add(departmentName); // 岗位 - SearchConditionItem position = conditionFactory.createCondition(ConditionType.BROWSER, 502227, "position", "24"); + SearchConditionItem position = conditionFactory.createCondition(ConditionType.BROWSER, 502227, "positionIds", "24"); position.setColSpan(2); position.setFieldcol(16); position.setLabelcol(8); @@ -249,29 +248,16 @@ public class SalarySendWrapper extends Service { status.setLabel("状态"); //设置文本值 这个将覆盖多语言标签的值 conditionItems.add(status); -// //入职日期 -// SearchConditionItem hiredate = conditionFactory.createCondition(ConditionType.RANGEPICKER, 25034, "hiredate"); -// hiredate.setColSpan(2);//定义一行显示条件数,默认值为2,当值为1时标识该条件单独占一行 -// hiredate.setFieldcol(16); //条件输入框所占宽度,默认值18 -// hiredate.setLabelcol(8); -// hiredate.setViewAttr(2); // 编辑权限 1:只读,2:可编辑, 3:必填 默认2 -// Map otherParams1 = new HashMap(); -// otherParams1.put("format", "yyyy-MM-dd"); -// hiredate.setOtherParams(otherParams1); -// hiredate.setInputType("day"); -// hiredate.setMode("day"); -// hiredate.setLabel("入职日期"); //设置文本值 这个将覆盖多语言标签的值 -// conditionItems.add(hiredate); - //发送状态 - SearchConditionItem sendStatus = conditionFactory.createCondition(ConditionType.SELECT, 25034, "sendStatus"); + SearchConditionItem sendStatus = conditionFactory.createCondition(ConditionType.SELECT, 25034, "sendStatusVal"); sendStatus.setColSpan(2);//定义一行显示条件数,默认值为2,当值为1时标识该条件单独占一行 sendStatus.setFieldcol(16); //条件输入框所占宽度,默认值18 sendStatus.setLabelcol(8); List sendStatusOptions = new ArrayList<>(); - UserStatusEnum.getList().forEach(e -> sendStatusOptions.add(new SearchConditionOption(e.get("id"), e.get("content")))); - status.setOptions(sendStatusOptions); - status.setInputType(""); + Arrays.asList(SalarySendStatusEnum.values()) + .forEach(e -> sendStatusOptions.add(new SearchConditionOption(e.getValue().toString(), e.getDefaultLabel()))); + sendStatus.setOptions(sendStatusOptions); + sendStatus.setInputType(""); sendStatus.setViewAttr(2); // 编辑权限 1:只读,2:可编辑, 3:必填 默认2 sendStatus.setLabel("发送状态"); //设置文本值 这个将覆盖多语言标签的值 conditionItems.add(sendStatus); @@ -486,13 +472,6 @@ public class SalarySendWrapper extends Service { // 3.组装详情数据 List> listMaps = getSalarySendService(user).buildDetailList(salaryItems, records, salarySend.getSalaryAccountingId()); -// List employeeIds = records.stream().map(SalarySendDetailListDTO::getEmployeeId).collect(Collectors.toList()); - - // 是否合并计税 - // TODO: 1/25/22 判断是否合并计税 - - - List columns = buildDetailListWeaTableColumns(); for (SalaryTemplateSalaryItemListDTO salaryItem : salaryItems) { From 89574f278b1475a0a2cc53dc1a2261f7efc4c46a Mon Sep 17 00:00:00 2001 From: fcli Date: Thu, 8 Dec 2022 16:31:16 +0800 Subject: [PATCH 63/77] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=8A=A0=E5=BF=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/service/impl/SalarySendServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index e90030326..9eff6e150 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -615,6 +615,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService po.setDeleteType(0); po.setSalaryAcctRecordId(salaryAccountingId); po.setEmployeeIds(list.stream().map(SalarySendDetailListDTO::getEmployeeId).collect(Collectors.toList())); + po.setSalaryItemIds(salaryItems.stream().map(SalaryTemplateSalaryItemListDTO::getSalaryItemId).map(Long::valueOf).collect(Collectors.toList())); List salaryAccountingResults = getSalaryAcctResultMapper().listSome(po); SalaryAcctResultPOEncrypt.decryptList(salaryAccountingResults); // 动态列 From 269bfeee18eec9a5abf0aec19f56b5ce3f5368ca Mon Sep 17 00:00:00 2001 From: fcli Date: Thu, 8 Dec 2022 16:39:57 +0800 Subject: [PATCH 64/77] =?UTF-8?q?feat:=20=E6=9F=A5=E8=AF=A2=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=8A=A0=E5=BF=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/service/impl/SalarySendServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 9eff6e150..e90030326 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -615,7 +615,6 @@ public class SalarySendServiceImpl extends Service implements SalarySendService po.setDeleteType(0); po.setSalaryAcctRecordId(salaryAccountingId); po.setEmployeeIds(list.stream().map(SalarySendDetailListDTO::getEmployeeId).collect(Collectors.toList())); - po.setSalaryItemIds(salaryItems.stream().map(SalaryTemplateSalaryItemListDTO::getSalaryItemId).map(Long::valueOf).collect(Collectors.toList())); List salaryAccountingResults = getSalaryAcctResultMapper().listSome(po); SalaryAcctResultPOEncrypt.decryptList(salaryAccountingResults); // 动态列 From 30e8fd37334ffce5ff4a3527fc6ac8e0b593f7be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 8 Dec 2022 16:48:37 +0800 Subject: [PATCH 65/77] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E4=B8=AD=E4=B8=AA?= =?UTF-8?q?=E7=A8=8E=E6=89=A3=E7=BC=B4=E4=B9=89=E5=8A=A1=E4=BA=BA=E5=B7=B2?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/service/impl/SalaryArchiveExcelServiceImpl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java index c8b90d76d..812613c04 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java @@ -552,8 +552,6 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // 构建导入需要的数据 SalaryArchiveImportHandleParam importHandleParam = buildImportHandleParam(SalaryArchiveImportHandleParam.builder().isProcess(true).listType(param.getListType()).importType(param.getImportType()).build()); - // 设置所有的个税扣缴义务人,由于定薪流程调用者不一定是个税扣缴义务人管理员,防止出现个税扣缴义务人不存在问题。 - importHandleParam.setTaxAgentList(getTaxAgentService(user).listAllTaxAgentAndEmployeeTree()); int total = 0; //excel数据 From 77d30469664d5d13dd6116d7005fb2ddae3cbe13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Thu, 8 Dec 2022 17:48:46 +0800 Subject: [PATCH 66/77] =?UTF-8?q?=E6=89=80=E6=9C=89=E4=B8=AA=E7=A8=8E?= =?UTF-8?q?=E6=89=A3=E7=BC=B4=E4=B9=89=E5=8A=A1=E4=BA=BA=E7=9A=84=E6=A0=91?= =?UTF-8?q?=E5=BD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/service/TaxAgentService.java | 5 +++++ src/com/engine/salary/service/impl/SISchemeServiceImpl.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/com/engine/salary/service/TaxAgentService.java b/src/com/engine/salary/service/TaxAgentService.java index cac92e45c..2890f94b8 100644 --- a/src/com/engine/salary/service/TaxAgentService.java +++ b/src/com/engine/salary/service/TaxAgentService.java @@ -201,6 +201,11 @@ public interface TaxAgentService { List listAllTaxAgentAndEmployeeTree(); + /** + * 获取所有个税扣缴义务人和可查看的人员列表(树型) + * + * @return + */ List listTaxAgentAndEmployeeTree(); /** diff --git a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java index 24a79c9c1..4478d86e9 100644 --- a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java @@ -1374,7 +1374,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { } //获取所有个税扣缴义务人树型 - List taxAgentManageRangeEmployeeTree = getTaxAgentService().listAllTaxAgentAndEmployeeTree(); + List taxAgentManageRangeEmployeeTree = getTaxAgentService().listTaxAgentAndEmployeeTree(); // 获取所有人员信息 List employeeByIds = employeeBiz.listEmployee(); From 389022e0ea8202e05101c2c67646407317ce0037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Fri, 9 Dec 2022 10:12:25 +0800 Subject: [PATCH 67/77] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/WEB-INF/config/MyBatis.xml | 43 +++++++++++++++++++++ resource/WEB-INF/lib/QLExpress-3.2.0.jar | Bin 0 -> 239182 bytes resource/WEB-INF/lib/pagehelper-5.0.0.jar | Bin 0 -> 64807 bytes resource/WEB-INF/prop/hrmSalary.properties | 5 +++ 4 files changed, 48 insertions(+) create mode 100644 resource/WEB-INF/config/MyBatis.xml create mode 100644 resource/WEB-INF/lib/QLExpress-3.2.0.jar create mode 100644 resource/WEB-INF/lib/pagehelper-5.0.0.jar create mode 100644 resource/WEB-INF/prop/hrmSalary.properties diff --git a/resource/WEB-INF/config/MyBatis.xml b/resource/WEB-INF/config/MyBatis.xml new file mode 100644 index 000000000..7de8d02d1 --- /dev/null +++ b/resource/WEB-INF/config/MyBatis.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resource/WEB-INF/lib/QLExpress-3.2.0.jar b/resource/WEB-INF/lib/QLExpress-3.2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..52f48b28979e94c7f852d64d475e6d32bc752377 GIT binary patch literal 239182 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

?%+RwhTGUug*70ai_^2A)*lgzxX( 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
>#DP(W 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 WV2Fl-DguAr2tq;G8GuO+)c*msIU7&_ literal 0 HcmV?d00001 diff --git a/resource/WEB-INF/lib/pagehelper-5.0.0.jar b/resource/WEB-INF/lib/pagehelper-5.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..187266c88e16a5edcc1bfe59dd26ac34198ba202 GIT binary patch literal 64807 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�w!i% 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

I>gysFLDtV8NO!7@O{V-^~ zaLn`aOUrDC|#W+hBirHVhV3xn%T03^2@N{wY6ooxJ1B zoWTztGVi3YAZ1#CCjsr0sks_kP08AcfVL!EN$OQKDbu=!>TDrrZ2SlfTYMA2d^53k zc)GSSwVsgAJ>MBSplZV(^6_`>kp>erhRt&Ld#_7_^eVvE%j}^?vjtcU4zga7YMZ35#TMp-y{CSHfC+sfFRU}qv-dtTbN0m9yEnuQX%7F1@YG|65&T)n^I6GoT;#1N^^ud%T#=6@J&a2z z!%q!VHW{zJ-+l@TO^642(ziQ6TAlyWn^Z4)(T^M#d75J$s^Zw^lN=lJ&7~N(AOh&b z2M1BLq4F^3E0d&jXjYm?X6#sUu@W+zT_A^{IVY6RJ)A_Hz&$XlF$xO`3J&gWFYn;{ zeeG!uJn-YR8|v4Rky9|g&$?^3OV66Pd;UlO(h&UqSEZq6#+k4-W%{i!w{0?q`RHr_Oqvv89ov-`V;M@`>f6O61SPW;|4^d2+jB4p7KW#E-o=+9#ln8 zs_{KH)YTJJ-L2`dSq-2EErp~%qwqJW4`2ork0bY_RO}TnW>FT=K#L3W8(V4&CfzDz zxL1PQ(i5h*HY`FgnE%G+;p6Srie81uu!E5fF&1m~TnY6qDHWqi`{fZ9=)D3{$Ybr-u20rXmP-0?{&ygMP%@r2wO7v!djM z9*s7JBDJGtXik0S5`0^txl~ENcE+-NyjPK$A-p|_0QBz5aY_h9le>#!{y~Z}IDE9F zcl(sb9ZK{j2S@3)`4sCPU_t9QbrqdpfHb`}!SvBQ2^`?+!rwq4&)I=I9HnOT>L|Ab z1nzJ}k={zW1-iWx-_U*_Hp8)WlvFKXQqt$7HiI3bYL(BgW0J0eRjb|#FZ0Z(>UD*n zlSJM=W*8m{C|IjS!=Km@^>u_jh|x)A2Kf=@a-$}M!F*H$=Yhry?<0%@LP5BbFc%0x z=A*O$>60dwUfNWzMUiK_RCdj)--=nppmjOcwc;r`Olg~#QLH|+MbmqeS)uw*5cPSM zC-Y#)1w8b_X(7vc0CmuOs|`&P^Dx*pM0hQEsI8DX{@w9JvGaomGwb z#sas{(k3!OY8F`1T*^J!wCiNtKgibTu+b{yw+0l!bm_4q<+|OS^g*#YfcaAT>5W-O z+*miEirD6vezF&eYD@WJj9_Ieu_ENpJ#+a+S`vBUgpXIh9*5GH-F|L4V#4w`*F>uF z=+1GmG;1X`JaZ;Og>Q$@?OZc|H}h?Ke41{YqUuAd5vEN9=#2A^PVtYO9#f^fW6Ffg zYVaD-T|vh`n7~e^4sOa1ZpL41Sj3W1AM=KGn-aEmQ7B5n5#}xu=_Ohc;b5%}rCX3& znxJ#v)$5?UWo}x@wt$F_`u0$SdVI;&9f_=`Cw<4;Sez|w+0nEp{!?NNb+f{Ta$Lk4 zQ*E7fy(bwov5zgKJEn?j6HiN>J3Nu@JJ;5oz0&B;60}5EX3P!fJdw*elfYdxV*Ua@ z#F{vsVbvyCFXAWc#hGM++^J%XklD#ykfV_crxbm!fU${XBHdVn0X0+Rbd+$RnD$Nl zG~~w``vkM6{UJK*&)OtVkofoT29QuvWeszqmF*BEK4H&4DC3AAVCro<;8>OI%}%am zh3y}utpK%0CtG0Fe!;>@LQkqfHj*)uZVbo^#z@4sLo2ZQq?(2QcF#vVI6Az9=?w>v z#8)<}qm4|m)f7(^-?2FQxgCG1MAJ)~BX>f4l#jf& zF1DToO6E@|z+LRrxUvS@>Ns!@V-lX~#*lIvkyP#~D-38!Or&OkfpN%ziSn`+;K}+@OmVWEX;3aJvnP^a~CGE$Y z%~vGOZ#L{oR(+0j^|2OSQu@jt$lL^p_FtXEi`XsKoy26#a09iE7-xj#b?w_q_)ckI zxKgd)!X!@6Wa?`o0dOL^S#5kXol(fF^W8#n!$mT-MLxrZpIWq{?Z(xTpp;N6GhVyP zW^m{Yu|HUO=`Va=dfj6h@0&7Wm(TuVmo4pgKD~aN0`FXLgc#1&gdp7Cd&)EpA-Bw? zc`nRr!#-}_HLj2?_26Z~k~cmIh~h`~MPlSB#WF}KQ*68sy@qc}pro`Sgp17M2p4LG zue_ZQ^%PmIff>3zxFw}ESG&<<&QAnHF*SY1`CZxrhgl4qmpqQBFT>lZvv)tS__8SQ zG7<1%JVM#}*g9VXIo;@iQAdn^U$Jq&^&6+zNdpKtS(PPjEAY~=EDFJRl&0bx`Me#p z9m_a57oU!2<=aZ(+md8a^ixIb*4zR;1}WuSceYp31q}jlSq^1=b-3t^x*v$cgv-u# z)w|uNAG|Y2PIh|{%M{bObD4)(eB zuilr&rP&d5Yakh_Gy^HsV`|qFOWc;I1CLktQ6dXupeCuGiqr3^Pexr3P**`oI}K2G z5q)_Vrxm267lS!$&F3BSMkms*^KV~6hhHr(&@M)S(V!QkpPD8I?N_0mtSR4sutQ;oGW4D%5Yty(0+R+iXiy6QWkCsJ)dWK<}@yy8lu!6dW+X%~xR%S@UZJM(c2o_Tofqz0Z>B`C6)W_85u3MKV)Hs^#l!2Z z&neC*t#(mik8*`>=|E`?4IRnA6!%Cb%2OW-uja@mqXA*7>SYYuoK2&(pn~u>YpF$~ z`u-+{2+0g#%In5S4^vy072;R-C!^F(o(UCjVj`FT7O-3nfzL0!|Pfmx&!C=%JVK$LM41X#bR4!c+Q<>%S~ zNVi_%9U5;yv}yTG>mx%FaN^UGY4Kb9Ee0`V`PQD~RYR>_b+s&*F~!eMs-$K@ zV=yET7CV+7XQ{-@m%>RLvn{Wa`R$pNI(2jOTA)yK`^x%$V);az$@!44C4Z8rW~Y?6 zLF<8W(E=|a5c5ra0^cKbbzb^d?tQtrzN9hb+z2oIMyY-^*gd@U9!G-*kH%o~kal`f zUBP4Ix@x5?1IIxvd~4cK@5?jAeV;MAX#0pqVUp--SPbSOM|GAvEwD+rr)=P&r=0TG zszi2;fXWD@^p{^{1U8jpXIijAMPWhkFdO;3UvQUWBdel&26fC%R%<)Jzu(`%A*UmI zKcX>3?+bervBBn|B4#%=jH(kgh3bl#g5KJz%7!M!H(njhRBA-su^mofS)HEuq6`Is zpZhX=wuLr@u}5s?$!vTSs}H;iJ^n(!PhRxzhyv4f9A)#!Po1QR?G==;?LCU6foHcID(-LOR}UEmY&8drqQ(r{2? z2${(cJ;W4|bOO;pha65F+{zP@ye*vIYS^}oUZ`re^d&f04;k__EXS>=NU3O(mcemH z1J;DlxVLHven=~0FqZl3q~ymmgNKycUWZWV&ll*3Eh`ru=CYCU9`mq3&G9h%`SDKl zMsXmbNbdFBvFx_b2B#o2$EDn-PCsO0{(?Aoh$4vBw~M|t7d|PUR43$G*I~Qf>b}nU zg);-0P7Jkt%_M0h0>uIQsrS-776}p?r<2Lv^%Uiduvcg!it+YPRO%8(l%?jo{V-+h zI^a|Jd}&*up0~==%h-mbr!6r1w9?$F`&mBn^zs~{Z}#C@^ei&J;&$mk%U^!AL6)%c zyvx4RZLGK&%jq4ojfZw#`I{-;>CaZUtVsAdC(SL>D7^+vh;tNJ?aM1DtAa+JDbjf6 zh9qUU6#9d4GTp~3J5(CgFoQuJbEXG}m;&;_i$Y#bD`5bU~IKoZ#rT32q(-9Tpo(%Xp3&Bd_GJcBYxu zP*R+%JgIu*b()B7A#-jT;S#~ktvCtaA%ux37RZ7H#0E;_K`_CIU?Yr0R4Gqgu>4s3XbA>5=Cjo@*1yyddL5&FIT%uC*=>swQvIB zTKqW^=RXU6s;{F6gY!bTThd}?~mfFrSuXWU5pnRQm)PSY27+)5C9le{X zhOF#+<2i%b+nzgf;?c0NgeS^v)NBDea~!;^ysTUGE57&Z>mf(m65t7dWj!W4k>)6n zHlzz;njVf+WqaHdod!-t^R^C?7CBCsbFDJk0QAelBqWqp=J(D&;Ee|Wz8wJ;M8emxWmu;2nJT{Mj`{OF8wM% zN)Ir3aW!FjX$1*JJ0o{9`(Nu)|9LU_e_m|jV8>u#%-{(4@0Mn^jzC~8VLcNPB;z$ov_rk z?wzRmPUM_bRC%~7=Z!w8cvNKy>#qOl*~>KINC%v@Qy;ifD7R3k519;w$|+EfvS67! z3m)!y2L}&@A%{TlJKoKi^fj7(Ah<;|L3-9WHFX@w{Os+@E2oHj@f_yGN3Xz?V?xMC z>Zx(XxbC!cW#1QrGxl3Rc48yqCc|!OL=PsLYiRI>7P?ojka36j zo8K^L8EGRJuBDgr{Sc;vHb?M7;j&l}OzMrUj-Cqke2!JN*jmN+c6i(b!`7U4dDUwp z+}{&mZ!Pqr<@=2Dt&wC|rr=Gw4D(4Wws9ZzTdBEp+#k38l!Q-Pb<-(#b5*a7<@5uDK z^nknON%tY{JU|S;{Z+HVyo;GV#CX+2vq3JMhMfRSzr`E5Vlz?A zv2SWB#tgIcb0Ju9S^3s3!dZJU(Um3@zi~(d=ivkrS4O)-G*1Q{t5>NmsE6b$%E%1S zI}olmCGR5^afo6cwSkdq8sD2R^|B%yAJetAMmE_1P9#%i`xC4cJ?`_4gV$|v>3KdH z9m8MFg;l6It8PH@-(XkUe`Vxc_OO@_yoqeuaw2NOs9YNQ~Q{%6roSdj?m+nVdWVR@xG& zLR42~;dy(DZxqA(a=jGsvg-|IU$|6w)(G*oLdM{hf|Xns;?N?v8PT220z$kctLFvZ7q`{Ad4x`C0=)JA8^#wD$GipYBS6?c>U zZoS<}x3)HMu(Oo=2(!90qKu)kY;u)+>nUPv;OVASz+*1q$$1?RP-yye?=$1s>9NE4 z&f$Pz0OR)H(Z_dZo43!szqT3}-2b-HWpFC4tjmA?+5hd)daLF;zn!m~FYoVKxROxP zI?o5JIJ`R<`p_rf_qEnw9kTo61D5~0qZ0?szVm}G8J}Gmts~zG)2U%Hb8Lq{N9;h2 zOLg?&x)u6@cT|Nfi-Ljbk)#7Hek8as1Op1^w@ypc4vzTj1h!ds$@PrjCQL~wScY(k zEGw2ATyI5eC? z_)frj69`@2g@yy$pY`q(gl7*}b{?`SDNp5YQOJ!B85EWJHU_nm&r=8W=YzOzX@S{m z>Gv7$L~}f-Ey_$BfyXs~g4^Wb5-QC&wvC9wjMz6dRf8qQk7fQm%M=j4-<$pB_3#~u z>30#3HV#^L4h8Nrbj>S7Oy&~X?ClwqQ8n+gmaY7cBy1GY_x(q|S;%%3iQ7yXm8JR; z!`ivw3y~&1`S!7M5ghq2E}R2&On^bBBT!12bVsV~CBkx3C_Yi}yx)UXwqb+KEF8E} z@RF)B5-#3*tQ!+LXP&IEshv&6d(SpLlhtG~l=&_hPtS??)t0+%^*aN%$ zOD{twEw3z9sJ1OnC)+c>sPe6+Pjy?STa}4Pg^8_{y?q~K`{+8U|PdZ?x7=N4t?XgcL&?}u(?GfIcLGboKgu1j4dIKQzr4`PYH(mhfV(;i4a499To3_#&@Zn1 zQF1|)z^`A`t8iC zf7JNy^xjwz^JhJ<3o0yN=5#^zqv93+_Rr)%%I+WK0z>wX7$!z0mS#6f1H?`L7gF#a zkxZ?OY=MIsH)35(1iqIGsT%())~{*7pB25>^S*?H0;ZV1H`Y(_oEG;U^;SoeP2l{`>p;@GnpaBNHIj zzSr-uXY@=3w*VB%AEz9D!smjVfJxj<*phBW?nXCAEf?=lI1QwwLC5S;Z2^f0iG^?T@_4O7_I#nl2j(uNb8_GFe&Q zX4?iVRt+e{{)^|L3AqvdH>Mw>gP1YPjTAvCdz^g$MF>E_b%mme^e-u-T%2r8jc;U$ z(diO|2TV2&u<%@AnFMm5-fXfTid-bzbGEbcypac?_cKQ~piKRYm|+1b^xQeCL8b z0n0sq#R4dzYUb>2=FGyxd~++XUQuPT2h>?b1_R^0LPo>(|0TOoD}SugF;>8K>;ReY z6`~!WUEHkI<--YR)PL83*tdrLmjENS0!9?OLKg^let%2%y@CH7BVm5xOF}?F96&*d zD~w%$zJJU3v$6jjr+h9H`#hj!51^&!6;65azvuj?;r|`sNga8z6`*7spyXAv#!LM@ z;rCAPcZ?RPpFiIM7zqJJ*()mQ%Kbg#l@9TD#KiW5@tnW|iwGF(C9e?oDgF<{e@7}W zvIKV#>$(@vnDh#%joP0`Z|ruW9cr4s08k9@xe7?4@h3oORkI71_4kij5mU*8i-67w zfD3oA`uwxxf~Nln_}v`@d_rM2SBD$Ll}3EVLJAn23NZS`p2*LV3&Jz|leoXofn(8@ z4yL~s8;cT0^bi1k0r+HBfkUnSD=-jI%*gJ?0nzKup8vq+p$H%?1>gY?{S+7Y&INVa z{|Q(LFvai1yq??rCtxl}8kn^Heh|4pyO!zwx{%jXj$gvU``iTk-6#6JsMj;*USd9e za1-Wb{@m+QUe8H&i5L@oGvc)jRo8*9N07e+=1#u}_*b9(y#=nvHot`ZmhmUp8zP-w zm->42yGwZ1!v6yQYqn>5nhi*i@=zZ6Z*8`1O6? zOW^-p0=n3G{9f*Wou7|Q{cA1f=SJk^a>4cWBl4ehfrQnm^dB3S|0cPx%JntEOOn9lzqHD~RJb6yTrpIV Wg$BHsi@5_ASQ9YwRb09F>;C` Date: Fri, 9 Dec 2022 15:28:29 +0800 Subject: [PATCH 68/77] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/WEB-INF/config/MyBatis.xml | 1 - .../impl/AddUpDeductionServiceImpl.java | 3 +-- .../impl/AddUpSituationServiceImpl.java | 8 ++++--- .../impl/AttendQuoteDataServiceImpl.java | 23 +++++++++--------- .../salary/util/page/SalaryPageUtil.java | 24 ++++++++++++++++++- 5 files changed, 40 insertions(+), 19 deletions(-) diff --git a/resource/WEB-INF/config/MyBatis.xml b/resource/WEB-INF/config/MyBatis.xml index 7de8d02d1..31cc6f0dd 100644 --- a/resource/WEB-INF/config/MyBatis.xml +++ b/resource/WEB-INF/config/MyBatis.xml @@ -9,7 +9,6 @@ - diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index 6bfa10eff..7130b96fc 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -855,10 +855,9 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpDeductionMapper().list(queryParam); AddUpDeductionStrDTOEncrypt.decryptAddUpDeductionList(list); - return new PageInfo<>(list, AddUpDeductionDTO.class); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, AddUpDeductionDTO.class); } @Override diff --git a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java index ee52107f4..83ab197ac 100644 --- a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java @@ -15,7 +15,10 @@ import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AddUpSituationDTO; import com.engine.salary.entity.datacollection.dto.AddUpSituationRecordDTO; -import com.engine.salary.entity.datacollection.param.*; +import com.engine.salary.entity.datacollection.param.AddUpSituationDeleteParam; +import com.engine.salary.entity.datacollection.param.AddUpSituationImportParam; +import com.engine.salary.entity.datacollection.param.AddUpSituationParam; +import com.engine.salary.entity.datacollection.param.AddUpSituationQueryParam; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; @@ -196,10 +199,9 @@ public class AddUpSituationServiceImpl extends Service implements AddUpSituation } queryParam.setTaxAgentIds(taxAgentIdsAsAdmin); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpSituationMapper().list(queryParam); AddUpSituationDTOEncrypt.decryptAddUpSituationDTOList(list); - return new PageInfo<>(list, AddUpSituationDTO.class); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, AddUpSituationDTO.class); } diff --git a/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java b/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java index d2865804d..fbaf62b40 100644 --- a/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java +++ b/src/com/engine/salary/service/impl/AttendQuoteDataServiceImpl.java @@ -134,9 +134,8 @@ public class AttendQuoteDataServiceImpl extends Service implements AttendQuoteDa OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAttendQuoteDataMapper().list(queryParam); - PageInfo page = new PageInfo(list); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, AttendQuoteDataBaseDTO.class); return page; } @@ -487,7 +486,7 @@ public class AttendQuoteDataServiceImpl extends Service implements AttendQuoteDa if (CollectionUtils.isNotEmpty(values)) { log.info("考勤数据:{}", values); //去除空值 - values = values.stream().filter(po->StringUtils.isNotBlank(po.getDataValue())).collect(Collectors.toList()); + values = values.stream().filter(po -> StringUtils.isNotBlank(po.getDataValue())).collect(Collectors.toList()); dataValueBiz.insertData(values); } } @@ -785,8 +784,8 @@ public class AttendQuoteDataServiceImpl extends Service implements AttendQuoteDa } /** - * @description 编辑数据 * @return null + * @description 编辑数据 * @author Harryxzy * @date 2022/10/28 14:40 */ @@ -799,33 +798,33 @@ public class AttendQuoteDataServiceImpl extends Service implements AttendQuoteDa ids.add(attendQuoteDataEditParam.getId()); AttendQuoteDataQueryParam build = AttendQuoteDataQueryParam.builder().ids(ids).build(); List list = dataBiz.list(build); - if(list == null || list.size() == 0){ + if (list == null || list.size() == 0) { throw new SalaryRunTimeException("该数据不存在!"); } Map attendQuoteFieldData = new HashMap<>(); - for(Map.Entry entrySet:attendQuoteData.entrySet()){ + for (Map.Entry entrySet : attendQuoteData.entrySet()) { String[] s = entrySet.getKey().split("_"); - attendQuoteFieldData.put(s[0],entrySet.getValue()); + attendQuoteFieldData.put(s[0], entrySet.getValue()); } - for(Map.Entry entrySet : attendQuoteFieldData.entrySet()){ + for (Map.Entry entrySet : attendQuoteFieldData.entrySet()) { AttendQuoteDataValuePO updatePO = AttendQuoteDataValuePO.builder().employeeId(list.get(0).getEmployeeId()).attendQuoteFieldId(SalaryEntityUtil.string2Long(entrySet.getKey())).dataValue(entrySet.getValue()).build(); attendQuoteDataValueBiz.updateDataValue(updatePO); } } /** - * @description 获取数据 * @return void + * @description 获取数据 * @author Harryxzy * @date 2022/10/31 14:12 */ @Override - public Map getData(AttendQuoteDataEditParam attendQuoteDataEditParam) { + public Map getData(AttendQuoteDataEditParam attendQuoteDataEditParam) { ArrayList ids = new ArrayList<>(); ids.add(attendQuoteDataEditParam.getId()); AttendQuoteDataQueryParam build = AttendQuoteDataQueryParam.builder().ids(ids).build(); List list = dataBiz.list(build); - if(list==null || list.size()==0){ + if (list == null || list.size() == 0) { throw new SalaryRunTimeException("该数据不存在!"); } // 所有考勤字段 @@ -853,7 +852,7 @@ public class AttendQuoteDataServiceImpl extends Service implements AttendQuoteDa result.putAll(weaTable.makeDataResult()); result.success(); Map datas = new HashMap<>(); - datas.put("data",listMaps.get(0)); + datas.put("data", listMaps.get(0)); datas.put("dataKey", result.getResultMap()); return datas; } diff --git a/src/com/engine/salary/util/page/SalaryPageUtil.java b/src/com/engine/salary/util/page/SalaryPageUtil.java index bbb2917d5..58bca7ddf 100644 --- a/src/com/engine/salary/util/page/SalaryPageUtil.java +++ b/src/com/engine/salary/util/page/SalaryPageUtil.java @@ -27,7 +27,7 @@ public class SalaryPageUtil { return pageInfo; } - public static PageInfo buildPage(Integer pageNo, Integer pageSize,Class clazz) { + public static PageInfo buildPage(Integer pageNo, Integer pageSize, Class clazz) { pageNo = pageNo == null || pageNo <= 0 ? 1 : pageNo; pageSize = pageSize == null || pageSize <= 0 ? 10 : pageSize; PageInfo pageInfo = new PageInfo<>(clazz); @@ -37,6 +37,28 @@ public class SalaryPageUtil { return pageInfo; } + /** + * 内存分页 + * + * @param pageNo + * @param pageSize + * @param source + * @param clazz + * @param + * @return + */ + public static PageInfo buildPage(Integer pageNo, Integer pageSize, List source, Class clazz) { + pageNo = pageNo == null || pageNo <= 0 ? 1 : pageNo; + pageSize = pageSize == null || pageSize <= 0 ? 10 : pageSize; + PageInfo pageInfo = new PageInfo<>(clazz); + pageInfo.setPageNum(pageNo); + pageInfo.setPageSize(pageSize); + pageInfo.setTotal(source == null ? 0 : source.size()); + pageInfo.setList(subList(pageNo, pageSize, source)); + return pageInfo; + } + + /** * 分页 * From 8dc2ddc3c8a0e9e9fdf8c62fae5e69792df2e13e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 12 Dec 2022 09:37:15 +0800 Subject: [PATCH 69/77] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/annotation/Encrypt.java | 20 +++ .../engine/salary/biz/AddUpDeductionBiz.java | 10 +- .../engine/salary/encrypt/EncryptSetting.java | 16 +++ .../engine/salary/encrypt/EncryptUtil.java | 131 ++++++++++++++++++ .../entity/datacollection/AddUpDeduction.java | 7 + .../datacollection/dto/AddUpDeductionDTO.java | 12 +- .../impl/AddUpDeductionServiceImpl.java | 6 +- .../service/impl/TaxAgentServiceImpl.java | 6 - .../sys/service/SalarySysConfService.java | 2 + .../impl/SalarySysConfServiceImpl.java | 24 ++-- 10 files changed, 207 insertions(+), 27 deletions(-) create mode 100644 src/com/engine/salary/annotation/Encrypt.java create mode 100644 src/com/engine/salary/encrypt/EncryptSetting.java create mode 100644 src/com/engine/salary/encrypt/EncryptUtil.java diff --git a/src/com/engine/salary/annotation/Encrypt.java b/src/com/engine/salary/annotation/Encrypt.java new file mode 100644 index 000000000..c61e1de44 --- /dev/null +++ b/src/com/engine/salary/annotation/Encrypt.java @@ -0,0 +1,20 @@ +package com.engine.salary.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 加密字段,用于标注需加解密的字段 + *

Copyright: Copyright (c) 2022

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Encrypt { + +} diff --git a/src/com/engine/salary/biz/AddUpDeductionBiz.java b/src/com/engine/salary/biz/AddUpDeductionBiz.java index ba1b48ef7..617cda617 100644 --- a/src/com/engine/salary/biz/AddUpDeductionBiz.java +++ b/src/com/engine/salary/biz/AddUpDeductionBiz.java @@ -1,5 +1,6 @@ package com.engine.salary.biz; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.datacollection.AddUpDeductionEncrypt; import com.engine.salary.encrypt.datacollection.AddUpDeductionRecordStrDTOEncrypt; import com.engine.salary.encrypt.datacollection.AddUpDeductionStrDTOEncrypt; @@ -19,6 +20,8 @@ import java.util.stream.Collectors; public class AddUpDeductionBiz extends BaseBean { + private final EncryptUtil encryptUtil = new EncryptUtil(); + /** * 关联查询查询列表 @@ -49,7 +52,7 @@ public class AddUpDeductionBiz extends BaseBean { try { AddUpDeductionMapper mapper = sqlSession.getMapper(AddUpDeductionMapper.class); List addUpDeductions = mapper.listSome(param); - return AddUpDeductionEncrypt.decryptAddUpDeductionList(addUpDeductions); + return encryptUtil.decryptList(addUpDeductions, AddUpDeduction.class); } finally { sqlSession.close(); } @@ -135,11 +138,6 @@ public class AddUpDeductionBiz extends BaseBean { } - - - - - /** * 处理导入数据 * diff --git a/src/com/engine/salary/encrypt/EncryptSetting.java b/src/com/engine/salary/encrypt/EncryptSetting.java new file mode 100644 index 000000000..4954537fd --- /dev/null +++ b/src/com/engine/salary/encrypt/EncryptSetting.java @@ -0,0 +1,16 @@ +package com.engine.salary.encrypt; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EncryptSetting { + + public boolean open; + +} \ No newline at end of file diff --git a/src/com/engine/salary/encrypt/EncryptUtil.java b/src/com/engine/salary/encrypt/EncryptUtil.java new file mode 100644 index 000000000..8cc5c0606 --- /dev/null +++ b/src/com/engine/salary/encrypt/EncryptUtil.java @@ -0,0 +1,131 @@ +package com.engine.salary.encrypt; + + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.annotation.Encrypt; +import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import weaver.hrm.User; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +public class EncryptUtil { + + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + + public T encrypt(T data, Class clazz) { + boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); + if (!encryptIsOpen) { + return data; + } + try { + List fieldList = Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.isAnnotationPresent(Encrypt.class)).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(fieldList)) { + for (Field field : fieldList) { + Field declaredField = data.getClass().getDeclaredField(field.getName()); + declaredField.setAccessible(true); + String fieldValue = (String) declaredField.get(data); + if (StringUtils.isNotBlank(fieldValue)) { + String encryptValue = AESEncryptUtil.encrypt(fieldValue); + declaredField.set(data, encryptValue); + } + } + } + return data; + } catch (Exception e) { + log.error("加密异常", e); + throw new SalaryRunTimeException("加密异常"); + } + } + + public List encryptList(List dataList, Class clazz) { + boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); + if (!encryptIsOpen) { + return dataList; + } + try { + List fieldList = Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.isAnnotationPresent(Encrypt.class)).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(fieldList)) { + List> values = new ArrayList<>(); + for (T data : dataList) { + for (Field field : fieldList) { + Field declaredField = data.getClass().getDeclaredField(field.getName()); + declaredField.setAccessible(true); + String fieldValue = (String) declaredField.get(data); + if (StringUtils.isNotBlank(fieldValue)) { + String encryptValue = AESEncryptUtil.encrypt(fieldValue); + declaredField.set(data, encryptValue); + } + } + } + + } + return dataList; + } catch (Exception e) { + log.error("批量加密异常", e); + throw new SalaryRunTimeException("批量加密异常"); + } + } + + public T decrypt(T data, Class clazz) { + boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); + if (!encryptIsOpen) { + return data; + } + try { + List fieldList = Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.isAnnotationPresent(Encrypt.class)).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(fieldList)) { + for (Field field : fieldList) { + Field declaredField = data.getClass().getDeclaredField(field.getName()); + declaredField.setAccessible(true); + String fieldValue = (String) declaredField.get(data); + if (StringUtils.isNotBlank(fieldValue)) { + String encryptValue = AESEncryptUtil.decrypt(fieldValue); + declaredField.set(data, encryptValue); + } + } + } + return data; + } catch (Exception e) { + log.error("解密异常", e); + throw new SalaryRunTimeException("解密异常"); + } + } + + public List decryptList(List dataList, Class clazz) { + boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); + if (!encryptIsOpen) { + return dataList; + } + try { + List fieldList = Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.isAnnotationPresent(Encrypt.class)).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(fieldList)) { + for (T data : dataList) { + for (Field field : fieldList) { + Field declaredField = data.getClass().getDeclaredField(field.getName()); + declaredField.setAccessible(true); + String fieldValue = (String) declaredField.get(data); + if (StringUtils.isNotBlank(fieldValue)) { + String encryptValue = AESEncryptUtil.decrypt(fieldValue); + declaredField.set(data, encryptValue); + } + } + } + } + return dataList; + } catch (Exception e) { + log.error("批量解密异常", e); + throw new SalaryRunTimeException("批量解密异常"); + } + } + +} diff --git a/src/com/engine/salary/entity/datacollection/AddUpDeduction.java b/src/com/engine/salary/entity/datacollection/AddUpDeduction.java index 98bcea5f1..6e714885d 100644 --- a/src/com/engine/salary/entity/datacollection/AddUpDeduction.java +++ b/src/com/engine/salary/entity/datacollection/AddUpDeduction.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.datacollection; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryFormulaVar; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,36 +43,42 @@ public class AddUpDeduction { * 累计子女教育 */ @SalaryFormulaVar(defaultLabel = "累计子女教育", labelId = 86321, dataType = "number") + @Encrypt private String addUpChildEducation; /** * 累计继续教育 */ @SalaryFormulaVar(defaultLabel = "累计继续教育", labelId = 86323, dataType = "number") + @Encrypt private String addUpContinuingEducation; /** * 累计住房贷款利息 */ @SalaryFormulaVar(defaultLabel = "累计住房贷款利息", labelId = 86324, dataType = "number") + @Encrypt private String addUpHousingLoanInterest; /** * 累计住房租金 */ @SalaryFormulaVar(defaultLabel = "累计住房租金", labelId = 86325, dataType = "number") + @Encrypt private String addUpHousingRent; /** * 累计赡养老人 */ @SalaryFormulaVar(defaultLabel = "累计赡养老人", labelId = 86326, dataType = "number") + @Encrypt private String addUpSupportElderly; /** * 累计大病医疗 */ @SalaryFormulaVar(defaultLabel = "累计大病医疗", labelId = 105142, dataType = "number") + @Encrypt private String addUpIllnessMedical; /** diff --git a/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionDTO.java b/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionDTO.java index f618c3f1c..c44181818 100644 --- a/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionDTO.java @@ -1,10 +1,7 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; -import com.engine.salary.annotation.SalaryTable; -import com.engine.salary.annotation.SalaryTableColumn; -import com.engine.salary.annotation.SalaryTableOperate; -import com.engine.salary.annotation.TableTitle; +import com.engine.salary.annotation.*; import com.engine.salary.util.excel.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; @@ -108,6 +105,7 @@ public class AddUpDeductionDTO { @ExcelProperty(index = 7, msg = "第8列,累计子女教育解析错误,请输入数字") @SalaryTableColumn(text = "累计子女教育", width = "10%", column = "addUpChildEducation") @TableTitle(title = "累计子女教育", dataIndex = "addUpChildEducation", key = "addUpChildEducation") + @Encrypt private String addUpChildEducation; /** @@ -116,6 +114,7 @@ public class AddUpDeductionDTO { @ExcelProperty(index = 8, msg = "第9列,累计继续教育教育解析错误,请输入数字") @SalaryTableColumn(text = "累计继续教育", width = "10%", column = "addUpContinuingEducation") @TableTitle(title = "累计继续教育", dataIndex = "addUpContinuingEducation", key = "addUpContinuingEducation") + @Encrypt private String addUpContinuingEducation; /** @@ -124,6 +123,7 @@ public class AddUpDeductionDTO { @ExcelProperty(index = 9, msg = "第10列,累计住房贷款利息解析错误,请输入数字") @SalaryTableColumn(text = "累计住房贷款利息", width = "10%", column = "addUpHousingLoanInterest") @TableTitle(title = "累计住房贷款利息", dataIndex = "addUpHousingLoanInterest", key = "addUpHousingLoanInterest") + @Encrypt private String addUpHousingLoanInterest; /** @@ -132,6 +132,7 @@ public class AddUpDeductionDTO { @ExcelProperty(index = 10, msg = "第11列,累计住房租金解析错误,请输入数字") @SalaryTableColumn(text = "累计住房租金", width = "10%", column = "addUpHousingRent") @TableTitle(title = "累计住房租金", dataIndex = "addUpHousingRent", key = "addUpHousingRent") + @Encrypt private String addUpHousingRent; /** @@ -140,6 +141,7 @@ public class AddUpDeductionDTO { @ExcelProperty(index = 11, msg = "第12列,累计赡养老人解析错误,请输入数字") @SalaryTableColumn(text = "累计赡养老人", width = "10%", column = "addUpSupportElderly") @TableTitle(title = "累计赡养老人", dataIndex = "addUpSupportElderly", key = "addUpSupportElderly") + @Encrypt private String addUpSupportElderly; /** @@ -148,11 +150,13 @@ public class AddUpDeductionDTO { @ExcelProperty(index = 12, msg = "第13列,累计大病医疗解析错误,请输入数字") @SalaryTableColumn(text = "累计大病医疗", width = "10%", column = "addUpIllnessMedical") @TableTitle(title = "累计大病医疗", dataIndex = "addUpIllnessMedical", key = "addUpIllnessMedical") + @Encrypt private String addUpIllnessMedical; @ExcelProperty(index = 13, msg = "第14列,累计婴幼儿照护解析错误,请输入数字") @SalaryTableColumn(text = "累计婴幼儿照护", width = "10%", column = "addUpInfantCare") @TableTitle(title = "累计婴幼儿照护", dataIndex = "addUpInfantCare", key = "addUpInfantCare") + @Encrypt private String addUpInfantCare; @SalaryTableColumn(text = "操作", width = "20%", column = "operate") diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index 6bfa10eff..57a854a1d 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -12,9 +12,9 @@ import com.engine.core.impl.Service; import com.engine.salary.biz.AddUpDeductionBiz; import com.engine.salary.biz.EmployBiz; import com.engine.salary.common.LocalDateRange; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.datacollection.AddUpDeductionEncrypt; import com.engine.salary.encrypt.datacollection.AddUpDeductionRecordStrDTOEncrypt; -import com.engine.salary.encrypt.datacollection.AddUpDeductionStrDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AddUpDeductionDTO; @@ -857,8 +857,8 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpDeductionMapper().list(queryParam); - AddUpDeductionStrDTOEncrypt.decryptAddUpDeductionList(list); - return new PageInfo<>(list, AddUpDeductionDTO.class); + List addUpDeductionDTOS = new EncryptUtil().decryptList(list, AddUpDeductionDTO.class); + return new PageInfo<>(addUpDeductionDTOS, AddUpDeductionDTO.class); } @Override diff --git a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java index 0d1a32b54..2344db967 100644 --- a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java @@ -5,9 +5,6 @@ import com.engine.common.service.impl.HrmCommonServiceImpl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.constant.SalaryAuthConstant; -import com.engine.salary.encrypt.datacollection.AddUpDeductionEncrypt; -import com.engine.salary.encrypt.datacollection.AddUpSituationEncrypt; -import com.engine.salary.encrypt.datacollection.OtherDeductionPOEncrypt; import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; @@ -493,19 +490,16 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { // 被累计专项附加扣除引用 List addUpDeductionList = getAddUpDeductionMapper().listSome(AddUpDeduction.builder().taxAgentIds(Collections.singleton(id)).build()); - AddUpDeductionEncrypt.decryptAddUpDeductionList(addUpDeductionList); if (CollectionUtils.isNotEmpty(addUpDeductionList)) { throw new SalaryRunTimeException("存在累计专项附加扣除引用"); } // 被其他免税扣除引用 List otherDeductionList = getOtherDeductionMapper().listSome(OtherDeductionPO.builder().taxAgentIds(Collections.singleton(id)).build()); - OtherDeductionPOEncrypt.decryptOtherDeductionPOList(otherDeductionList); if (CollectionUtils.isNotEmpty(otherDeductionList)) { throw new SalaryRunTimeException("存在其他免税扣除引用"); } // 被往期累计情况引用 List addUpSituationList = getAddUpSituationMapper().listSome(AddUpSituation.builder().taxAgentIds(Collections.singleton(id)).build()); - AddUpSituationEncrypt.decryptAddUpSituationList(addUpSituationList); if (CollectionUtils.isNotEmpty(addUpSituationList)) { throw new SalaryRunTimeException("存在往期累计情况引用"); } diff --git a/src/com/engine/salary/sys/service/SalarySysConfService.java b/src/com/engine/salary/sys/service/SalarySysConfService.java index 87b3323e9..ab1ae6a9e 100644 --- a/src/com/engine/salary/sys/service/SalarySysConfService.java +++ b/src/com/engine/salary/sys/service/SalarySysConfService.java @@ -81,6 +81,8 @@ public interface SalarySysConfService { */ Map getEncryptProgress(String progressId); + boolean encryptIsOpen(); + /** * @description 获取个税申报功能重启日期 * @return Date diff --git a/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java b/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java index 40a269b3f..5f2781b09 100644 --- a/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java +++ b/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java @@ -134,7 +134,6 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe return MapperProxyFactory.getProxy(SpecialAddDeductionMapper.class); } - static SalarySysConfServiceImpl salarySysConfService = new SalarySysConfServiceImpl(); /** * 操作是否需要申报功能 @@ -173,14 +172,14 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe } /** - * @description 获取申报功能状态 * @return Boolean + * @description 获取申报功能状态 * @author Harryxzy * @date 2022/11/7 17:05 */ - public TaxDeclarationFunctionEnum getTaxDeclaration(){ - SalarySysConfPO taxDeclarationFunction = salarySysConfService.getOneByCode(TAX_DECLARATION_FUNCTION); - if(taxDeclarationFunction == null){ + public TaxDeclarationFunctionEnum getTaxDeclaration() { + SalarySysConfPO taxDeclarationFunction = getOneByCode(TAX_DECLARATION_FUNCTION); + if (taxDeclarationFunction == null) { // 默认开启 return TaxDeclarationFunctionEnum.OPEN; } @@ -331,7 +330,7 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe resultMap.put("isSuccess", true); String progressId = UUID.randomUUID().toString(); resultMap.put("progressId", progressId); - SalarySysConfPO sysConfPo = salarySysConfService.getOneByCode(SalarySysConstant.OPEN_APPLICATION_ENCRYPT); + SalarySysConfPO sysConfPo = getOneByCode(SalarySysConstant.OPEN_APPLICATION_ENCRYPT); if (ObjectUtils.isNotEmpty(sysConfPo) && sysConfPo.getConfValue().equals(param.getIsOpenEncrypt())) { return resultMap; } else if (ObjectUtils.isEmpty(sysConfPo) && OpenEnum.OPEN.getValue().equals(param.getIsOpenEncrypt())) { @@ -377,6 +376,15 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe } } + @Override + public boolean encryptIsOpen() { + SalarySysConfPO sysConfPo = getOneByCode(SalarySysConstant.OPEN_APPLICATION_ENCRYPT); + if (sysConfPo != null && sysConfPo.getConfValue().equals(OpenEnum.OFF.getValue())) { + return false; + } + return true; + } + @Override public Map getEncryptProgress(String progressId) { Map resultMap = new HashMap<>(); @@ -451,10 +459,10 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe } List taxDeclarationFunction = getSalarySysConfMapper().listSome(SalarySysConfPO.builder().deleteType(0).confKey(TAX_DECLARATION_FUNCTION).build()); - if(taxDeclarationFunction == null || taxDeclarationFunction.size() == 0 || (taxDeclarationFunction.get(0).getConfValue().equals(TaxDeclarationFunctionEnum.REBOOT.getValue()))){ + if (taxDeclarationFunction == null || taxDeclarationFunction.size() == 0 || (taxDeclarationFunction.get(0).getConfValue().equals(TaxDeclarationFunctionEnum.REBOOT.getValue()))) { // 默认开启报税功能 或者重启状态时前端展示开启 appSettingVO.setIsOpenTaxDeclaration("1"); - }else { + } else { appSettingVO.setIsOpenTaxDeclaration(taxDeclarationFunction.get(0).getConfValue()); } //默认加密开启 From b58e71989d63d9e6a8306af84675d3053db2ef8f Mon Sep 17 00:00:00 2001 From: fcli Date: Mon, 12 Dec 2022 10:25:55 +0800 Subject: [PATCH 70/77] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=88=B0=E5=86=85=E5=AD=98=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 13 ++++++------ src/com/engine/salary/biz/SIArchivesBiz.java | 5 ++--- .../salary/biz/SalaryArchiveItemBiz.java | 7 ++++--- src/com/engine/salary/biz/SalaryItemBiz.java | 7 +++---- .../salary/biz/SalarySobCheckRuleBiz.java | 8 +++----- .../impl/AddUpDeductionServiceImpl.java | 7 ++++--- .../impl/AddUpSituationServiceImpl.java | 8 ++++---- .../impl/AttendQuoteFieldServiceImpl.java | 3 +-- .../service/impl/AttendQuoteServiceImpl.java | 4 ++-- .../impl/OtherDeductionServiceImpl.java | 14 +++++++------ .../service/impl/SIAccountServiceImpl.java | 17 ++++++++-------- .../service/impl/SIImportServiceImpl.java | 4 ++-- .../service/impl/SIReportServiceImpl.java | 4 ++-- .../impl/SalaryAcctEmployeeServiceImpl.java | 9 ++++----- .../impl/SalaryAcctRecordServiceImpl.java | 4 ++-- .../SalaryArchiveTaxAgentServiceImpl.java | 5 ++--- .../impl/SalarySendRangeServiceImpl.java | 13 ++++-------- .../service/impl/SalarySendServiceImpl.java | 10 ++++------ .../service/impl/SalarySobServiceImpl.java | 4 ++-- .../impl/SpecialAddDeductionServiceImpl.java | 20 +++++++++++-------- .../service/impl/TaxAgentServiceImpl.java | 4 ++-- .../impl/TaxDeclarationServiceImpl.java | 4 ++-- .../salary/wrapper/SalarySendWrapper.java | 5 ++--- 23 files changed, 86 insertions(+), 93 deletions(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 16828b51e..d8e5020e8 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -119,11 +119,12 @@ public class SIAccountBiz extends Service { } public PageInfo listPage(InsuranceAccountBatchParam queryParam) { - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountBatchMapper().list(queryParam); list = SiAccountEncrypt.decryptInsuranceAccountBatchList(list); - PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountBatchPO.class); - return pageInfo; + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, InsuranceAccountBatchPO.class); + SiAccountEncrypt.decryptInsuranceAccountBatchList(page.getList()); + return page; } public PageInfo listCommonPage(InsuranceAccountDetailParam queryParam) { @@ -141,11 +142,11 @@ public class SIAccountBiz extends Service { OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountDetailMapper().list(queryParam); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list); - PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class); + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, InsuranceAccountDetailPO.class); + InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(pageInfo.getList()); return pageInfo; } diff --git a/src/com/engine/salary/biz/SIArchivesBiz.java b/src/com/engine/salary/biz/SIArchivesBiz.java index 62fa5fc76..99019e219 100644 --- a/src/com/engine/salary/biz/SIArchivesBiz.java +++ b/src/com/engine/salary/biz/SIArchivesBiz.java @@ -967,14 +967,13 @@ public class SIArchivesBiz { pageInfo.setTotal(page.size()); pageInfo.setList(SalaryPageUtil.subList(pageInfo.getPageNum(), pageInfo.getPageSize(), page)); } else { - SalaryPageUtil.start(param.getCurrent(), param.getPageSize()); -// List page = socialSchemeMapper.listPageEmployeePOS(param); log.info("从数据库获取档案列表数据开始"); sw.start("获取档案列表数据"); page = socialSchemeMapper.queryEmployeeList(param); sw.stop(); log.info("从数据库获取档案列表数据完成!"); - pageInfo = new PageInfo<>(page, InsuranceArchivesEmployeePO.class); + pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), + page, InsuranceArchivesEmployeePO.class); } List> records = null; log.info("buildTableData方法处理福利档案列表数据开始"); diff --git a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java index e36c02296..abb427566 100644 --- a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java +++ b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java @@ -160,11 +160,12 @@ public class SalaryArchiveItemBiz { public PageInfo salaryItemAdjustRecordListPage(SalaryItemAdjustRecordQueryParam queryParam, List salaryItemIds) { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); List salaryItemAdjustRecordListDTOS = mapper.salaryItemAdjustRecordList(queryParam, salaryItemIds); - SalaryItemAdjustRecordListDTOEncrypt.decryptSalaryItemAdjustRecordListDTOList(salaryItemAdjustRecordListDTOS); - PageInfo page = new PageInfo(salaryItemAdjustRecordListDTOS, SalaryItemAdjustRecordListDTO.class); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + salaryItemAdjustRecordListDTOS, + SalaryItemAdjustRecordListDTO.class); + SalaryItemAdjustRecordListDTOEncrypt.decryptSalaryItemAdjustRecordListDTOList(page.getList()); return page; } finally { sqlSession.close(); diff --git a/src/com/engine/salary/biz/SalaryItemBiz.java b/src/com/engine/salary/biz/SalaryItemBiz.java index ef3ed6d56..3309bf874 100644 --- a/src/com/engine/salary/biz/SalaryItemBiz.java +++ b/src/com/engine/salary/biz/SalaryItemBiz.java @@ -5,7 +5,7 @@ import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.enums.SalaryOnOffEnum; import com.engine.salary.mapper.salaryitem.SalaryItemMapper; import com.engine.salary.util.page.PageInfo; -import com.github.pagehelper.PageHelper; +import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.apache.ibatis.session.SqlSession; @@ -98,10 +98,9 @@ public class SalaryItemBiz { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryItemMapper mapper = sqlSession.getMapper(SalaryItemMapper.class); -// SalaryPageUtil.start(searchParam.getCurrent(), searchParam.getPageSize()); - PageHelper.startPage(searchParam.getCurrent(), searchParam.getPageSize()); List salaryItemPOList = mapper.listByParam(searchParam); - return new PageInfo(salaryItemPOList); + return SalaryPageUtil.buildPage(searchParam.getCurrent(), searchParam.getPageSize(), + salaryItemPOList, SalaryItemPO.class); } finally { sqlSession.close(); } diff --git a/src/com/engine/salary/biz/SalarySobCheckRuleBiz.java b/src/com/engine/salary/biz/SalarySobCheckRuleBiz.java index 88ed8f4bf..e11c3d37d 100644 --- a/src/com/engine/salary/biz/SalarySobCheckRuleBiz.java +++ b/src/com/engine/salary/biz/SalarySobCheckRuleBiz.java @@ -4,10 +4,9 @@ import com.engine.salary.entity.salarysob.param.SalarySobCheckRuleQueryParam; import com.engine.salary.entity.salarysob.po.SalarySobCheckRulePO; import com.engine.salary.mapper.salarysob.SalarySobCheckRuleMapper; import com.engine.salary.util.page.PageInfo; - +import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; -import com.engine.salary.util.page.SalaryPageUtil; import org.apache.ibatis.session.SqlSession; import weaver.conn.mybatis.MyBatisFactory; @@ -100,10 +99,9 @@ public class SalarySobCheckRuleBiz { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalarySobCheckRuleMapper mapper = sqlSession.getMapper(SalarySobCheckRuleMapper.class); - SalaryPageUtil.start(param.getCurrent(), param.getPageSize()); List list = mapper.listByParam(param); - PageInfo pageInfo = new PageInfo(list, SalarySobCheckRulePO.class); - return pageInfo; + return SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), + list, SalarySobCheckRulePO.class); } finally { sqlSession.close(); } diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index 7130b96fc..2665d539b 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -873,10 +873,11 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction queryParam.setTaxAgentIds(taxAgentIdsAsAdmin); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpDeductionMapper().recordList(queryParam); - AddUpDeductionRecordStrDTOEncrypt.decryptAddUpDeductionRecordDTO(list); - return new PageInfo<>(list, AddUpDeductionRecordDTO.class); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, AddUpDeductionRecordDTO.class); + AddUpDeductionRecordStrDTOEncrypt.decryptAddUpDeductionRecordDTO(page.getList()); + return page; } diff --git a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java index 83ab197ac..a3bf8ea0a 100644 --- a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java @@ -218,11 +218,11 @@ public class AddUpSituationServiceImpl extends Service implements AddUpSituation queryParam.setTaxAgentIds(taxAgentIdsAsAdmin); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpSituationMapper().recordList(queryParam); - AddUpSituationRecordDTOEncrypt.decryptAddUpSituationRecordDTOList(list); - return new PageInfo<>(list, AddUpSituationRecordDTO.class); - + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, AddUpSituationRecordDTO.class); + AddUpSituationRecordDTOEncrypt.decryptAddUpSituationRecordDTOList(page.getList()); + return page; } @Override diff --git a/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java b/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java index 719d6cafb..f8d4b8eba 100644 --- a/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java +++ b/src/com/engine/salary/service/impl/AttendQuoteFieldServiceImpl.java @@ -65,9 +65,8 @@ public class AttendQuoteFieldServiceImpl extends Service implements AttendQuoteF @Override public PageInfo listPage(AttendQuoteFieldQueryParam queryParam) { - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAttendQuoteFieldMapper().list(queryParam); - return new PageInfo<>(list); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, AttendQuoteFieldListDTO.class); } diff --git a/src/com/engine/salary/service/impl/AttendQuoteServiceImpl.java b/src/com/engine/salary/service/impl/AttendQuoteServiceImpl.java index 6c6ba3e3c..177cca276 100644 --- a/src/com/engine/salary/service/impl/AttendQuoteServiceImpl.java +++ b/src/com/engine/salary/service/impl/AttendQuoteServiceImpl.java @@ -79,9 +79,9 @@ public class AttendQuoteServiceImpl extends Service implements AttendQuoteServic queryParam.setSalarySobIds(salarySobIds); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAttendQuoteMapper().list(queryParam); - return new PageInfo<>(list, AttendQuoteListDTO.class); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, AttendQuoteListDTO.class); } @Override diff --git a/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java b/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java index dd4a026ca..e897c7d50 100644 --- a/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java @@ -117,10 +117,11 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction } queryParam.setTaxAgentIds(taxAgentIdsAsAdmin); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getOtherDeductionMapper().list(queryParam); - OtherDeductionListDTOEncrypt.decryptOtherDeductionListDTOList(list); - return new PageInfo<>(list, OtherDeductionListDTO.class); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, OtherDeductionListDTO.class); + OtherDeductionListDTOEncrypt.decryptOtherDeductionListDTOList(page.getList()); + return page; } @Override @@ -142,10 +143,11 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction } queryParam.setTaxAgentIds(taxAgentIdsAsAdmin); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getOtherDeductionMapper().recordList(queryParam); - OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(list); - return new PageInfo<>(list, OtherDeductionRecordDTO.class); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, OtherDeductionRecordDTO.class); + OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(page.getList()); + return page; } diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index b59e86774..e6b9e51f4 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -310,9 +310,9 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountDetailMapper().list(queryParam); - PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class); + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(),queryParam.getPageSize(), + list, InsuranceAccountDetailPO.class); List insuranceAccountDetailPOS = pageInfo.getList(); InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(insuranceAccountDetailPOS); //数据组装 @@ -376,9 +376,9 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountDetailMapper().list(queryParam); - PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class); + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(),queryParam.getPageSize(), + list, InsuranceAccountDetailPO.class); List insuranceAccountDetailPOS = pageInfo.getList(); InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(insuranceAccountDetailPOS); //数据组装 @@ -585,9 +585,9 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { public Map changeList(InsuranceAccountDetailParam param) { Map datas = new HashMap<>(); Long employeeId = (long) user.getUID(); - SalaryPageUtil.start(param.getCurrent(), param.getPageSize()); List insuranceArchivesEmployeePOS = getInsuranceAccountDetailMapper().changeList(param.getUserName()); - PageInfo pageInfo = new PageInfo<>(insuranceArchivesEmployeePOS); + PageInfo pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), + insuranceArchivesEmployeePOS, InsuranceArchivesEmployeePO.class); List> records = siArchivesBiz.buildTableData(insuranceArchivesEmployeePOS); PageInfo> pageInfos = new PageInfo<>(records); @@ -647,11 +647,10 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { public Map getInspectTable(InsuranceAccountDetailParam param) { Map datas = new HashMap<>(); - SalaryPageUtil.start(param.getCurrent(), param.getPageSize()); List insuranceAccountInspectPOS = MapperProxyFactory.getProxy(InsuranceAccountInspectMapper.class).getByBillMonth(param.getBillMonth()); List> records = getService(user).buildInspectRecords(insuranceAccountInspectPOS, Long.valueOf(param.getPaymentOrganization())); - - PageInfo> pageInfos = new PageInfo<>(records); + List> paged = SalaryPageUtil.subList(param.getCurrent(), param.getPageSize(), records); + PageInfo> pageInfos = new PageInfo<>(paged); pageInfos.setTotal(records.size()); pageInfos.setPageNum(param.getCurrent()); pageInfos.setPageSize(param.getPageSize()); diff --git a/src/com/engine/salary/service/impl/SIImportServiceImpl.java b/src/com/engine/salary/service/impl/SIImportServiceImpl.java index aecdd2e8d..ab09e3a5f 100644 --- a/src/com/engine/salary/service/impl/SIImportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIImportServiceImpl.java @@ -98,9 +98,9 @@ public class SIImportServiceImpl extends Service implements SIImportService { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); SocialSchemeMapper socialSchemeMapper = sqlSession.getMapper(SocialSchemeMapper.class); List page = new ArrayList<>(); - SalaryPageUtil.start(param.getCurrent(), param.getPageSize()); page = socialSchemeMapper.queryEmployeeList(param); - PageInfo pageInfo = new PageInfo<>(page, InsuranceArchivesEmployeePO.class); + PageInfo pageInfo = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), + page, InsuranceArchivesEmployeePO.class); int total = (int)pageInfo.getTotal(); param.setPageSize(total); param.setCurrent(1); diff --git a/src/com/engine/salary/service/impl/SIReportServiceImpl.java b/src/com/engine/salary/service/impl/SIReportServiceImpl.java index a89e68f27..619547e83 100644 --- a/src/com/engine/salary/service/impl/SIReportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIReportServiceImpl.java @@ -21,9 +21,9 @@ public class SIReportServiceImpl extends Service implements SIReportService { @Override public PageInfo welfareList(QueryAccountDetailParam param) { - SalaryPageUtil.start(param.getCurrent(),param.getPageSize()); List insuranceAccountDetailPOS = getSIAccountDetailMapper().listSome(param); - PageInfo page = new PageInfo<>(insuranceAccountDetailPOS ,InsuranceAccountDetailPO.class); + PageInfo page = SalaryPageUtil.buildPage(param.getCurrent(), param.getPageSize(), + insuranceAccountDetailPOS ,InsuranceAccountDetailPO.class); List list = page.getList(); InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list); page.setList(list); diff --git a/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java index df9666c18..f1bf13b19 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctEmployeeServiceImpl.java @@ -190,10 +190,10 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct queryParam.setOrderRule(orderRule); // 分页参数 - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); // 查询薪资核算人员 List salaryAcctEmployeePOS = getSalaryAcctEmployeeMapper().listPage(queryParam); - return new PageInfo<>(salaryAcctEmployeePOS); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + salaryAcctEmployeePOS, SalaryAcctEmployeePO.class); } @Override @@ -322,10 +322,9 @@ public class SalaryAcctEmployeeServiceImpl extends Service implements SalaryAcct // 查询合并计税的薪资核算人员 Set otherSalaryAcctRecordIds = SalaryEntityUtil.properties(otherSalaryAcctRecordPOS, SalaryAcctRecordPO::getId); // 分页参数 - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List salaryAcctEmployeePOS = getSalaryAcctEmployeeMapper().listPage4ConsolidatedTax(otherSalaryAcctRecordIds, queryParam); - PageInfo salaryAcctEmployeePOPageInfo = new PageInfo<>(salaryAcctEmployeePOS); - return salaryAcctEmployeePOPageInfo; + return SalaryPageUtil.buildPage(queryParam.getCurrent(),queryParam.getPageSize(), + salaryAcctEmployeePOS, SalaryAcctEmployeePO.class); } @Override diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index a7347ea31..0076efe20 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -172,9 +172,9 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe } // 查询薪资核算记录 - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List salaryAcctRecordPOS = getSalaryAcctRecordMapper().listSome(po); - return new PageInfo<>(salaryAcctRecordPOS, SalaryAcctRecordPO.class); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + salaryAcctRecordPOS, SalaryAcctRecordPO.class); } @Override diff --git a/src/com/engine/salary/service/impl/SalaryArchiveTaxAgentServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveTaxAgentServiceImpl.java index 624958552..eede97198 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveTaxAgentServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveTaxAgentServiceImpl.java @@ -60,10 +60,9 @@ public class SalaryArchiveTaxAgentServiceImpl extends Service implements SalaryA @Override public PageInfo taxAgentAdjustRecordListPage(TaxAgentAdjustRecordQueryParam queryParam) { - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List taxAgentAdjustRecordListDTOS = getSalaryArchiveTaxAgentMapper().taxAgentAdjustRecordList(queryParam); - PageInfo pageInfo = new PageInfo(taxAgentAdjustRecordListDTOS, TaxAgentAdjustRecordListDTO.class); - return pageInfo; + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + taxAgentAdjustRecordListDTOS, TaxAgentAdjustRecordListDTO.class); } @Override diff --git a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java index d1cd3db78..bf15ff818 100644 --- a/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendRangeServiceImpl.java @@ -94,9 +94,6 @@ public class SalarySendRangeServiceImpl extends Service implements SalarySendRan @Override public PageInfo listPage(SalarySendRangeQueryParam queryParam) { - if (StrUtil.isEmpty(queryParam.getTargetName())) { - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); - } SalarySendRangeMapper mapper = MapperProxyFactory.getProxy(SalarySendRangeMapper.class); List listDTOs = mapper.selectByParam(queryParam); PageInfo page = new PageInfo<>(listDTOs, SalarySendRangeListDTO.class); @@ -164,11 +161,9 @@ public class SalarySendRangeServiceImpl extends Service implements SalarySendRan return s; }).filter(Objects::nonNull) .collect(Collectors.toList()); - if (StrUtil.isNotEmpty(queryParam.getTargetName())) { - page.setTotal(listDTOs.size()); - List list = SalaryPageUtil.subList(queryParam.getCurrent(), queryParam.getPageSize(), listDTOs); - page.setList(list); - } + page.setTotal(listDTOs.size()); + List list = SalaryPageUtil.subList(queryParam.getCurrent(), queryParam.getPageSize(), listDTOs); + page.setList(list); return page; } @@ -179,7 +174,7 @@ public class SalarySendRangeServiceImpl extends Service implements SalarySendRan @Override public void deleteByIds(List sendRangeIds) { - runMapper(mapper-> { + runMapper(mapper -> { for (Long sendRangeId : sendRangeIds) { mapper.deleteByPrimaryKey(sendRangeId); } diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index e90030326..5efcfbe16 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -453,10 +453,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService OrderRuleVO orderRule = getSalarySysConfService(user).orderRule(); queryParam.setOrderRule(orderRule); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List page = salarySendInfoMapper.list(queryParam); - PageInfo result = new PageInfo<>(page, SalarySendInfoListDTO.class); - return result; + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + page, SalarySendInfoListDTO.class); } @Override @@ -493,10 +492,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return new PageInfo<>(); } } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = MapperProxyFactory.getProxy(SalarySendInfoMapper.class).detailList(queryParam, otherSalaryAcctRecordIds); - PageInfo pageInfo = new PageInfo<>(list, SalarySendDetailListDTO.class); - return pageInfo; + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, SalarySendDetailListDTO.class); } /** diff --git a/src/com/engine/salary/service/impl/SalarySobServiceImpl.java b/src/com/engine/salary/service/impl/SalarySobServiceImpl.java index dfd10acd9..9c60d1154 100644 --- a/src/com/engine/salary/service/impl/SalarySobServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySobServiceImpl.java @@ -190,9 +190,9 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { page.setList(subSalarySobs); return page; } else { - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List salarySobPOS = salarySobMapper.listSome(build); - return new PageInfo<>(salarySobPOS, SalarySobPO.class); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + salarySobPOS, SalarySobPO.class); } } diff --git a/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java b/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java index df9b604be..f3c74b186 100644 --- a/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java @@ -9,7 +9,10 @@ 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.*; +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.param.SpecialAddDeductionRecordDeleteParam; import com.engine.salary.entity.datacollection.po.SpecialAddDeductionPO; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeTaxAgentDTO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; @@ -99,10 +102,11 @@ public class SpecialAddDeductionServiceImpl extends Service implements SpecialAd if (needAuth) { putQueryRange(queryParam); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getSpecialAddDeductionMapper().listByParam(queryParam); - SpecialAddDeductionEncrypt.decrypt(list); - return new PageInfo<>(list, SpecialAddDeductionListDTO.class); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, SpecialAddDeductionListDTO.class); + SpecialAddDeductionEncrypt.decrypt(page.getList()); + return page; } @Override @@ -113,11 +117,11 @@ public class SpecialAddDeductionServiceImpl extends Service implements SpecialAd if (needAuth) { putQueryRange(queryParam); } - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getSpecialAddDeductionMapper().listDtoByParam(queryParam); - SpecialAddDeductionEncrypt.decrypt(list); - - return new PageInfo<>(list, SpecialAddDeductionRecordDTO.class); + PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, SpecialAddDeductionRecordDTO.class); + SpecialAddDeductionEncrypt.decrypt(page.getList()); + return page; } private void putQueryRange(SpecialAddDeductionQueryParam queryParam) { diff --git a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java index 0d1a32b54..0573737f7 100644 --- a/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxAgentServiceImpl.java @@ -215,9 +215,9 @@ public class TaxAgentServiceImpl extends Service implements TaxAgentService { @Override public PageInfo listPage(TaxAgentQueryParam queryParam) { - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List taxAgentPOS = getTaxAgentMapper().listBySome(queryParam); - return new PageInfo<>(taxAgentPOS); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + taxAgentPOS, TaxAgentPO.class); } @Override diff --git a/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java index a9c95c094..f518e664e 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java @@ -122,9 +122,9 @@ public class TaxDeclarationServiceImpl extends Service implements TaxDeclaration } // 查询个税申报表 - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List taxDeclarationPOS = getTaxDeclarationMapper().listSome(po); - return new PageInfo<>(taxDeclarationPOS, TaxDeclarationPO.class); + return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + taxDeclarationPOS, TaxDeclarationPO.class); } diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index c0e4fb0f0..d8e2c2ac7 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -94,16 +94,15 @@ public class SalarySendWrapper extends Service { if (CollectionUtils.isNotEmpty(salarySobIds)) { queryParam.setSalarySobIds(salarySobIds); SalarySendMapper salarySendMapper = sqlSession.getMapper(SalarySendMapper.class); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); list = salarySendMapper.list(queryParam); } } else { SalarySendMapper salarySendMapper = sqlSession.getMapper(SalarySendMapper.class); - SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); list = salarySendMapper.list(queryParam); } - PageInfo pageInfo = new PageInfo<>(list, SalarySendListDTO.class); + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + list, SalarySendListDTO.class); List pageList = pageInfo.getList(); List salarySobIds = pageList.stream().map(SalarySendListDTO::getSalarySobId).distinct().collect(Collectors.toList()); // 获取默认模板 From 5e893160b4a42814cb9342ca8495e5a228bb357a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 12 Dec 2022 10:36:06 +0800 Subject: [PATCH 71/77] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salary/biz/SalaryArchiveItemBiz.java | 19 ++++++++++--------- .../dto/SalaryItemAdjustRecordListDTO.java | 3 +++ .../salaryarchive/po/SalaryArchiveItemPO.java | 2 ++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java index e36c02296..d2a79b233 100644 --- a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java +++ b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java @@ -1,7 +1,7 @@ package com.engine.salary.biz; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.archive.SalaryArchiveItemPOEncrypt; -import com.engine.salary.encrypt.archive.SalaryItemAdjustRecordListDTOEncrypt; import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO; import com.engine.salary.entity.salaryarchive.param.SalaryArchiveItemQueryParam; import com.engine.salary.entity.salaryarchive.param.SalaryItemAdjustRecordQueryParam; @@ -18,13 +18,14 @@ import java.util.ArrayList; import java.util.List; public class SalaryArchiveItemBiz { + public EncryptUtil encryptUtil = new EncryptUtil(); public List getCurrentEffectiveItemList(SalaryArchiveItemQueryParam build) { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); List salaryArchiveItemPOS = mapper.listByParam(build); - return SalaryArchiveItemPOEncrypt.decryptSalaryArchiveItemPOList(salaryArchiveItemPOS); + return encryptUtil.decryptList(salaryArchiveItemPOS, SalaryArchiveItemPO.class); } finally { sqlSession.close(); } @@ -56,9 +57,9 @@ public class SalaryArchiveItemBiz { try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); List ineffectiveSalaryItems = new ArrayList<>(); - if(CollectionUtils.isNotEmpty(build.getSalaryArchivesIds())){ + if (CollectionUtils.isNotEmpty(build.getSalaryArchivesIds())) { List salaryArchivesIds = (List) build.getSalaryArchivesIds(); - List> partition = Lists.partition(salaryArchivesIds,1000); + List> partition = Lists.partition(salaryArchivesIds, 1000); partition.forEach(list -> { build.setSalaryArchivesIds(list); ineffectiveSalaryItems.addAll(mapper.getIneffectiveSalaryItems(build)); @@ -86,7 +87,7 @@ public class SalaryArchiveItemBiz { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); - List> partition = Lists.partition(effectiveSalaryItemDels, 999); + List> partition = Lists.partition(effectiveSalaryItemDels, 999); partition.forEach(mapper::deleteBatchIds); sqlSession.commit(); } finally { @@ -95,13 +96,13 @@ public class SalaryArchiveItemBiz { } public void batchInsert(List salaryArchiveItemNews) { - if(CollectionUtils.isEmpty(salaryArchiveItemNews)){ + if (CollectionUtils.isEmpty(salaryArchiveItemNews)) { return; } SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); - SalaryArchiveItemPOEncrypt.encryptSalaryArchiveItemPOList(salaryArchiveItemNews); + encryptUtil.encryptList(salaryArchiveItemNews, SalaryArchiveItemPO.class); List> partition = Lists.partition(salaryArchiveItemNews, 100); partition.forEach(mapper::batchInsert); sqlSession.commit(); @@ -140,7 +141,7 @@ public class SalaryArchiveItemBiz { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); - return SalaryItemAdjustRecordListDTOEncrypt.decryptSalaryItemAdjustRecordListDTOList(mapper.salaryItemAdjustRecordList(queryParam, salaryItemIds)); + return encryptUtil.decryptList(mapper.salaryItemAdjustRecordList(queryParam, salaryItemIds), SalaryItemAdjustRecordListDTO.class); } finally { sqlSession.close(); } @@ -163,7 +164,7 @@ public class SalaryArchiveItemBiz { SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); List salaryItemAdjustRecordListDTOS = mapper.salaryItemAdjustRecordList(queryParam, salaryItemIds); - SalaryItemAdjustRecordListDTOEncrypt.decryptSalaryItemAdjustRecordListDTOList(salaryItemAdjustRecordListDTOS); + encryptUtil.decryptList(salaryItemAdjustRecordListDTOS, SalaryItemAdjustRecordListDTO.class); PageInfo page = new PageInfo(salaryItemAdjustRecordListDTOS, SalaryItemAdjustRecordListDTO.class); return page; } finally { diff --git a/src/com/engine/salary/entity/salaryarchive/dto/SalaryItemAdjustRecordListDTO.java b/src/com/engine/salary/entity/salaryarchive/dto/SalaryItemAdjustRecordListDTO.java index e1560f5b5..ede032ccb 100644 --- a/src/com/engine/salary/entity/salaryarchive/dto/SalaryItemAdjustRecordListDTO.java +++ b/src/com/engine/salary/entity/salaryarchive/dto/SalaryItemAdjustRecordListDTO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.salaryarchive.dto; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.TableTitle; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -50,9 +51,11 @@ public class SalaryItemAdjustRecordListDTO { private String adjustItem; @TableTitle(title = "调整前", dataIndex = "adjustBefore", key = "adjustBefore") + @Encrypt private String adjustBefore; @TableTitle(title = "调整后", dataIndex = "adjustAfter", key = "adjustAfter") + @Encrypt private String adjustAfter; @TableTitle(title = "调整原因", dataIndex = "adjustReason", key = "adjustReason") diff --git a/src/com/engine/salary/entity/salaryarchive/po/SalaryArchiveItemPO.java b/src/com/engine/salary/entity/salaryarchive/po/SalaryArchiveItemPO.java index be3c54598..4a3a9306a 100644 --- a/src/com/engine/salary/entity/salaryarchive/po/SalaryArchiveItemPO.java +++ b/src/com/engine/salary/entity/salaryarchive/po/SalaryArchiveItemPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.salaryarchive.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -56,6 +57,7 @@ public class SalaryArchiveItemPO { /** * 薪资项目值 */ + @Encrypt private String itemValue; /** From 93db32b758b362c7edda1afcd61dbf0c15eeab37 Mon Sep 17 00:00:00 2001 From: fcli Date: Mon, 12 Dec 2022 15:40:01 +0800 Subject: [PATCH 72/77] =?UTF-8?q?feat:=20=E5=8A=A0=E5=AF=86=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=EF=BC=8C=E7=B4=AF=E8=AE=A1=E9=99=84=E5=8A=A0=E6=89=A3?= =?UTF-8?q?=E9=99=A4&=E7=A4=BE=E4=BF=9D=E7=A6=8F=E5=88=A9=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/biz/AddUpDeductionBiz.java | 13 ++++----- src/com/engine/salary/biz/SIAccountBiz.java | 29 ++++++++++--------- .../encrypt/siaccount/SiAccountEncrypt.java | 4 +++ .../entity/datacollection/AddUpDeduction.java | 1 + .../dto/AddUpDeductionRecordDTO.java | 8 +++++ .../siaccount/po/InsuranceAccountBatchPO.java | 4 +++ .../service/impl/SIAccountServiceImpl.java | 18 +++++++----- 7 files changed, 47 insertions(+), 30 deletions(-) diff --git a/src/com/engine/salary/biz/AddUpDeductionBiz.java b/src/com/engine/salary/biz/AddUpDeductionBiz.java index 617cda617..75fc201f7 100644 --- a/src/com/engine/salary/biz/AddUpDeductionBiz.java +++ b/src/com/engine/salary/biz/AddUpDeductionBiz.java @@ -1,9 +1,6 @@ package com.engine.salary.biz; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.datacollection.AddUpDeductionEncrypt; -import com.engine.salary.encrypt.datacollection.AddUpDeductionRecordStrDTOEncrypt; -import com.engine.salary.encrypt.datacollection.AddUpDeductionStrDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.dto.AddUpDeductionDTO; import com.engine.salary.entity.datacollection.dto.AddUpDeductionRecordDTO; @@ -34,7 +31,7 @@ public class AddUpDeductionBiz extends BaseBean { try { AddUpDeductionMapper mapper = sqlSession.getMapper(AddUpDeductionMapper.class); List list = mapper.list(param); - AddUpDeductionStrDTOEncrypt.decryptAddUpDeductionList(list); + list = encryptUtil.decryptList(list, AddUpDeductionDTO.class); return list; } finally { sqlSession.close(); @@ -70,7 +67,7 @@ public class AddUpDeductionBiz extends BaseBean { try { AddUpDeductionMapper mapper = sqlSession.getMapper(AddUpDeductionMapper.class); AddUpDeduction byId = mapper.getById(id); - return AddUpDeductionEncrypt.decryptAddUpDeduction(byId); + return encryptUtil.decrypt(byId, AddUpDeduction.class); } finally { sqlSession.close(); } @@ -87,7 +84,7 @@ public class AddUpDeductionBiz extends BaseBean { try { AddUpDeductionMapper mapper = sqlSession.getMapper(AddUpDeductionMapper.class); List addUpDeductionRecordStrDTOS = mapper.recordList(param); - return AddUpDeductionRecordStrDTOEncrypt.decryptAddUpDeductionRecordDTO(addUpDeductionRecordStrDTOS); + return encryptUtil.decryptList(addUpDeductionRecordStrDTOS, AddUpDeductionRecordDTO.class); } finally { sqlSession.close(); } @@ -106,7 +103,7 @@ public class AddUpDeductionBiz extends BaseBean { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { AddUpDeductionMapper mapper = sqlSession.getMapper(AddUpDeductionMapper.class); - AddUpDeductionEncrypt.encryptAddUpDeductionList(param); + encryptUtil.encryptList(param, AddUpDeduction.class); List> partition = Lists.partition(param, 100); partition.forEach(mapper::insertData); sqlSession.commit(); @@ -128,7 +125,7 @@ public class AddUpDeductionBiz extends BaseBean { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { AddUpDeductionMapper mapper = sqlSession.getMapper(AddUpDeductionMapper.class); - AddUpDeductionEncrypt.encryptAddUpDeductionList(param); + encryptUtil.encryptList(param, AddUpDeduction.class); List> partition = Lists.partition(param, 100); partition.forEach(mapper::updateData); sqlSession.commit(); diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 16828b51e..ce9099800 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -8,9 +8,9 @@ import com.engine.core.impl.Service; import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailTempPOEncrypt; -import com.engine.salary.encrypt.siaccount.SiAccountEncrypt; import com.engine.salary.encrypt.sischeme.InsuranceSchemeDetailPOEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; @@ -77,6 +77,8 @@ public class SIAccountBiz extends Service { private SIArchivesBiz siArchivesBiz = new SIArchivesBiz(); + private EncryptUtil encryptUtil = new EncryptUtil(); + private TaxAgentService getTaxAgentService() { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } @@ -121,7 +123,7 @@ public class SIAccountBiz extends Service { public PageInfo listPage(InsuranceAccountBatchParam queryParam) { SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountBatchMapper().list(queryParam); - list = SiAccountEncrypt.decryptInsuranceAccountBatchList(list); + list = encryptUtil.decryptList(list, InsuranceAccountBatchPO.class); PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountBatchPO.class); return pageInfo; } @@ -152,10 +154,9 @@ public class SIAccountBiz extends Service { public String save(boolean flag, AccountParam param, Long employeeId, String currentUserName) { if (flag) { InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); - insuranceAccountBatchPO = SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO); + insuranceAccountBatchPO = encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); SalaryAssert.isNull(insuranceAccountBatchPO, SalaryI18nUtil.getI18nLabel(100461, "所属月份存在核算数据")); - InsuranceAccountBatchPO build = InsuranceAccountBatchPO.builder() .paymentOrganization(param.getPaymentOrganization()) .accountant(currentUserName) @@ -169,7 +170,7 @@ public class SIAccountBiz extends Service { .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) .paymentOrganization(param.getPaymentOrganization()) .build(); - SiAccountEncrypt.encryptInsuranceAccountBatch(build); + encryptUtil.encrypt(build, InsuranceAccountBatchPO.class); getInsuranceAccountBatchMapper().insert(build); // LoggerContext insuranceSchemeContext = new LoggerContext(); // insuranceSchemeContext.setTargetId(String.valueOf(build.getId())); @@ -185,7 +186,7 @@ public class SIAccountBiz extends Service { } catch (Exception e) { // 回滚 List list = Lists.newArrayList(getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), param.getPaymentOrganization())); - list = SiAccountEncrypt.decryptInsuranceAccountBatchList(list); + list = encryptUtil.decryptList(list, InsuranceAccountBatchPO.class); if (CollectionUtils.isNotEmpty(list)) { list.stream().forEach(f -> { getInsuranceAccountBatchMapper().deleteById(f.getId()); @@ -206,7 +207,7 @@ public class SIAccountBiz extends Service { // employeeIds = employeeIds.stream().filter(employeeIdsInTaxAgent::contains).collect(Collectors.toList()); if (CollectionUtils.isEmpty(employeeIds)) { List list = Lists.newArrayList(getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), paymentOrganization)); - SiAccountEncrypt.decryptInsuranceAccountBatchList(list); + encryptUtil.decryptList(list, InsuranceAccountBatchPO.class); if (CollectionUtils.isNotEmpty(list)) { list.stream().forEach(f -> { getInsuranceAccountDetailMapper().deleteById(f.getId()); @@ -349,7 +350,7 @@ public class SIAccountBiz extends Service { } catch (Exception e) { log.error("account run fail", e); List list = Lists.newArrayList(getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), param.getPaymentOrganization())); - list = SiAccountEncrypt.decryptInsuranceAccountBatchList(list); + list = encryptUtil.decryptList(list, InsuranceAccountBatchPO.class); if (CollectionUtils.isNotEmpty(list)) { list.stream().forEach(f -> { getInsuranceAccountBatchMapper().deleteById(f.getId()); @@ -905,7 +906,7 @@ public class SIAccountBiz extends Service { } } InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, param.getPaymentOrganization()); - SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO); + encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); DataCollectionEmployee simpleEmployee = MapperProxyFactory.getProxy(EmployMapper.class).getEmployeeById(employeeId); insuranceAccountBatchPO.setAccountant(currentUserName); @@ -916,7 +917,7 @@ public class SIAccountBiz extends Service { insuranceAccountBatchPO.setFundPay(fundSum.toPlainString()); insuranceAccountBatchPO.setOtherNum(otherAccountPerson); insuranceAccountBatchPO.setOtherPay(otherSum.toPlainString()); - SiAccountEncrypt.encryptInsuranceAccountBatch(insuranceAccountBatchPO); + encryptUtil.encrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); getInsuranceAccountBatchMapper().updateById(insuranceAccountBatchPO); // LoggerContext insuranceSchemeContext = new LoggerContext(); // insuranceSchemeContext.setTargetId(String.valueOf(insuranceAccountBatchPO.getId())); @@ -948,7 +949,7 @@ public class SIAccountBiz extends Service { public void delete(AccountParam param, Long employeeId) { InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(param.getBillMonth(), param.getPaymentOrganization()); - SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO); + encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); SalaryAssert.notNull(insuranceAccountBatchPO, SalaryI18nUtil.getI18nLabel(84026, "参数错误")); // if(param.getPaymentOrganization()==null){ // throw new SalaryRunTimeException("个税扣缴义务人为空"); @@ -1550,11 +1551,11 @@ public class SIAccountBiz extends Service { // SalaryAssert.isEmpty(insuranceAccountInspectPOS, SalaryI18nUtil.getI18nLabel( 100500, "当前核算月存在核算异常数据")); //开始归档数据 InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillStatus(billMonth, BillStatusEnum.NOT_ARCHIVED.getValue(), paymentOrganization); - SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO); + encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); SalaryAssert.notNull(insuranceAccountBatchPO, SalaryI18nUtil.getI18nLabel(100503, "月份账单不存在")); - SalaryAssert.isFalse(insuranceAccountBatchPO.getBillStatus() == BillStatusEnum.ARCHIVED.getValue(), SalaryI18nUtil.getI18nLabel(100504, "月份账单已归档")); + SalaryAssert.isFalse(Objects.equals(insuranceAccountBatchPO.getBillStatus(), BillStatusEnum.ARCHIVED.getValue()), SalaryI18nUtil.getI18nLabel(100504, "月份账单已归档")); insuranceAccountBatchPO.setBillStatus(BillStatusEnum.ARCHIVED.getValue()); - SiAccountEncrypt.encryptInsuranceAccountBatch(insuranceAccountBatchPO); + encryptUtil.encrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); getInsuranceAccountBatchMapper().updateById(insuranceAccountBatchPO); //日志记录 // LoggerContext insuranceSchemeContext = new LoggerContext(); diff --git a/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java b/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java index 96bb1a9d7..14fdbee4e 100644 --- a/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java +++ b/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java @@ -13,6 +13,7 @@ import java.util.List; * fund_pay */ public class SiAccountEncrypt { + @Deprecated public static List encryptInsuranceAccountBatchList(List list) { list.forEach(item -> { item.setOtherPay(AESEncryptUtil.encrypt(item.getOtherPay())); @@ -22,6 +23,7 @@ public class SiAccountEncrypt { return list; } + @Deprecated public static List decryptInsuranceAccountBatchList(List list) { if(list == null || list.size() == 0) { return list; @@ -34,6 +36,7 @@ public class SiAccountEncrypt { return list; } + @Deprecated public static InsuranceAccountBatchPO encryptInsuranceAccountBatch(InsuranceAccountBatchPO item) { if(item == null) { return item; @@ -44,6 +47,7 @@ public class SiAccountEncrypt { return item; } + @Deprecated public static InsuranceAccountBatchPO decryptInsuranceAccountBatch(InsuranceAccountBatchPO item) { if(item == null) { return item; diff --git a/src/com/engine/salary/entity/datacollection/AddUpDeduction.java b/src/com/engine/salary/entity/datacollection/AddUpDeduction.java index 6e714885d..c462a4551 100644 --- a/src/com/engine/salary/entity/datacollection/AddUpDeduction.java +++ b/src/com/engine/salary/entity/datacollection/AddUpDeduction.java @@ -85,6 +85,7 @@ public class AddUpDeduction { * 累计婴幼儿照护 */ @SalaryFormulaVar(defaultLabel = "累计婴幼儿照护", labelId = 117732, dataType = "number") + @Encrypt private String addUpInfantCare; /** diff --git a/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionRecordDTO.java b/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionRecordDTO.java index 4e30b12e2..b3cbbc0d7 100644 --- a/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionRecordDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/AddUpDeductionRecordDTO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryTable; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.annotation.TableTitle; @@ -73,6 +74,7 @@ public class AddUpDeductionRecordDTO { @ExcelProperty(index = 5) @SalaryTableColumn(text = "累计子女教育", width = "10%", column = "addUpChildEducation") @TableTitle(title = "累计子女教育", dataIndex = "addUpChildEducation", key = "addUpChildEducation") + @Encrypt private String addUpChildEducation; /** @@ -81,6 +83,7 @@ public class AddUpDeductionRecordDTO { @ExcelProperty(index = 6) @SalaryTableColumn(text = "累计继续教育", width = "10%", column = "addUpContinuingEducation") @TableTitle(title = "累计继续教育", dataIndex = "addUpContinuingEducation", key = "addUpContinuingEducation") + @Encrypt private String addUpContinuingEducation; /** @@ -89,6 +92,7 @@ public class AddUpDeductionRecordDTO { @ExcelProperty(index = 7) @SalaryTableColumn(text = "累计住房贷款利息", width = "10%", column = "addUpHousingLoanInterest") @TableTitle(title = "累计住房贷款利息", dataIndex = "addUpHousingLoanInterest", key = "addUpHousingLoanInterest") + @Encrypt private String addUpHousingLoanInterest; /** @@ -97,6 +101,7 @@ public class AddUpDeductionRecordDTO { @ExcelProperty(index = 8) @SalaryTableColumn(text = "累计住房租金", width = "10%", column = "addUpHousingRent") @TableTitle(title = "累计住房租金", dataIndex = "addUpHousingRent", key = "addUpHousingRent") + @Encrypt private String addUpHousingRent; /** @@ -105,16 +110,19 @@ public class AddUpDeductionRecordDTO { @ExcelProperty(index = 9) @SalaryTableColumn(text = "累计赡养老人", width = "10%", column = "addUpSupportElderly") @TableTitle(title = "累计赡养老人", dataIndex = "addUpSupportElderly", key = "addUpSupportElderly") + @Encrypt private String addUpSupportElderly; @ExcelProperty(index = 10) @SalaryTableColumn(text = "累计大病医疗", width = "10%", column = "addUpIllnessMedical") @TableTitle(title = "累计大病医疗", dataIndex = "addUpIllnessMedical", key = "addUpIllnessMedical") + @Encrypt private String addUpIllnessMedical; @ExcelProperty(index = 11) @SalaryTableColumn(text = "累计婴幼儿照护", width = "10%", column = "addUpInfantCare") @TableTitle(title = "累计婴幼儿照护", dataIndex = "addUpInfantCare", key = "addUpInfantCare") + @Encrypt private String addUpInfantCare; } diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceAccountBatchPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceAccountBatchPO.java index eef9f7627..b3296596e 100644 --- a/src/com/engine/salary/entity/siaccount/po/InsuranceAccountBatchPO.java +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceAccountBatchPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.siaccount.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -54,16 +55,19 @@ public class InsuranceAccountBatchPO { /** * 社保缴费总额(单位+个人) */ + @Encrypt private String socialPay; /** * 公积金缴费总额(单位+个人) */ + @Encrypt private String fundPay; /** * 其他福利缴费总额(单位+个人) */ + @Encrypt private String otherPay; /** diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index b59e86774..b042f5c57 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -12,9 +12,9 @@ import com.engine.core.impl.Service; import com.engine.salary.biz.*; import com.engine.salary.component.SalaryWeaTable; import com.engine.salary.constant.SalaryDefaultTenantConstant; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.siaccount.ExcelInsuranceDetailPOEncrypt; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; -import com.engine.salary.encrypt.siaccount.SiAccountEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.siaccount.bo.InsuranceAccountBO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountBatchListDTO; @@ -95,6 +95,8 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { private SIArchivesBiz siArchivesBiz = new SIArchivesBiz(); + private EncryptUtil encryptUtil = new EncryptUtil(); + public RecordsBuildService getService(User user) { return ServiceUtil.getService(RecordsBuildServiceImpl.class, user); } @@ -422,7 +424,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { datePickerItem.getOtherParams().put("maxDate", maxDate); List billMonthList = getInsuranceAccountBatchMapper().listByTimeRange(minDate, maxDate); - SiAccountEncrypt.decryptInsuranceAccountBatchList(billMonthList); + encryptUtil.decryptList(billMonthList, InsuranceAccountBatchPO.class); if (CollectionUtils.isEmpty(billMonthList)) { datePickerItem.getOtherParams().put("disabledData", Collections.emptyList()); } else { @@ -541,7 +543,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { public InsuranceAccountTabDTO tabList(AccountParam build) { InsuranceAccountTabDTO insuranceAccountTabDTO = InsuranceAccountTabDTO.builder().build(); InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(build.getBillMonth(), build.getPaymentOrganization()); - insuranceAccountBatchPO = SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO); + insuranceAccountBatchPO = encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); boolean isShow = false; if (insuranceAccountBatchPO == null || insuranceAccountBatchPO.getBillStatus() == BillStatusEnum.NOT_ARCHIVED.getValue()) { isShow = true; @@ -772,7 +774,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { @Override public List> welfareData(String billMonth, List employeeIds, Long taxAgentId) { InsuranceAccountBatchPO insuranceAccountBatchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, taxAgentId); - insuranceAccountBatchPO = SiAccountEncrypt.decryptInsuranceAccountBatch(insuranceAccountBatchPO); + insuranceAccountBatchPO = encryptUtil.decrypt(insuranceAccountBatchPO, InsuranceAccountBatchPO.class); if (insuranceAccountBatchPO == null || Objects.equals(BillStatusEnum.NOT_ARCHIVED.getValue(), insuranceAccountBatchPO.getBillStatus())) { return Lists.newArrayList(); } @@ -1349,7 +1351,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { List viewListDTOList = pageInfos.getList(); viewListDTOList.stream().filter(f -> f.getPayOrg().equals(taxAgentPo.getName())).collect(Collectors.toList()); InsuranceAccountBatchPO batchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, paymentOrganization); - batchPO = SiAccountEncrypt.decryptInsuranceAccountBatch(batchPO); + batchPO = encryptUtil.decrypt(batchPO, InsuranceAccountBatchPO.class); //更新 if (viewListDTOList.size() > 0 && batchPO != null) { InsuranceAccountViewListDTO viewListDTO = viewListDTOList.get(0); @@ -1362,7 +1364,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { batchPO.setOtherPay(viewListDTO.getOtherPaySum().replace(",", "")); batchPO.setUpdateTime(new Date()); - batchPO = SiAccountEncrypt.encryptInsuranceAccountBatch(batchPO); + batchPO = encryptUtil.encrypt(batchPO, InsuranceAccountBatchPO.class); getInsuranceAccountBatchMapper().updateById(batchPO); } } @@ -2207,7 +2209,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { List viewListDTOList = pageInfos.getList(); viewListDTOList.stream().filter(f -> f.getPayOrg().equals(taxAgentPo.getName())).collect(Collectors.toList()); InsuranceAccountBatchPO batchPO = getInsuranceAccountBatchMapper().getByBillMonth(billMonth, paymentOrganization); - batchPO = SiAccountEncrypt.decryptInsuranceAccountBatch(batchPO); + batchPO = encryptUtil.decrypt(batchPO, InsuranceAccountBatchPO.class); //更新 if (viewListDTOList.size() > 0 && batchPO != null) { InsuranceAccountViewListDTO viewListDTO = viewListDTOList.get(0); @@ -2220,7 +2222,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { batchPO.setOtherPay(viewListDTO.getOtherPaySum().replace(",", "")); batchPO.setUpdateTime(new Date()); - batchPO = SiAccountEncrypt.encryptInsuranceAccountBatch(batchPO); + batchPO = encryptUtil.encrypt(batchPO, InsuranceAccountBatchPO.class); getInsuranceAccountBatchMapper().updateById(batchPO); } } From 1431308cc5e562b278bef274d9996a6f167ab932 Mon Sep 17 00:00:00 2001 From: fcli Date: Mon, 12 Dec 2022 16:42:44 +0800 Subject: [PATCH 73/77] =?UTF-8?q?feat:=20=E5=8A=A0=E5=AF=86=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=EF=BC=8C=E8=96=AA=E8=B5=84=E6=A0=B8=E7=AE=97=E7=BB=93?= =?UTF-8?q?=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datacollection/AddUpDeductionEncrypt.java | 4 ++++ .../salaryacct/po/SalaryAcctResultPO.java | 2 ++ .../impl/AddUpDeductionServiceImpl.java | 6 +++--- .../impl/SalaryAcctResultServiceImpl.java | 18 ++++++++++-------- .../service/impl/SalarySendServiceImpl.java | 8 +++++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java index 286e8047e..c79112501 100644 --- a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java @@ -17,6 +17,7 @@ import java.util.List; * add_up_infant_care */ public class AddUpDeductionEncrypt { + @Deprecated public static List encryptAddUpDeductionList(List list) { list.forEach(item -> { item.setAddUpChildEducation(AESEncryptUtil.encrypt(item.getAddUpChildEducation())); @@ -30,6 +31,7 @@ public class AddUpDeductionEncrypt { return list; } + @Deprecated public static List decryptAddUpDeductionList(List list) { list.forEach(item -> { item.setAddUpChildEducation(AESEncryptUtil.decrypt(item.getAddUpChildEducation())); @@ -43,6 +45,7 @@ public class AddUpDeductionEncrypt { return list; } + @Deprecated public static AddUpDeduction encryptAddUpDeduction(AddUpDeduction item) { if(item == null) { return item; @@ -57,6 +60,7 @@ public class AddUpDeductionEncrypt { return item; } + @Deprecated public static AddUpDeduction decryptAddUpDeduction(AddUpDeduction item) { if(item == null) { return item; diff --git a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java index 101d2bda1..a2b9d3ab1 100644 --- a/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java +++ b/src/com/engine/salary/entity/salaryacct/po/SalaryAcctResultPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.salaryacct.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -61,6 +62,7 @@ public class SalaryAcctResultPO { /** * 计算后的值 */ + @Encrypt private String resultValue; /** diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index 57a854a1d..2e19d1190 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -13,7 +13,6 @@ import com.engine.salary.biz.AddUpDeductionBiz; import com.engine.salary.biz.EmployBiz; import com.engine.salary.common.LocalDateRange; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.datacollection.AddUpDeductionEncrypt; import com.engine.salary.encrypt.datacollection.AddUpDeductionRecordStrDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.DataCollectionEmployee; @@ -78,6 +77,7 @@ import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TEN * @version 1.0 **/ public class AddUpDeductionServiceImpl extends Service implements AddUpDeductionService { + private EncryptUtil encryptUtil = new EncryptUtil(); private AddUpDeductionMapper getAddUpDeductionMapper() { return MapperProxyFactory.getProxy(AddUpDeductionMapper.class); @@ -712,12 +712,12 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction if (oldInfo == null) { addUpDeduction.setCreateTime(yearMonth); addUpDeduction.setUpdateTime(yearMonth); - insertList.add(AddUpDeductionEncrypt.encryptAddUpDeduction(addUpDeduction)); + insertList.add(encryptUtil.encrypt(addUpDeduction, AddUpDeduction.class)); } else { addUpDeduction.setId(oldInfo.getId()); addUpDeduction.setCreateTime(oldInfo.getCreateTime()); addUpDeduction.setUpdateTime(yearMonth); - updateList.add(AddUpDeductionEncrypt.encryptAddUpDeduction(addUpDeduction)); + updateList.add(encryptUtil.encrypt(addUpDeduction, AddUpDeduction.class)); } }); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index 2f5e7e428..17200bc38 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -4,7 +4,7 @@ import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.common.LocalDateRange; -import com.engine.salary.encrypt.salaryacct.SalaryAcctResultPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AttendQuoteFieldListDTO; import com.engine.salary.entity.report.bo.SalaryAcctResultReportBO; @@ -71,6 +71,7 @@ import java.util.stream.Collectors; **/ @Slf4j public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctResultService { + private EncryptUtil encryptUtil = new EncryptUtil(); private SalaryAcctResultMapper getSalaryAcctResultMapper() { return MapperProxyFactory.getProxy(SalaryAcctResultMapper.class); @@ -160,14 +161,14 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe return Collections.emptyList(); } List salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).build()); - SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS); + encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); return salaryAcctResultPOS; } @Override public List listBySalaryAcctEmployeeId(Long salaryAcctEmployeeId) { List salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpId(salaryAcctEmployeeId).build()); - SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS); + encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); // 解密 return salaryAcctResultPOS; } @@ -179,7 +180,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe } List salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctEmpIds(salaryAcctEmployeeIds).build()); // 解密 - SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS); + encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); return salaryAcctResultPOS; } @@ -189,7 +190,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe return Collections.emptyList(); } List salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).employeeIds(employeeIds).build()); - SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS); + encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); return salaryAcctResultPOS; } @@ -456,7 +457,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe // 保存薪资核算结果 if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) { // 加密 - SalaryAcctResultPOEncrypt.encryptList(salaryAcctResultPOS); + encryptUtil.encryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); List> partition = Lists.partition(salaryAcctResultPOS, 100); partition.forEach(getSalaryAcctResultMapper()::batchInsert); } @@ -491,7 +492,7 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe if (CollectionUtils.isNotEmpty(salaryAcctResultPOS)) { List list = (List) salaryAcctResultPOS; // 数据加密 - SalaryAcctResultPOEncrypt.encryptList(list); + encryptUtil.encryptList(list, SalaryAcctResultPO.class); List> partition = Lists.partition(list, 100); partition.forEach(getSalaryAcctResultMapper()::batchInsert); } @@ -694,7 +695,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe if (CollectionUtils.isEmpty(salaryAcctRecordIds)) { return Collections.emptyList(); } - return SalaryAcctResultPOEncrypt.decryptList(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).taxAgentIds(taxAgentIds).build())); + return encryptUtil.decryptList(getSalaryAcctResultMapper().listSome(SalaryAcctResultPO.builder().salaryAcctRecordIds(salaryAcctRecordIds).taxAgentIds(taxAgentIds).build()), + SalaryAcctResultPO.class); } diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index e90030326..9eb321973 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -12,7 +12,7 @@ import com.engine.salary.biz.SalarySendBiz; import com.engine.salary.biz.SalarySendInfoBiz; import com.engine.salary.constant.SalaryItemConstant; import com.engine.salary.constant.SalaryTemplateSalaryItemSetGroupConstant; -import com.engine.salary.encrypt.salaryacct.SalaryAcctResultPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryBill.dto.*; import com.engine.salary.entity.salaryBill.param.*; @@ -75,6 +75,8 @@ public class SalarySendServiceImpl extends Service implements SalarySendService private static final Logger log = LoggerFactory.getLogger(SalarySendServiceImpl.class); + private EncryptUtil encryptUtil = new EncryptUtil(); + private SalarySendBiz mapper = new SalarySendBiz(); private SalarySendInfoBiz salarySendInfoMapper = new SalarySendInfoBiz(); @@ -377,7 +379,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService acctPo.setSalaryAcctRecordId(salarySendInfo.getSalaryAcctRecordId()); acctPo.setEmployeeId(currentEmployeeId); List salaryAcctResultPOS = getSalaryAcctResultMapper().listSome(acctPo); - SalaryAcctResultPOEncrypt.decryptList(salaryAcctResultPOS); + encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); List> salaryAcctResultS = salaryAcctResultPOS.stream().map(m -> { Map map = new LinkedHashMap<>(); map.put("salaryItemId", m.getSalaryItemId()); @@ -616,7 +618,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService po.setSalaryAcctRecordId(salaryAccountingId); po.setEmployeeIds(list.stream().map(SalarySendDetailListDTO::getEmployeeId).collect(Collectors.toList())); List salaryAccountingResults = getSalaryAcctResultMapper().listSome(po); - SalaryAcctResultPOEncrypt.decryptList(salaryAccountingResults); + encryptUtil.decryptList(salaryAccountingResults, SalaryAcctResultPO.class); // 动态列 list.forEach(e -> { Map map = new LinkedHashMap<>(); From eabc983100fc8fb861f9527f9326ea78478f48ed Mon Sep 17 00:00:00 2001 From: fcli Date: Mon, 12 Dec 2022 17:56:26 +0800 Subject: [PATCH 74/77] =?UTF-8?q?feat:=20=E5=8A=A0=E5=AF=86=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=EF=BC=8C=E7=A4=BE=E4=BF=9D=E7=A6=8F=E5=88=A9=E6=A1=A3?= =?UTF-8?q?=E6=A1=88&=E8=96=AA=E8=B5=84=E6=A0=B8=E7=AE=97=E7=BB=93?= =?UTF-8?q?=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 11 +++++------ .../salaryacct/SalaryAcctResultPOEncrypt.java | 4 ++++ .../InsuranceAccountDetailPOEncrypt.java | 1 + .../siaccount/po/InsuranceAccountDetailPO.java | 18 ++++++++++++++++++ .../service/impl/SIAccountServiceImpl.java | 17 ++++++++--------- .../impl/SICompensationServiceImpl.java | 18 ++++++++---------- .../service/impl/SIExportServiceImpl.java | 7 ++++--- .../service/impl/SIRecessionServiceImpl.java | 16 +++++++++------- .../service/impl/SIReportServiceImpl.java | 6 ++++-- 9 files changed, 61 insertions(+), 37 deletions(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index ce9099800..100097823 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -9,7 +9,6 @@ import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailTempPOEncrypt; import com.engine.salary.encrypt.sischeme.InsuranceSchemeDetailPOEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; @@ -146,8 +145,8 @@ public class SIAccountBiz extends Service { SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getInsuranceAccountDetailMapper().list(queryParam); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list); PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class); + encryptUtil.decryptList(pageInfo.getList(), InsuranceAccountDetailPO.class); return pageInfo; } @@ -474,7 +473,7 @@ public class SIAccountBiz extends Service { if (CollectionUtils.isNotEmpty(collect)) { log.info("bill_detail入库数据数量:{}", collect.size()); batchSaveAccountInspectDetail(collect, billMonth, tenantKey); - InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(collect); + encryptUtil.encryptList(collect, InsuranceAccountDetailPO.class); List> lists = splitDetailList(collect, 20); lists.forEach(subList -> { getInsuranceAccountDetailMapper().batchSaveAccountDetails(subList); @@ -870,7 +869,7 @@ public class SIAccountBiz extends Service { BigDecimal socialTemp = new BigDecimal("0"); BigDecimal fundTemp = new BigDecimal("0"); BigDecimal otherTemp = new BigDecimal("0"); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(v); + encryptUtil.decryptList(v, InsuranceAccountDetailPO.class); boolean socialPersonFlag = false; boolean fundPersonFlag = false; boolean otherPersonFlag = false; @@ -1473,7 +1472,7 @@ public class SIAccountBiz extends Service { } batchSaveAccountInspectDetail(pos, billMonth, tenantKey); getInsuranceAccountDetailMapper().batchDelSupplementAccountDetails(pos); - InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(pos); + encryptUtil.encryptList(pos, InsuranceAccountDetailPO.class); List> lists = splitDetailList(pos, 20); lists.forEach(subList -> { getInsuranceAccountDetailMapper().batchSaveAccountDetails(subList); @@ -1616,7 +1615,7 @@ public class SIAccountBiz extends Service { // SalaryPageUtil.start(queryParam.getCurrent(),queryParam.getPageSize()); List insuranceAccountDetailPOS = getInsuranceAccountDetailMapper().selectList(queryParam.getBillMonth(), StringUtil.isBlank(queryParam.getPaymentOrganization()) ? null : Long.valueOf(queryParam.getPaymentOrganization())); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(insuranceAccountDetailPOS); + encryptUtil.decryptList(insuranceAccountDetailPOS, InsuranceAccountDetailPO.class); //获取扣缴义务人信息 List paymentList = MapperProxyFactory.getProxy(TaxAgentMapper.class).listAll(); diff --git a/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java b/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java index ecdb969a5..4150e15bf 100644 --- a/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java +++ b/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java @@ -7,6 +7,7 @@ import java.util.List; public class SalaryAcctResultPOEncrypt { + @Deprecated public static List encryptList(List list) { if(list == null || list.size() == 0) { return list; @@ -17,6 +18,7 @@ public class SalaryAcctResultPOEncrypt { return list; } + @Deprecated public static List decryptList(List list) { if(list == null || list.size() == 0) { return list; @@ -27,6 +29,7 @@ public class SalaryAcctResultPOEncrypt { return list; } + @Deprecated public static SalaryAcctResultPO encryptItem(SalaryAcctResultPO item) { if(item == null) { return item; @@ -35,6 +38,7 @@ public class SalaryAcctResultPOEncrypt { return item; } + @Deprecated public static SalaryAcctResultPO decryptItem(SalaryAcctResultPO item) { if(item == null) { return item; diff --git a/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailPOEncrypt.java b/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailPOEncrypt.java index 841140839..73153f629 100644 --- a/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailPOEncrypt.java +++ b/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailPOEncrypt.java @@ -30,6 +30,7 @@ import java.util.List; * other_sum * total */ +@Deprecated public class InsuranceAccountDetailPOEncrypt { public static List encryptInsuranceAccountDetailPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailPO.java index 5caeaff88..e8f7ce98f 100644 --- a/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailPO.java +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailPO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.siaccount.po; import com.cloudstore.eccom.pc.table.WeaTableType; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryTable; import lombok.AllArgsConstructor; import lombok.Builder; @@ -102,6 +103,7 @@ public class InsuranceAccountDetailPO { /** * 社保缴纳基数 */ + @Encrypt private String socialPaymentBaseString; /** @@ -112,6 +114,7 @@ public class InsuranceAccountDetailPO { /** * 公积金缴纳基数 */ + @Encrypt private String fundPaymentBaseString; /** @@ -122,51 +125,61 @@ public class InsuranceAccountDetailPO { /** * 其他福利缴纳基数 */ + @Encrypt private String otherPaymentBaseString; /** * 社保个人缴费明细 */ + @Encrypt private String socialPerJson; /** * 社保个人合计 */ + @Encrypt private String socialPerSum; /** * 公积金个人缴费明细 */ + @Encrypt private String fundPerJson; /** * 公积金个人合计 */ + @Encrypt private String fundPerSum; /** * 其他福利个人缴费明细 */ + @Encrypt private String otherPerJson; /** * 其他福利个人合计 */ + @Encrypt private String otherPerSum; /** * 个人合计 */ + @Encrypt private String perSum; /** * 社保单位缴费明细 */ + @Encrypt private String socialComJson; /** * 社保单位合计 */ + @Encrypt private String socialComSum; /** @@ -192,26 +205,31 @@ public class InsuranceAccountDetailPO { /** * 单位合计 */ + @Encrypt private String comSum; /** * 社保合计 */ + @Encrypt private String socialSum; /** * 公积金合计 */ + @Encrypt private String fundSum; /** * 其他福利合计 */ + @Encrypt private String otherSum; /** * 合计 */ + @Encrypt private String total; /** diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index b042f5c57..73a03981b 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -14,7 +14,6 @@ import com.engine.salary.component.SalaryWeaTable; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.siaccount.ExcelInsuranceDetailPOEncrypt; -import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.siaccount.bo.InsuranceAccountBO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountBatchListDTO; @@ -316,7 +315,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { List list = getInsuranceAccountDetailMapper().list(queryParam); PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class); List insuranceAccountDetailPOS = pageInfo.getList(); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(insuranceAccountDetailPOS); + encryptUtil.decryptList(insuranceAccountDetailPOS, InsuranceAccountDetailPO.class); //数据组装 List> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId); PageInfo> pageInfos = new PageInfo<>(records); @@ -382,7 +381,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { List list = getInsuranceAccountDetailMapper().list(queryParam); PageInfo pageInfo = new PageInfo<>(list, InsuranceAccountDetailPO.class); List insuranceAccountDetailPOS = pageInfo.getList(); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(insuranceAccountDetailPOS); + encryptUtil.decryptList(insuranceAccountDetailPOS, InsuranceAccountDetailPO.class); //数据组装 List> records = getService(user).buildCommonRecords(insuranceAccountDetailPOS, employeeId); PageInfo> pageInfos = new PageInfo<>(records); @@ -933,7 +932,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { BigDecimal perSum = new BigDecimal("0"); BigDecimal comSum = new BigDecimal("0"); for (InsuranceAccountDetailPO item : v) { - InsuranceAccountDetailPOEncrypt.decryptItem(item); + encryptUtil.decrypt(item, InsuranceAccountDetailPO.class); insuranceAccountDetailPO.setId(item.getId()); BigDecimal socialPerSum = StringUtils.isBlank(item.getSocialPerSum()) ? new BigDecimal("0") : new BigDecimal(item.getSocialPerSum()); BigDecimal socialComSum = StringUtils.isBlank(item.getSocialComSum()) ? new BigDecimal("0") : new BigDecimal(item.getSocialComSum()); @@ -1314,7 +1313,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { excelComments.add(errorMessageMap); } else { //拼装待更新数据 - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list); + encryptUtil.decryptList(list, InsuranceAccountDetailPO.class); updateInsuranceAccountDetailList.add(handleInsuranceAccountDetail(list.get(0), map)); } @@ -1329,7 +1328,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { } //将待更新列表加密 - InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(updateInsuranceAccountDetailList); + encryptUtil.encryptList(updateInsuranceAccountDetailList, InsuranceAccountDetailPO.class); //更新 for(InsuranceAccountDetailPO po : updateInsuranceAccountDetailList) { getSiAccountBiz(user).updateByEmployeeIdAndBillMonth(po); @@ -2240,7 +2239,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { if (insuranceAccountDetailPO == null) { throw new SalaryRunTimeException("该条核算数据不存在!"); } - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); String socialPerJson = insuranceAccountDetailPO.getSocialPerJson(); String socialComJson = insuranceAccountDetailPO.getSocialComJson(); String fundPerJson = insuranceAccountDetailPO.getFundPerJson(); @@ -2336,14 +2335,14 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { if (insuranceAccountDetailPO == null) { throw new SalaryRunTimeException("该条核算数据不存在!"); } - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); accountSocialByData(insuranceAccountDetailPO, param); accountFundByData(insuranceAccountDetailPO, param); accountOtherByData(insuranceAccountDetailPO, param); account(insuranceAccountDetailPO); - InsuranceAccountDetailPOEncrypt.encryptItem(insuranceAccountDetailPO); + encryptUtil.encrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //刷新_bill_batch表中的统计信息 diff --git a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java index 18171a378..d3a3c4a36 100644 --- a/src/com/engine/salary/service/impl/SICompensationServiceImpl.java +++ b/src/com/engine/salary/service/impl/SICompensationServiceImpl.java @@ -7,7 +7,7 @@ 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.siaccount.InsuranceAccountDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; @@ -17,7 +17,6 @@ import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationConfigPO; import com.engine.salary.entity.siaccount.po.InsuranceCompensationPO; import com.engine.salary.entity.sicategory.po.ICategoryPO; -import com.engine.salary.entity.taxagent.po.TaxAgentPO; import com.engine.salary.enums.siaccount.PaymentStatusEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; @@ -35,8 +34,6 @@ import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.page.Column; -import com.engine.salary.util.page.PageInfo; -import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import dm.jdbc.util.IdGenerator; import org.springframework.beans.BeanUtils; @@ -53,6 +50,7 @@ import java.util.stream.Collectors; * @Date: 2022/11/23 **/ public class SICompensationServiceImpl extends Service implements SICompensationService { + private EncryptUtil encryptUtil = new EncryptUtil(); private InsuranceAccountDetailMapper getInsuranceAccountDetailMapper() { return MapperProxyFactory.getProxy(InsuranceAccountDetailMapper.class); @@ -157,7 +155,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation if (insuranceAccountDetailPO == null) { return Lists.newArrayList(); } - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); List> result = new ArrayList<>(); String socialComJson = insuranceAccountDetailPO.getSocialComJson(); if (StringUtils.isNotBlank(socialComJson)) { @@ -195,7 +193,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation temp.put("error", SalaryI18nUtil.getI18nLabel(121038, "当前月在该缴纳组织下没有核算记录")); temp.put("totalNum", "0"); } else { - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); //判断是否已有调差数据(个税扣缴义务人+账单月份+人员id) InsuranceCompensationPO nowCompensation = getInsuranceCompensationMapper().getOneByBillMonthPayOrgEmpId(InsuranceCompensationPO.builder() .billMonth(insuranceAccountDetailPO.getBillMonth()) @@ -295,7 +293,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation continue; } - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); for (Map.Entry entry : socialJson.entrySet()) { @@ -325,7 +323,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation totalSum = totalSum.add(adjustmentTo); insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); //更新社保调差后的明细 - InsuranceAccountDetailPOEncrypt.encryptItem(insuranceAccountDetailPO); + encryptUtil.encrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //新建调差记录 InsuranceCompensationPO insuranceCompensationPO = new InsuranceCompensationPO(); @@ -410,7 +408,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation .build()); SalaryAssert.notNull(insuranceAccountDetailPO, SalaryI18nUtil.getI18nLabel(121108, "补差对象不存在")); - InsuranceAccountDetailPOEncrypt.decryptItem(insuranceAccountDetailPO); + encryptUtil.decrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); if (StringUtils.isNotBlank(insuranceAccountDetailPO.getSocialComJson())) { Map socialJson = JSON.parseObject(insuranceAccountDetailPO.getSocialComJson(), new HashMap().getClass()); for (Map.Entry entry : socialJson.entrySet()) { @@ -440,7 +438,7 @@ public class SICompensationServiceImpl extends Service implements SICompensation totalSum = totalSum.subtract(adjustmentTo); insuranceAccountDetailPO.setTotal(totalSum.toPlainString()); //更新社保调差后的明细 - InsuranceAccountDetailPOEncrypt.encryptItem(insuranceAccountDetailPO); + encryptUtil.encrypt(insuranceAccountDetailPO, InsuranceAccountDetailPO.class); getInsuranceAccountDetailMapper().updateById(insuranceAccountDetailPO); //删除调差记录 getInsuranceCompensationMapper().deleteById(param.getId()); diff --git a/src/com/engine/salary/service/impl/SIExportServiceImpl.java b/src/com/engine/salary/service/impl/SIExportServiceImpl.java index 504a69e8e..825f10af9 100644 --- a/src/com/engine/salary/service/impl/SIExportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIExportServiceImpl.java @@ -5,7 +5,7 @@ import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.SIAccountBiz; -import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.siexport.AccountExportPOEncrypt; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; @@ -21,7 +21,6 @@ import com.engine.salary.enums.siaccount.ResourceFromEnum; import com.engine.salary.enums.sicategory.DataTypeEnum; import com.engine.salary.enums.sicategory.WelfareTypeEnum; import com.engine.salary.mapper.InsuranceExportMapper; -import com.engine.salary.mapper.SysTaxRateDetailMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.mapper.siarchives.InsuranceBaseInfoMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; @@ -60,6 +59,8 @@ public class SIExportServiceImpl extends Service implements SIExportService { BaseBean bs = new BaseBean(); + private EncryptUtil encryptUtil = new EncryptUtil(); + private SIAccountBiz siAccountBiz = new SIAccountBiz(); private SISchemeService getSISchemeService(User user) { @@ -93,7 +94,7 @@ public class SIExportServiceImpl extends Service implements SIExportService { @Override public XSSFWorkbook exportOverView(InsuranceExportParam queryParam) { List insuranceAccountDetailPOS = getInsuranceAccountDetailMapper().selectList(queryParam.getBillMonth(), StringUtils.isBlank(queryParam.getPaymentOrganization()) ? null : Long.valueOf(queryParam.getPaymentOrganization())); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(insuranceAccountDetailPOS); + encryptUtil.decryptList(insuranceAccountDetailPOS, InsuranceAccountDetailPO.class); //获取扣缴义务人信息 List paymentList =getTaxAgentMapper().listAll(); diff --git a/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java b/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java index fae20634b..3a6476889 100644 --- a/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIRecessionServiceImpl.java @@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSON; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; -import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.hrm.dto.HrmInfoDTO; import com.engine.salary.entity.hrm.param.HrmQueryParam; import com.engine.salary.entity.siaccount.param.InsuranceAccountDetailParam; @@ -16,22 +16,22 @@ import com.engine.salary.enums.siaccount.BillStatusEnum; import com.engine.salary.enums.siaccount.PaymentStatusEnum; import com.engine.salary.enums.siaccount.ProjectTypeEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.datacollection.EmployMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountBatchMapper; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.service.SIAccountService; import com.engine.salary.service.SIRecessionService; import com.engine.salary.service.TaxAgentService; +import com.engine.salary.util.SalaryAssert; import com.engine.salary.util.SalaryEntityUtil; +import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.collections4.CollectionUtils; -import com.engine.salary.exception.SalaryRunTimeException; -import com.engine.salary.util.SalaryI18nUtil; -import com.engine.salary.util.SalaryAssert; +import org.apache.commons.lang3.StringUtils; import weaver.hrm.User; import java.math.BigDecimal; @@ -45,6 +45,8 @@ import java.util.stream.Collectors; **/ public class SIRecessionServiceImpl extends Service implements SIRecessionService { + private EncryptUtil encryptUtil = new EncryptUtil(); + private InsuranceAccountDetailMapper getInsuranceAccountDetailMapper() { return SqlProxyHandle.getProxy(InsuranceAccountDetailMapper.class); } @@ -92,7 +94,7 @@ public class SIRecessionServiceImpl extends Service implements SIRecessionServic ); }); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceAccountDetailPO.class); //处理数据 List finalDetailPOS = detailPOS; List finalRecessionDetails = new ArrayList<>(); @@ -106,7 +108,7 @@ public class SIRecessionServiceImpl extends Service implements SIRecessionServic }); //退差数据入库 if (CollectionUtils.isNotEmpty(finalRecessionDetails)) { - InsuranceAccountDetailPOEncrypt.encryptInsuranceAccountDetailPOList(finalRecessionDetails); + encryptUtil.encryptList(finalRecessionDetails, InsuranceAccountDetailPO.class); //删除已有退差记录 finalRecessionDetails.forEach(getInsuranceAccountDetailMapper()::deleteRecessionData); diff --git a/src/com/engine/salary/service/impl/SIReportServiceImpl.java b/src/com/engine/salary/service/impl/SIReportServiceImpl.java index a89e68f27..5be314a3a 100644 --- a/src/com/engine/salary/service/impl/SIReportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIReportServiceImpl.java @@ -1,7 +1,7 @@ package com.engine.salary.service.impl; import com.engine.core.impl.Service; -import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.siaccount.param.QueryAccountDetailParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.mapper.siaccount.SIAccountDetailMapper; @@ -15,6 +15,8 @@ import java.util.List; public class SIReportServiceImpl extends Service implements SIReportService { + private EncryptUtil encryptUtil = new EncryptUtil(); + private SIAccountDetailMapper getSIAccountDetailMapper(){ return MapperProxyFactory.getProxy(SIAccountDetailMapper.class); } @@ -25,7 +27,7 @@ public class SIReportServiceImpl extends Service implements SIReportService { List insuranceAccountDetailPOS = getSIAccountDetailMapper().listSome(param); PageInfo page = new PageInfo<>(insuranceAccountDetailPOS ,InsuranceAccountDetailPO.class); List list = page.getList(); - InsuranceAccountDetailPOEncrypt.decryptInsuranceAccountDetailPOList(list); + encryptUtil.decryptList(list, InsuranceAccountDetailPO.class); page.setList(list); return page; } From 1c6acb497cc0890a1200b78c87048bae50c8c3fb Mon Sep 17 00:00:00 2001 From: fcli Date: Tue, 13 Dec 2022 10:49:51 +0800 Subject: [PATCH 75/77] =?UTF-8?q?feat:=20=E5=8A=A0=E5=AF=86=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=EF=BC=8C=E7=B4=AF=E8=AE=A1=E9=99=84=E5=8A=A0=E6=89=A3?= =?UTF-8?q?=E9=99=A4=E8=AF=A6=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/biz/AddUpSituationBiz.java | 7 +++--- .../datacollection/dto/AddUpSituationDTO.java | 22 +++++++++++++++---- .../impl/AddUpSituationServiceImpl.java | 10 ++++++--- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/com/engine/salary/biz/AddUpSituationBiz.java b/src/com/engine/salary/biz/AddUpSituationBiz.java index 3ddc0b8fb..fee6dfcb7 100644 --- a/src/com/engine/salary/biz/AddUpSituationBiz.java +++ b/src/com/engine/salary/biz/AddUpSituationBiz.java @@ -1,6 +1,6 @@ package com.engine.salary.biz; -import com.engine.salary.encrypt.datacollection.AddUpSituationDTOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.datacollection.AddUpSituationEncrypt; import com.engine.salary.encrypt.datacollection.AddUpSituationRecordDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpSituation; @@ -19,6 +19,7 @@ import java.util.stream.Collectors; public class AddUpSituationBiz extends BaseBean { + private EncryptUtil encryptUtil = new EncryptUtil(); /** * 关联查询查询列表 @@ -31,7 +32,7 @@ public class AddUpSituationBiz extends BaseBean { try { AddUpSituationMapper mapper = sqlSession.getMapper(AddUpSituationMapper.class); List list = mapper.list(param); - return AddUpSituationDTOEncrypt.decryptAddUpSituationDTOList(list); + return encryptUtil.decryptList(list, AddUpSituationDTO.class); } finally { sqlSession.close(); } @@ -48,7 +49,7 @@ public class AddUpSituationBiz extends BaseBean { try { AddUpSituationMapper mapper = sqlSession.getMapper(AddUpSituationMapper.class); List addUpSituations = mapper.listSome(param); - return AddUpSituationEncrypt.decryptAddUpSituationList(addUpSituations); + return encryptUtil.decryptList(addUpSituations, AddUpSituation.class); } finally { sqlSession.close(); } diff --git a/src/com/engine/salary/entity/datacollection/dto/AddUpSituationDTO.java b/src/com/engine/salary/entity/datacollection/dto/AddUpSituationDTO.java index d761114cd..342d81f53 100644 --- a/src/com/engine/salary/entity/datacollection/dto/AddUpSituationDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/AddUpSituationDTO.java @@ -1,10 +1,7 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; -import com.engine.salary.annotation.SalaryTable; -import com.engine.salary.annotation.SalaryTableColumn; -import com.engine.salary.annotation.SalaryTableOperate; -import com.engine.salary.annotation.TableTitle; +import com.engine.salary.annotation.*; import com.engine.salary.util.excel.ExcelProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; @@ -92,102 +89,119 @@ public class AddUpSituationDTO { @SalaryTableColumn(text = "累计收入额", width = "10%", column = "addUpIncome") @TableTitle(title = "累计收入额", dataIndex = "addUpIncome", key = "addUpIncome") @ExcelProperty(index = 7) + @Encrypt private String addUpIncome; //累计减除费用 @SalaryTableColumn(text = "累计减除费用", width = "10%", column = "addUpSubtraction") @TableTitle(title = "累计减除费用", dataIndex = "addUpSubtraction", key = "addUpSubtraction") @ExcelProperty(index = 8) + @Encrypt private String addUpSubtraction; //累计社保个人合计 @SalaryTableColumn(text = "累计社保个人合计", width = "10%", column = "addUpSocialSecurityTotal") @TableTitle(title = "累计社保个人合计", dataIndex = "addUpSocialSecurityTotal", key = "addUpSocialSecurityTotal") @ExcelProperty(index = 9) + @Encrypt private String addUpSocialSecurityTotal; //累计公积金个人合计 @SalaryTableColumn(text = "累计公积金个人合计", width = "10%", column = "addUpAccumulationFundTotal") @TableTitle(title = "累计公积金个人合计", dataIndex = "addUpAccumulationFundTotal", key = "addUpAccumulationFundTotal") @ExcelProperty(index = 10) + @Encrypt private String addUpAccumulationFundTotal; //累计子女教育 @SalaryTableColumn(text = "累计子女教育", width = "10%", column = "addUpChildEducation") @TableTitle(title = "累计子女教育", dataIndex = "addUpChildEducation", key = "addUpChildEducation") @ExcelProperty(index = 11) + @Encrypt private String addUpChildEducation; //累计继续教育 @SalaryTableColumn(text = "累计继续教育", width = "10%", column = "addUpContinuingEducation") @TableTitle(title = "累计继续教育", dataIndex = "addUpContinuingEducation", key = "addUpContinuingEducation") @ExcelProperty(index = 12) + @Encrypt private String addUpContinuingEducation; //累计住房贷款利息 @SalaryTableColumn(text = "累计住房贷款利息", width = "10%", column = "addUpHousingLoanInterest") @TableTitle(title = "累计住房贷款利息", dataIndex = "addUpHousingLoanInterest", key = "addUpHousingLoanInterest") @ExcelProperty(index = 13) + @Encrypt private String addUpHousingLoanInterest; //累计住房租金 @SalaryTableColumn(text = "累计住房租金", width = "10%", column = "addUpHousingRent") @TableTitle(title = "累计住房租金", dataIndex = "addUpHousingRent", key = "addUpHousingRent") @ExcelProperty(index = 14) + @Encrypt private String addUpHousingRent; //累计赡养老人 @SalaryTableColumn(text = "累计赡养老人", width = "10%", column = "addUpSupportElderly") @TableTitle(title = "累计赡养老人", dataIndex = "addUpSupportElderly", key = "addUpSupportElderly") @ExcelProperty(index = 15) + @Encrypt private String addUpSupportElderly; //累计大病医疗 @SalaryTableColumn(text = "累计大病医疗", width = "10%", column = "addUpIllnessMedical") @TableTitle(title = "累计大病医疗", dataIndex = "addUpIllnessMedical", key = "addUpIllnessMedical") @ExcelProperty(index = 16) + @Encrypt private String addUpIllnessMedical; //累计企业(职业)年金及其他福利 @SalaryTableColumn(text = "累计企业(职业)年金及其他福利", width = "10%", column = "addUpEnterpriseAndOther") @TableTitle(title = "累计企业(职业)年金及其他福利", dataIndex = "addUpEnterpriseAndOther", key = "addUpEnterpriseAndOther") @ExcelProperty(index = 17) + @Encrypt private String addUpEnterpriseAndOther; //累计其他扣除 @SalaryTableColumn(text = "累计其他扣除", width = "10%", column = "addUpOtherDeduction") @TableTitle(title = "累计其他扣除", dataIndex = "addUpOtherDeduction", key = "addUpOtherDeduction") @ExcelProperty(index = 18) + @Encrypt private String addUpOtherDeduction; //累计免税收入 @SalaryTableColumn(text = "累计免税收入", width = "10%", column = "addUpTaxExemptIncome") @TableTitle(title = "累计免税收入", dataIndex = "addUpTaxExemptIncome", key = "addUpTaxExemptIncome") @ExcelProperty(index = 19) + @Encrypt private String addUpTaxExemptIncome; //累计准予扣除的捐赠额 @SalaryTableColumn(text = "累计准予扣除的捐赠额", width = "10%", column = "addUpAllowedDonation") @TableTitle(title = "累计准予扣除的捐赠额", dataIndex = "addUpAllowedDonation", key = "addUpAllowedDonation") @ExcelProperty(index = 20) + @Encrypt private String addUpAllowedDonation; //累计减免税额 @SalaryTableColumn(text = "累计减免税额", width = "10%", column = "addUpTaxSavings") @TableTitle(title = "累计减免税额", dataIndex = "addUpTaxSavings", key = "addUpTaxSavings") @ExcelProperty(index = 21) + @Encrypt private String addUpTaxSavings; //累计已预扣预缴税额 @SalaryTableColumn(text = "累计已预扣预缴税额", width = "10%", column = "addUpAdvanceTax") @TableTitle(title = "累计已预扣预缴税额", dataIndex = "addUpAdvanceTax", key = "addUpAdvanceTax") @ExcelProperty(index = 22) + @Encrypt private String addUpAdvanceTax; //累计婴幼儿照护 @ExcelProperty(index = 23) @SalaryTableColumn(text = "累计婴幼儿照护", width = "10%", column = "addUpInfantCare") @TableTitle(title = "累计婴幼儿照护", dataIndex = "addUpInfantCare", key = "addUpInfantCare") + @Encrypt private String addUpInfantCare; @SalaryTableColumn(text = "操作", width = "20%", column = "operate") diff --git a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java index ee52107f4..76b09e534 100644 --- a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java @@ -9,13 +9,16 @@ import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.AddUpSituationBiz; import com.engine.salary.biz.EmployBiz; -import com.engine.salary.encrypt.datacollection.AddUpSituationDTOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.encrypt.datacollection.AddUpSituationRecordDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AddUpSituationDTO; import com.engine.salary.entity.datacollection.dto.AddUpSituationRecordDTO; -import com.engine.salary.entity.datacollection.param.*; +import com.engine.salary.entity.datacollection.param.AddUpSituationDeleteParam; +import com.engine.salary.entity.datacollection.param.AddUpSituationImportParam; +import com.engine.salary.entity.datacollection.param.AddUpSituationParam; +import com.engine.salary.entity.datacollection.param.AddUpSituationQueryParam; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; @@ -60,6 +63,7 @@ import java.util.stream.Collectors; import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; public class AddUpSituationServiceImpl extends Service implements AddUpSituationService { + private EncryptUtil encryptUtil = new EncryptUtil(); private AddUpSituationMapper getAddUpSituationMapper() { return MapperProxyFactory.getProxy(AddUpSituationMapper.class); @@ -198,7 +202,7 @@ public class AddUpSituationServiceImpl extends Service implements AddUpSituation } SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpSituationMapper().list(queryParam); - AddUpSituationDTOEncrypt.decryptAddUpSituationDTOList(list); + encryptUtil.decryptList(list, AddUpSituationDTO.class); return new PageInfo<>(list, AddUpSituationDTO.class); } From d3de862d1176d42ed4f8e92da8338653722b579c Mon Sep 17 00:00:00 2001 From: fcli Date: Tue, 13 Dec 2022 13:34:22 +0800 Subject: [PATCH 76/77] =?UTF-8?q?feat:=20=E5=8A=A0=E5=AF=86=E7=BB=9F?= =?UTF-8?q?=E4=B8=80,=E8=96=AA=E8=B5=84=E9=A1=B9=E7=9B=AE&=E7=A4=BE?= =?UTF-8?q?=E4=BF=9D=E6=A1=A3=E6=A1=88=E8=AF=A6=E6=83=85...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/salary/biz/AddUpSituationBiz.java | 10 ++--- .../engine/salary/biz/OtherDeductionBiz.java | 15 ++++--- src/com/engine/salary/biz/SIAccountBiz.java | 20 ++++----- src/com/engine/salary/biz/SIArchivesBiz.java | 41 +++++++++---------- src/com/engine/salary/biz/SISchemeBiz.java | 16 ++++---- .../salary/biz/SalaryArchiveItemBiz.java | 13 +++--- .../salary/biz/SpecialAddDeductionBiz.java | 19 +++++---- .../archive/SalaryArchiveItemPOEncrypt.java | 1 + .../SalaryItemAdjustRecordListDTOEncrypt.java | 1 + .../datacollection/AddUpDeductionEncrypt.java | 1 + .../AddUpDeductionRecordStrDTOEncrypt.java | 1 + .../AddUpDeductionStrDTOEncrypt.java | 1 + .../AddUpSituationDTOEncrypt.java | 6 +-- .../datacollection/AddUpSituationEncrypt.java | 1 + .../AddUpSituationRecordDTOEncrypt.java | 1 + .../OtherDeductionListDTOEncrypt.java | 1 + .../OtherDeductionPOEncrypt.java | 10 +---- .../OtherDeductionRecordDTOEncrypt.java | 1 + .../SpecialAddDeductionEncrypt.java | 5 +-- .../SalaryAcctResultReportPOEncrypt.java | 1 + .../salaryacct/ExcelAcctResultPOEncrypt.java | 1 + .../salaryacct/SalaryAcctResultPOEncrypt.java | 1 + .../ExcelInsuranceDetailPOEncrypt.java | 1 + .../InsuranceAccountDetailTempPOEncrypt.java | 1 + .../encrypt/siaccount/SiAccountEncrypt.java | 1 + .../InsuranceArchivesFundSchemePOEncrypt.java | 1 + ...InsuranceArchivesOtherSchemePOEncrypt.java | 2 +- ...nsuranceArchivesSocialSchemePOEncrypt.java | 1 + .../siexport/AccountExportPOEncrypt.java | 1 + .../siexport/ExcelAccountExportPOEncrypt.java | 1 + .../InsuranceSchemeDetailPOEncrypt.java | 1 + .../TaxDeclarationDetailEncrypt.java | 2 + .../TaxDeclarationDetailPOEncrypt.java | 1 + .../entity/datacollection/AddUpSituation.java | 18 ++++++++ .../dto/AddUpSituationRecordDTO.java | 18 ++++++++ .../dto/OtherDeductionListDTO.java | 9 ++-- .../dto/OtherDeductionRecordDTO.java | 5 +++ .../dto/SpecialAddDeductionListDTO.java | 12 ++++-- .../dto/SpecialAddDeductionRecordDTO.java | 11 +++-- .../datacollection/po/OtherDeductionPO.java | 5 +++ .../po/SpecialAddDeductionPO.java | 11 ++++- .../report/po/SalaryAcctResultReportPO.java | 3 ++ .../salaryacct/po/ExcelAcctResultPO.java | 2 + .../siaccount/po/ExcelInsuranceDetailPO.java | 18 ++++++++ .../po/InsuranceAccountDetailTempPO.java | 18 ++++++++ .../po/InsuranceArchivesFundSchemePO.java | 2 + .../po/InsuranceArchivesOtherSchemePO.java | 2 + .../po/InsuranceArchivesSocialSchemePO.java | 2 + .../sischeme/po/InsuranceSchemeDetailPO.java | 4 ++ .../taxdeclaration/bo/TaxDeclarationBO.java | 5 ++- .../po/TaxDeclarationDetailPO.java | 2 + .../impl/AddUpDeductionServiceImpl.java | 3 +- .../impl/AddUpSituationServiceImpl.java | 3 +- .../impl/OtherDeductionServiceImpl.java | 17 ++++---- .../impl/SIAComparisonResultServiceImpl.java | 8 ++-- .../service/impl/SIAccountServiceImpl.java | 3 +- .../service/impl/SIExportServiceImpl.java | 3 +- .../service/impl/SIImportServiceImpl.java | 11 +++-- .../service/impl/SISchemeServiceImpl.java | 33 ++++++++------- .../impl/SalaryAcctReportServiceImpl.java | 7 ++-- .../SalaryComparisonResultServiceImpl.java | 10 ++--- .../impl/SpecialAddDeductionServiceImpl.java | 14 ++++--- .../impl/TaxDeclarationDetailServiceImpl.java | 10 +++-- .../impl/SalarySysConfServiceImpl.java | 12 +++--- 64 files changed, 296 insertions(+), 165 deletions(-) diff --git a/src/com/engine/salary/biz/AddUpSituationBiz.java b/src/com/engine/salary/biz/AddUpSituationBiz.java index fee6dfcb7..ba27c39d9 100644 --- a/src/com/engine/salary/biz/AddUpSituationBiz.java +++ b/src/com/engine/salary/biz/AddUpSituationBiz.java @@ -1,8 +1,6 @@ package com.engine.salary.biz; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.datacollection.AddUpSituationEncrypt; -import com.engine.salary.encrypt.datacollection.AddUpSituationRecordDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.dto.AddUpSituationDTO; import com.engine.salary.entity.datacollection.dto.AddUpSituationRecordDTO; @@ -67,7 +65,7 @@ public class AddUpSituationBiz extends BaseBean { try { AddUpSituationMapper mapper = sqlSession.getMapper(AddUpSituationMapper.class); AddUpSituation byId = mapper.getById(id); - return AddUpSituationEncrypt.decryptAddUpSituation(byId); + return encryptUtil.decrypt(byId, AddUpSituation.class); } finally { sqlSession.close(); } @@ -84,7 +82,7 @@ public class AddUpSituationBiz extends BaseBean { try { AddUpSituationMapper mapper = sqlSession.getMapper(AddUpSituationMapper.class); List addUpSituationRecordDTOS = mapper.recordList(param); - return AddUpSituationRecordDTOEncrypt.decryptAddUpSituationRecordDTOList(addUpSituationRecordDTOS); + return encryptUtil.decryptList(addUpSituationRecordDTOS, AddUpSituationRecordDTO.class); } finally { sqlSession.close(); } @@ -103,7 +101,7 @@ public class AddUpSituationBiz extends BaseBean { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { AddUpSituationMapper mapper = sqlSession.getMapper(AddUpSituationMapper.class); - AddUpSituationEncrypt.encryptAddUpSituationList(param); + encryptUtil.encryptList(param, AddUpSituation.class); List> partition = Lists.partition(param, 50); partition.forEach(mapper::insertData); sqlSession.commit(); @@ -125,7 +123,7 @@ public class AddUpSituationBiz extends BaseBean { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { AddUpSituationMapper mapper = sqlSession.getMapper(AddUpSituationMapper.class); - AddUpSituationEncrypt.encryptAddUpSituationList(param); + encryptUtil.encryptList(param, AddUpSituation.class); List> partition = Lists.partition(param, 50); partition.forEach(mapper::updateData); sqlSession.commit(); diff --git a/src/com/engine/salary/biz/OtherDeductionBiz.java b/src/com/engine/salary/biz/OtherDeductionBiz.java index b71668f86..5b6002825 100644 --- a/src/com/engine/salary/biz/OtherDeductionBiz.java +++ b/src/com/engine/salary/biz/OtherDeductionBiz.java @@ -1,7 +1,6 @@ package com.engine.salary.biz; -import com.engine.salary.encrypt.datacollection.OtherDeductionPOEncrypt; -import com.engine.salary.encrypt.datacollection.OtherDeductionRecordDTOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.dto.OtherDeductionRecordDTO; import com.engine.salary.entity.datacollection.param.OtherDeductionQueryParam; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; @@ -17,7 +16,7 @@ import java.util.stream.Collectors; public class OtherDeductionBiz extends BaseBean { - + private EncryptUtil encryptUtil = new EncryptUtil(); /** * 条件查询 @@ -30,7 +29,7 @@ public class OtherDeductionBiz extends BaseBean { try { OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); List otherDeductionPOS = mapper.listSome(param); - return OtherDeductionPOEncrypt.decryptOtherDeductionPOList(otherDeductionPOS); + return encryptUtil.decryptList(otherDeductionPOS, OtherDeductionPO.class); } finally { sqlSession.close(); } @@ -48,7 +47,7 @@ public class OtherDeductionBiz extends BaseBean { try { OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); OtherDeductionPO byId = mapper.getById(id); - return OtherDeductionPOEncrypt.decryptOtherDeductionPO(byId); + return encryptUtil.decrypt(byId, OtherDeductionPO.class); } finally { sqlSession.close(); } @@ -65,7 +64,7 @@ public class OtherDeductionBiz extends BaseBean { try { OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); List otherDeductionRecordDTOS = mapper.recordList(param); - return OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(otherDeductionRecordDTOS); + return encryptUtil.decryptList(otherDeductionRecordDTOS, OtherDeductionRecordDTO.class); } finally { sqlSession.close(); } @@ -84,7 +83,7 @@ public class OtherDeductionBiz extends BaseBean { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); - OtherDeductionPOEncrypt.encryptOtherDeductionPOList(param); + encryptUtil.encryptList(param, OtherDeductionPO.class); List> partition = Lists.partition(param, 100); partition.forEach(mapper::insertData); sqlSession.commit(); @@ -106,7 +105,7 @@ public class OtherDeductionBiz extends BaseBean { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { OtherDeductionMapper mapper = sqlSession.getMapper(OtherDeductionMapper.class); - OtherDeductionPOEncrypt.encryptOtherDeductionPOList(param); + encryptUtil.encryptList(param, OtherDeductionPO.class); List> partition = Lists.partition(param, 100); partition.forEach(mapper::updateData); sqlSession.commit(); diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index 100097823..cdbcbd315 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -9,8 +9,6 @@ import com.engine.salary.cache.SalaryCacheKey; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.siaccount.InsuranceAccountDetailTempPOEncrypt; -import com.engine.salary.encrypt.sischeme.InsuranceSchemeDetailPOEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryacct.dto.SalaryAcctProgressDTO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; @@ -411,7 +409,7 @@ public class SIAccountBiz extends Service { }); //临时表数据入库 if (CollectionUtils.isNotEmpty(list)) { - InsuranceAccountDetailTempPOEncrypt.encryptInsuranceAccountDetailTempPOList(list); + encryptUtil.encryptList(list, InsuranceAccountDetailTempPO.class); List> lists = splitList(list, 40); lists.forEach(subList -> { MapperProxyFactory.getProxy(SIAccountDetailTempMapper.class).batchSaveAccountTempDetails(subList); @@ -448,7 +446,7 @@ public class SIAccountBiz extends Service { String billMonth = param.getBillMonth(); try { List list = MapperProxyFactory.getProxy(SIAccountDetailTempMapper.class).getListByEmployeeIdsAndBillMonth(ids, billMonth, param.getPaymentOrganization()); - InsuranceAccountDetailTempPOEncrypt.decryptInsuranceAccountDetailTempPOList(list); + encryptUtil.decryptList(list, InsuranceAccountDetailTempPO.class); Integer paymentStatus = 0; log.info("核算明细临时表 hrsa_bill_detail_temp待处理数量:{}", list.size()); List> partitionIds = Lists.partition((List) ids, 100); @@ -527,7 +525,7 @@ public class SIAccountBiz extends Service { Boolean inDataRange = SalaryDateUtil.monthInRange(insuranceAccountDetailPO.getBillMonth(), otherPO.getOtherStartTime(), otherPO.getOtherEndTime()); if ((Objects.equals(NonPaymentEnum.YES.getValue(), otherPO.getNonPayment()) || otherPO.getNonPayment() == null) && otherPO.getOtherSchemeId() != null && inDataRange) { List detailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryListBySchemeId(otherPO.getOtherSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceSchemeDetailPO.class); //方案中包含的需要缴纳其他的个人福利 Map otherPerson = detailPOS.stream() .filter(item -> Objects.equals(IsPaymentEnum.YES.getValue(), item.getIsPayment()) && item.getPaymentScope() == PaymentScopeEnum.SCOPE_PERSON.getValue()) @@ -618,7 +616,7 @@ public class SIAccountBiz extends Service { Boolean inDataRange = SalaryDateUtil.monthInRange(insuranceAccountDetailPO.getBillMonth(), fundPO.getFundStartTime(), fundPO.getFundEndTime()); if ((NonPaymentEnum.YES.getValue() == fundPO.getNonPayment() || fundPO.getNonPayment() == null) && fundPO.getFundSchemeId() != null && inDataRange) { List detailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryListBySchemeId(fundPO.getFundSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceSchemeDetailPO.class); //方案中包含的需要缴纳社保的个人福利 Map fundperson = detailPOS.stream() .filter(item -> IsPaymentEnum.YES.getValue() == item.getIsPayment() && item.getPaymentScope() == PaymentScopeEnum.SCOPE_PERSON.getValue()) @@ -709,7 +707,7 @@ public class SIAccountBiz extends Service { Boolean inDataRange = SalaryDateUtil.monthInRange(insuranceAccountDetailPO.getBillMonth(), socialPO.getSocialStartTime(), socialPO.getSocialEndTime()); if ((NonPaymentEnum.YES.getValue().equals(socialPO.getNonPayment()) || socialPO.getNonPayment() == null) && socialPO.getSocialSchemeId() != null && inDataRange) { List detailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryListBySchemeId(socialPO.getSocialSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceSchemeDetailPO.class); //方案中包含的需要缴纳社保的个人福利 Map schemeperson = detailPOS.stream() .filter(item -> Objects.equals(IsPaymentEnum.YES.getValue(), item.getIsPayment()) && Objects.equals(item.getPaymentScope(), PaymentScopeEnum.SCOPE_PERSON.getValue())) @@ -1106,7 +1104,7 @@ public class SIAccountBiz extends Service { insuranceAccountDetailPO.setOtherPaymentBaseString(otherPO.getOtherPaymentBaseString()); if ((Objects.equals(NonPaymentEnum.YES.getValue(), otherPO.getNonPayment()) || otherPO.getNonPayment() == null) && otherPO.getOtherSchemeId() != null) { List detailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryListBySchemeId(otherPO.getOtherSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceSchemeDetailPO.class); //方案中包含的需要缴纳其他的个人福利 Map otherPerson = detailPOS.stream() .filter(item -> Objects.equals(IsPaymentEnum.YES.getValue(), item.getIsPayment()) && item.getPaymentScope() == PaymentScopeEnum.SCOPE_PERSON.getValue()) @@ -1196,7 +1194,7 @@ public class SIAccountBiz extends Service { insuranceAccountDetailPO.setFundPaymentBaseString(fundPO.getFundPaymentBaseString()); if ((NonPaymentEnum.YES.getValue() == fundPO.getNonPayment() || fundPO.getNonPayment() == null) && fundPO.getFundSchemeId() != null) { List detailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryListBySchemeId(fundPO.getFundSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceSchemeDetailPO.class); //方案中包含的需要缴纳社保的个人福利 Map fundperson = detailPOS.stream() .filter(item -> IsPaymentEnum.YES.getValue() == item.getIsPayment() && item.getPaymentScope() == PaymentScopeEnum.SCOPE_PERSON.getValue()) @@ -1284,7 +1282,7 @@ public class SIAccountBiz extends Service { insuranceAccountDetailPO.setSocialPaymentBaseString(socialPO.getSocialPaymentBaseString()); if ((NonPaymentEnum.YES.getValue() == socialPO.getNonPayment() || socialPO.getNonPayment() == null) && socialPO.getSocialSchemeId() != null) { List detailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryListBySchemeId(socialPO.getSocialSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceSchemeDetailPO.class); //方案中包含的需要缴纳社保的个人福利 Map schemeperson = detailPOS.stream() .filter(item -> IsPaymentEnum.YES.getValue() == item.getIsPayment() && item.getPaymentScope() == PaymentScopeEnum.SCOPE_PERSON.getValue()) @@ -1372,7 +1370,7 @@ public class SIAccountBiz extends Service { insuranceAccountDetailPO.setSocialPaymentBaseString(socialPO.getSocialPaymentBaseString()); if ((NonPaymentEnum.YES.getValue() == socialPO.getNonPayment() || socialPO.getNonPayment() == null) && socialPO.getSocialSchemeId() != null) { List detailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryListBySchemeId(socialPO.getSocialSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(detailPOS); + encryptUtil.decryptList(detailPOS, InsuranceSchemeDetailPO.class); //方案中包含的需要缴纳社保的个人福利 Map schemeperson = detailPOS.stream() .filter(item -> IsPaymentEnum.YES.getValue() == item.getIsPayment() && item.getPaymentScope() == PaymentScopeEnum.SCOPE_PERSON.getValue()) diff --git a/src/com/engine/salary/biz/SIArchivesBiz.java b/src/com/engine/salary/biz/SIArchivesBiz.java index 62fa5fc76..ba4f3df93 100644 --- a/src/com/engine/salary/biz/SIArchivesBiz.java +++ b/src/com/engine/salary/biz/SIArchivesBiz.java @@ -14,10 +14,7 @@ import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesFundSchemePOEncrypt; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesOtherSchemePOEncrypt; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesSocialSchemePOEncrypt; -import com.engine.salary.encrypt.sischeme.InsuranceSchemeDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.siarchives.bo.InsuranceArchivesBO; import com.engine.salary.entity.siarchives.dto.InsuranceArchivesBaseDTO; @@ -81,6 +78,8 @@ public class SIArchivesBiz { Boolean needAuth; Collection taxAgentPOS; + private EncryptUtil encryptUtil = new EncryptUtil(); + private TaxAgentMapper getTaxAgentMapper() { return MapperProxyFactory.getProxy(TaxAgentMapper.class); } @@ -378,7 +377,7 @@ public class SIArchivesBiz { try { InsuranceSchemeDetailMapper insuranceSchemeDetailMapper = sqlSession.getMapper(InsuranceSchemeDetailMapper.class); List insuranceSchemeDetailPOS = insuranceSchemeDetailMapper.queryListByPrimaryIdIsPayment(schemeId, IsPaymentEnum.YES.getValue(), welfareType); - InsuranceSchemeDetailPOEncrypt.decryptList(insuranceSchemeDetailPOS); + encryptUtil.decryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); return insuranceSchemeDetailPOS; } finally { sqlSession.close(); @@ -417,7 +416,7 @@ public class SIArchivesBiz { .employeeId(employeeId) .paymentOrganization(paymentOrganization) .build()); - InsuranceArchivesOtherSchemePOEncrypt.decryptList(otherList); + encryptUtil.decryptList(otherList, InsuranceArchivesOtherSchemePO.class); InsuranceArchivesOtherSchemePO insuranceArchivesOtherSchemePO = otherList.size() != 0 ? otherList.get(0) : null; InsuranceArchivesOtherSchemeDTO data = InsuranceArchivesBO.convertOtherPOtoDTO(insuranceArchivesOtherSchemePO, employeeId); if (insuranceArchivesOtherSchemePO == null) { @@ -448,7 +447,7 @@ public class SIArchivesBiz { .employeeId(employeeId) .paymentOrganization(paymentOrganization) .build()); - InsuranceArchivesFundSchemePOEncrypt.decryptList(fundList); + encryptUtil.decryptList(fundList, InsuranceArchivesFundSchemePO.class); InsuranceArchivesFundSchemePO insuranceArchivesFundSchemePO = fundList.size() != 0 ? fundList.get(0) : null; InsuranceArchivesFundSchemeDTO data = InsuranceArchivesBO.convertFundPOtoDTO(insuranceArchivesFundSchemePO, employeeId); if (insuranceArchivesFundSchemePO == null) { @@ -494,7 +493,7 @@ public class SIArchivesBiz { .employeeId(employeeId) .paymentOrganization(paymentOrganization) .build()); - InsuranceArchivesSocialSchemePOEncrypt.decryptList(socialList); + encryptUtil.decryptList(socialList, InsuranceArchivesSocialSchemePO.class); return socialList.size() != 0 ? socialList.get(0) : null; } finally { sqlSession.close(); @@ -670,7 +669,7 @@ public class SIArchivesBiz { if (!checkWelBaseLimit(updateOtherInfo.getOtherSchemeId(),updateOtherInfo.getOtherPaymentBaseString())) { throw new SalaryRunTimeException("其他福利明细中的基数更新内容不符合相关基数上下限要求,请检查后重试!"); } - InsuranceArchivesOtherSchemePOEncrypt.encryptItem(updateOtherInfo); + encryptUtil.encrypt(updateOtherInfo, InsuranceArchivesOtherSchemePO.class); otherSchemeMapper.updateById(updateOtherInfo); sqlSession.commit(); } else { @@ -722,7 +721,7 @@ public class SIArchivesBiz { if (!checkWelBaseLimit(updateFundInfo.getFundSchemeId(),updateFundInfo.getFundPaymentBaseString())) { throw new SalaryRunTimeException("公积金福利明细中的基数更新内容不符合相关基数上下限要求,请检查后重试!"); } - InsuranceArchivesFundSchemePOEncrypt.encryptItem(updateFundInfo); + encryptUtil.encrypt(updateFundInfo, InsuranceArchivesFundSchemePO.class); fundSchemeMapper.updateById(updateFundInfo); sqlSession.commit(); @@ -783,7 +782,7 @@ public class SIArchivesBiz { if (!checkWelBaseLimit(updateSocialInfo.getSocialSchemeId(),updateSocialInfo.getSocialPaymentBaseString())) { throw new SalaryRunTimeException("社保福利明细中的基数更新内容不符合相关基数上下限要求,请检查后重试!"); } - InsuranceArchivesSocialSchemePOEncrypt.encryptItem(updateSocialInfo); + encryptUtil.encrypt(updateSocialInfo, InsuranceArchivesSocialSchemePO.class); socialSchemeMapper.updateById(updateSocialInfo); sqlSession.commit(); @@ -837,7 +836,7 @@ public class SIArchivesBiz { if (isPaymentList.size() > 0) { InsuranceSchemeDetailPO insuranceSchemeDetailPO = isPaymentList.get(0); - InsuranceSchemeDetailPOEncrypt.decryptItem(insuranceSchemeDetailPO); + encryptUtil.decrypt(insuranceSchemeDetailPO, InsuranceSchemeDetailPO.class); String lowerLimit = "0.000".equals(insuranceSchemeDetailPO.getLowerLimit()) ? null : insuranceSchemeDetailPO.getLowerLimit(); String upperLimit = "0.000".equals(insuranceSchemeDetailPO.getUpperLimit()) ? null : insuranceSchemeDetailPO.getUpperLimit(); if (lowerLimit != null && lowerLimit.length() > 0 && Double.parseDouble(entry.getValue()) < Double.parseDouble(lowerLimit)) { @@ -1077,13 +1076,13 @@ public class SIArchivesBiz { insuranceArchivesEmployeePOS.forEach(item -> { List socialList = socialSchemeMapper.getSocialByEmployeeId(Collections.singletonList(item.getEmployeeId())); - InsuranceArchivesSocialSchemePOEncrypt.decryptList(socialList); + encryptUtil.decryptList(socialList, InsuranceArchivesSocialSchemePO.class); // InsuranceArchivesSocialSchemePO socialItem = socialList.size() != 0 ? socialList.get(0) : null; List fundList = fundSchemeMapper.getFundByEmployeeId(Collections.singletonList(item.getEmployeeId())); - InsuranceArchivesFundSchemePOEncrypt.decryptList(fundList); + encryptUtil.decryptList(fundList, InsuranceArchivesFundSchemePO.class); // InsuranceArchivesFundSchemePO fundItem = fundList.size() != 0 ? fundList.get(0) : null; List otherList = otherSchemeMapper.getOtherByEmployeeId(Collections.singletonList(item.getEmployeeId())); - InsuranceArchivesOtherSchemePOEncrypt.decryptList(otherList); + encryptUtil.decryptList(otherList, InsuranceArchivesOtherSchemePO.class); // InsuranceArchivesOtherSchemePO otherItem = otherList.size() != 0 ? otherList.get(0) : null; if (socialList.size() > 0) { for (InsuranceArchivesSocialSchemePO socialSchemePO : socialList) { @@ -1189,13 +1188,13 @@ public class SIArchivesBiz { InsuranceSchemeMapper insuranceSchemeMapper = sqlSession.getMapper(InsuranceSchemeMapper.class); // List employeeIds = insuranceArchivesEmployeePOS.stream().map(InsuranceArchivesEmployeePO::getEmployeeId).collect(Collectors.toList()); - Map socialSchemePOMap = InsuranceArchivesSocialSchemePOEncrypt.decryptList(this.getSocialByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS)) + Map socialSchemePOMap = encryptUtil.decryptList(this.getSocialByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS), InsuranceArchivesSocialSchemePO.class) .stream().collect(Collectors.toMap(InsuranceArchivesSocialSchemePO::getId, Function.identity())); - Map fundSchemePOMap = InsuranceArchivesFundSchemePOEncrypt.decryptList(this.getFundByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS)) + Map fundSchemePOMap = encryptUtil.decryptList(this.getFundByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS), InsuranceArchivesFundSchemePO.class) .stream().collect(Collectors.toMap(InsuranceArchivesFundSchemePO::getId, Function.identity())); List otherByEmployeeList = this.getOtherByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS); - InsuranceArchivesOtherSchemePOEncrypt.decryptList(otherByEmployeeList); + encryptUtil.decryptList(otherByEmployeeList, InsuranceArchivesOtherSchemePO.class); Map otherSchemePOMap = otherByEmployeeList .stream().collect(Collectors.toMap(InsuranceArchivesOtherSchemePO::getId, Function.identity())); insuranceArchivesEmployeePOS.forEach(item -> { @@ -1442,16 +1441,16 @@ public class SIArchivesBiz { Map socialMap = new HashMap<>(); Map funMap = new HashMap<>(); Map otherMap = new HashMap<>(); - List socialPOS = InsuranceArchivesSocialSchemePOEncrypt.decryptList(this.getSocialByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS)); + List socialPOS = encryptUtil.decryptList(this.getSocialByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS), InsuranceArchivesSocialSchemePO.class); if (CollectionUtils.isNotEmpty(socialPOS)) { socialMap = socialPOS.stream().collect(Collectors.toMap(InsuranceArchivesSocialSchemePO::getEmployeeId, Function.identity())); } - List fundPOS = InsuranceArchivesFundSchemePOEncrypt.decryptList(this.getFundByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS)); + List fundPOS = encryptUtil.decryptList(this.getFundByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS), InsuranceArchivesFundSchemePO.class); if (CollectionUtils.isNotEmpty(fundPOS)) { funMap = fundPOS.stream().collect(Collectors.toMap(InsuranceArchivesFundSchemePO::getEmployeeId, Function.identity())); } List otherPOS = this.getOtherByEmployeeIdAndPayOrg(insuranceArchivesEmployeePOS); - InsuranceArchivesOtherSchemePOEncrypt.decryptList(otherPOS); + encryptUtil.decryptList(otherPOS, InsuranceArchivesOtherSchemePO.class); if (CollectionUtils.isNotEmpty(otherPOS)) { otherMap = otherPOS.stream().collect(Collectors.toMap(InsuranceArchivesOtherSchemePO::getEmployeeId, Function.identity())); } diff --git a/src/com/engine/salary/biz/SISchemeBiz.java b/src/com/engine/salary/biz/SISchemeBiz.java index 1ca41d542..b1596254f 100644 --- a/src/com/engine/salary/biz/SISchemeBiz.java +++ b/src/com/engine/salary/biz/SISchemeBiz.java @@ -3,7 +3,7 @@ package com.engine.salary.biz; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.encrypt.sischeme.InsuranceSchemeDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.sicategory.po.ICategoryPO; import com.engine.salary.entity.sischeme.bo.InsuranceSchemeBO; import com.engine.salary.entity.sischeme.dto.InsuranceSchemeDTO; @@ -42,6 +42,8 @@ public class SISchemeBiz { return SqlProxyHandle.getProxy(SIAccountUtilMapper.class); } + private EncryptUtil encryptUtil = new EncryptUtil(); + /** * 获取社保方案 * @@ -150,7 +152,7 @@ public class SISchemeBiz { try { InsuranceSchemeDetailMapper insuranceSchemeDetailMapper = sqlSession.getMapper(InsuranceSchemeDetailMapper.class); InsuranceSchemeDetailPO insuranceSchemeDetailPO = insuranceSchemeDetailMapper.getByPPI(primaryId, paymentScope, insuranceId); - InsuranceSchemeDetailPOEncrypt.decryptItem(insuranceSchemeDetailPO); + encryptUtil.decrypt(insuranceSchemeDetailPO, InsuranceSchemeDetailPO.class); return insuranceSchemeDetailPO; } finally { sqlSession.close(); @@ -231,7 +233,7 @@ public class SISchemeBiz { try { InsuranceSchemeDetailMapper insuranceSchemeDetailMapper = sqlSession.getMapper(InsuranceSchemeDetailMapper.class); List insuranceSchemeDetailPOS = insuranceSchemeDetailMapper.queryListBySchemeId(primaryId); - InsuranceSchemeDetailPOEncrypt.decryptList(insuranceSchemeDetailPOS); + encryptUtil.decryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); return decryptSchemeDetailList(insuranceSchemeDetailPOS); } finally { sqlSession.close(); @@ -271,7 +273,7 @@ public class SISchemeBiz { //保存福利项目明细表 InsuranceSchemeDetailMapper insuranceSchemeDetailMapper = sqlSession.getMapper(InsuranceSchemeDetailMapper.class); List insuranceSchemeDetailPOS = InsuranceSchemeBO.convertToInsuranceSchemeDetailPoList(saveParam.getInsuranceSchemeDetailList(), employeeId, insuranceSchemePO.getId()); - InsuranceSchemeDetailPOEncrypt.encryptList(insuranceSchemeDetailPOS); + encryptUtil.encryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); insuranceSchemeDetailPOS.forEach(insuranceSchemeDetailMapper::insert); sqlSession.commit(); @@ -325,7 +327,7 @@ public class SISchemeBiz { insuranceSchemeDetailMapper.batchDeleteByPrimaryIds(Collections.singleton(updateParam.getInsuranceScheme().getId())); //更新明细表 List insuranceSchemeDetailPOS = InsuranceSchemeBO.convertToInsuranceSchemeDetailPoList(updateParam.getInsuranceSchemeDetailList(), employeeId, insuranceSchemePO.getId()); - InsuranceSchemeDetailPOEncrypt.encryptList(insuranceSchemeDetailPOS); + encryptUtil.encryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); insuranceSchemeDetailPOS.forEach(insuranceSchemeDetailMapper::insert); //记录操作日志 @@ -410,7 +412,7 @@ public class SISchemeBiz { .validNum(item.getValidNum()) .build() ).collect(Collectors.toList()); - InsuranceSchemeDetailPOEncrypt.encryptList(detailPOS); + encryptUtil.encryptList(detailPOS, InsuranceSchemeDetailPO.class); detailPOS.forEach(insuranceSchemeDetailMapper::insert); } @@ -432,7 +434,7 @@ public class SISchemeBiz { try { InsuranceSchemeDetailMapper insuranceSchemeDetailMapper = sqlSession.getMapper(InsuranceSchemeDetailMapper.class); List insuranceSchemeDetailPOList = insuranceSchemeDetailMapper.queryListByInsuranceIdIsPayment(insuranceId, isPayment); - InsuranceSchemeDetailPOEncrypt.decryptList(insuranceSchemeDetailPOList); + encryptUtil.decryptList(insuranceSchemeDetailPOList, InsuranceSchemeDetailPO.class); return insuranceSchemeDetailPOList; } finally { sqlSession.close(); diff --git a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java index d2a79b233..8917d6de9 100644 --- a/src/com/engine/salary/biz/SalaryArchiveItemBiz.java +++ b/src/com/engine/salary/biz/SalaryArchiveItemBiz.java @@ -1,7 +1,6 @@ package com.engine.salary.biz; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.archive.SalaryArchiveItemPOEncrypt; import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO; import com.engine.salary.entity.salaryarchive.param.SalaryArchiveItemQueryParam; import com.engine.salary.entity.salaryarchive.param.SalaryItemAdjustRecordQueryParam; @@ -36,7 +35,7 @@ public class SalaryArchiveItemBiz { try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); List salaryArchiveItemPOS = mapper.listByParam(build); - return SalaryArchiveItemPOEncrypt.decryptSalaryArchiveItemPOList(salaryArchiveItemPOS); + return encryptUtil.decryptList(salaryArchiveItemPOS, SalaryArchiveItemPO.class); } finally { sqlSession.close(); } @@ -46,7 +45,7 @@ public class SalaryArchiveItemBiz { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); - return SalaryArchiveItemPOEncrypt.decryptSalaryArchiveItemPO(mapper.getById(salaryArchiveItemId)); + return encryptUtil.decrypt(mapper.getById(salaryArchiveItemId), SalaryArchiveItemPO.class); } finally { sqlSession.close(); } @@ -65,7 +64,7 @@ public class SalaryArchiveItemBiz { ineffectiveSalaryItems.addAll(mapper.getIneffectiveSalaryItems(build)); }); } - return SalaryArchiveItemPOEncrypt.decryptSalaryArchiveItemPOList(ineffectiveSalaryItems); + return encryptUtil.decryptList(ineffectiveSalaryItems, SalaryArchiveItemPO.class); } finally { sqlSession.close(); } @@ -76,7 +75,7 @@ public class SalaryArchiveItemBiz { try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); List effectiveSalaryItems = mapper.getEffectiveSalaryItems(build); - return SalaryArchiveItemPOEncrypt.decryptSalaryArchiveItemPOList(effectiveSalaryItems); + return encryptUtil.decryptList(effectiveSalaryItems, SalaryArchiveItemPO.class); } finally { sqlSession.close(); } @@ -115,7 +114,7 @@ public class SalaryArchiveItemBiz { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); - SalaryArchiveItemPOEncrypt.encryptSalaryArchiveItemPO(salaryArchiveItem); + encryptUtil.encrypt(salaryArchiveItem, SalaryArchiveItemPO.class); mapper.update(salaryArchiveItem); sqlSession.commit(); } finally { @@ -128,7 +127,7 @@ public class SalaryArchiveItemBiz { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SalaryArchiveItemMapper mapper = sqlSession.getMapper(SalaryArchiveItemMapper.class); - SalaryArchiveItemPOEncrypt.encryptSalaryArchiveItemPO(salaryArchiveItem); + encryptUtil.encrypt(salaryArchiveItem, SalaryArchiveItemPO.class); mapper.updateIgnoreNull(salaryArchiveItem); sqlSession.commit(); } finally { diff --git a/src/com/engine/salary/biz/SpecialAddDeductionBiz.java b/src/com/engine/salary/biz/SpecialAddDeductionBiz.java index cece96e18..7fc30292e 100644 --- a/src/com/engine/salary/biz/SpecialAddDeductionBiz.java +++ b/src/com/engine/salary/biz/SpecialAddDeductionBiz.java @@ -1,13 +1,12 @@ package com.engine.salary.biz; -import com.engine.salary.encrypt.datacollection.SpecialAddDeductionEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.dto.SpecialAddDeductionListDTO; 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.SpecialAddDeductionMapper; import com.engine.salary.util.db.MapperProxyFactory; -import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.apache.ibatis.session.SqlSession; @@ -18,6 +17,8 @@ import java.util.*; import java.util.stream.Collectors; public class SpecialAddDeductionBiz extends BaseBean { + private EncryptUtil encryptUtil = new EncryptUtil(); + private SpecialAddDeductionMapper mapper() { return MapperProxyFactory.getProxy(SpecialAddDeductionMapper.class); } @@ -32,26 +33,26 @@ public class SpecialAddDeductionBiz extends BaseBean { try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); SpecialAddDeductionPO byId = mapper.getById(id); - return SpecialAddDeductionEncrypt.decrypt(byId); + return encryptUtil.decrypt(byId, SpecialAddDeductionPO.class); } } public List listDTOByParam(SpecialAddDeductionQueryParam param) { List specialAddDeductionRecordDTOS = mapper().listDtoByParam(param); - return SpecialAddDeductionEncrypt.decrypt(specialAddDeductionRecordDTOS); + return encryptUtil.decryptList(specialAddDeductionRecordDTOS, SpecialAddDeductionRecordDTO.class); } public List listByParam(SpecialAddDeductionQueryParam param) { List specialAddDeductionListDTOS = mapper().listByParam(param); - return SpecialAddDeductionEncrypt.decrypt(specialAddDeductionListDTOS); + return encryptUtil.decryptList(specialAddDeductionListDTOS, SpecialAddDeductionListDTO.class); } public List listByTaxAgentIds(List taxAgentIds) { try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); List pos = mapper.listByTaxAgentIds(taxAgentIds); - return SpecialAddDeductionEncrypt.decrypt(pos); + return encryptUtil.decryptList(pos, SpecialAddDeductionPO.class); } } @@ -68,7 +69,7 @@ public class SpecialAddDeductionBiz extends BaseBean { } try (SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession()) { SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); - SpecialAddDeductionEncrypt.encrypt(param); + encryptUtil.encryptList(param, SpecialAddDeductionPO.class); List> partition = Lists.partition(param, 100); partition.forEach(mapper::batchInsert); sqlSession.commit(); @@ -88,7 +89,7 @@ public class SpecialAddDeductionBiz extends BaseBean { SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); try { SpecialAddDeductionMapper mapper = sqlSession.getMapper(SpecialAddDeductionMapper.class); - SpecialAddDeductionEncrypt.encrypt(param); + encryptUtil.encryptList(param, SpecialAddDeductionPO.class); List> partition = Lists.partition(param, 100); partition.forEach(mapper::updateBatchSelective); sqlSession.commit(); @@ -166,7 +167,7 @@ public class SpecialAddDeductionBiz extends BaseBean { .stream() .filter(Objects::nonNull) .filter(s -> s.getEmployeeId() != null) - .map(SpecialAddDeductionEncrypt::decrypt) + .map(item -> encryptUtil.decrypt(item, SpecialAddDeductionPO.class)) .collect(Collectors.toList()); } } diff --git a/src/com/engine/salary/encrypt/archive/SalaryArchiveItemPOEncrypt.java b/src/com/engine/salary/encrypt/archive/SalaryArchiveItemPOEncrypt.java index 98acfd230..b307616a8 100644 --- a/src/com/engine/salary/encrypt/archive/SalaryArchiveItemPOEncrypt.java +++ b/src/com/engine/salary/encrypt/archive/SalaryArchiveItemPOEncrypt.java @@ -10,6 +10,7 @@ import java.util.List; * 字段: * item_value */ +@Deprecated public class SalaryArchiveItemPOEncrypt { public static List encryptSalaryArchiveItemPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/archive/SalaryItemAdjustRecordListDTOEncrypt.java b/src/com/engine/salary/encrypt/archive/SalaryItemAdjustRecordListDTOEncrypt.java index 3c3bb602a..404b0b3f4 100644 --- a/src/com/engine/salary/encrypt/archive/SalaryItemAdjustRecordListDTOEncrypt.java +++ b/src/com/engine/salary/encrypt/archive/SalaryItemAdjustRecordListDTOEncrypt.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.salaryarchive.dto.SalaryItemAdjustRecordListDTO; import java.util.List; +@Deprecated public class SalaryItemAdjustRecordListDTOEncrypt { public static List decryptSalaryItemAdjustRecordListDTOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java index c79112501..848c56ab2 100644 --- a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionEncrypt.java @@ -16,6 +16,7 @@ import java.util.List; * add_up_illness_medical * add_up_infant_care */ +@Deprecated public class AddUpDeductionEncrypt { @Deprecated public static List encryptAddUpDeductionList(List list) { diff --git a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionRecordStrDTOEncrypt.java b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionRecordStrDTOEncrypt.java index 4dc13a349..0750a6422 100644 --- a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionRecordStrDTOEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionRecordStrDTOEncrypt.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; * add_up_housing_rent * add_up_support_elderly */ +@Deprecated public class AddUpDeductionRecordStrDTOEncrypt { public static List decryptAddUpDeductionRecordDTO(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionStrDTOEncrypt.java b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionStrDTOEncrypt.java index 163ec4b03..4877fe406 100644 --- a/src/com/engine/salary/encrypt/datacollection/AddUpDeductionStrDTOEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/AddUpDeductionStrDTOEncrypt.java @@ -14,6 +14,7 @@ import java.util.List; * add_up_housing_rent * add_up_support_elderly */ +@Deprecated public class AddUpDeductionStrDTOEncrypt { public static void decryptAddUpDeductionList(List list) { if (list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/AddUpSituationDTOEncrypt.java b/src/com/engine/salary/encrypt/datacollection/AddUpSituationDTOEncrypt.java index fb39e33e1..a8b369c80 100644 --- a/src/com/engine/salary/encrypt/datacollection/AddUpSituationDTOEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/AddUpSituationDTOEncrypt.java @@ -3,7 +3,6 @@ package com.engine.salary.encrypt.datacollection; import com.engine.salary.encrypt.AESEncryptUtil; import com.engine.salary.entity.datacollection.dto.AddUpSituationDTO; -import java.util.ArrayList; import java.util.List; /** @@ -24,9 +23,10 @@ import java.util.List; * add_up_allowed_donation * add_up_advance_tax */ +@Deprecated public class AddUpSituationDTOEncrypt { public static List encryptAddUpSituationDTOList(List list) { - if(list == null || list.size() == 0) { + if (list == null || list.size() == 0) { return list; } list.forEach(item -> { @@ -53,7 +53,7 @@ public class AddUpSituationDTOEncrypt { } public static List decryptAddUpSituationDTOList(List list) { - if(list == null || list.size() == 0) { + if (list == null || list.size() == 0) { return list; } list.forEach(item -> { diff --git a/src/com/engine/salary/encrypt/datacollection/AddUpSituationEncrypt.java b/src/com/engine/salary/encrypt/datacollection/AddUpSituationEncrypt.java index fa2a72f07..b6debb195 100644 --- a/src/com/engine/salary/encrypt/datacollection/AddUpSituationEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/AddUpSituationEncrypt.java @@ -23,6 +23,7 @@ import java.util.List; * add_up_allowed_donation * add_up_advance_tax */ +@Deprecated public class AddUpSituationEncrypt { public static List encryptAddUpSituationList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/AddUpSituationRecordDTOEncrypt.java b/src/com/engine/salary/encrypt/datacollection/AddUpSituationRecordDTOEncrypt.java index dc5e0c086..dd39664f9 100644 --- a/src/com/engine/salary/encrypt/datacollection/AddUpSituationRecordDTOEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/AddUpSituationRecordDTOEncrypt.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.datacollection.dto.AddUpSituationRecordDTO; import java.util.List; +@Deprecated public class AddUpSituationRecordDTOEncrypt { public static List encryptAddUpSituationRecordDTOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/OtherDeductionListDTOEncrypt.java b/src/com/engine/salary/encrypt/datacollection/OtherDeductionListDTOEncrypt.java index c7a1f9385..6d099a631 100644 --- a/src/com/engine/salary/encrypt/datacollection/OtherDeductionListDTOEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/OtherDeductionListDTOEncrypt.java @@ -14,6 +14,7 @@ import java.util.List; * other_deduction * deduction_allowed_donation */ +@Deprecated public class OtherDeductionListDTOEncrypt { public static List encryptOtherDeductionListDTOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/OtherDeductionPOEncrypt.java b/src/com/engine/salary/encrypt/datacollection/OtherDeductionPOEncrypt.java index ddfed66f5..bed9cd935 100644 --- a/src/com/engine/salary/encrypt/datacollection/OtherDeductionPOEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/OtherDeductionPOEncrypt.java @@ -4,15 +4,7 @@ import com.engine.salary.encrypt.AESEncryptUtil; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; import java.util.List; - -/** - * hrsa_other_deduction: 加解密 - * 字段: - * business_healthy_insurance - * tax_delay_endowment_insurance - * other_deduction - * deduction_allowed_donation - */ +@Deprecated public class OtherDeductionPOEncrypt { public static List encryptOtherDeductionPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/OtherDeductionRecordDTOEncrypt.java b/src/com/engine/salary/encrypt/datacollection/OtherDeductionRecordDTOEncrypt.java index 015a3741e..44fffcc1b 100644 --- a/src/com/engine/salary/encrypt/datacollection/OtherDeductionRecordDTOEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/OtherDeductionRecordDTOEncrypt.java @@ -13,6 +13,7 @@ import java.util.List; * other_deduction * deduction_allowed_donation */ +@Deprecated public class OtherDeductionRecordDTOEncrypt { public static List encryptOtherDeductionRecordDTOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/datacollection/SpecialAddDeductionEncrypt.java b/src/com/engine/salary/encrypt/datacollection/SpecialAddDeductionEncrypt.java index c6169219c..448fb2010 100644 --- a/src/com/engine/salary/encrypt/datacollection/SpecialAddDeductionEncrypt.java +++ b/src/com/engine/salary/encrypt/datacollection/SpecialAddDeductionEncrypt.java @@ -1,13 +1,9 @@ package com.engine.salary.encrypt.datacollection; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.entity.datacollection.dto.SpecialAddDeductionRecordDTO; -import com.engine.salary.entity.datacollection.po.SpecialAddDeductionPO; import java.lang.reflect.Field; import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -22,6 +18,7 @@ import java.util.stream.Collectors; * serious_illness_treatment * infant_care */ +@Deprecated public class SpecialAddDeductionEncrypt { private static final List FIELDS = Arrays.asList( "childrenEducation", "continuingEducation", "supportingElder", "housingLoanInterest", diff --git a/src/com/engine/salary/encrypt/report/SalaryAcctResultReportPOEncrypt.java b/src/com/engine/salary/encrypt/report/SalaryAcctResultReportPOEncrypt.java index 37232d0e2..7c34d4dc9 100644 --- a/src/com/engine/salary/encrypt/report/SalaryAcctResultReportPOEncrypt.java +++ b/src/com/engine/salary/encrypt/report/SalaryAcctResultReportPOEncrypt.java @@ -8,6 +8,7 @@ import java.util.Collection; /** * 薪资核算报表 */ +@Deprecated public class SalaryAcctResultReportPOEncrypt { public static Collection encryptList(Collection list) { diff --git a/src/com/engine/salary/encrypt/salaryacct/ExcelAcctResultPOEncrypt.java b/src/com/engine/salary/encrypt/salaryacct/ExcelAcctResultPOEncrypt.java index 57b6cae02..c19d16689 100644 --- a/src/com/engine/salary/encrypt/salaryacct/ExcelAcctResultPOEncrypt.java +++ b/src/com/engine/salary/encrypt/salaryacct/ExcelAcctResultPOEncrypt.java @@ -6,6 +6,7 @@ import com.engine.salary.entity.salaryacct.po.ExcelAcctResultPO; import java.util.Collection; import java.util.List; +@Deprecated public class ExcelAcctResultPOEncrypt { public static Collection encryptList(Collection list) { diff --git a/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java b/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java index 4150e15bf..e7da51250 100644 --- a/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java +++ b/src/com/engine/salary/encrypt/salaryacct/SalaryAcctResultPOEncrypt.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import java.util.List; +@Deprecated public class SalaryAcctResultPOEncrypt { @Deprecated diff --git a/src/com/engine/salary/encrypt/siaccount/ExcelInsuranceDetailPOEncrypt.java b/src/com/engine/salary/encrypt/siaccount/ExcelInsuranceDetailPOEncrypt.java index 6d6a30776..592ba011a 100644 --- a/src/com/engine/salary/encrypt/siaccount/ExcelInsuranceDetailPOEncrypt.java +++ b/src/com/engine/salary/encrypt/siaccount/ExcelInsuranceDetailPOEncrypt.java @@ -30,6 +30,7 @@ import java.util.List; * other_sum * total */ +@Deprecated public class ExcelInsuranceDetailPOEncrypt { public static List encryptInsuranceAccountDetailPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailTempPOEncrypt.java b/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailTempPOEncrypt.java index af3a86e42..5e5f32724 100644 --- a/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailTempPOEncrypt.java +++ b/src/com/engine/salary/encrypt/siaccount/InsuranceAccountDetailTempPOEncrypt.java @@ -30,6 +30,7 @@ import java.util.List; * other_sum * total */ +@Deprecated public class InsuranceAccountDetailTempPOEncrypt { public static List encryptInsuranceAccountDetailTempPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java b/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java index 14fdbee4e..73a627e5f 100644 --- a/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java +++ b/src/com/engine/salary/encrypt/siaccount/SiAccountEncrypt.java @@ -12,6 +12,7 @@ import java.util.List; * social_pay * fund_pay */ +@Deprecated public class SiAccountEncrypt { @Deprecated public static List encryptInsuranceAccountBatchList(List list) { diff --git a/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesFundSchemePOEncrypt.java b/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesFundSchemePOEncrypt.java index 5bc6a7d3e..18233ed58 100644 --- a/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesFundSchemePOEncrypt.java +++ b/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesFundSchemePOEncrypt.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.siarchives.po.InsuranceArchivesFundSchemePO; import java.util.List; +@Deprecated public class InsuranceArchivesFundSchemePOEncrypt { public static List encryptList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesOtherSchemePOEncrypt.java b/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesOtherSchemePOEncrypt.java index 071868571..d24b22e89 100644 --- a/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesOtherSchemePOEncrypt.java +++ b/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesOtherSchemePOEncrypt.java @@ -1,11 +1,11 @@ package com.engine.salary.encrypt.siarchives; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.entity.siaccount.po.InsuranceAccountBatchPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesOtherSchemePO; import java.util.List; +@Deprecated public class InsuranceArchivesOtherSchemePOEncrypt { public static List encryptList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesSocialSchemePOEncrypt.java b/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesSocialSchemePOEncrypt.java index 19cc358a5..7490ad352 100644 --- a/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesSocialSchemePOEncrypt.java +++ b/src/com/engine/salary/encrypt/siarchives/InsuranceArchivesSocialSchemePOEncrypt.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.siarchives.po.InsuranceArchivesSocialSchemePO; import java.util.List; +@Deprecated public class InsuranceArchivesSocialSchemePOEncrypt { public static List encryptList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/siexport/AccountExportPOEncrypt.java b/src/com/engine/salary/encrypt/siexport/AccountExportPOEncrypt.java index 5684afec1..564993785 100644 --- a/src/com/engine/salary/encrypt/siexport/AccountExportPOEncrypt.java +++ b/src/com/engine/salary/encrypt/siexport/AccountExportPOEncrypt.java @@ -30,6 +30,7 @@ import java.util.List; * other_sum * total */ +@Deprecated public class AccountExportPOEncrypt { public static List encryptAccountExportPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/siexport/ExcelAccountExportPOEncrypt.java b/src/com/engine/salary/encrypt/siexport/ExcelAccountExportPOEncrypt.java index 3121cc46d..d562ac937 100644 --- a/src/com/engine/salary/encrypt/siexport/ExcelAccountExportPOEncrypt.java +++ b/src/com/engine/salary/encrypt/siexport/ExcelAccountExportPOEncrypt.java @@ -30,6 +30,7 @@ import java.util.List; * other_sum * total */ +@Deprecated public class ExcelAccountExportPOEncrypt { public static List encryptExcelAccountExportPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/sischeme/InsuranceSchemeDetailPOEncrypt.java b/src/com/engine/salary/encrypt/sischeme/InsuranceSchemeDetailPOEncrypt.java index 613c0a362..2f75436c8 100644 --- a/src/com/engine/salary/encrypt/sischeme/InsuranceSchemeDetailPOEncrypt.java +++ b/src/com/engine/salary/encrypt/sischeme/InsuranceSchemeDetailPOEncrypt.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.sischeme.po.InsuranceSchemeDetailPO; import java.util.List; +@Deprecated public class InsuranceSchemeDetailPOEncrypt { public static List encryptList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailEncrypt.java b/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailEncrypt.java index 0e912c4ba..b1bde8463 100644 --- a/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailEncrypt.java +++ b/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailEncrypt.java @@ -10,6 +10,8 @@ import java.util.List; * 字段: * field_value */ + +@Deprecated public class TaxDeclarationDetailEncrypt { public static List encryptTaxDeclarationDetailList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailPOEncrypt.java b/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailPOEncrypt.java index 8f0d57b3a..0cbc88a29 100644 --- a/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailPOEncrypt.java +++ b/src/com/engine/salary/encrypt/taxdeclaration/TaxDeclarationDetailPOEncrypt.java @@ -11,6 +11,7 @@ import java.util.List; * 字段: * field_value */ +@Deprecated public class TaxDeclarationDetailPOEncrypt { public static List encryptTaxDeclarationDetailPOList(List list) { if(list == null || list.size() == 0) { diff --git a/src/com/engine/salary/entity/datacollection/AddUpSituation.java b/src/com/engine/salary/entity/datacollection/AddUpSituation.java index ddecd5eee..6335aee90 100644 --- a/src/com/engine/salary/entity/datacollection/AddUpSituation.java +++ b/src/com/engine/salary/entity/datacollection/AddUpSituation.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.datacollection; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryFormulaVar; import com.engine.salary.annotation.SalaryTable; import com.engine.salary.annotation.SalaryTableOperate; @@ -52,102 +53,119 @@ public class AddUpSituation { * 累计收入额 */ @SalaryFormulaVar(defaultLabel = "累计收入额", labelId = 86712, dataType = "number") + @Encrypt private String addUpIncome; /** * 累计减除费用 */ @SalaryFormulaVar(defaultLabel = "累计减除费用", labelId = 86711, dataType = "number") + @Encrypt private String addUpSubtraction; /** * 累计社保个人合计 */ @SalaryFormulaVar(defaultLabel = "累计社保个人合计", labelId = 86710, dataType = "number") + @Encrypt private String addUpSocialSecurityTotal; /** * 累计公积金个人合计 */ @SalaryFormulaVar(defaultLabel = "累计公积金个人合计", labelId = 86709, dataType = "number") + @Encrypt private String addUpAccumulationFundTotal; /** * 累计子女教育 */ @SalaryFormulaVar(defaultLabel = "累计子女教育", labelId = 86321, dataType = "number") + @Encrypt private String addUpChildEducation; /** * 累计继续教育 */ @SalaryFormulaVar(defaultLabel = "累计继续教育", labelId = 86323, dataType = "number") + @Encrypt private String addUpContinuingEducation; /** * 累计住房贷款利息 */ @SalaryFormulaVar(defaultLabel = "累计住房贷款利息", labelId = 86324, dataType = "number") + @Encrypt private String addUpHousingLoanInterest; /** * 累计住房租金 */ @SalaryFormulaVar(defaultLabel = "累计住房租金", labelId = 86325, dataType = "number") + @Encrypt private String addUpHousingRent; /** * 累计赡养老人 */ @SalaryFormulaVar(defaultLabel = "累计赡养老人", labelId = 86326, dataType = "number") + @Encrypt private String addUpSupportElderly; /** * 累计大病医疗 */ @SalaryFormulaVar(defaultLabel = "累计大病医疗", labelId = 105142, dataType = "number") + @Encrypt private String addUpIllnessMedical; /** * 累计婴幼儿照护 */ @SalaryFormulaVar(defaultLabel = "累计婴幼儿照护", labelId = 117732, dataType = "number") + @Encrypt private String addUpInfantCare; /** * 累计企业(职业)年金及其他福利 */ @SalaryFormulaVar(defaultLabel = "累计企业(职业)年金及其他福利", labelId = 90567, dataType = "number") + @Encrypt private String addUpEnterpriseAndOther; /** * 累计其他免税扣除 */ @SalaryFormulaVar(defaultLabel = "累计其他免税扣除", labelId = 93902, dataType = "number") + @Encrypt private String addUpOtherDeduction; /** * 累计免税收入 */ @SalaryFormulaVar(defaultLabel = "累计免税收入", labelId = 86704, dataType = "number") + @Encrypt private String addUpTaxExemptIncome; /** * 累计准予扣除的捐赠额 */ @SalaryFormulaVar(defaultLabel = "累计准予扣除的捐赠额", labelId = 86703, dataType = "number") + @Encrypt private String addUpAllowedDonation; /** * 累计减免税额 */ @SalaryFormulaVar(defaultLabel = "累计减免税额", labelId = 105478, dataType = "number") + @Encrypt private String addUpTaxSavings; /** * 累计已预扣预缴税额 */ @SalaryFormulaVar(defaultLabel = "累计已预扣预缴税额", labelId = 86702, dataType = "number") + @Encrypt private String addUpAdvanceTax; /** diff --git a/src/com/engine/salary/entity/datacollection/dto/AddUpSituationRecordDTO.java b/src/com/engine/salary/entity/datacollection/dto/AddUpSituationRecordDTO.java index 50a79012b..b32b60cae 100644 --- a/src/com/engine/salary/entity/datacollection/dto/AddUpSituationRecordDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/AddUpSituationRecordDTO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryTable; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.annotation.TableTitle; @@ -71,85 +72,102 @@ public class AddUpSituationRecordDTO { @SalaryTableColumn(text = "累计收入额", width = "10%", column = "addUpIncome") @TableTitle(title = "累计收入额", dataIndex = "addUpIncome", key = "addUpIncome") @ExcelProperty(index = 6) + @Encrypt private String addUpIncome; @SalaryTableColumn(text = "累计减除费用", width = "10%", column = "addUpSubtraction") @TableTitle(title = "累计减除费用", dataIndex = "addUpSubtraction", key = "addUpSubtraction") @ExcelProperty(index = 7) + @Encrypt private String addUpSubtraction; @SalaryTableColumn(text = "累计社保个人合计", width = "10%", column = "addUpSocialSecurityTotal") @TableTitle(title = "累计社保个人合计", dataIndex = "addUpSocialSecurityTotal", key = "addUpSocialSecurityTotal") @ExcelProperty(index = 8) + @Encrypt private String addUpSocialSecurityTotal; @SalaryTableColumn(text = "累计公积金个人合计", width = "10%", column = "addUpAccumulationFundTotal") @TableTitle(title = "累计公积金个人合计", dataIndex = "addUpAccumulationFundTotal", key = "addUpAccumulationFundTotal") @ExcelProperty(index = 9) + @Encrypt private String addUpAccumulationFundTotal; @ExcelProperty(index = 10) @SalaryTableColumn(text = "累计子女教育", width = "10%", column = "addUpChildEducation") @TableTitle(title = "累计子女教育", dataIndex = "addUpChildEducation", key = "addUpChildEducation") + @Encrypt private String addUpChildEducation; @ExcelProperty(index = 11) @SalaryTableColumn(text = "累计继续教育", width = "10%", column = "addUpContinuingEducation") @TableTitle(title = "累计继续教育", dataIndex = "addUpContinuingEducation", key = "addUpContinuingEducation") + @Encrypt private String addUpContinuingEducation; @ExcelProperty(index = 12) @SalaryTableColumn(text = "累计住房贷款利息", width = "10%", column = "addUpHousingLoanInterest") @TableTitle(title = "累计住房贷款利息", dataIndex = "addUpHousingLoanInterest", key = "addUpHousingLoanInterest") + @Encrypt private String addUpHousingLoanInterest; @ExcelProperty(index = 13) @SalaryTableColumn(text = "累计住房租金", width = "10%", column = "addUpHousingRent") @TableTitle(title = "累计住房租金", dataIndex = "addUpHousingRent", key = "addUpHousingRent") + @Encrypt private String addUpHousingRent; @ExcelProperty(index = 14) @SalaryTableColumn(text = "累计赡养老人", width = "10%", column = "addUpSupportElderly") @TableTitle(title = "累计赡养老人", dataIndex = "addUpSupportElderly", key = "addUpSupportElderly") + @Encrypt private String addUpSupportElderly; @ExcelProperty(index = 15) @SalaryTableColumn(text = "累计大病医疗", width = "10%", column = "addUpIllnessMedical") @TableTitle(title = "累计大病医疗", dataIndex = "addUpIllnessMedical", key = "addUpIllnessMedical") + @Encrypt private String addUpIllnessMedical; @ExcelProperty(index = 16) @SalaryTableColumn(text = "累计企业(职业)年金及其他福利", width = "10%", column = "addUpEnterpriseAndOther") @TableTitle(title = "累计企业(职业)年金及其他福利", dataIndex = "addUpEnterpriseAndOther", key = "addUpEnterpriseAndOther") + @Encrypt private String addUpEnterpriseAndOther; @ExcelProperty(index = 17) @SalaryTableColumn(text = "累计其他扣除", width = "10%", column = "addUpOtherDeduction") @TableTitle(title = "累计其他扣除", dataIndex = "addUpOtherDeduction", key = "addUpOtherDeduction") + @Encrypt private String addUpOtherDeduction; @ExcelProperty(index = 18) @SalaryTableColumn(text = "累计免税收入", width = "10%", column = "addUpTaxExemptIncome") @TableTitle(title = "累计免税收入", dataIndex = "addUpTaxExemptIncome", key = "addUpTaxExemptIncome") + @Encrypt private String addUpTaxExemptIncome; @ExcelProperty(index = 19) @SalaryTableColumn(text = "累计准予扣除的捐赠额", width = "10%", column = "addUpAllowedDonation") @TableTitle(title = "累计准予扣除的捐赠额", dataIndex = "addUpAllowedDonation", key = "addUpAllowedDonation") + @Encrypt private String addUpAllowedDonation; @ExcelProperty(index = 20) @SalaryTableColumn(text = "累计减免税额", width = "10%", column = "addUpTaxSavings") @TableTitle(title = "累计减免税额", dataIndex = "addUpTaxSavings", key = "addUpTaxSavings") + @Encrypt private String addUpTaxSavings; @ExcelProperty(index = 21) @SalaryTableColumn(text = "累计已预扣预缴税额", width = "10%", column = "addUpAdvanceTax") @TableTitle(title = "累计已预扣预缴税额", dataIndex = "addUpAdvanceTax", key = "addUpAdvanceTax") + @Encrypt private String addUpAdvanceTax; @ExcelProperty(index = 22) @SalaryTableColumn(text = "累计婴幼儿照护", width = "10%", column = "addUpInfantCare") @TableTitle(title = "累计婴幼儿照护", dataIndex = "addUpInfantCare", key = "addUpInfantCare") + @Encrypt private String addUpInfantCare; } diff --git a/src/com/engine/salary/entity/datacollection/dto/OtherDeductionListDTO.java b/src/com/engine/salary/entity/datacollection/dto/OtherDeductionListDTO.java index c5702b9c9..fef35da8e 100644 --- a/src/com/engine/salary/entity/datacollection/dto/OtherDeductionListDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/OtherDeductionListDTO.java @@ -1,10 +1,7 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; -import com.engine.salary.annotation.SalaryTable; -import com.engine.salary.annotation.SalaryTableColumn; -import com.engine.salary.annotation.SalaryTableOperate; -import com.engine.salary.annotation.TableTitle; +import com.engine.salary.annotation.*; import com.engine.salary.util.excel.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; @@ -87,24 +84,28 @@ public class OtherDeductionListDTO { @ExcelProperty(index = 7) @SalaryTableColumn(text = "商业健康保险", width = "10%", column = "businessHealthyInsurance") @TableTitle(title = "商业健康保险", dataIndex = "businessHealthyInsurance", key = "businessHealthyInsurance") + @Encrypt private String businessHealthyInsurance; //税延养老保险 @ExcelProperty(index = 8) @SalaryTableColumn(text = "税延养老保险", width = "10%", column = "taxDelayEndowmentInsurance") @TableTitle(title = "税延养老保险", dataIndex = "taxDelayEndowmentInsurance", key = "taxDelayEndowmentInsurance") + @Encrypt private String taxDelayEndowmentInsurance; //其他 @ExcelProperty(index = 9) @SalaryTableColumn(text = "其他", width = "10%", column = "otherDeduction") @TableTitle(title = "其他", dataIndex = "otherDeduction", key = "otherDeduction") + @Encrypt private String otherDeduction; //准予扣除的捐赠额 @ExcelProperty(index = 10) @SalaryTableColumn(text = "准予扣除的捐赠额", width = "10%", column = "deductionAllowedDonation") @TableTitle(title = "准予扣除的捐赠额", dataIndex = "deductionAllowedDonation", key = "deductionAllowedDonation") + @Encrypt private String deductionAllowedDonation; @SalaryTableColumn(text = "操作", width = "20%", column = "operate") diff --git a/src/com/engine/salary/entity/datacollection/dto/OtherDeductionRecordDTO.java b/src/com/engine/salary/entity/datacollection/dto/OtherDeductionRecordDTO.java index ef1c09271..caafb0010 100644 --- a/src/com/engine/salary/entity/datacollection/dto/OtherDeductionRecordDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/OtherDeductionRecordDTO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryTable; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.annotation.TableTitle; @@ -72,20 +73,24 @@ public class OtherDeductionRecordDTO { //商业健康保险 @SalaryTableColumn(text = "商业健康保险", width = "10%", column = "businessHealthyInsurance") @TableTitle(title = "商业健康保险", dataIndex = "businessHealthyInsurance", key = "businessHealthyInsurance") + @Encrypt private String businessHealthyInsurance; //税延养老保险 @SalaryTableColumn(text = "税延养老保险", width = "10%", column = "taxDelayEndowmentInsurance") @TableTitle(title = "税延养老保险", dataIndex = "taxDelayEndowmentInsurance", key = "taxDelayEndowmentInsurance") + @Encrypt private String taxDelayEndowmentInsurance; //其他 @SalaryTableColumn(text = "其他", width = "10%", column = "otherDeduction") @TableTitle(title = "其他", dataIndex = "otherDeduction", key = "otherDeduction") + @Encrypt private String otherDeduction; //准予扣除的捐赠额 @SalaryTableColumn(text = "准予扣除的捐赠额", width = "10%", column = "deductionAllowedDonation") @TableTitle(title = "准予扣除的捐赠额", dataIndex = "deductionAllowedDonation", key = "deductionAllowedDonation") + @Encrypt private String deductionAllowedDonation; } diff --git a/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionListDTO.java b/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionListDTO.java index 8b86b6281..8597f505b 100644 --- a/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionListDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionListDTO.java @@ -1,10 +1,7 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; -import com.engine.salary.annotation.SalaryTable; -import com.engine.salary.annotation.SalaryTableColumn; -import com.engine.salary.annotation.SalaryTableOperate; -import com.engine.salary.annotation.TableTitle; +import com.engine.salary.annotation.*; import com.engine.salary.util.excel.ExcelProperty; import lombok.AllArgsConstructor; import lombok.Builder; @@ -87,42 +84,49 @@ public class SpecialAddDeductionListDTO { @ExcelProperty(index = 7) @SalaryTableColumn(text = "子女教育", width = "10%", column = "childrenEducation") @TableTitle(title = "子女教育", dataIndex = "childrenEducation", key = "childrenEducation") + @Encrypt private String childrenEducation; //继续教育 @ExcelProperty(index = 8) @SalaryTableColumn(text = "继续教育", width = "10%", column = "continuingEducation") @TableTitle(title = "继续教育", dataIndex = "continuingEducation", key = "continuingEducation") + @Encrypt private String continuingEducation; //住房贷款利息 @ExcelProperty(index = 9) @SalaryTableColumn(text = "住房贷款利息", width = "10%", column = "housingLoanInterest") @TableTitle(title = "住房贷款利息", dataIndex = "housingLoanInterest", key = "housingLoanInterest") + @Encrypt private String housingLoanInterest; //住房租金 @ExcelProperty(index = 10) @SalaryTableColumn(text = "住房租金", width = "10%", column = "housingRent") @TableTitle(title = "住房租金", dataIndex = "housingRent", key = "housingRent") + @Encrypt private String housingRent; //赡养老人 @ExcelProperty(index = 11) @SalaryTableColumn(text = "赡养老人", width = "10%", column = "supportingElder") @TableTitle(title = "赡养老人", dataIndex = "supportingElder", key = "supportingElder") + @Encrypt private String supportingElder; //大病医疗 @ExcelProperty(index = 12) @SalaryTableColumn(text = "大病医疗", width = "10%", column = "seriousIllnessTreatment") @TableTitle(title = "大病医疗", dataIndex = "seriousIllnessTreatment", key = "seriousIllnessTreatment") + @Encrypt private String seriousIllnessTreatment; //婴幼儿照护 @ExcelProperty(index = 13) @SalaryTableColumn(text = "婴幼儿照护", width = "10%", column = "infantCare") @TableTitle(title = "婴幼儿照护", dataIndex = "infantCare", key = "infantCare") + @Encrypt private String infantCare; @SalaryTableColumn(text = "操作", width = "20%", column = "operate") diff --git a/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionRecordDTO.java b/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionRecordDTO.java index a7cb63bac..f872279e1 100644 --- a/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionRecordDTO.java +++ b/src/com/engine/salary/entity/datacollection/dto/SpecialAddDeductionRecordDTO.java @@ -1,17 +1,15 @@ package com.engine.salary.entity.datacollection.dto; import com.cloudstore.eccom.pc.table.WeaTableType; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryTable; import com.engine.salary.annotation.SalaryTableColumn; import com.engine.salary.annotation.TableTitle; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.Date; - /** * 其他免税扣除记录列表 *

Copyright: Copyright (c) 2022

@@ -66,35 +64,42 @@ public class SpecialAddDeductionRecordDTO { //子女教育 @SalaryTableColumn(text = "子女教育", width = "10%", column = "childrenEducation") @TableTitle(title = "子女教育", dataIndex = "childrenEducation", key = "childrenEducation") + @Encrypt private String childrenEducation; //继续教育 @SalaryTableColumn(text = "继续教育", width = "10%", column = "continuingEducation") @TableTitle(title = "继续教育", dataIndex = "continuingEducation", key = "continuingEducation") + @Encrypt private String continuingEducation; //住房贷款利息 @SalaryTableColumn(text = "住房贷款利息", width = "10%", column = "housingLoanInterest") @TableTitle(title = "住房贷款利息", dataIndex = "housingLoanInterest", key = "housingLoanInterest") + @Encrypt private String housingLoanInterest; //住房租金 @SalaryTableColumn(text = "住房租金", width = "10%", column = "housingRent") @TableTitle(title = "住房租金", dataIndex = "housingRent", key = "housingRent") + @Encrypt private String housingRent; //赡养老人 @SalaryTableColumn(text = "赡养老人", width = "10%", column = "supportingElder") @TableTitle(title = "赡养老人", dataIndex = "supportingElder", key = "supportingElder") + @Encrypt private String supportingElder; //大病医疗 @SalaryTableColumn(text = "大病医疗", width = "10%", column = "seriousIllnessTreatment") @TableTitle(title = "大病医疗", dataIndex = "seriousIllnessTreatment", key = "seriousIllnessTreatment") + @Encrypt private String seriousIllnessTreatment; //大病医疗 @SalaryTableColumn(text = "婴幼儿照护", width = "10%", column = "infantCare") @TableTitle(title = "婴幼儿照护", dataIndex = "infantCare", key = "infantCare") + @Encrypt private String infantCare; } diff --git a/src/com/engine/salary/entity/datacollection/po/OtherDeductionPO.java b/src/com/engine/salary/entity/datacollection/po/OtherDeductionPO.java index 7b0ca4113..addccafa3 100644 --- a/src/com/engine/salary/entity/datacollection/po/OtherDeductionPO.java +++ b/src/com/engine/salary/entity/datacollection/po/OtherDeductionPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.datacollection.po; +import com.engine.salary.annotation.Encrypt; import com.engine.salary.annotation.SalaryFormulaVar; import lombok.AllArgsConstructor; import lombok.Builder; @@ -43,24 +44,28 @@ public class OtherDeductionPO { * 商业健康保险 */ @SalaryFormulaVar(defaultLabel = "商业健康保险", labelId = 91238, dataType = "number") + @Encrypt private String businessHealthyInsurance; /** * 税延养老保险 */ @SalaryFormulaVar(defaultLabel = "税延养老保险", labelId = 91239, dataType = "number") + @Encrypt private String taxDelayEndowmentInsurance; /** * 其他 */ @SalaryFormulaVar(defaultLabel = "其他", labelId = 84500, dataType = "number") + @Encrypt private String otherDeduction; /** * 准予扣除的捐赠额 */ @SalaryFormulaVar(defaultLabel = "准予扣除的捐赠额", labelId = 91240, dataType = "number") + @Encrypt private String deductionAllowedDonation; /** diff --git a/src/com/engine/salary/entity/datacollection/po/SpecialAddDeductionPO.java b/src/com/engine/salary/entity/datacollection/po/SpecialAddDeductionPO.java index 32cfe786b..9aaaa7363 100644 --- a/src/com/engine/salary/entity/datacollection/po/SpecialAddDeductionPO.java +++ b/src/com/engine/salary/entity/datacollection/po/SpecialAddDeductionPO.java @@ -1,12 +1,14 @@ package com.engine.salary.entity.datacollection.po; -import java.util.Date; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import java.util.Date; + /** * 数据采集-专项附加扣除表 */ @@ -31,36 +33,43 @@ public class SpecialAddDeductionPO { /** * 子女教育 */ + @Encrypt private String childrenEducation; /** * 继续教育 */ + @Encrypt private String continuingEducation; /** * 住房贷款利息 */ + @Encrypt private String housingLoanInterest; /** * 住房租金 */ + @Encrypt private String housingRent; /** * 赡养老人 */ + @Encrypt private String supportingElder; /** * 大病医疗 */ + @Encrypt private String seriousIllnessTreatment; /** * 婴幼儿照护 */ + @Encrypt private String infantCare; /** diff --git a/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java b/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java index 400a8ab2d..0af632fd8 100644 --- a/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java +++ b/src/com/engine/salary/entity/report/po/SalaryAcctResultReportPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.report.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -24,6 +25,7 @@ public class SalaryAcctResultReportPO { /** * 薪资核算人员id */ + @Encrypt private String salaryAcctEmpId; /** * 薪资核算的id @@ -32,6 +34,7 @@ public class SalaryAcctResultReportPO { /** * 人员id */ + @Encrypt private String employeeId; /** * 个税扣缴义务人id diff --git a/src/com/engine/salary/entity/salaryacct/po/ExcelAcctResultPO.java b/src/com/engine/salary/entity/salaryacct/po/ExcelAcctResultPO.java index a7fc850c5..4e7bc31d4 100644 --- a/src/com/engine/salary/entity/salaryacct/po/ExcelAcctResultPO.java +++ b/src/com/engine/salary/entity/salaryacct/po/ExcelAcctResultPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.salaryacct.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -61,6 +62,7 @@ public class ExcelAcctResultPO { /** * 计算后的值 */ + @Encrypt private String resultValue; /** diff --git a/src/com/engine/salary/entity/siaccount/po/ExcelInsuranceDetailPO.java b/src/com/engine/salary/entity/siaccount/po/ExcelInsuranceDetailPO.java index 7f7544456..4e7889544 100644 --- a/src/com/engine/salary/entity/siaccount/po/ExcelInsuranceDetailPO.java +++ b/src/com/engine/salary/entity/siaccount/po/ExcelInsuranceDetailPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.siaccount.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -97,6 +98,7 @@ public class ExcelInsuranceDetailPO { /** * 社保缴纳基数 */ + @Encrypt private String socialPaymentBaseString; /** @@ -107,6 +109,7 @@ public class ExcelInsuranceDetailPO { /** * 公积金缴纳基数 */ + @Encrypt private String fundPaymentBaseString; /** @@ -117,51 +120,61 @@ public class ExcelInsuranceDetailPO { /** * 其他福利缴纳基数 */ + @Encrypt private String otherPaymentBaseString; /** * 社保个人缴费明细 */ + @Encrypt private String socialPerJson; /** * 社保个人合计 */ + @Encrypt private String socialPerSum; /** * 公积金个人缴费明细 */ + @Encrypt private String fundPerJson; /** * 公积金个人合计 */ + @Encrypt private String fundPerSum; /** * 其他福利个人缴费明细 */ + @Encrypt private String otherPerJson; /** * 其他福利个人合计 */ + @Encrypt private String otherPerSum; /** * 个人合计 */ + @Encrypt private String perSum; /** * 社保单位缴费明细 */ + @Encrypt private String socialComJson; /** * 社保单位合计 */ + @Encrypt private String socialComSum; /** @@ -187,26 +200,31 @@ public class ExcelInsuranceDetailPO { /** * 单位合计 */ + @Encrypt private String comSum; /** * 社保合计 */ + @Encrypt private String socialSum; /** * 公积金合计 */ + @Encrypt private String fundSum; /** * 其他福利合计 */ + @Encrypt private String otherSum; /** * 合计 */ + @Encrypt private String total; /** diff --git a/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailTempPO.java b/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailTempPO.java index cda03ca2e..50897c6b2 100644 --- a/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailTempPO.java +++ b/src/com/engine/salary/entity/siaccount/po/InsuranceAccountDetailTempPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.siaccount.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -98,6 +99,7 @@ public class InsuranceAccountDetailTempPO { /** * 社保缴纳基数 */ + @Encrypt private String socialPaymentBaseString; /** @@ -108,6 +110,7 @@ public class InsuranceAccountDetailTempPO { /** * 公积金缴纳基数 */ + @Encrypt private String fundPaymentBaseString; /** @@ -118,51 +121,61 @@ public class InsuranceAccountDetailTempPO { /** * 其他福利缴纳基数 */ + @Encrypt private String otherPaymentBaseString; /** * 社保个人缴费明细 */ + @Encrypt private String socialPerJson; /** * 社保个人合计 */ + @Encrypt private String socialPerSum; /** * 公积金个人缴费明细 */ + @Encrypt private String fundPerJson; /** * 公积金个人合计 */ + @Encrypt private String fundPerSum; /** * 其他福利个人缴费明细 */ + @Encrypt private String otherPerJson; /** * 其他福利个人合计 */ + @Encrypt private String otherPerSum; /** * 个人合计 */ + @Encrypt private String perSum; /** * 社保单位缴费明细 */ + @Encrypt private String socialComJson; /** * 社保单位合计 */ + @Encrypt private String socialComSum; /** @@ -188,26 +201,31 @@ public class InsuranceAccountDetailTempPO { /** * 单位合计 */ + @Encrypt private String comSum; /** * 社保合计 */ + @Encrypt private String socialSum; /** * 公积金合计 */ + @Encrypt private String fundSum; /** * 其他福利合计 */ + @Encrypt private String otherSum; /** * 合计 */ + @Encrypt private String total; /** diff --git a/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesFundSchemePO.java b/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesFundSchemePO.java index 352e948fa..5e511ae39 100644 --- a/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesFundSchemePO.java +++ b/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesFundSchemePO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.siarchives.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -83,6 +84,7 @@ public class InsuranceArchivesFundSchemePO { /** * 公积金缴纳基数 */ + @Encrypt private String fundPaymentBaseString; /** diff --git a/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesOtherSchemePO.java b/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesOtherSchemePO.java index a97420925..5a7453937 100644 --- a/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesOtherSchemePO.java +++ b/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesOtherSchemePO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.siarchives.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -73,6 +74,7 @@ public class InsuranceArchivesOtherSchemePO { /** * 其他福利缴纳基数 */ + @Encrypt private String otherPaymentBaseString; /** diff --git a/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesSocialSchemePO.java b/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesSocialSchemePO.java index 901977fee..d9c5a6e72 100644 --- a/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesSocialSchemePO.java +++ b/src/com/engine/salary/entity/siarchives/po/InsuranceArchivesSocialSchemePO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.siarchives.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -79,6 +80,7 @@ public class InsuranceArchivesSocialSchemePO { /** * 社保缴纳基数 */ + @Encrypt private String socialPaymentBaseString; /** diff --git a/src/com/engine/salary/entity/sischeme/po/InsuranceSchemeDetailPO.java b/src/com/engine/salary/entity/sischeme/po/InsuranceSchemeDetailPO.java index 5d1f79fd8..40f491caf 100644 --- a/src/com/engine/salary/entity/sischeme/po/InsuranceSchemeDetailPO.java +++ b/src/com/engine/salary/entity/sischeme/po/InsuranceSchemeDetailPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.sischeme.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -59,11 +60,13 @@ public class InsuranceSchemeDetailPO { /** * 基数上限 */ + @Encrypt private String upperLimit; /** * 基数下限 */ + @Encrypt private String lowerLimit; /** @@ -74,6 +77,7 @@ public class InsuranceSchemeDetailPO { /** * 固定费用 */ + @Encrypt private String fixedCost; /** diff --git a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java index 6a4ee80f6..2282119c3 100644 --- a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java +++ b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationBO.java @@ -2,7 +2,7 @@ package com.engine.salary.entity.taxdeclaration.bo; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.constant.TaxDeclarationDataIndexConstant; -import com.engine.salary.encrypt.datacollection.AddUpSituationEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; @@ -44,6 +44,7 @@ import java.util.stream.Collectors; * @version 1.0 **/ public class TaxDeclarationBO { + private static EncryptUtil encryptUtil = new EncryptUtil(); public static List convert2ListDTO(List taxDeclarations, List simpleEmployees, @@ -413,7 +414,7 @@ public class TaxDeclarationBO { .tenantKey(taxDeclaration.getTenantKey()) .deleteType(NumberUtils.INTEGER_ZERO) .build(); - AddUpSituationEncrypt.encryptAddUpSituation(accumulatedSituation); + encryptUtil.encrypt(accumulatedSituation, AddUpSituation.class); result.getNeedInsertAddUpSituations().add(accumulatedSituation); }); } diff --git a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationDetailPO.java b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationDetailPO.java index 90787406d..e7c4e49b2 100644 --- a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationDetailPO.java +++ b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationDetailPO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.taxdeclaration.po; +import com.engine.salary.annotation.Encrypt; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -50,6 +51,7 @@ public class TaxDeclarationDetailPO { /** * 申报表字段的值 */ + @Encrypt private String fieldValue; diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index 2e19d1190..506046b23 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -13,7 +13,6 @@ import com.engine.salary.biz.AddUpDeductionBiz; import com.engine.salary.biz.EmployBiz; import com.engine.salary.common.LocalDateRange; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.datacollection.AddUpDeductionRecordStrDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AddUpDeductionDTO; @@ -876,7 +875,7 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpDeductionMapper().recordList(queryParam); - AddUpDeductionRecordStrDTOEncrypt.decryptAddUpDeductionRecordDTO(list); + encryptUtil.decryptList(list, AddUpDeductionRecordDTO.class); return new PageInfo<>(list, AddUpDeductionRecordDTO.class); } diff --git a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java index 76b09e534..74d6e344c 100644 --- a/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpSituationServiceImpl.java @@ -10,7 +10,6 @@ import com.engine.core.impl.Service; import com.engine.salary.biz.AddUpSituationBiz; import com.engine.salary.biz.EmployBiz; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.datacollection.AddUpSituationRecordDTOEncrypt; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.AddUpSituationDTO; @@ -222,7 +221,7 @@ public class AddUpSituationServiceImpl extends Service implements AddUpSituation SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getAddUpSituationMapper().recordList(queryParam); - AddUpSituationRecordDTOEncrypt.decryptAddUpSituationRecordDTOList(list); + encryptUtil.decryptList(list, AddUpSituationRecordDTO.class); return new PageInfo<>(list, AddUpSituationRecordDTO.class); } diff --git a/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java b/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java index dd4a026ca..ee0c3ecf3 100644 --- a/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/OtherDeductionServiceImpl.java @@ -7,8 +7,7 @@ import com.engine.core.impl.Service; import com.engine.salary.biz.EmployBiz; import com.engine.salary.biz.OtherDeductionBiz; import com.engine.salary.constant.SalaryDefaultTenantConstant; -import com.engine.salary.encrypt.datacollection.OtherDeductionListDTOEncrypt; -import com.engine.salary.encrypt.datacollection.OtherDeductionRecordDTOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.datacollection.dto.OtherDeductionListDTO; import com.engine.salary.entity.datacollection.dto.OtherDeductionRecordDTO; @@ -59,6 +58,7 @@ import java.util.stream.Collectors; import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; public class OtherDeductionServiceImpl extends Service implements OtherDeductionService { + private EncryptUtil encryptUtil = new EncryptUtil(); private OtherDeductionMapper getOtherDeductionMapper() { return MapperProxyFactory.getProxy(OtherDeductionMapper.class); @@ -119,8 +119,9 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction } SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getOtherDeductionMapper().list(queryParam); - OtherDeductionListDTOEncrypt.decryptOtherDeductionListDTOList(list); - return new PageInfo<>(list, OtherDeductionListDTO.class); + PageInfo page = new PageInfo<>(list, OtherDeductionListDTO.class); + encryptUtil.decryptList(page.getList(), OtherDeductionListDTO.class); + return page; } @Override @@ -144,7 +145,7 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction } SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getOtherDeductionMapper().recordList(queryParam); - OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(list); + encryptUtil.decryptList(list, OtherDeductionRecordDTO.class); return new PageInfo<>(list, OtherDeductionRecordDTO.class); } @@ -432,7 +433,7 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction } List list = getOtherDeductionMapper().list(param); - OtherDeductionListDTOEncrypt.decryptOtherDeductionListDTOList(list); + encryptUtil.decryptList(list, OtherDeductionListDTO.class); // 开启分权并且不是薪酬模块总管理员 if (getTaxAgentService(user).isOpenDevolution() && !getTaxAgentService(user).isChief(employeeId)) { List taxAgentIdsAsAdmin = getTaxAgentService(user).listAllTaxAgentsAsAdmin(employeeId).stream().map(TaxAgentPO::getId).collect(Collectors.toList()); @@ -526,7 +527,7 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); //查询详细信息 List list = getOtherDeductionMapper().recordList(param); - OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(list); + encryptUtil.decryptList(list, OtherDeductionRecordDTO.class); final List> dataRowList = Optional.ofNullable(list) .map(List::stream) .map(operatorStream -> operatorStream.map(dto -> { @@ -780,7 +781,7 @@ public class OtherDeductionServiceImpl extends Service implements OtherDeduction ids.add(otherDeductionParam.getId()); OtherDeductionQueryParam build = OtherDeductionQueryParam.builder().ids(ids).build(); List list = getOtherDeductionMapper().recordList(build); - OtherDeductionRecordDTOEncrypt.decryptOtherDeductionRecordDTOList(list); + encryptUtil.decryptList(list, OtherDeductionRecordDTO.class); if (list == null || list.size() == 0) { throw new SalaryRunTimeException("该数据不存在!"); diff --git a/src/com/engine/salary/service/impl/SIAComparisonResultServiceImpl.java b/src/com/engine/salary/service/impl/SIAComparisonResultServiceImpl.java index d79a76f2e..f5fc62819 100644 --- a/src/com/engine/salary/service/impl/SIAComparisonResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAComparisonResultServiceImpl.java @@ -2,8 +2,7 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; -import com.engine.salary.encrypt.siexport.AccountExportPOEncrypt; -import com.engine.salary.encrypt.siexport.ExcelAccountExportPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.siaccount.bo.InsuranceComparisonResultBO; import com.engine.salary.entity.siaccount.dto.InsuranceComparisonResultListDTO; import com.engine.salary.entity.siaccount.param.InsuranceComparisonResultQueryParam; @@ -40,6 +39,7 @@ import java.util.stream.Collectors; * @Date: 2022/9/28 **/ public class SIAComparisonResultServiceImpl extends Service implements SIAComparisonResultService { + private EncryptUtil encryptUtil = new EncryptUtil(); private InsuranceExportMapper getInsuranceExportMapper() { return MapperProxyFactory.getProxy(InsuranceExportMapper.class); @@ -147,10 +147,10 @@ public class SIAComparisonResultServiceImpl extends Service implements SIACompar .collect(Collectors.toList()); accountExportPOS = accountExportPOS.stream().filter(v -> canAccountIds.contains(v.getEmployeeId())).collect(Collectors.toList()); - AccountExportPOEncrypt.decryptAccountExportPOList(accountExportPOS); + encryptUtil.decryptList(accountExportPOS, AccountExportPO.class); //2-查询线下对比数据 List excelAccountExportPOS = getInsuranceExportMapper().exportExcelAccount(queryParam); - ExcelAccountExportPOEncrypt.decryptExcelAccountExportPOList(excelAccountExportPOS); + encryptUtil.decryptList(excelAccountExportPOS, ExcelAccountExportPO.class); //3-构建福利核算对比结果列表表头 List weaTableColumns = InsuranceComparisonResultBO.buildTableColumns4ComparisonResult(); //4-通过线上线下两份数据获得对比结果 diff --git a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java index 73a03981b..710e4379f 100644 --- a/src/com/engine/salary/service/impl/SIAccountServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIAccountServiceImpl.java @@ -13,7 +13,6 @@ import com.engine.salary.biz.*; import com.engine.salary.component.SalaryWeaTable; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.siaccount.ExcelInsuranceDetailPOEncrypt; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.siaccount.bo.InsuranceAccountBO; import com.engine.salary.entity.siaccount.dto.InsuranceAccountBatchListDTO; @@ -1998,7 +1997,7 @@ public class SIAccountServiceImpl extends Service implements SIAccountService { } //将待更新列表加密 - ExcelInsuranceDetailPOEncrypt.encryptInsuranceAccountDetailPOList(addCompareList); + encryptUtil.encryptList(addCompareList, ExcelInsuranceDetailPO.class); //删除 if (idList.size() > 0) { getExcelInsuranceDetailMapper().batchDelByIds(idList); diff --git a/src/com/engine/salary/service/impl/SIExportServiceImpl.java b/src/com/engine/salary/service/impl/SIExportServiceImpl.java index 825f10af9..6e74a92ef 100644 --- a/src/com/engine/salary/service/impl/SIExportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIExportServiceImpl.java @@ -6,7 +6,6 @@ import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.SIAccountBiz; import com.engine.salary.encrypt.EncryptUtil; -import com.engine.salary.encrypt.siexport.AccountExportPOEncrypt; import com.engine.salary.entity.siaccount.dto.InsuranceAccountViewListDTO; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesBaseInfoPO; @@ -174,7 +173,7 @@ public class SIExportServiceImpl extends Service implements SIExportService { accountExportPOS = accountExportPOS.stream().filter(f -> canAccountIds.contains(f.getEmployeeId())).collect(Collectors.toList()); } - AccountExportPOEncrypt.decryptAccountExportPOList(accountExportPOS); + encryptUtil.decryptList(accountExportPOS, AccountExportPO.class); List columns = new ArrayList<>(); List> records = new ArrayList<>(); // if (Objects.equals(PaymentStatusEnum.COMMON.getValue(), paymentStatus)) { diff --git a/src/com/engine/salary/service/impl/SIImportServiceImpl.java b/src/com/engine/salary/service/impl/SIImportServiceImpl.java index aecdd2e8d..32e5e69ed 100644 --- a/src/com/engine/salary/service/impl/SIImportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIImportServiceImpl.java @@ -6,9 +6,7 @@ import com.cloudstore.eccom.pc.table.WeaTableColumn; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.biz.SIArchivesBiz; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesFundSchemePOEncrypt; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesOtherSchemePOEncrypt; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesSocialSchemePOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.siarchives.param.InsuranceArchivesListParam; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesFundSchemePO; @@ -48,6 +46,7 @@ import java.util.stream.Collectors; * @Version V1.0 **/ public class SIImportServiceImpl extends Service implements SIImportService { + private EncryptUtil encryptUtil = new EncryptUtil(); private SIArchivesBiz siArchivesBiz = new SIArchivesBiz(); @@ -231,19 +230,19 @@ public class SIImportServiceImpl extends Service implements SIImportService { List employeeIds = insuranceArchivesEmployeePOS.stream().map(InsuranceArchivesEmployeePO::getEmployeeId).collect(Collectors.toList()); Map socialSchemePOMap = new HashMap<>(); List socialSchemePOList = siArchivesBiz.getSocialByEmployeeIds(employeeIds); - InsuranceArchivesSocialSchemePOEncrypt.decryptList(socialSchemePOList); + encryptUtil.decryptList(socialSchemePOList, InsuranceArchivesSocialSchemePO.class); if (CollectionUtils.isNotEmpty(socialSchemePOList)) { socialSchemePOMap = socialSchemePOList.stream().collect(Collectors.toMap(InsuranceArchivesSocialSchemePO::getEmployeeId, Function.identity())); } List fundSchemePOList = siArchivesBiz.getFundByEmployeeIds(employeeIds); - InsuranceArchivesFundSchemePOEncrypt.encryptList(fundSchemePOList); + encryptUtil.encryptList(fundSchemePOList, InsuranceArchivesFundSchemePO.class); Map fundSchemePOMap = new HashMap<>(); if (CollectionUtils.isNotEmpty(fundSchemePOList)) { fundSchemePOMap = fundSchemePOList.stream().collect(Collectors.toMap(InsuranceArchivesFundSchemePO::getEmployeeId, Function.identity())); } Map otherSchemePOMap = new HashMap<>(); List otherSchemePOList = siArchivesBiz.getOtherByEmployeeIds(employeeIds); - InsuranceArchivesOtherSchemePOEncrypt.decryptList(otherSchemePOList); + encryptUtil.decryptList(otherSchemePOList, InsuranceArchivesOtherSchemePO.class); if (CollectionUtils.isNotEmpty(otherSchemePOList)) { otherSchemePOMap = otherSchemePOList.stream().collect(Collectors.toMap(InsuranceArchivesOtherSchemePO::getEmployeeId, Function.identity())); } diff --git a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java index 4478d86e9..a19a164cf 100644 --- a/src/com/engine/salary/service/impl/SISchemeServiceImpl.java +++ b/src/com/engine/salary/service/impl/SISchemeServiceImpl.java @@ -12,10 +12,7 @@ import com.engine.salary.biz.SISchemeBiz; import com.engine.salary.cmd.sischeme.*; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesFundSchemePOEncrypt; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesOtherSchemePOEncrypt; -import com.engine.salary.encrypt.siarchives.InsuranceArchivesSocialSchemePOEncrypt; -import com.engine.salary.encrypt.sischeme.InsuranceSchemeDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.siarchives.param.InsuranceArchivesListParam; import com.engine.salary.entity.siarchives.param.SIArchiveImportActionParam; @@ -84,6 +81,8 @@ import static com.engine.salary.util.excel.ExcelSupport.EXCEL_TYPE_XLSX; * @Version V1.0 **/ public class SISchemeServiceImpl extends Service implements SISchemeService { + private EncryptUtil encryptUtil = new EncryptUtil(); + private SocialSchemeMapper getSocialSchemeMapper() { return MapperProxyFactory.getProxy(SocialSchemeMapper.class); } @@ -262,9 +261,9 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { end = employeeIds.size(); } List ids = employeeIds.subList(i, end); - socialList.addAll(InsuranceArchivesSocialSchemePOEncrypt.decryptList(siArchivesBiz.getSocialByEmployeeIds(ids))); - fundList.addAll(InsuranceArchivesFundSchemePOEncrypt.decryptList(siArchivesBiz.getFundByEmployeeIds(ids))); - otherList.addAll(InsuranceArchivesOtherSchemePOEncrypt.decryptList(siArchivesBiz.getOtherByEmployeeIds(ids))); + socialList.addAll(encryptUtil.decryptList(siArchivesBiz.getSocialByEmployeeIds(ids), InsuranceArchivesSocialSchemePO.class)); + fundList.addAll(encryptUtil.decryptList(siArchivesBiz.getFundByEmployeeIds(ids), InsuranceArchivesFundSchemePO.class)); + otherList.addAll(encryptUtil.decryptList(siArchivesBiz.getOtherByEmployeeIds(ids), InsuranceArchivesOtherSchemePO.class)); } Map socialSchemePOMap = SalaryEntityUtil.convert2Map(socialList, k -> k.getPaymentOrganization() + "-" + k.getEmployeeId()); Map fundSchemePOMap = SalaryEntityUtil.convert2Map(fundList, k -> k.getPaymentOrganization() + "-" + k.getEmployeeId()); @@ -412,7 +411,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { public Collection queryInsuranceSchemeDetailList(Long id) { List insuranceSchemeDetailPOS = MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class).queryInsuranceSchemeDetailList(id, IsPaymentEnum.YES.getValue()); - return InsuranceSchemeDetailPOEncrypt.decryptList(insuranceSchemeDetailPOS); + return encryptUtil.decryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); } public String queryInsuranceName(Long id) { @@ -474,7 +473,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { List socialByEmployeeId = siArchivesBiz.getSocialByEmployeeIds(new ArrayList() {{ add(item.getEmployeeId()); }}); - InsuranceArchivesSocialSchemePOEncrypt.decryptList(socialByEmployeeId); + encryptUtil.decryptList(socialByEmployeeId, InsuranceArchivesSocialSchemePO.class); InsuranceArchivesSocialSchemePO socialItem = null; if (socialByEmployeeId.size() > 0) { socialItem = socialByEmployeeId.get(0); @@ -484,7 +483,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { List fundByEmployeeId = siArchivesBiz.getFundByEmployeeIds(new ArrayList() {{ add(item.getEmployeeId()); }}); - InsuranceArchivesFundSchemePOEncrypt.decryptList(fundByEmployeeId); + encryptUtil.decryptList(fundByEmployeeId, InsuranceArchivesFundSchemePO.class); if (fundByEmployeeId.size() > 0) { fundItem = fundByEmployeeId.get(0); @@ -494,7 +493,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { List otherByEmployeeId = siArchivesBiz.getOtherByEmployeeIds(new ArrayList() {{ add(item.getEmployeeId()); }}); - InsuranceArchivesOtherSchemePOEncrypt.decryptList(otherByEmployeeId); + encryptUtil.decryptList(otherByEmployeeId, InsuranceArchivesOtherSchemePO.class); if (otherByEmployeeId.size() > 0) { otherItem = otherByEmployeeId.get(0); } @@ -1082,7 +1081,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { insuranceArchivesSocialSchemePO.setEmployeeId(employeeId); insuranceArchivesSocialSchemePO.setUnderTake(UndertakerEnum.SCOPE_PERSON.getValue()); List insuranceSchemeDetailPOS = getInsuranceSchemeDetailMapper().queryListBySchemeId(insuranceArchivesSocialSchemePO.getSocialSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(insuranceSchemeDetailPOS); + encryptUtil.decryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); if (CollectionUtils.isNotEmpty(insuranceSchemeDetailPOS)) { List insuranceIds = insuranceSchemeDetailPOS.stream().map(InsuranceSchemeDetailPO::getInsuranceId).collect(Collectors.toList()); HashMap socialPaymentBase = new HashMap<>(); @@ -1134,7 +1133,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { insuranceArchivesFundSchemePO.setEmployeeId(employeeId); List insuranceSchemeDetailPOS = getInsuranceSchemeDetailMapper().queryListBySchemeId(insuranceArchivesFundSchemePO.getFundSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(insuranceSchemeDetailPOS); + encryptUtil.decryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); if (CollectionUtils.isNotEmpty(insuranceSchemeDetailPOS)) { List insuranceIds = insuranceSchemeDetailPOS.stream().map(InsuranceSchemeDetailPO::getInsuranceId).collect(Collectors.toList()); HashMap socialPaymentBase = new HashMap<>(); @@ -1182,7 +1181,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { insuranceArchivesOtherSchemePO.setUnderTake(UndertakerEnum.SCOPE_PERSON.getValue()); insuranceArchivesOtherSchemePO.setEmployeeId(employeeId); List insuranceSchemeDetailPOS = getInsuranceSchemeDetailMapper().queryListBySchemeId(insuranceArchivesOtherSchemePO.getOtherSchemeId()); - InsuranceSchemeDetailPOEncrypt.decryptList(insuranceSchemeDetailPOS); + encryptUtil.decryptList(insuranceSchemeDetailPOS, InsuranceSchemeDetailPO.class); if (CollectionUtils.isNotEmpty(insuranceSchemeDetailPOS)) { List insuranceIds = insuranceSchemeDetailPOS.stream().map(InsuranceSchemeDetailPO::getInsuranceId).collect(Collectors.toList()); HashMap socialPaymentBase = new HashMap<>(); @@ -1232,7 +1231,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { socialSchemePOS = socialSchemePOS.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); - List insuranceArchivesSocialSchemePOS = InsuranceArchivesSocialSchemePOEncrypt.encryptList(socialSchemePOS); + List insuranceArchivesSocialSchemePOS = encryptUtil.encryptList(socialSchemePOS, InsuranceArchivesSocialSchemePO.class); List> partition = Lists.partition(insuranceArchivesSocialSchemePOS, 100); partition.forEach(getSocialSchemeMapper()::batchSave); } @@ -1249,7 +1248,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { fundSchemePOS = fundSchemePOS.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); - List insuranceArchivesFundSchemePOS = InsuranceArchivesFundSchemePOEncrypt.encryptList(fundSchemePOS); + List insuranceArchivesFundSchemePOS = encryptUtil.encryptList(fundSchemePOS, InsuranceArchivesFundSchemePO.class); List> partition = Lists.partition(insuranceArchivesFundSchemePOS, 100); partition.forEach(getFundSchemeMapper()::batchSave); } @@ -1266,7 +1265,7 @@ public class SISchemeServiceImpl extends Service implements SISchemeService { otherSchemePOS = otherSchemePOS.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getPaymentOrganization() + "-" + f.getEmployeeId()))), ArrayList::new)); - List insuranceArchivesOtherSchemePOS = InsuranceArchivesOtherSchemePOEncrypt.encryptList(otherSchemePOS); + List insuranceArchivesOtherSchemePOS = encryptUtil.encryptList(otherSchemePOS, InsuranceArchivesOtherSchemePO.class); List> partition = Lists.partition(insuranceArchivesOtherSchemePOS, 100); partition.forEach(getOtherSchemeMapper()::batchSave); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctReportServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctReportServiceImpl.java index e02c2aeac..c79f6d79d 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctReportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctReportServiceImpl.java @@ -3,7 +3,7 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.encrypt.report.SalaryAcctResultReportPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.report.po.SalaryAcctResultReportPO; import com.engine.salary.mapper.report.SalaryAcctResultReportMapper; import com.engine.salary.service.SalaryAcctReportService; @@ -16,6 +16,7 @@ import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import weaver.hrm.User; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -31,7 +32,7 @@ import static com.engine.salary.sys.constant.SalarySysConstant.DISPLAY_EMP_INFO_ * @version 1.0 **/ public class SalaryAcctReportServiceImpl extends Service implements SalaryAcctReportService { - + private EncryptUtil encryptUtil = new EncryptUtil(); private SalaryAcctResultReportMapper getSalaryAcctResultReportMapper() { return MapperProxyFactory.getProxy(SalaryAcctResultReportMapper.class); } @@ -77,7 +78,7 @@ public class SalaryAcctReportServiceImpl extends Service implements SalaryAcctRe SalarySysConfPO disPlay = getSalarySysConfService(user).getOneByCode(DISPLAY_EMP_INFO_REPORT); //默认不显示,关闭状态 if (disPlay == null || OpenEnum.OFF.getValue().equals(disPlay.getConfValue())) { - SalaryAcctResultReportPOEncrypt.encryptList(pos); + pos = encryptUtil.encryptList(new ArrayList<>(pos), SalaryAcctResultReportPO.class); } // List> partition = Lists.partition((List) pos, 100); // partition.forEach(getSalaryAcctResultReportMapper()::batchInsert); diff --git a/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java index 09b567960..5abf3f1e5 100644 --- a/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryComparisonResultServiceImpl.java @@ -3,7 +3,7 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.encrypt.salaryacct.ExcelAcctResultPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryacct.bo.SalaryAcctResultBO; import com.engine.salary.entity.salaryacct.dto.SalaryComparisonResultListDTO; @@ -50,7 +50,7 @@ import java.util.stream.Collectors; * @version 1.0 **/ public class SalaryComparisonResultServiceImpl extends Service implements SalaryComparisonResultService { - + private EncryptUtil encryptUtil = new EncryptUtil(); private ExcelAcctResultMapper getExcelAcctResultMapper() { return MapperProxyFactory.getProxy(ExcelAcctResultMapper.class); @@ -104,7 +104,7 @@ public class SalaryComparisonResultServiceImpl extends Service implements Salary @Override public List listBySalaryAcctRecordId(Long salaryAcctRecordId) { List excelAcctResultPOS = getExcelAcctResultMapper().listSome(ExcelAcctResultPO.builder().salaryAcctRecordId(salaryAcctRecordId).build()); - return ExcelAcctResultPOEncrypt.decryptList(excelAcctResultPOS); + return encryptUtil.decryptList(excelAcctResultPOS, ExcelAcctResultPO.class); } @Override @@ -113,7 +113,7 @@ public class SalaryComparisonResultServiceImpl extends Service implements Salary return Collections.emptyList(); } List excelAcctResultPOS = getExcelAcctResultMapper().listSome(ExcelAcctResultPO.builder().salaryAcctEmpIds(salaryAcctEmployeeIds).build()); - return ExcelAcctResultPOEncrypt.decryptList(excelAcctResultPOS); + return encryptUtil.decryptList(excelAcctResultPOS, ExcelAcctResultPO.class); } @Override @@ -249,10 +249,10 @@ public class SalaryComparisonResultServiceImpl extends Service implements Salary @Override public void batchSave(Collection excelAcctResultPOS) { - ExcelAcctResultPOEncrypt.encryptList(excelAcctResultPOS); if (CollectionUtils.isEmpty(excelAcctResultPOS)) { return; } + excelAcctResultPOS = encryptUtil.encryptList(new ArrayList<>(excelAcctResultPOS), ExcelAcctResultPO.class); List> partition = Lists.partition((List) excelAcctResultPOS, 100); partition.forEach(getExcelAcctResultMapper()::batchInsert); } diff --git a/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java b/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java index df9b604be..638d76f86 100644 --- a/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/SpecialAddDeductionServiceImpl.java @@ -5,11 +5,14 @@ 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.encrypt.EncryptUtil; 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.*; +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.param.SpecialAddDeductionRecordDeleteParam; import com.engine.salary.entity.datacollection.po.SpecialAddDeductionPO; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeTaxAgentDTO; import com.engine.salary.entity.taxagent.dto.TaxAgentManageRangeEmployeeDTO; @@ -52,6 +55,7 @@ import java.util.stream.Collectors; import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; public class SpecialAddDeductionServiceImpl extends Service implements SpecialAddDeductionService { + private EncryptUtil encryptUtil = new EncryptUtil(); private SpecialAddDeductionBiz getSpecialAddDeductionBiz() { return new SpecialAddDeductionBiz(); @@ -101,7 +105,7 @@ public class SpecialAddDeductionServiceImpl extends Service implements SpecialAd } SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getSpecialAddDeductionMapper().listByParam(queryParam); - SpecialAddDeductionEncrypt.decrypt(list); + encryptUtil.decryptList(list, SpecialAddDeductionListDTO.class); return new PageInfo<>(list, SpecialAddDeductionListDTO.class); } @@ -115,7 +119,7 @@ public class SpecialAddDeductionServiceImpl extends Service implements SpecialAd } SalaryPageUtil.start(queryParam.getCurrent(), queryParam.getPageSize()); List list = getSpecialAddDeductionMapper().listDtoByParam(queryParam); - SpecialAddDeductionEncrypt.decrypt(list); + encryptUtil.decryptList(list, SpecialAddDeductionRecordDTO.class); return new PageInfo<>(list, SpecialAddDeductionRecordDTO.class); } @@ -439,7 +443,7 @@ public class SpecialAddDeductionServiceImpl extends Service implements SpecialAd SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); //查询详细信息 List list = getSpecialAddDeductionBiz().listDTOByParam(param); - SpecialAddDeductionEncrypt.decrypt(list); + encryptUtil.decryptList(list, SpecialAddDeductionRecordDTO.class); final List> dataRowList = Optional.ofNullable(list) .map(List::stream) .map(operatorStream -> operatorStream.map(dto -> { diff --git a/src/com/engine/salary/service/impl/TaxDeclarationDetailServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationDetailServiceImpl.java index 7524ea9c3..d0773e055 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationDetailServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationDetailServiceImpl.java @@ -2,7 +2,7 @@ package com.engine.salary.service.impl; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; -import com.engine.salary.encrypt.taxdeclaration.TaxDeclarationDetailPOEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.taxagent.dto.TaxAgentEmployeeDTO; import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationBO; @@ -46,6 +46,8 @@ import java.util.stream.Collectors; **/ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDeclarationDetailService { + private EncryptUtil encryptUtil = new EncryptUtil(); + private TaxDeclarationDetailMapper getTaxDeclarationDetailMapper() { return MapperProxyFactory.getProxy(TaxDeclarationDetailMapper.class); } @@ -231,7 +233,7 @@ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDecla Set employeeIds = SalaryEntityUtil.properties(list, TaxDeclarationEmployeeDTO::getEmployeeId); List taxDeclarationDetailPOS = listByTaxDeclarationIdAndEmployeeIds(queryParam.getTaxDeclarationId(), employeeIds); - TaxDeclarationDetailPOEncrypt.decryptTaxDeclarationDetailPOList(taxDeclarationDetailPOS); + encryptUtil.decryptList(taxDeclarationDetailPOS, TaxDeclarationDetailPO.class); // 查询人员信息 List simpleEmployeeIds = list.stream() .filter(taxDeclarationEmployeeDTO -> Objects.equals(taxDeclarationEmployeeDTO.getEmployeeType(), EmployeeTypeEnum.ORGANIZATION.getValue())) @@ -258,7 +260,7 @@ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDecla @Override public void batchSave(Collection taxDeclarationDetailPOS) { if (CollectionUtils.isNotEmpty(taxDeclarationDetailPOS)) { - TaxDeclarationDetailPOEncrypt.encryptTaxDeclarationDetailPOList(taxDeclarationDetailPOS); + taxDeclarationDetailPOS = encryptUtil.encryptList(new ArrayList<>(taxDeclarationDetailPOS), TaxDeclarationDetailPO.class); List> partition = Lists.partition((List) taxDeclarationDetailPOS, 100); partition.forEach(getTaxDeclarationDetailMapper()::batchInsert); } @@ -270,7 +272,7 @@ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDecla } List taxDeclarationDetailPOS = getTaxDeclarationDetailMapper().listByTaxDeclarationIdAndEmployeeIds(taxDeclarationId, employeeIds); - return TaxDeclarationDetailPOEncrypt.decryptTaxDeclarationDetailPOList(taxDeclarationDetailPOS); + return encryptUtil.decryptList(taxDeclarationDetailPOS, TaxDeclarationDetailPO.class); } @Override diff --git a/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java b/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java index 5f2781b09..e86a03f86 100644 --- a/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java +++ b/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java @@ -4,7 +4,7 @@ import com.api.formmode.mybatis.util.SqlProxyHandle; import com.cloudstore.dev.api.util.Util_DataCache; import com.engine.core.impl.Service; import com.engine.salary.encrypt.AESEncryptUtil; -import com.engine.salary.encrypt.datacollection.SpecialAddDeductionEncrypt; +import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.datacollection.AddUpDeduction; import com.engine.salary.entity.datacollection.AddUpSituation; import com.engine.salary.entity.datacollection.po.OtherDeductionPO; @@ -57,10 +57,11 @@ import weaver.conn.mybatis.MyBatisFactory; import weaver.general.BaseBean; import java.util.*; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; import static com.engine.salary.sys.constant.SalarySysConstant.*; -import static java.util.concurrent.Executors.*; +import static java.util.concurrent.Executors.newFixedThreadPool; /** * 薪酬系统配置类 @@ -71,6 +72,7 @@ import static java.util.concurrent.Executors.*; * @version 1.0 **/ public class SalarySysConfServiceImpl extends Service implements SalarySysConfService { + private EncryptUtil encryptUtil = new EncryptUtil(); private SalarySysConfMapper getSalarySysConfMapper() { return SqlProxyHandle.getProxy(SalarySysConfMapper.class); @@ -929,9 +931,9 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe if (CollectionUtils.isNotEmpty(addUpSituations)) { addUpSituations.forEach(po -> { if (OpenEnum.OFF.getValue().equals(isOpenEncrypt)) { - SpecialAddDeductionEncrypt.decrypt(po); + encryptUtil.decrypt(po, SpecialAddDeductionPO.class); } else { - SpecialAddDeductionEncrypt.encrypt(po); + encryptUtil.encrypt(po, SpecialAddDeductionPO.class); } }); List> partition = Lists.partition(addUpSituations, 50); From d039781b74b6e413745378845628cebc8da9fdb7 Mon Sep 17 00:00:00 2001 From: fcli Date: Wed, 14 Dec 2022 11:03:33 +0800 Subject: [PATCH 77/77] =?UTF-8?q?feat:=20develop=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/engine/salary/biz/SIAccountBiz.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/engine/salary/biz/SIAccountBiz.java b/src/com/engine/salary/biz/SIAccountBiz.java index bb49a4fa1..2bf7c9e3d 100644 --- a/src/com/engine/salary/biz/SIAccountBiz.java +++ b/src/com/engine/salary/biz/SIAccountBiz.java @@ -119,10 +119,9 @@ public class SIAccountBiz extends Service { public PageInfo listPage(InsuranceAccountBatchParam queryParam) { List list = getInsuranceAccountBatchMapper().list(queryParam); - list = encryptUtil.decryptList(list, InsuranceAccountBatchPO.class); PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), list, InsuranceAccountBatchPO.class); - SiAccountEncrypt.decryptInsuranceAccountBatchList(page.getList()); + encryptUtil.decryptList(page.getList(), InsuranceAccountBatchPO.class); return page; }