diff --git a/resource/sqlupgrade/Mysql/sql202509180103SHQZJRXXFW.sql b/resource/sqlupgrade/Mysql/sql202509180103SHQZJRXXFW.sql new file mode 100644 index 000000000..6d4a29add --- /dev/null +++ b/resource/sqlupgrade/Mysql/sql202509180103SHQZJRXXFW.sql @@ -0,0 +1,15 @@ +CREATE TABLE hrsa_employee_declare_opt +( + id bigint(0) NOT NULL, + create_time datetime(0), + update_time datetime(0), + creator bigint(0), + delete_type int(0), + tenant_key varchar(10), + tax_agent_id bigint(0), + status varchar(255), + last_operate_time datetime(0), + last_operate varchar(255), + tax_cycle datetime(0), + PRIMARY KEY (id) USING BTREE +); \ No newline at end of file diff --git a/src/com/engine/salary/entity/employeedeclare/dto/TaxAgentDeclareListDTO.java b/src/com/engine/salary/entity/employeedeclare/dto/TaxAgentDeclareListDTO.java index a241b008e..56e12666e 100644 --- a/src/com/engine/salary/entity/employeedeclare/dto/TaxAgentDeclareListDTO.java +++ b/src/com/engine/salary/entity/employeedeclare/dto/TaxAgentDeclareListDTO.java @@ -1,11 +1,14 @@ package com.engine.salary.entity.employeedeclare.dto; +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 lombok.experimental.Accessors; +import java.util.Date; import java.util.Set; /** @@ -27,7 +30,28 @@ public class TaxAgentDeclareListDTO { private Long id; // 个税扣缴义务人 + @TableTitle(title = "个税扣缴义务人", dataIndex = "taxAgentName", key = "taxAgentName") private String taxAgentName; + /** + * 最后操作功能 + */ + @TableTitle(title = "最后操作功能", dataIndex = "lastOperate", key = "lastOperate") + private String lastOperate; + + /** + * 最后操作时间 + */ + @TableTitle(title = "最后操作时间", dataIndex = "lastOperateTime", key = "lastOperateTime") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date lastOperateTime; + + /** + * 报送状态 + */ + @TableTitle(title = "报送状态", dataIndex = "status", key = "status") + public String status; + + Set opts; } diff --git a/src/com/engine/salary/entity/employeedeclare/param/TaxAgentDeclareListQueryParam.java b/src/com/engine/salary/entity/employeedeclare/param/TaxAgentDeclareListQueryParam.java index 6daffceb3..e05cbf7f8 100644 --- a/src/com/engine/salary/entity/employeedeclare/param/TaxAgentDeclareListQueryParam.java +++ b/src/com/engine/salary/entity/employeedeclare/param/TaxAgentDeclareListQueryParam.java @@ -6,6 +6,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + /** * 人员报送(个税扣缴义务人)查询条件 *

Copyright: Copyright (c) 2023

@@ -22,4 +24,13 @@ public class TaxAgentDeclareListQueryParam extends BaseQueryParam { // "个税扣缴义务人名称" private String taxAgentName; + + + // 最后操作 + private List lastOperates; + + /** + * 操作状态 + */ + private List statuses; } diff --git a/src/com/engine/salary/entity/employeedeclare/po/EmployeeDeclareOptPO.java b/src/com/engine/salary/entity/employeedeclare/po/EmployeeDeclareOptPO.java new file mode 100644 index 000000000..9f833b95a --- /dev/null +++ b/src/com/engine/salary/entity/employeedeclare/po/EmployeeDeclareOptPO.java @@ -0,0 +1,101 @@ +package com.engine.salary.entity.employeedeclare.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_employee_declare_opt +public class EmployeeDeclareOptPO { + /** + * ID + */ + @ElogTransform(name = "ID") + private Long id; + + /** + * 个税扣缴义务人 + */ + @ElogTransform(name = "个税扣缴义务人") + private Long taxAgentId; + + /** + * 税款所属期 + */ + @ElogTransform(name = "税款所属期") + private Date taxCycle; + + /** + * 报送状态 + */ + @ElogTransform(name = "操作状态") + private String status; + + /** + * 最后操作 + */ + @ElogTransform(name = "最后操作") + private String lastOperate; + + /** + * 最后操作时间 + */ + @ElogTransform(name = "最后操作时间") + private Date lastOperateTime; + + + /** + * 创建时间 + */ + @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; + + private Collection taxAgentIds; + + private Collection lastOperates; + + private Collection statuses; + + +} \ No newline at end of file diff --git a/src/com/engine/salary/enums/employeedeclare/DeclareOptEnum.java b/src/com/engine/salary/enums/employeedeclare/DeclareOptEnum.java new file mode 100644 index 000000000..596b5b2a8 --- /dev/null +++ b/src/com/engine/salary/enums/employeedeclare/DeclareOptEnum.java @@ -0,0 +1,56 @@ +package com.engine.salary.enums.employeedeclare; + +import com.engine.salary.enums.BaseEnum; + +import java.util.Objects; + +/** + * 操作枚举 + *

Copyright: Copyright (c) 2025

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public enum DeclareOptEnum implements BaseEnum { + + BAT_REFRESH("1", "批量刷新", 158772), + BAT_DECLARE("2", "批量报送", 158770), + BAT_DECLARE_FEEDBACK("3", "批量获取反馈", 158774); + + DeclareOptEnum(String value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + private String value; + + private String defaultLabel; + + private int labelId; + + @Override + public String getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + public static DeclareOptEnum getByValue(String value) { + for (DeclareOptEnum e : DeclareOptEnum.values()) { + if (Objects.equals(e.getValue(), value)) { + return e; + } + } + return BAT_REFRESH; + } +} diff --git a/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareOptMapper.java b/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareOptMapper.java new file mode 100644 index 000000000..9a4f255ba --- /dev/null +++ b/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareOptMapper.java @@ -0,0 +1,73 @@ +package com.engine.salary.mapper.employeedeclare; + +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclareOptPO; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +public interface EmployeeDeclareOptMapper { + + /** + * 查询所有记录 + * + * @return 返回集合,没有返回空List + */ + List listAll(); + + /** + * 条件查询 + * + * @return 返回集合,没有返回空List + */ + List listSome(EmployeeDeclareOptPO employeeDeclareOpt); + + + /** + * 根据主键查询 + * + * @param id 主键 + * @return 返回记录,没有返回null + */ + EmployeeDeclareOptPO getById(Long id); + + /** + * 新增,忽略null字段 + * + * @param employeeDeclareOpt 新增的记录 + * @return 返回影响行数 + */ + int insertIgnoreNull(EmployeeDeclareOptPO employeeDeclareOpt); + + /** + * 修改,修改所有字段 + * + * @param employeeDeclareOpt 修改的记录 + * @return 返回影响行数 + */ + int update(EmployeeDeclareOptPO employeeDeclareOpt); + + /** + * 修改,忽略null字段 + * + * @param employeeDeclareOpt 修改的记录 + * @return 返回影响行数 + */ + int updateIgnoreNull(EmployeeDeclareOptPO employeeDeclareOpt); + + /** + * 删除记录 + * + * @param employeeDeclareOpt 待删除的记录 + * @return 返回影响行数 + */ + int delete(EmployeeDeclareOptPO employeeDeclareOpt); + + /** + * 批量删除记录 + * @param ids 主键id集合 + */ + void deleteByIds(@Param("ids") Collection ids); + + EmployeeDeclareOptPO getByTaxAgentId(Long taxAgentId); +} \ No newline at end of file diff --git a/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareOptMapper.xml b/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareOptMapper.xml new file mode 100644 index 000000000..78049ea4a --- /dev/null +++ b/src/com/engine/salary/mapper/employeedeclare/EmployeeDeclareOptMapper.xml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + t + . + create_time + , t.creator + , t.delete_type + , t.id + , t.last_operate + , t.last_operate_time + , t.status + , t.tax_agent_id + , t.tenant_key + , t.update_time + , t.tax_cycle + + + + + + + + + + + + + + + INSERT INTO hrsa_employee_declare_opt + + + + create_time, + + + creator, + + + delete_type, + + + id, + + + last_operate, + + + last_operate_time, + + + status, + + + tax_agent_id, + + + tenant_key, + + + update_time, + + + tax_cycle, + + + + + #{createTime}, + + + #{creator}, + + + #{deleteType}, + + + #{id}, + + + #{lastOperate}, + + + #{lastOperateTime}, + + + #{status}, + + + #{taxAgentId}, + + + #{tenantKey}, + + + #{updateTime}, + + + #{taxCycle}, + + + + + + + UPDATE hrsa_employee_declare_opt + + create_time=#{createTime}, + creator=#{creator}, + delete_type=#{deleteType}, + last_operate=#{lastOperate}, + last_operate_time=#{lastOperateTime}, + status=#{status}, + tax_agent_id=#{taxAgentId}, + tenant_key=#{tenantKey}, + update_time=#{updateTime}, + tax_cycle=#{taxCycle}, + + WHERE id = #{id} AND delete_type = 0 + + + + + + UPDATE hrsa_employee_declare_opt + + + create_time=#{createTime}, + + + creator=#{creator}, + + + delete_type=#{deleteType}, + + + last_operate=#{lastOperate}, + + + last_operate_time=#{lastOperateTime}, + + + status=#{status}, + + + tax_agent_id=#{taxAgentId}, + + + tenant_key=#{tenantKey}, + + + update_time=#{updateTime}, + + + tax_cycle=#{taxCycle}, + + + WHERE id = #{id} AND delete_type = 0 + + + + + + UPDATE hrsa_employee_declare_opt + SET delete_type=1 + WHERE id = #{id} + AND delete_type = 0 + + + + UPDATE hrsa_employee_declare_opt + 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/service/EmployeeDeclareOptService.java b/src/com/engine/salary/service/EmployeeDeclareOptService.java new file mode 100644 index 000000000..497122b42 --- /dev/null +++ b/src/com/engine/salary/service/EmployeeDeclareOptService.java @@ -0,0 +1,28 @@ +package com.engine.salary.service; + +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclareOptPO; + +import java.util.List; + +/** + * 人员报送(人员) + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public interface EmployeeDeclareOptService { + /** + * 查询操作记录 + * @param po + * @return + */ + List listSome(EmployeeDeclareOptPO po); + + /** + * 记录操作 + * @param po + */ + void record(EmployeeDeclareOptPO po); +} diff --git a/src/com/engine/salary/service/impl/EmployeeDeclareOptServiceImpl.java b/src/com/engine/salary/service/impl/EmployeeDeclareOptServiceImpl.java new file mode 100644 index 000000000..1f45587f5 --- /dev/null +++ b/src/com/engine/salary/service/impl/EmployeeDeclareOptServiceImpl.java @@ -0,0 +1,63 @@ +package com.engine.salary.service.impl; + +import com.engine.core.impl.Service; +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclareOptPO; +import com.engine.salary.mapper.employeedeclare.EmployeeDeclareOptMapper; +import com.engine.salary.service.EmployeeDeclareOptService; +import com.engine.salary.util.db.IdGenerator; +import com.engine.salary.util.db.MapperProxyFactory; + +import java.util.Date; +import java.util.List; + +import static com.engine.salary.constant.SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY; + +/** + * 员工报送记录 + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public class EmployeeDeclareOptServiceImpl extends Service implements EmployeeDeclareOptService { + + private EmployeeDeclareOptMapper getEmployeeDeclareOptMapper() { + return MapperProxyFactory.getProxy(EmployeeDeclareOptMapper.class); + } + + + @Override + public List listSome(EmployeeDeclareOptPO po) { + return getEmployeeDeclareOptMapper().listSome(po); + } + + @Override + public void record(EmployeeDeclareOptPO po) { + Date now = new Date(); + Long taxAgentId = po.getTaxAgentId(); + EmployeeDeclareOptPO optPO = getEmployeeDeclareOptMapper().getByTaxAgentId(taxAgentId); + + if (optPO == null) { + po = EmployeeDeclareOptPO.builder() + .id(IdGenerator.generate()) + .taxAgentId(taxAgentId) + .status(po.getStatus()) + .lastOperate(po.getLastOperate()) + .lastOperateTime(now) + .creator((long)user.getUID()) + .createTime(now) + .updateTime(now) + .deleteType(0) + .tenantKey(DEFAULT_TENANT_KEY) + .build(); + getEmployeeDeclareOptMapper().insertIgnoreNull(po); + }else { + optPO.setStatus(po.getStatus()); + optPO.setLastOperate(po.getLastOperate()); + optPO.setLastOperateTime(now); + getEmployeeDeclareOptMapper().updateIgnoreNull(optPO); + } + + } +} diff --git a/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java b/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java index 23fad260f..9782a0c00 100644 --- a/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java +++ b/src/com/engine/salary/wrapper/EmployeeDeclareWrapper.java @@ -1,5 +1,6 @@ package com.engine.salary.wrapper; +import cn.hutool.core.collection.CollUtil; import com.cloudstore.dev.api.util.Util_DataCache; import com.cloudstore.eccom.result.WeaResultMsg; import com.engine.common.util.ServiceUtil; @@ -10,6 +11,7 @@ import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.employeedeclare.bo.EmployeeDeclareList; import com.engine.salary.entity.employeedeclare.dto.*; import com.engine.salary.entity.employeedeclare.param.*; +import com.engine.salary.entity.employeedeclare.po.EmployeeDeclareOptPO; import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO; import com.engine.salary.entity.taxagent.param.TaxAgentQueryParam; import com.engine.salary.entity.taxagent.po.TaxAgentPO; @@ -79,6 +81,11 @@ public class EmployeeDeclareWrapper extends Service { return ServiceUtil.getService(EmployeeDeclareExcelServiceImpl.class, user); } + private EmployeeDeclareOptService getEmployeeDeclareOptService(User user) { + return ServiceUtil.getService(EmployeeDeclareOptServiceImpl.class, user); + } + + /** * 人员报送的个税扣缴义务人列表 * @@ -93,14 +100,53 @@ public class EmployeeDeclareWrapper extends Service { if (StringUtils.isNotEmpty(queryParam.getTaxAgentName())) { taxAgents = taxAgents.stream().filter(e -> StringUtils.contains(e.getName(), queryParam.getTaxAgentName())).collect(Collectors.toList()); } + + //查询操作状态 + List lastOperates = queryParam.getLastOperates(); + List statuses = queryParam.getStatuses(); + EmployeeDeclareOptPO declareOptPO = EmployeeDeclareOptPO.builder() + .taxAgentIds(SalaryEntityUtil.properties(taxAgents, TaxAgentPO::getId)) + .lastOperates(lastOperates) + .statuses(statuses) + .build(); + List employeeDeclareOptPOS = getEmployeeDeclareOptService(user).listSome(declareOptPO); + Map longEmployeeDeclareOptPOMap = SalaryEntityUtil.convert2Map(employeeDeclareOptPOS, EmployeeDeclareOptPO::getTaxAgentId); + + // 分页 List dtoList = Lists.newArrayList(); for (TaxAgentPO taxAgent : taxAgents) { + EmployeeDeclareOptPO optPO = longEmployeeDeclareOptPOMap.get(taxAgent.getId()); + + optPO = optPO == null ? new EmployeeDeclareOptPO() : optPO; + Date taxCycle = optPO.getTaxCycle(); + EmployeeDeclareInfoDTO declareInfo = getDeclareInfo(EmployeeDeclareParam.builder().taxAgentId(taxAgent.getId()).taxCycle(taxCycle).build()); + String status; + if (declareInfo.getNotDeclareSize() > 0) { + status = DeclareStatusEnum.NOT_DECLARE.getDefaultLabel(); + } else if (declareInfo.getDeclareFailSize() > 0) { + status = DeclareStatusEnum.DECLARE_FAIL.getDefaultLabel(); + } else { + status = DeclareStatusEnum.DECLARE_SUCCESS.getDefaultLabel(); + } + TaxAgentDeclareListDTO dto = TaxAgentDeclareListDTO.builder() .id(taxAgent.getId()) .taxAgentName(taxAgent.getName()) + .status(status) + .lastOperate(DeclareOptEnum.getByValue(optPO.getLastOperate()).getDefaultLabel()) + .lastOperateTime(optPO.getLastOperateTime()) .opts(Sets.newHashSet("admin")) .build(); + + //如果根据报送状态和最后操作功能筛选,则过滤掉没有查询到操作记录的数据 + if (CollUtil.isNotEmpty(lastOperates) && !lastOperates.contains(optPO.getLastOperate())) { + continue; + } + if (CollUtil.isNotEmpty(statuses) && !statuses.contains(status)) { + continue; + } + dtoList.add(dto); } return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), dtoList, TaxAgentDeclareListDTO.class); @@ -468,6 +514,12 @@ public class EmployeeDeclareWrapper extends Service { fail++; } finally { } + EmployeeDeclareOptPO po = EmployeeDeclareOptPO.builder() + .taxAgentId(taxAgentId) + .taxCycle(param.getTaxCycle()) + .lastOperate(DeclareOptEnum.BAT_REFRESH.getValue()) + .build(); + getEmployeeDeclareOptService(user).record(po); } return "成功:" + success + "个,失败:" + fail + "个,失败原因:" + msg; } @@ -533,6 +585,12 @@ public class EmployeeDeclareWrapper extends Service { fail++; } finally { } + EmployeeDeclareOptPO po = EmployeeDeclareOptPO.builder() + .taxAgentId(taxAgentId) + .taxCycle(param.getTaxCycle()) + .lastOperate(DeclareOptEnum.BAT_DECLARE.getValue()) + .build(); + getEmployeeDeclareOptService(user).record(po); } return "成功:" + success + "个,失败:" + fail + "个,失败原因:" + msg; } @@ -585,7 +643,7 @@ public class EmployeeDeclareWrapper extends Service { .setStatus(true) .setFinish(false) .setMsg(""); - getEmployeeDeclareService(user).getDeclareFeedback(param,employeeDeclareRate); + getEmployeeDeclareService(user).getDeclareFeedback(param, employeeDeclareRate); success++; } catch (Exception e) { log.error("获取报送结果反馈失败:{}", e.getMessage(), e); @@ -593,6 +651,13 @@ public class EmployeeDeclareWrapper extends Service { fail++; } finally { } + + EmployeeDeclareOptPO po = EmployeeDeclareOptPO.builder() + .taxAgentId(taxAgentId) + .taxCycle(param.getTaxCycle()) + .lastOperate(DeclareOptEnum.BAT_DECLARE_FEEDBACK.getValue()) + .build(); + getEmployeeDeclareOptService(user).record(po); } return "成功:" + success + "个,失败:" + fail + "个,失败原因:" + msg; }