From 894b9cd1fc97da00c477cda53f312f0085d8796b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com>
Date: Mon, 10 Mar 2025 15:31:33 +0800
Subject: [PATCH 1/9] =?UTF-8?q?1=E3=80=81=E6=89=A3=E9=99=A4=E5=90=8D?=
=?UTF-8?q?=E5=8D=95=E6=9F=A5=E8=AF=A2=202=E3=80=81=E6=89=A3=E9=99=A4?=
=?UTF-8?q?=E5=90=8D=E5=8D=95=E7=A1=AE=E8=AE=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../salary/web/DeductionAmountController.java | 15 +
.../param/DeductionAmountAddParam.java | 45 ++
.../param/DeductionAmountConfirmParam.java | 31 ++
.../DeductionAmountOnlineQueryParam.java | 31 ++
.../param/DeductionAmountQueryParam.java | 31 ++
.../deductionamount/po/DeductionAmountPO.java | 128 +++++
.../DeductionAmountMapper.java | 74 +++
.../deductionamount/DeductionAmountMapper.xml | 345 ++++++++++++++
.../tax/client/DeductionAmountClient.java | 93 ++++
.../remote/tax/client/EmployeeClient.java | 4 +-
.../ConfirmPreDeductRequest.java | 95 ++++
.../QueryDeductionAmountRequest.java | 64 +++
.../service/DeductionAmountService.java | 19 +
.../impl/DeductionAmountServiceImpl.java | 112 +++++
.../salary/web/DeductionAmountController.java | 442 ++++++++++++++++++
.../wrapper/DeductionAmountWrapper.java | 34 ++
test/ParseTaxApi.java | 4 +-
17 files changed, 1563 insertions(+), 4 deletions(-)
create mode 100644 src/com/api/salary/web/DeductionAmountController.java
create mode 100644 src/com/engine/salary/entity/deductionamount/param/DeductionAmountAddParam.java
create mode 100644 src/com/engine/salary/entity/deductionamount/param/DeductionAmountConfirmParam.java
create mode 100644 src/com/engine/salary/entity/deductionamount/param/DeductionAmountOnlineQueryParam.java
create mode 100644 src/com/engine/salary/entity/deductionamount/param/DeductionAmountQueryParam.java
create mode 100644 src/com/engine/salary/entity/deductionamount/po/DeductionAmountPO.java
create mode 100644 src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.java
create mode 100644 src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.xml
create mode 100644 src/com/engine/salary/remote/tax/client/DeductionAmountClient.java
create mode 100644 src/com/engine/salary/remote/tax/request/deductionAmount/ConfirmPreDeductRequest.java
create mode 100644 src/com/engine/salary/remote/tax/request/deductionAmount/QueryDeductionAmountRequest.java
create mode 100644 src/com/engine/salary/service/DeductionAmountService.java
create mode 100644 src/com/engine/salary/service/impl/DeductionAmountServiceImpl.java
create mode 100644 src/com/engine/salary/web/DeductionAmountController.java
create mode 100644 src/com/engine/salary/wrapper/DeductionAmountWrapper.java
diff --git a/src/com/api/salary/web/DeductionAmountController.java b/src/com/api/salary/web/DeductionAmountController.java
new file mode 100644
index 000000000..b18635031
--- /dev/null
+++ b/src/com/api/salary/web/DeductionAmountController.java
@@ -0,0 +1,15 @@
+package com.api.salary.web;
+
+import javax.ws.rs.Path;
+
+/**
+ * 年收入不足6万元的纳税人暂不预扣预缴税款扣除名单
+ *
Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Path("/bs/hrmsalary/deductionAmount")
+public class DeductionAmountController extends com.engine.salary.web.DeductionAmountController {
+}
diff --git a/src/com/engine/salary/entity/deductionamount/param/DeductionAmountAddParam.java b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountAddParam.java
new file mode 100644
index 000000000..0deb8966f
--- /dev/null
+++ b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountAddParam.java
@@ -0,0 +1,45 @@
+package com.engine.salary.entity.deductionamount.param;
+
+import com.engine.salary.util.valid.DataCheck;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 扣除名单查询参数
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeductionAmountAddParam {
+ /**
+ * ID
+ */
+ private Long id;
+
+ /**
+ * 个税扣缴义务人id
+ */
+ @DataCheck(require = true, message = "参数错误,个税扣缴义务人id不能为空")
+ private Long taxAgentId;
+
+ /**
+ * 税款所属年度
+ */
+ @DataCheck(require = true, message = "参数错误,税款所属年度参数格式错误")
+ private String year;
+
+ /**
+ * 报送人员ids
+ */
+ private List employeeDeclareIds;
+}
diff --git a/src/com/engine/salary/entity/deductionamount/param/DeductionAmountConfirmParam.java b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountConfirmParam.java
new file mode 100644
index 000000000..e5fe93593
--- /dev/null
+++ b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountConfirmParam.java
@@ -0,0 +1,31 @@
+package com.engine.salary.entity.deductionamount.param;
+
+import com.engine.salary.util.valid.DataCheck;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 扣除名单查询参数
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeductionAmountConfirmParam {
+
+ // 个税扣缴义务人id
+ @DataCheck(require = true, message = "参数错误,个税扣缴义务人id不能为空")
+ private Long taxAgentId;
+
+ // 税款所属年度
+ @DataCheck(require = true, message = "参数错误,税款所属年度参数格式错误")
+ private String year;
+
+}
diff --git a/src/com/engine/salary/entity/deductionamount/param/DeductionAmountOnlineQueryParam.java b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountOnlineQueryParam.java
new file mode 100644
index 000000000..cd5c8f2ee
--- /dev/null
+++ b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountOnlineQueryParam.java
@@ -0,0 +1,31 @@
+package com.engine.salary.entity.deductionamount.param;
+
+import com.engine.salary.util.valid.DataCheck;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 扣除名单查询参数
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeductionAmountOnlineQueryParam {
+
+ // 个税扣缴义务人id
+ @DataCheck(require = true, message = "参数错误,个税扣缴义务人id不能为空")
+ private Long taxAgentId;
+
+ // 税款所属年度
+ @DataCheck(require = true, message = "参数错误,税款所属年度参数格式错误")
+ private String year;
+
+}
diff --git a/src/com/engine/salary/entity/deductionamount/param/DeductionAmountQueryParam.java b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountQueryParam.java
new file mode 100644
index 000000000..d6b87fb23
--- /dev/null
+++ b/src/com/engine/salary/entity/deductionamount/param/DeductionAmountQueryParam.java
@@ -0,0 +1,31 @@
+package com.engine.salary.entity.deductionamount.param;
+
+import com.engine.salary.util.valid.DataCheck;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 扣除名单查询参数
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeductionAmountQueryParam {
+
+ // 个税扣缴义务人id
+ @DataCheck(require = true, message = "参数错误,个税扣缴义务人id不能为空")
+ private Long taxAgentId;
+
+ // 税款所属年度
+ @DataCheck(require = true, message = "参数错误,税款所属年度参数格式错误")
+ private String year;
+
+}
diff --git a/src/com/engine/salary/entity/deductionamount/po/DeductionAmountPO.java b/src/com/engine/salary/entity/deductionamount/po/DeductionAmountPO.java
new file mode 100644
index 000000000..d3ae06169
--- /dev/null
+++ b/src/com/engine/salary/entity/deductionamount/po/DeductionAmountPO.java
@@ -0,0 +1,128 @@
+package com.engine.salary.entity.deductionamount.po;
+
+import com.engine.hrmelog.annotation.ElogTransform;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Collection;
+import java.util.Date;
+
+/**
+ * 人员报送记录
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+//hrsa_deduction_amount
+public class DeductionAmountPO {
+
+ /**
+ * ID
+ */
+ @ElogTransform(name = "ID")
+ private Long id;
+
+ /**
+ * 个税扣缴义务人ID
+ */
+ @ElogTransform(name = "个税扣缴义务人ID")
+ private Long taxAgentId;
+
+
+ /**
+ * 税款所属年度
+ */
+ @ElogTransform(name = "税款所属年度")
+ private String year;
+ /**
+ * 人员id
+ */
+ @ElogTransform(name = "人员id")
+ private Long employeeId;
+
+ /**
+ * 姓名
+ */
+ @ElogTransform(name = "姓名")
+ private String employeeName;
+
+ /**
+ * 人员类型
+ */
+ @ElogTransform(name = "人员类型")
+ private Byte employeeType;
+
+ /**
+ * 工号
+ */
+ @ElogTransform(name = "工号")
+ private String jobNum;
+
+ /**
+ * 证件号码
+ */
+ @ElogTransform(name = "证件号码")
+ private String cardNum;
+
+ /**
+ * 证件类型
+ */
+ @ElogTransform(name = "证件类型")
+ private Byte cardType;
+
+ /**
+ * 报送状态
+ */
+ @ElogTransform(name = "报送状态")
+ private Byte declareStatus;
+
+ /**
+ * 是否扣除
+ */
+ @ElogTransform(name = "是否扣除")
+ private Byte deductFlag;
+ /**
+ * 是否成功报送过
+ */
+ @ElogTransform(name = "是否成功报送过")
+ private Byte successfullyDeclared;
+
+
+ /**
+ * 创建时间
+ */
+ @ElogTransform(name = "创建时间")
+ private Date createTime;
+
+
+ /**
+ * 修改时间
+ */
+ @ElogTransform(name = "修改时间")
+ private Date updateTime;
+
+ /**
+ * 创建人id
+ */
+ @ElogTransform(name = "创建人id")
+ private Long creator;
+
+ /**
+ * 是否删除
+ */
+ @ElogTransform(name = "是否删除")
+ private Integer deleteType;
+
+ /**
+ * 租户KEY
+ */
+ @ElogTransform(name = "租户KEY")
+ private String tenantKey;
+
+ //主键id集合
+ private Collection ids;
+
+}
\ No newline at end of file
diff --git a/src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.java b/src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.java
new file mode 100644
index 000000000..352d00a2e
--- /dev/null
+++ b/src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.java
@@ -0,0 +1,74 @@
+package com.engine.salary.mapper.deductionamount;
+
+import com.engine.salary.entity.deductionamount.po.DeductionAmountPO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface DeductionAmountMapper {
+
+ /**
+ * 查询所有记录
+ *
+ * @return 返回集合,没有返回空List
+ */
+ List listAll();
+
+ /**
+ * 条件查询
+ *
+ * @return 返回集合,没有返回空List
+ */
+ List listSome(DeductionAmountPO deductionAmount);
+
+
+ /**
+ * 根据主键查询
+ *
+ * @param id 主键
+ * @return 返回记录,没有返回null
+ */
+ DeductionAmountPO getById(Long id);
+
+ /**
+ * 新增,忽略null字段
+ *
+ * @param deductionAmount 新增的记录
+ * @return 返回影响行数
+ */
+ int insertIgnoreNull(DeductionAmountPO deductionAmount);
+
+
+ /**
+ * 修改,修改所有字段
+ *
+ * @param deductionAmount 修改的记录
+ * @return 返回影响行数
+ */
+ int update(DeductionAmountPO deductionAmount);
+
+ /**
+ * 修改,忽略null字段
+ *
+ * @param deductionAmount 修改的记录
+ * @return 返回影响行数
+ */
+ int updateIgnoreNull(DeductionAmountPO deductionAmount);
+
+ /**
+ * 删除记录
+ *
+ * @param deductionAmount 待删除的记录
+ * @return 返回影响行数
+ */
+ int delete(DeductionAmountPO deductionAmount);
+
+ /**
+ * 批量删除记录
+ *
+ * @param ids 主键id集合
+ */
+ void deleteByIds(@Param("ids") Collection ids);
+
+}
\ No newline at end of file
diff --git a/src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.xml b/src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.xml
new file mode 100644
index 000000000..f41492135
--- /dev/null
+++ b/src/com/engine/salary/mapper/deductionamount/DeductionAmountMapper.xml
@@ -0,0 +1,345 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ t
+ .
+ card_num
+ , t.card_type
+ , t.create_time
+ , t.creator
+ , t.declare_status
+ , t.deduct_flag
+ , t.delete_type
+ , t.employee_id
+ , t.employee_name
+ , t.employee_type
+ , t.id
+ , t.job_num
+ , t.successfully_declared
+ , t.tax_agent_id
+ , t.tenant_key
+ , t.update_time
+ , t.year
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSERT INTO hrsa_deduction_amount
+
+
+
+ card_num,
+
+
+ card_type,
+
+
+ create_time,
+
+
+ creator,
+
+
+ declare_status,
+
+
+ deduct_flag,
+
+
+ delete_type,
+
+
+ employee_id,
+
+
+ employee_name,
+
+
+ employee_type,
+
+
+ id,
+
+
+ job_num,
+
+
+ successfully_declared,
+
+
+ tax_agent_id,
+
+
+ tenant_key,
+
+
+ update_time,
+
+
+ year,
+
+
+
+
+ #{cardNum},
+
+
+ #{cardType},
+
+
+ #{createTime},
+
+
+ #{creator},
+
+
+ #{declareStatus},
+
+
+ #{deductFlag},
+
+
+ #{deleteType},
+
+
+ #{employeeId},
+
+
+ #{employeeName},
+
+
+ #{employeeType},
+
+
+ #{id},
+
+
+ #{jobNum},
+
+
+ #{successfullyDeclared},
+
+
+ #{taxAgentId},
+
+
+ #{tenantKey},
+
+
+ #{updateTime},
+
+
+ #{year},
+
+
+
+
+
+
+
+ UPDATE hrsa_deduction_amount
+
+ card_num=#{cardNum},
+ card_type=#{cardType},
+ create_time=#{createTime},
+ creator=#{creator},
+ declare_status=#{declareStatus},
+ deduct_flag=#{deductFlag},
+ delete_type=#{deleteType},
+ employee_id=#{employeeId},
+ employee_name=#{employeeName},
+ employee_type=#{employeeType},
+ job_num=#{jobNum},
+ successfully_declared=#{successfullyDeclared},
+ tax_agent_id=#{taxAgentId},
+ tenant_key=#{tenantKey},
+ update_time=#{updateTime},
+ year=#{year},
+
+ WHERE id = #{id} AND delete_type = 0
+
+
+
+
+
+ UPDATE hrsa_deduction_amount
+
+
+ card_num=#{cardNum},
+
+
+ card_type=#{cardType},
+
+
+ create_time=#{createTime},
+
+
+ creator=#{creator},
+
+
+ declare_status=#{declareStatus},
+
+
+ deduct_flag=#{deductFlag},
+
+
+ delete_type=#{deleteType},
+
+
+ employee_id=#{employeeId},
+
+
+ employee_name=#{employeeName},
+
+
+ employee_type=#{employeeType},
+
+
+ job_num=#{jobNum},
+
+
+ successfully_declared=#{successfullyDeclared},
+
+
+ tax_agent_id=#{taxAgentId},
+
+
+ tenant_key=#{tenantKey},
+
+
+ update_time=#{updateTime},
+
+
+ year=#{year},
+
+
+ WHERE id = #{id} AND delete_type = 0
+
+
+
+
+
+ UPDATE hrsa_deduction_amount
+ SET delete_type=1
+ WHERE id = #{id}
+ AND delete_type = 0
+
+
+
+ UPDATE hrsa_deduction_amount
+ SET delete_type = 1
+ WHERE delete_type = 0
+ AND id IN
+
+ #{id}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/com/engine/salary/remote/tax/client/DeductionAmountClient.java b/src/com/engine/salary/remote/tax/client/DeductionAmountClient.java
new file mode 100644
index 000000000..bb9b92e9c
--- /dev/null
+++ b/src/com/engine/salary/remote/tax/client/DeductionAmountClient.java
@@ -0,0 +1,93 @@
+package com.engine.salary.remote.tax.client;
+
+import com.engine.salary.enums.taxagent.TaxAgentTaxReturnPasswordTypeEnum;
+import com.engine.salary.remote.tax.request.deductionAmount.ConfirmPreDeductRequest;
+import com.engine.salary.remote.tax.request.deductionAmount.QueryDeductionAmountRequest;
+import com.engine.salary.util.HttpUtil;
+import com.engine.salary.util.JsonUtil;
+import com.engine.salary.util.SingnatureData;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 申报扣减客户端
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Slf4j
+public class DeductionAmountClient extends TaxBaseClient {
+
+ public DeductionAmountClient(Long taxAgentId) {
+ super(taxAgentId);
+ }
+
+ public String query(String taxYear) {
+
+ String url = super.apiConfig.getHost() + "gateway/iit/deductionAmount/queryPreDeduct";
+ QueryDeductionAmountRequest queryDeductionAmountRequest = new QueryDeductionAmountRequest();
+ queryDeductionAmountRequest.setNsrsbh(returnPO.getTaxCode());
+ queryDeductionAmountRequest.setBizNo(UUID.randomUUID().toString().replace("-", ""));
+ queryDeductionAmountRequest.setQymc(returnPO.getTaxAgentName());
+ queryDeductionAmountRequest.setDjxhid(StringUtils.isNotEmpty(returnPO.getTaxRegistrationNumber()) ? returnPO.getTaxRegistrationNumber() : null);
+ queryDeductionAmountRequest.setAreaid(returnPO.getAreaCode());
+ queryDeductionAmountRequest.setBmbh(StringUtils.isNotEmpty(returnPO.getDepartmentCode()) ? returnPO.getDepartmentCode() : null);
+ boolean realNamePwd = TaxAgentTaxReturnPasswordTypeEnum.REAL_NAME_PASSWORD.getValue().equals(returnPO.getPasswordType());
+ queryDeductionAmountRequest.setSbmm(realNamePwd ? null : returnPO.getPwd());
+ queryDeductionAmountRequest.setJmsbmm("1");
+ queryDeductionAmountRequest.setSmzh(realNamePwd ? returnPO.getRealAccount() : null);
+ queryDeductionAmountRequest.setSmmm(realNamePwd ? returnPO.getPwd() : null);
+ queryDeductionAmountRequest.setJmsmmm("1");
+ queryDeductionAmountRequest.setMmlx("" + returnPO.getPasswordType());
+ queryDeductionAmountRequest.setSkssnd(taxYear);
+
+ String reqJson = JsonUtil.toJsonString(queryDeductionAmountRequest);
+ log.info("queryDeductionAmountRequest params --- \n{}\n", reqJson);
+ Map params = new HashMap<>(1);
+ Map header = SingnatureData.initHeader(params, apiConfig.getAppKey(), apiConfig.getAppSecret());
+
+ // 开始请求
+ String res = HttpUtil.doPost(url, header, reqJson, HttpUtil.JSON_TYPE);
+ log.info("queryDeductionAmountRequest res --- {}", res);
+ return res;
+ }
+
+
+
+ public String confirmPreDeduct(String year) {
+
+ String url = super.apiConfig.getHost() + "gateway/iit/deductionAmount/queryPreDeduct";
+ ConfirmPreDeductRequest request = new ConfirmPreDeductRequest();
+ request.setNsrsbh(returnPO.getTaxCode());
+ request.setBizNo(UUID.randomUUID().toString().replace("-", ""));
+ request.setQymc(returnPO.getTaxAgentName());
+ request.setDjxhid(StringUtils.isNotEmpty(returnPO.getTaxRegistrationNumber()) ? returnPO.getTaxRegistrationNumber() : null);
+ request.setAreaid(returnPO.getAreaCode());
+ request.setBmbh(StringUtils.isNotEmpty(returnPO.getDepartmentCode()) ? returnPO.getDepartmentCode() : null);
+ boolean realNamePwd = TaxAgentTaxReturnPasswordTypeEnum.REAL_NAME_PASSWORD.getValue().equals(returnPO.getPasswordType());
+ request.setSbmm(realNamePwd ? null : returnPO.getPwd());
+ request.setJmsbmm("1");
+ request.setSmzh(realNamePwd ? returnPO.getRealAccount() : null);
+ request.setSmmm(realNamePwd ? returnPO.getPwd() : null);
+ request.setJmsmmm("1");
+ request.setMmlx("" + returnPO.getPasswordType());
+ request.setSkssnd(year);
+ request.setKczglb(null);
+
+ String reqJson = JsonUtil.toJsonString(request);
+ log.info("queryDeductionAmountRequest params --- \n{}\n", reqJson);
+ Map params = new HashMap<>(1);
+ Map header = SingnatureData.initHeader(params, apiConfig.getAppKey(), apiConfig.getAppSecret());
+
+ // 开始请求
+ String res = HttpUtil.doPost(url, header, reqJson, HttpUtil.JSON_TYPE);
+ log.info("queryDeductionAmountRequest res --- {}", res);
+ return res;
+ }
+}
diff --git a/src/com/engine/salary/remote/tax/client/EmployeeClient.java b/src/com/engine/salary/remote/tax/client/EmployeeClient.java
index 480d00e53..5a246b398 100644
--- a/src/com/engine/salary/remote/tax/client/EmployeeClient.java
+++ b/src/com/engine/salary/remote/tax/client/EmployeeClient.java
@@ -39,10 +39,10 @@ public class EmployeeClient extends TaxBaseClient {
mergedEmployeeArchivesRequest.setBmbh(StringUtils.isNotEmpty(returnPO.getDepartmentCode()) ? returnPO.getDepartmentCode() : null);
boolean realNamePwd = TaxAgentTaxReturnPasswordTypeEnum.REAL_NAME_PASSWORD.getValue().equals(returnPO.getPasswordType());
mergedEmployeeArchivesRequest.setSbmm(realNamePwd ? null : returnPO.getPwd());
- mergedEmployeeArchivesRequest.setJmsbmm("0");
+ mergedEmployeeArchivesRequest.setJmsbmm("1");
mergedEmployeeArchivesRequest.setSmzh(realNamePwd ? returnPO.getRealAccount() : null);
mergedEmployeeArchivesRequest.setSmmm(realNamePwd ? returnPO.getPwd() : null);
- mergedEmployeeArchivesRequest.setJmsmmm("0");
+ mergedEmployeeArchivesRequest.setJmsmmm("1");
mergedEmployeeArchivesRequest.setMmlx("" + returnPO.getPasswordType());
diff --git a/src/com/engine/salary/remote/tax/request/deductionAmount/ConfirmPreDeductRequest.java b/src/com/engine/salary/remote/tax/request/deductionAmount/ConfirmPreDeductRequest.java
new file mode 100644
index 000000000..035c90543
--- /dev/null
+++ b/src/com/engine/salary/remote/tax/request/deductionAmount/ConfirmPreDeductRequest.java
@@ -0,0 +1,95 @@
+package com.engine.salary.remote.tax.request.deductionAmount;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ConfirmPreDeductRequest {
+ /**
+ * 外部业务编号 必填:是 外部业务编号,唯一,幂等需要,最长64位,建议使用UUID
+ */
+ private String bizNo;
+ /**
+ * 企业名称 必填:是 代报企业全称
+ */
+ private String qymc;
+ /**
+ * 密码类型 必填:否 默认不传则设置为0, 0表示申报密码;2表示实名账号实名密码
+ */
+ private String mmlx;
+ /**
+ * 实名账号 必填:选择必填 当mmlx=2时,必填
+ */
+ private String smzh;
+ /**
+ * 实名密码 必填:选择必填 当mmlx=2时,必填
+ */
+ private String smmm;
+ /**
+ * 加密实名密码 必填:否 默认不传则设置为0,0表示不加密;1表示加密 参考3.4代报、实名密码加密说明
+ */
+ private String jmsmmm;
+ /**
+ * 登记序号 必填:否 存在多个登记序号时,需要指定传入一个.例:10117440105249764755
+ */
+ private String djxhid;
+ /**
+ * 税号 必填:是 扣缴单位纳税人识别号
+ */
+ private String nsrsbh;
+ /**
+ * 地区编号 必填:是 6位行政区划代码,精确到市级,例如:440100,参考省市区编码
+ */
+ private String areaid;
+ /**
+ * 部门编号 必填:否 分部门代报时必传
+ */
+ private String bmbh;
+ /**
+ * 部门名称 必填:否
+ */
+ private String bmmc;
+ /**
+ * 申报密码 必填:条件必填 当mmlx=0时,必填
+ */
+ private String sbmm;
+ /**
+ * 加密申报密码 必填:否 默认不传则设置为0,0表示不加密;1表示加密
+ */
+ private String jmsbmm;
+ /**
+ * 税款所属年度 必填:必填 yyyy
+ */
+ private String skssnd;
+
+ /**
+ * 扣除资格列表
+ */
+ private List kczglb;
+
+
+ public static class kczg {
+ /**
+ * 姓名
+ */
+ private String xm;
+ /**
+ * 证件类型 见证件类型字典
+ */
+ private String zzlx;
+ /**
+ * 证件号码 证件号码
+ */
+ private String zzhm;
+ /**
+ * 国籍
+ */
+ private String gj;
+ /**
+ * 扣除标识 是/否
+ */
+ private String kcbs;
+ }
+
+}
diff --git a/src/com/engine/salary/remote/tax/request/deductionAmount/QueryDeductionAmountRequest.java b/src/com/engine/salary/remote/tax/request/deductionAmount/QueryDeductionAmountRequest.java
new file mode 100644
index 000000000..1aaa0a3a1
--- /dev/null
+++ b/src/com/engine/salary/remote/tax/request/deductionAmount/QueryDeductionAmountRequest.java
@@ -0,0 +1,64 @@
+package com.engine.salary.remote.tax.request.deductionAmount;
+
+import lombok.Data;
+
+@Data
+public class QueryDeductionAmountRequest {
+ /**
+ * 外部业务编号 必填:是 外部业务编号,唯一,幂等需要,最长64位,建议使用UUID
+ */
+ private String bizNo;
+ /**
+ * 企业名称 必填:是 代报企业全称
+ */
+ private String qymc;
+ /**
+ * 密码类型 必填:否 默认不传则设置为0, 0表示申报密码;2表示实名账号实名密码
+ */
+ private String mmlx;
+ /**
+ * 实名账号 必填:选择必填 当mmlx=2时,必填
+ */
+ private String smzh;
+ /**
+ * 实名密码 必填:选择必填 当mmlx=2时,必填
+ */
+ private String smmm;
+ /**
+ * 加密实名密码 必填:否 默认不传则设置为0,0表示不加密;1表示加密 参考3.4代报、实名密码加密说明
+ */
+ private String jmsmmm;
+ /**
+ * 登记序号 必填:否 存在多个登记序号时,需要指定传入一个.例:10117440105249764755
+ */
+ private String djxhid;
+ /**
+ * 税号 必填:是 扣缴单位纳税人识别号
+ */
+ private String nsrsbh;
+ /**
+ * 地区编号 必填:是 6位行政区划代码,精确到市级,例如:440100,参考省市区编码
+ */
+ private String areaid;
+ /**
+ * 部门编号 必填:否 分部门代报时必传
+ */
+ private String bmbh;
+ /**
+ * 部门名称 必填:否
+ */
+ private String bmmc;
+ /**
+ * 申报密码 必填:条件必填 当mmlx=0时,必填
+ */
+ private String sbmm;
+ /**
+ * 加密申报密码 必填:否 默认不传则设置为0,0表示不加密;1表示加密
+ */
+ private String jmsbmm;
+ /**
+ * 税款所属年度 必填:必填 yyyy
+ */
+ private String skssnd;
+
+}
diff --git a/src/com/engine/salary/service/DeductionAmountService.java b/src/com/engine/salary/service/DeductionAmountService.java
new file mode 100644
index 000000000..a72534724
--- /dev/null
+++ b/src/com/engine/salary/service/DeductionAmountService.java
@@ -0,0 +1,19 @@
+package com.engine.salary.service;
+
+import com.engine.salary.entity.deductionamount.param.DeductionAmountAddParam;
+import com.engine.salary.entity.deductionamount.param.DeductionAmountOnlineQueryParam;
+
+/**
+ * 年收入不足6万元的纳税人暂不预扣预缴税款扣除名单
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+public interface DeductionAmountService {
+
+ Object query(DeductionAmountOnlineQueryParam queryParam);
+
+ void add(DeductionAmountAddParam param);
+}
diff --git a/src/com/engine/salary/service/impl/DeductionAmountServiceImpl.java b/src/com/engine/salary/service/impl/DeductionAmountServiceImpl.java
new file mode 100644
index 000000000..e501287a7
--- /dev/null
+++ b/src/com/engine/salary/service/impl/DeductionAmountServiceImpl.java
@@ -0,0 +1,112 @@
+package com.engine.salary.service.impl;
+
+
+import com.engine.common.util.ServiceUtil;
+import com.engine.core.impl.Service;
+import com.engine.salary.entity.deductionamount.param.DeductionAmountAddParam;
+import com.engine.salary.entity.deductionamount.param.DeductionAmountOnlineQueryParam;
+import com.engine.salary.entity.deductionamount.po.DeductionAmountPO;
+import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO;
+import com.engine.salary.mapper.deductionamount.DeductionAmountMapper;
+import com.engine.salary.mapper.employeedeclare.EmployeeDeclareMapper;
+import com.engine.salary.remote.tax.client.DeductionAmountClient;
+import com.engine.salary.service.*;
+import com.engine.salary.util.SalaryEntityUtil;
+import com.engine.salary.util.db.MapperProxyFactory;
+import com.engine.salary.util.valid.ValidUtil;
+import lombok.extern.slf4j.Slf4j;
+import weaver.hrm.User;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 年收入不足6万元的纳税人暂不预扣预缴税款扣除名单
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Slf4j
+public class DeductionAmountServiceImpl extends Service implements DeductionAmountService {
+
+ private DeductionAmountMapper getDeductionAmountMapper() {
+ return MapperProxyFactory.getProxy(DeductionAmountMapper.class);
+ }
+
+ private EmployeeDeclareMapper getEmployeeDeclareMapper() {
+ return MapperProxyFactory.getProxy(EmployeeDeclareMapper.class);
+ }
+
+ private TaxAgentService getTaxAgentService(User user) {
+ return ServiceUtil.getService(TaxAgentServiceImpl.class, user);
+ }
+
+ private SalaryEmployeeService getSalaryEmployeeService(User user) {
+ return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user);
+ }
+
+ private SalaryArchiveService getSalaryArchiveService(User user) {
+ return ServiceUtil.getService(SalaryArchiveServiceImpl.class, user);
+ }
+
+ private TaxDeclarationApiConfigService getTaxDeclarationApiConfigService(User user) {
+ return ServiceUtil.getService(TaxDeclarationApiConfigServiceImpl.class, user);
+ }
+
+ private TaxAgentTaxReturnService getTaxAgentTaxReturnService(User user) {
+ return ServiceUtil.getService(TaxAgentTaxReturnServiceImpl.class, user);
+ }
+
+ private EmployeeDeclareRecordService getEmployeeDeclareRecordService(User user) {
+ return ServiceUtil.getService(EmployeeDeclareRecordServiceImpl.class, user);
+ }
+
+ private TaxDeclarationApiBillingService getTaxDeclarationApiBillingService(User user) {
+ return ServiceUtil.getService(TaxDeclarationApiBillingServiceImpl.class, user);
+ }
+
+ @Override
+ public Object query(DeductionAmountOnlineQueryParam queryParam) {
+ Long taxAgentId = queryParam.getTaxAgentId();
+ DeductionAmountClient deductionAmountClient = new DeductionAmountClient(taxAgentId);
+ return deductionAmountClient.query(queryParam.getYear());
+ }
+
+ @Override
+ public void add(DeductionAmountAddParam param) {
+ ValidUtil.doValidator(param);
+
+ //已存在
+ List deductionAmountPOS = getDeductionAmountMapper().listSome(DeductionAmountPO.builder().taxAgentId(param.getTaxAgentId()).year(param.getYear()).build());
+ List oldIds = SalaryEntityUtil.properties(deductionAmountPOS, DeductionAmountPO::getEmployeeId, Collectors.toList());
+
+ //本次新增
+ List employeeDeclareIds = param.getEmployeeDeclareIds();
+ List employeeDeclarePOS = getEmployeeDeclareMapper().listSome(EmployeeDeclarePO.builder().ids(employeeDeclareIds).build());
+
+// employeeDeclarePOS.stream()
+// .filter(employeeDeclarePO -> !oldIds.contains(employeeDeclarePO.getEmployeeId()))
+// .map(employeeDeclarePO -> {
+// DeductionAmountPO.builder()
+// .id(employeeDeclarePO.getEmployeeId())
+// .taxAgentId(employeeDeclarePO.getEmployeeId())
+// .year(param.getYear())
+// .employeeId(employeeDeclarePO.getEmployeeId())
+// .employeeName(employeeDeclarePO.getEmployeeName())
+// .employeeType(employeeDeclarePO.getEmployeeId())
+// .jobNum(employeeDeclarePO.getEmployeeId())
+// .cardNum(employeeDeclarePO.getEmployeeId())
+// .cardType(employeeDeclarePO.getEmployeeId())
+// .declareStatus(employeeDeclarePO.getEmployeeId())
+// .deductFlag(employeeDeclarePO.getEmployeeId())
+// .successfullyDeclared(employeeDeclarePO.getEmployeeId())
+// .creator(employeeId)
+// .createTime(now)
+// .updateTime(now)
+// .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
+// .deleteType(NumberUtils.INTEGER_ZERO)
+// });
+ }
+}
diff --git a/src/com/engine/salary/web/DeductionAmountController.java b/src/com/engine/salary/web/DeductionAmountController.java
new file mode 100644
index 000000000..e9ad983fc
--- /dev/null
+++ b/src/com/engine/salary/web/DeductionAmountController.java
@@ -0,0 +1,442 @@
+package com.engine.salary.web;
+
+
+import com.engine.common.util.ServiceUtil;
+import com.engine.salary.entity.deductionamount.param.DeductionAmountAddParam;
+import com.engine.salary.entity.deductionamount.param.DeductionAmountOnlineQueryParam;
+import com.engine.salary.util.ResponseResult;
+import com.engine.salary.wrapper.DeductionAmountWrapper;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+/**
+ * 年收入不足6万元的纳税人暂不预扣预缴税款扣除名单
+ * Copyright: Copyright (c) 2023
+ * Company: 泛微软件
+ *
+ * @author qiantao
+ * @version 1.0
+ **/
+@Slf4j
+public class DeductionAmountController {
+
+ private DeductionAmountWrapper getDeductionAmountWrapper(User user) {
+ return ServiceUtil.getService(DeductionAmountWrapper.class, user);
+ }
+
+ @POST
+ @Path("/add")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String add(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody DeductionAmountAddParam param) {
+ User user = HrmUserVarify.getUser(request, response);
+ return new ResponseResult(user).run(getDeductionAmountWrapper(user)::add, param);
+ }
+
+ @POST
+ @Path("/query")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String queryPreDeduct(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody DeductionAmountOnlineQueryParam queryParam) {
+ User user = HrmUserVarify.getUser(request, response);
+ return new ResponseResult(user).run(getDeductionAmountWrapper(user)::query, queryParam);
+ }
+
+// @POST
+// @Path("/confirmPreDeduct")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String queryPreDeduct(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody DeductionAmountConfirmParam param) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult(user).run(getDeductionAmountWrapper(user)::confirm, param);
+// }
+
+// /**
+// * 人员报送-个税扣缴义务人列表
+// *
+// * @param param 查询条件
+// * @return
+// */
+// @POST
+// @Path("/taxAgentDeclareList")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String taxAgentDeclareList(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxAgentDeclareListQueryParam param) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::taxAgentDeclareList, param);
+// }
+//
+// /**
+// * 人员报送-全部人员列表
+// *
+// * @param queryParam 查询条件
+// * @return
+// */
+// @POST
+// @Path("/list")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String list(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareListQueryParam queryParam) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::list, queryParam);
+// }
+//
+// /**
+// * 人员报送-本月新增人员列表
+// *
+// * @param queryParam 查询条件
+// * @return
+// */
+// @POST
+// @Path("/list4Add")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String list4Add(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareAddListQueryParam queryParam) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::list4Add, queryParam);
+// }
+//
+// /**
+// * 人员报送-本月信息变动列表
+// *
+// * @param queryParam 查询条件
+// * @return
+// */
+// @POST
+// @Path("/list4Update")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String list4Update(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareListQueryParam queryParam) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::list4Update, queryParam);
+// }
+//
+// /**
+// * 人员报送-本月报送失败人员列表
+// *
+// * @param queryParam 查询条件
+// * @return
+// */
+// @POST
+// @Path("/list4Fail")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String list4Fail(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareFailListQueryParam queryParam) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::list4Fail, queryParam);
+// }
+//
+// /**
+// * 人员报送-获取新建或编辑的表单
+// *
+// * @param id 报送人员列表的主键id
+// * @return
+// */
+// @GET
+// @Path("/getForm")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String getForm(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "id") Long id) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::getForm, id);
+// }
+//
+//// @GetMapping("/getBatchUpdateForm")
+//// @ApiOperation("人员报送-获取批量编辑的表单")
+//// @Produces(MediaType.APPLICATION_JSON)
+//// public WeaResult getBatchUpdateForm() {
+//// WeaForm weaForm = employeeDeclareWrapper.getBatchUpdateForm();
+//// return WeaResult.success(weaForm);
+//// }
+////
+//// @GetMapping("/getSearchCondition")
+//// @ApiOperation("人员报送-获取高级搜索条件")
+//// @Produces(MediaType.APPLICATION_JSON)
+//// public WeaResult getSearchCondition() {
+//// WeaSearchCondition searchCondition = employeeDeclareWrapper.getSearchCondition();
+//// return WeaResult.success(searchCondition);
+//// }
+//
+// /**
+// * 人员报送-新增人员/编辑人员保存
+// *
+// * @param saveParam 保存参数
+// * @return
+// */
+// @POST
+// @Path("/save")
+// @Produces(MediaType.APPLICATION_JSON)
+// public String save(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody EmployeeDeclareSaveParam saveParam) {
+// User user = HrmUserVarify.getUser(request, response);
+// return new ResponseResult>(user).run(getEmployeeDeclareWrapper(user)::save, saveParam);
+// }
+//
+//// /**
+//// * 人员报送-批量编辑
+//// *
+//// * @param batchUpdateParam 批量编辑参数
+//// * @return
+//// */
+//// @Path("/batchUpdate")
+//// @ApiOperation("人员报送-批量编辑")
+//// @Produces(MediaType.APPLICATION_JSON)
+//// public WeaResult