diff --git a/resource/sql/薪酬还原脚本.sql b/resource/sql/薪酬还原脚本.sql index caafbb73e..4ad486304 100644 --- a/resource/sql/薪酬还原脚本.sql +++ b/resource/sql/薪酬还原脚本.sql @@ -173,6 +173,9 @@ delete from hrsa_statreportlogs_detail where 1=1 delete from hrsa_statreportlogs where 1=1 ; +delete from hrsa_salary_bill_watermark where 1=1 +; + -- INSERT INTO hrsa_tax_agent_base(id, devolution_status, create_time, update_time, creator, delete_type, tenant_key) VALUES (1653303537239, 0, '2022-05-23 18:58:53', '2022-05-23 19:12:12', 1, 0, 'all_teams'); diff --git a/resource/sqlupgrade/DM/sql202307100103.sql b/resource/sqlupgrade/DM/sql202307100103.sql new file mode 100644 index 000000000..ffdfcf84f --- /dev/null +++ b/resource/sqlupgrade/DM/sql202307100103.sql @@ -0,0 +1,16 @@ +alter table hrsa_salary_template + add auto_send_cycle_type NUMBER null; +/ + +alter table hrsa_salary_template + add auto_send_status NUMBER null; +/ + +alter table hrsa_salary_template + add auto_send_day_of_month varchar2(200) NULL; +/ + +alter table hrsa_salary_template + add auto_send_time_of_day varchar2(200) NULL; +/ + diff --git a/resource/sqlupgrade/DM/sql202307170403.sql b/resource/sqlupgrade/DM/sql202307170403.sql new file mode 100644 index 000000000..bc59c53ae --- /dev/null +++ b/resource/sqlupgrade/DM/sql202307170403.sql @@ -0,0 +1,24 @@ +alter table hrsa_salary_send_info +add bill_read_status NUMBER null; +/ + +alter table hrsa_salary_send_info +add bill_confirm_status NUMBER null; +/ + +alter table hrsa_salary_send_info +add send_employee_id NUMBER(38,0) NULL; +/ + +alter table hrsa_salary_template +add ack_feedback_status NUMBER NULL; +/ + +alter table hrsa_salary_template +add auto_ack_days NUMBER NULL; +/ + +alter table hrsa_salary_template +add feedback_url VARCHAR2(500) NULL; +/ + diff --git a/resource/sqlupgrade/JC/sql202307100103.sql b/resource/sqlupgrade/JC/sql202307100103.sql new file mode 100644 index 000000000..ffdfcf84f --- /dev/null +++ b/resource/sqlupgrade/JC/sql202307100103.sql @@ -0,0 +1,16 @@ +alter table hrsa_salary_template + add auto_send_cycle_type NUMBER null; +/ + +alter table hrsa_salary_template + add auto_send_status NUMBER null; +/ + +alter table hrsa_salary_template + add auto_send_day_of_month varchar2(200) NULL; +/ + +alter table hrsa_salary_template + add auto_send_time_of_day varchar2(200) NULL; +/ + diff --git a/resource/sqlupgrade/JC/sql202307170403.sql b/resource/sqlupgrade/JC/sql202307170403.sql new file mode 100644 index 000000000..bc59c53ae --- /dev/null +++ b/resource/sqlupgrade/JC/sql202307170403.sql @@ -0,0 +1,24 @@ +alter table hrsa_salary_send_info +add bill_read_status NUMBER null; +/ + +alter table hrsa_salary_send_info +add bill_confirm_status NUMBER null; +/ + +alter table hrsa_salary_send_info +add send_employee_id NUMBER(38,0) NULL; +/ + +alter table hrsa_salary_template +add ack_feedback_status NUMBER NULL; +/ + +alter table hrsa_salary_template +add auto_ack_days NUMBER NULL; +/ + +alter table hrsa_salary_template +add feedback_url VARCHAR2(500) NULL; +/ + diff --git a/resource/sqlupgrade/Mysql/sql202307100103.sql b/resource/sqlupgrade/Mysql/sql202307100103.sql new file mode 100644 index 000000000..d283335e1 --- /dev/null +++ b/resource/sqlupgrade/Mysql/sql202307100103.sql @@ -0,0 +1,5 @@ +ALTER TABLE hrsa_salary_template +ADD COLUMN auto_send_status int NULL, +ADD COLUMN auto_send_cycle_type int NULL, +ADD COLUMN auto_send_day_of_month varchar(200) NULL, +ADD COLUMN auto_send_time_of_day varchar(50) NULL; \ No newline at end of file diff --git a/resource/sqlupgrade/Mysql/sql202307170403.sql b/resource/sqlupgrade/Mysql/sql202307170403.sql new file mode 100644 index 000000000..a01647d03 --- /dev/null +++ b/resource/sqlupgrade/Mysql/sql202307170403.sql @@ -0,0 +1,9 @@ +ALTER TABLE hrsa_salary_send_info +ADD COLUMN bill_read_status int NULL, +ADD COLUMN bill_confirm_status int NULL, +ADD COLUMN send_employee_id BIGINT NULL; + +ALTER TABLE hrsa_salary_template +ADD COLUMN ack_feedback_status int NULL, +ADD COLUMN auto_ack_days int NULL, +ADD COLUMN feedback_url varchar(500) NULL; \ No newline at end of file diff --git a/resource/sqlupgrade/Oracle/sql202307100103.sql b/resource/sqlupgrade/Oracle/sql202307100103.sql new file mode 100644 index 000000000..73836e82e --- /dev/null +++ b/resource/sqlupgrade/Oracle/sql202307100103.sql @@ -0,0 +1,15 @@ +alter table hrsa_salary_template + add auto_send_cycle_type NUMBER null +/ + +alter table hrsa_salary_template + add auto_send_status NUMBER null +/ + +alter table hrsa_salary_template + add auto_send_day_of_month varchar2(200) NULL +/ + +alter table hrsa_salary_template + add auto_send_time_of_day varchar2(200) NULL +/ \ No newline at end of file diff --git a/resource/sqlupgrade/Oracle/sql202307170403.sql b/resource/sqlupgrade/Oracle/sql202307170403.sql new file mode 100644 index 000000000..8765e111d --- /dev/null +++ b/resource/sqlupgrade/Oracle/sql202307170403.sql @@ -0,0 +1,23 @@ +alter table hrsa_salary_send_info +add bill_read_status NUMBER null +/ + +alter table hrsa_salary_send_info +add bill_confirm_status NUMBER null +/ + +alter table hrsa_salary_send_info +add send_employee_id NUMBER(38,0) NULL +/ + +alter table hrsa_salary_template +add ack_feedback_status NUMBER NULL +/ + +alter table hrsa_salary_template +add auto_ack_days NUMBER NULL +/ + +alter table hrsa_salary_template +add feedback_url VARCHAR2(500) NULL +/ \ No newline at end of file diff --git a/resource/sqlupgrade/PG/sql202307170403.sql b/resource/sqlupgrade/PG/sql202307170403.sql new file mode 100644 index 000000000..a01647d03 --- /dev/null +++ b/resource/sqlupgrade/PG/sql202307170403.sql @@ -0,0 +1,9 @@ +ALTER TABLE hrsa_salary_send_info +ADD COLUMN bill_read_status int NULL, +ADD COLUMN bill_confirm_status int NULL, +ADD COLUMN send_employee_id BIGINT NULL; + +ALTER TABLE hrsa_salary_template +ADD COLUMN ack_feedback_status int NULL, +ADD COLUMN auto_ack_days int NULL, +ADD COLUMN feedback_url varchar(500) NULL; \ No newline at end of file diff --git a/resource/sqlupgrade/SQLServer/sql202307100103.sql b/resource/sqlupgrade/SQLServer/sql202307100103.sql new file mode 100644 index 000000000..bd867842c --- /dev/null +++ b/resource/sqlupgrade/SQLServer/sql202307100103.sql @@ -0,0 +1,6 @@ +ALTER TABLE hrsa_salary_template +ADD auto_send_status int NULL, +auto_send_cycle_type int NULL, +auto_send_day_of_month varchar(200) NULL, +auto_send_time_of_day varchar(50) NULL +GO \ No newline at end of file diff --git a/resource/sqlupgrade/SQLServer/sql202307170403.sql b/resource/sqlupgrade/SQLServer/sql202307170403.sql new file mode 100644 index 000000000..de0724f06 --- /dev/null +++ b/resource/sqlupgrade/SQLServer/sql202307170403.sql @@ -0,0 +1,11 @@ +ALTER TABLE hrsa_salary_send_info +ADD bill_read_status int NULL, +bill_confirm_status int NULL, +send_employee_id BIGINT NULL +GO + +ALTER TABLE hrsa_salary_template +ADD ack_feedback_status int NULL, +auto_ack_days int NULL, +feedback_url varchar(500) NULL +GO \ No newline at end of file diff --git a/src/com/api/salary/listener/InitListener.java b/src/com/api/salary/listener/InitListener.java index b96ed8e0d..18fb3cb4f 100644 --- a/src/com/api/salary/listener/InitListener.java +++ b/src/com/api/salary/listener/InitListener.java @@ -18,30 +18,33 @@ public class InitListener implements AbstractResourceModelListener { BaseBean bb = new BaseBean(); String cId = new License().getCId(); String defaultCloseNonStandard149 = bb.getPropValue("hrmSalary", "defaultCloseNonStandard149"); - if(StringUtils.isNotBlank(cId) && "true".equals(defaultCloseNonStandard149)) { + if (StringUtils.isNotBlank(cId) && "true".equals(defaultCloseNonStandard149)) { + if (cId.length() > 7) { + cId = cId.substring(cId.length() - 7); + } int cid = Integer.parseInt(cId); - if(!hasMenuInfo(cid, "left", menuid)) { + if (!hasMenuInfo(cid, "left", menuid)) { bb.writeLog("149新薪酬管理 添加默认菜单控制"); insertMenuInfo(cid, "left", menuid); } } } - private void insertMenuInfo(int cid,String type,int id){ + private void insertMenuInfo(int cid, String type, int id) { RecordSet rs = new RecordSet(); BaseBean bb = new BaseBean(); - bb.writeLog("FunctionUpgradeUtil.getMenuId(cid,id):" + FunctionUpgradeUtil.getMenuId(cid,id)); - String sql ="INSERT INTO menucontrollist (type,menuid,isopen) VALUES('"+type+"','"+FunctionUpgradeUtil.getMenuId(cid,id)+"','"+FunctionUpgradeUtil.getMenuStatus(id,-1,cid)+"')"; + bb.writeLog("FunctionUpgradeUtil.getMenuId(cid,id):" + FunctionUpgradeUtil.getMenuId(cid, id)); + String sql = "INSERT INTO menucontrollist (type,menuid,isopen) VALUES('" + type + "','" + FunctionUpgradeUtil.getMenuId(cid, id) + "','" + FunctionUpgradeUtil.getMenuStatus(id, -1, cid) + "')"; rs.execute(sql); } private boolean hasMenuInfo(int cid, String type, int id) { RecordSet rs = new RecordSet(); String sql = "select count(1) as count from menucontrollist where type = ? and menuid = ?"; - rs.executeQuery(sql,type, FunctionUpgradeUtil.getMenuId(cid,id)); - if(rs.next()) { + rs.executeQuery(sql, type, FunctionUpgradeUtil.getMenuId(cid, id)); + if (rs.next()) { int count = rs.getInt("count"); - if(count > 0) { + if (count > 0) { return true; } } diff --git a/src/com/engine/salary/biz/SIArchivesBiz.java b/src/com/engine/salary/biz/SIArchivesBiz.java index dac9c3f20..51da1aa57 100644 --- a/src/com/engine/salary/biz/SIArchivesBiz.java +++ b/src/com/engine/salary/biz/SIArchivesBiz.java @@ -928,6 +928,10 @@ public class SIArchivesBiz { request.setPositions(Arrays.stream(param.getPositionsStr().split(",")).map(BigDecimal::new).collect(Collectors.toList())); } + if (StringUtils.isNotBlank(param.getStatusesStr())) { + request.setStatuses(Arrays.stream(param.getStatusesStr().split(",")).map(String::new).collect(Collectors.toList())); + } + request.setNeedAuth(param.getNeedAuth()); request.setTaxAgentEmployeeIds(param.getTaxAgentEmployeeIds()); request.setTaxAgentIds(param.getTaxAgentIds()); @@ -937,7 +941,7 @@ public class SIArchivesBiz { long startNum = (current - 1) * pageSize; param.setStartNum(startNum); param.setPageSize(pageSize); - request.setStatuses(param.getStatuses()); +// request.setStatuses(param.getStatuses()); request.setKeyword(param.getUserName()); request.setSiSchemeId(param.getSiSchemeId()); @@ -1393,8 +1397,9 @@ public class SIArchivesBiz { conditionItems.add(departmentIds); - SearchConditionItem statuses = conditionFactory.createCondition(ConditionType.SELECT, 502327, "statuses"); + SearchConditionItem statuses = conditionFactory.createCondition(ConditionType.SELECT, 502327, "statusesStr"); statuses.setInputType("select"); + statuses.setMultiple(true); statuses.setOptions(userStatusOptions); statuses.setColSpan(2); statuses.setFieldcol(16); diff --git a/src/com/engine/salary/biz/SysSalaryItemBiz.java b/src/com/engine/salary/biz/SysSalaryItemBiz.java index 4ff63dac4..19ed10802 100644 --- a/src/com/engine/salary/biz/SysSalaryItemBiz.java +++ b/src/com/engine/salary/biz/SysSalaryItemBiz.java @@ -38,4 +38,14 @@ public class SysSalaryItemBiz { sqlSession.close(); } } + + public SysSalaryItemPO selectOneByName(String name) { + SqlSession sqlSession = MyBatisFactory.sqlSessionFactory.openSession(); + try { + SysSalaryItemMapper mapper = sqlSession.getMapper(SysSalaryItemMapper.class); + return mapper.selectOneByName(name); + } finally { + sqlSession.close(); + } + } } diff --git a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java index a7767953a..a12f0e81f 100644 --- a/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java +++ b/src/com/engine/salary/entity/salaryBill/bo/SalaryTemplateBO.java @@ -62,7 +62,7 @@ public class SalaryTemplateBO { .salarySobId(saveParam.getSalarySobId()) .description(saveParam.getDescription()) .emailStatus(saveParam.getEmailStatus()?1:0) - .sendEmailId(saveParam.getEmailStatus()?saveParam.getSendEmail():0L) +// .sendEmailId(saveParam.getEmailStatus()?saveParam.getSendEmail():0L) .msgStatus(saveParam.getMsgStatus()?1:0) .theme(saveParam.getTheme()) .background(saveParam.getBackground()) @@ -74,6 +74,12 @@ public class SalaryTemplateBO { .replenishName(saveParam.getReplenishName()) .replenishRule(saveParam.getReplenishRule()) .replenishSalaryItemSetting((saveParam.getSalaryItemSetting() != null ? JsonUtil.toJsonString(saveParam.getReplenishSalaryItemSetting()) : "")) + .autoSendStatus(saveParam.getAutoSendStatus()?1:0) + .autoSendDayOfMonth(saveParam.getAutoSendDayOfMonth()) + .autoSendTimeOfDay(saveParam.getAutoSendTimeOfDay()) + .ackFeedbackStatus(saveParam.getAckFeedbackStatus()?1:0) + .autoAckDays(saveParam.getAutoAckDays()) + .feedbackUrl(saveParam.getFeedbackUrl()) .createTime(new Date()) .updateTime(new Date()) .creator(employeeId) diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryBaseSetFormDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryBaseSetFormDTO.java index 020e858cb..5bc07f1e1 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryBaseSetFormDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryBaseSetFormDTO.java @@ -29,10 +29,7 @@ public class SalaryBaseSetFormDTO { // 水印设置 private Object watermarkSetting; - // 签名确认 - private Boolean ackStatus; - - // 员工反馈 - private Boolean feedbackStatus; + // 工资单反馈设置 + private SalaryBillAckFeedbackDTO ackFeedbackSetting; } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryBillAckFeedbackDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillAckFeedbackDTO.java new file mode 100644 index 000000000..340e97387 --- /dev/null +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryBillAckFeedbackDTO.java @@ -0,0 +1,35 @@ +package com.engine.salary.entity.salaryBill.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName SalaryBillAckFeedbackDTO + * @date 2023/07/12 13:46 + * @description 工资单确认和反馈DTO + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SalaryBillAckFeedbackDTO { + + /** + * 工资单确认反馈是否开启。0:否,1:是 + */ + private String ackStatus; + + /** + * 反馈地址 + */ + private String feedBackUrl; + + /** + * 超时自动确认天数 + */ + private Integer autoAckDays; + +} diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java index 6f976855a..00548b4b6 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendInfoListDTO.java @@ -48,6 +48,12 @@ public class SalarySendInfoListDTO { @TableTitle(title = "发送状态", dataIndex = "sendStatus", key = "sendStatus") private String sendStatus; + @TableTitle(title = "查看状态", dataIndex = "billReadStatus", key = "billReadStatus") + private String billReadStatus; + + @TableTitle(title = "确认状态", dataIndex = "billConfirmStatus", key = "billConfirmStatus") + private String billConfirmStatus; + private String email; private Long salaryAcctRecordId; /** @@ -55,5 +61,10 @@ public class SalarySendInfoListDTO { */ private Integer salaryAcctType; + /** + * 该模板是否开启了工资单反馈确认 + */ + private boolean needAck; + } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java index c4c72bda0..915045c89 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalarySendListDTO.java @@ -141,5 +141,10 @@ public class SalarySendListDTO { */ // private Integer haveBackCalc; + /** + * 工资单确认反馈状态 + */ + private Integer ackFeedbackStatus; + } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java index 0ad55269b..910e38e10 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateBaseSetDTO.java @@ -54,4 +54,32 @@ public class SalaryTemplateBaseSetDTO { //消息中心") private Boolean msgStatus; + + // 是否启用工资单定时发送 + private Boolean autoSendStatus; + + // 自动发送工资单周期1:本月、2:上月 + private Integer autoSendCycleType; + + // 每月几号自动发送工资单 + private String autoSendDayOfMonth; + + // 发送时间 + private String autoSendTimeOfDay; + + /** + * 工资单确认反馈状态 + */ + private Boolean ackFeedbackStatus; + + /** + * 自动确认超时天数 + */ + private Integer autoAckDays; + + /** + * 反馈流程地址 + * + */ + private String feedbackUrl; } diff --git a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateShowSetDTO.java b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateShowSetDTO.java index 8f976ec9d..4b5efcd1c 100644 --- a/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateShowSetDTO.java +++ b/src/com/engine/salary/entity/salaryBill/dto/SalaryTemplateShowSetDTO.java @@ -54,4 +54,5 @@ public class SalaryTemplateShowSetDTO { // 薪资项为0时不显示") private Boolean salaryItemZeroStatus; + } diff --git a/src/com/engine/salary/entity/salaryBill/param/SalaryBaseSetSaveParam.java b/src/com/engine/salary/entity/salaryBill/param/SalaryBaseSetSaveParam.java index a08ddf83e..4716f9958 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalaryBaseSetSaveParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalaryBaseSetSaveParam.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.salaryBill.param; +import com.engine.salary.entity.salaryBill.dto.SalaryBillAckFeedbackDTO; import com.engine.salary.enums.salarybill.SalaryTemplateWatermarkTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.util.SalaryI18nUtil; @@ -7,6 +8,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; import java.util.Map; import java.util.Objects; @@ -32,11 +34,8 @@ public class SalaryBaseSetSaveParam { // 自定义设置内容") private Map wmSetting; - // 是否启用确认") - private Boolean ackStatus; - - // 是否启用反馈") - private Boolean feedbackStatus; + // 工资单确认反馈设置 + private SalaryBillAckFeedbackDTO ackFeedbackSetting; public static void checkParam(SalaryBaseSetSaveParam saveParam) { if (Objects.isNull(saveParam.getWatermarkStatus())) { @@ -51,14 +50,10 @@ public class SalaryBaseSetSaveParam { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(220419, "自定义水印的设置内容必传")); } } + if (Objects.isNull(saveParam.getAckFeedbackSetting()) || StringUtils.isBlank(saveParam.getAckFeedbackSetting().getAckStatus())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(220418, "工资单确认反馈信息必传")); + } -// if (Objects.isNull(saveParam.getAckStatus())) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 222645, "是否启用确认必传")); -// } -// -// if (Objects.isNull(saveParam.getFeedbackStatus())) { -// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(tenantKey, employeeId, 222646, "是否启用反馈必传")); -// } } } diff --git a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java index 66d55f5b1..ff8af0607 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalaryTemplateSaveParam.java @@ -12,6 +12,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.util.List; +import java.util.Objects; /** * @Description: 工资单模板 @@ -62,6 +63,18 @@ public class SalaryTemplateSaveParam { // 薪资项为0时不显示开启状态。false:关、true:开 private Boolean salaryItemZeroStatus; + // 是否启用工资单定时发送。0:未启用、1:已启用 + private Boolean autoSendStatus; + + // 自动发送工资单周期1:本月、2:上月 + private Integer autoSendCycleType; + + // 每月几号自动发送工资单 + private String autoSendDayOfMonth; + + // 自动发放时间 + private String autoSendTimeOfDay; + // 薪资项目设置 private List salaryItemSetting; @@ -75,6 +88,22 @@ public class SalaryTemplateSaveParam { // 补发薪资项目设置 private List replenishSalaryItemSetting; + /** + * 工资单确认反馈状态 + */ + private Boolean ackFeedbackStatus; + + /** + * 自动确认超时天数 + */ + private Integer autoAckDays; + + /** + * 反馈流程地址 + * + */ + private String feedbackUrl; + public static void checkParam(SalaryTemplateSaveParam saveParam) { if (saveParam.getSalarySobId() == null) { throw new SalaryRunTimeException("薪资账套表的主键id必传;"); @@ -101,9 +130,9 @@ public class SalaryTemplateSaveParam { } - if (saveParam.getEmailStatus() && saveParam.getSendEmail() == null) { - throw new SalaryRunTimeException("开启邮箱后,发送地址必选;"); - } +// if (saveParam.getEmailStatus() && saveParam.getSendEmail() == null) { +// throw new SalaryRunTimeException("开启邮箱后,发送地址必选;"); +// } if (StringUtils.isNotEmpty(saveParam.getTextContent()) && saveParam.getTextContentPosition() == null) { throw new SalaryRunTimeException("文本内容不为空时,文本内容位置必选;"); @@ -116,5 +145,18 @@ public class SalaryTemplateSaveParam { if (CollectionUtils.isEmpty(saveParam.getReplenishSalaryItemSetting())) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "补发工资单模板的薪资项目设置不能为空")); } + + if (Objects.isNull(saveParam.getAutoSendStatus())) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "是否启用自动发放不能为空")); + } + + if (saveParam.getAutoSendStatus() == Boolean.TRUE) { + if(StringUtils.isBlank(saveParam.getAutoSendDayOfMonth())) + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "自动发放日期不能为空")); + if(Objects.isNull(saveParam.getAutoSendCycleType())) + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "自动发放周期不能为空")); + if(StringUtils.isBlank(saveParam.getAutoSendTimeOfDay())) + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(140509, "自动发放时间不能为空")); + } } } diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java index 5efa58c05..b14d9cd6a 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java @@ -52,6 +52,21 @@ public class SalarySendInfoPO { */ private Integer sendStatus; + /** + * 查看状态。0:未查看、1:已查看 + */ + private Integer billReadStatus; + + /** + * 确认状态 0:未确认、1:已确认 + */ + private Integer billConfirmStatus; + + /** + * 操作发送工资单人员id + */ + private Long sendEmployeeId; + /** * 发送时间 */ diff --git a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java index 1ffbc0622..fd8e1a1c9 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java @@ -124,6 +124,27 @@ public class SalaryTemplatePO { */ private String replenishSalaryItemSetting; + + /** + * 是否启用工资单定时发送。0:未启用、1:已启用 + */ + private Integer autoSendStatus; + + /** + * 自动发送工资单周期1:本月、2:上月 + */ + private Integer autoSendCycleType; + + /** + * 每月几号自动发送工资单 + */ + private String autoSendDayOfMonth; + + /** + * 自动发放时间 + */ + private String autoSendTimeOfDay; + /** * 创建时间 */ @@ -149,5 +170,23 @@ public class SalaryTemplatePO { */ private String tenantKey; + /** + * 工资单确认反馈状态 + */ + private Integer ackFeedbackStatus; + + /** + * 自动确认超时天数 + */ + private Integer autoAckDays; + + /** + * 反馈流程地址 + * + */ + private String feedbackUrl; + + + private Collection salarySobIds; } diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java index 5244de8c0..22af2b674 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctCalculateBO.java @@ -10,6 +10,7 @@ import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO; import com.engine.salary.entity.salarysob.po.SalarySobAdjustRulePO; import com.engine.salary.entity.salarysob.po.SalarySobItemPO; import com.engine.salary.entity.salarysob.po.SalarySobPO; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.Accessors; @@ -119,6 +120,11 @@ public class SalaryAcctCalculateBO { */ private BlockingDeque results; + /** + * 系统算税启用状态 + */ + private TaxDeclarationFunctionEnum taxDeclarationFunction; + @Data @AllArgsConstructor public static class Result { diff --git a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java index 6f40a8d19..f07aa7d36 100644 --- a/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java +++ b/src/com/engine/salary/entity/salaryacct/bo/SalaryAcctRecordBO.java @@ -64,16 +64,16 @@ public class SalaryAcctRecordBO { if (SalaryAcctRecordStatusEnum.NOT_ARCHIVED == salaryAcctRecordStatusEnum) { btnList.add(new WeaTableOperate("核算", null, "0")); if(!Objects.equals(salaryAcctRecordPO.getBackCalcStatus(),NumberUtils.INTEGER_ONE)){ - btnList.add(new WeaTableOperate("删除", null, "0")); + btnList.add(new WeaTableOperate("删除", null, "1")); } - btnList.add(new WeaTableOperate("归档", null, "0")); + btnList.add(new WeaTableOperate("归档", null, "2")); } else if (SalaryAcctRecordStatusEnum.ARCHIVED == salaryAcctRecordStatusEnum && ( salarySendMap.get(salaryAcctRecordPO.getId()) ==Boolean.TRUE ) ){ - btnList.add(new WeaTableOperate("查看", null, "0")); - btnList.add(new WeaTableOperate("重新核算", null, "0")); - btnList.add(new WeaTableOperate("回算", null, "0")); + btnList.add(new WeaTableOperate("查看", null, "3")); + btnList.add(new WeaTableOperate("重新核算", null, "4")); + btnList.add(new WeaTableOperate("回算", null, "5")); } else { - btnList.add(new WeaTableOperate("查看", null, "0")); - btnList.add(new WeaTableOperate("重新核算", null, "0")); + btnList.add(new WeaTableOperate("查看", null, "3")); + btnList.add(new WeaTableOperate("重新核算", null, "4")); } return SalaryAcctRecordListDTO.builder() .id(salaryAcctRecordPO.getId()) diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java index 8320ff6bf..cfe97aae9 100644 --- a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctEmployeeQueryParam.java @@ -50,6 +50,8 @@ public class SalaryAcctEmployeeQueryParam extends BaseQueryParam { */ private SalaryEmployeeStatusEnum status; + //状态(多选) + private List statuses; //离职日期") private LocalDateRange dismissDate; diff --git a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java index 939163a9d..f5b3d3bce 100644 --- a/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java +++ b/src/com/engine/salary/entity/salaryacct/param/SalaryAcctResultQueryParam.java @@ -10,6 +10,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.Collection; +import java.util.List; /** * 薪资核算结果查询参数 @@ -46,6 +47,8 @@ public class SalaryAcctResultQueryParam extends BaseQueryParam { //状态 private SalaryEmployeeStatusEnum status; + //状态(多选) + private List statuses; //离职日期 private LocalDateRange dismissDate; diff --git a/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveQueryParam.java b/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveQueryParam.java index c975e8283..f52e8bee2 100644 --- a/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveQueryParam.java +++ b/src/com/engine/salary/entity/salaryarchive/param/SalaryArchiveQueryParam.java @@ -48,6 +48,8 @@ public class SalaryArchiveQueryParam extends BaseQueryParam { //状态 private String userstatus; + //状态(多选) + private List statuses; //入职日期 private List hiredate; diff --git a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java index 9450cb69a..940e11b29 100644 --- a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java +++ b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java @@ -134,7 +134,7 @@ public class SalarySobItemAggregateBO { .taxDeclarationColumn(SalaryItemBO.buildTaxDeclarationColumn(salaryItemPO.getCode())) .sortedIndex(salarySobItemPO.getSortedIndex()) .canEdit(openFormulaForcedEditing || Objects.equals(salaryItemPO.getCanEdit(), 1)) - .canDelete(salaryItemPO.getCanDelete() == null || Objects.equals(salaryItemPO.getCanDelete(), 1)) + .canDelete(openFormulaForcedEditing || salaryItemPO.getCanDelete() == null || Objects.equals(salaryItemPO.getCanDelete(), 1)) .build()); } } diff --git a/src/com/engine/salary/entity/siaccount/bo/InsuranceAccountBO.java b/src/com/engine/salary/entity/siaccount/bo/InsuranceAccountBO.java index cc31abebf..8aa28ab09 100644 --- a/src/com/engine/salary/entity/siaccount/bo/InsuranceAccountBO.java +++ b/src/com/engine/salary/entity/siaccount/bo/InsuranceAccountBO.java @@ -54,8 +54,8 @@ public class InsuranceAccountBO { .id(e.getId()) .accountant(e.getAccountant()) .billMonth(e.getBillMonth()) - .billStatus(queryLabelId(e.getBillStatus()).getDefaultLabel()) -// .billStatus(e.getBillStatus().toString()) +// .billStatus(queryLabelId(e.getBillStatus()).getDefaultLabel()) + .billStatus(e.getBillStatus().toString()) .fundNum(e.getFundNum()) .fundPay(SalaryEntityUtil.thousandthConvert(e.getFundPay())) .lastTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(e.getUpdateTime())) diff --git a/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java b/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java index ad05e9702..276fd82b3 100644 --- a/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java +++ b/src/com/engine/salary/entity/siarchives/param/InsuranceArchivesListParam.java @@ -38,6 +38,7 @@ public class InsuranceArchivesListParam extends BaseQueryParam { //状态(多线)") private List statuses; + private String statusesStr; //岗位(多选)") private List positions; diff --git a/src/com/engine/salary/enums/salarybill/BillConfimStatusEnum.java b/src/com/engine/salary/enums/salarybill/BillConfimStatusEnum.java new file mode 100644 index 000000000..2a1626532 --- /dev/null +++ b/src/com/engine/salary/enums/salarybill/BillConfimStatusEnum.java @@ -0,0 +1,71 @@ +package com.engine.salary.enums.salarybill; + +import com.engine.salary.enums.BaseEnum; + +import java.util.Arrays; + +/** + * @ClassName BillConfimStatusEnum + * @author Harryxzy + * @date 2023/7/10 17:03 + * @description 工资单确认 + */ +public enum BillConfimStatusEnum implements BaseEnum { + + UNCONFIRMED(0, "未确认", 93286), + CONFIRMED(1, "已确认", 93212), + FEEDBACK(2, "已反馈", 0); + + private final int value; + + private final String defaultLabel; + + private final int labelId; + + BillConfimStatusEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + public static String getDefaultLabelByValue(Integer value) { + if (value == null) { + return ""; + } + BillConfimStatusEnum[] enumAry = BillConfimStatusEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getValue().equals(value)) { + return enumAry[i].getDefaultLabel(); + } + } + return ""; + } + + public static String getNameByValue(Integer value) { + if (value == null) { + return ""; + } + BillConfimStatusEnum[] enumAry = BillConfimStatusEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (enumAry[i].getValue().equals(value)) { + return enumAry[i].name(); + } + } + return ""; + } +} diff --git a/src/com/engine/salary/enums/salarybill/BillReadStatusEnum.java b/src/com/engine/salary/enums/salarybill/BillReadStatusEnum.java new file mode 100644 index 000000000..09fd47107 --- /dev/null +++ b/src/com/engine/salary/enums/salarybill/BillReadStatusEnum.java @@ -0,0 +1,70 @@ +package com.engine.salary.enums.salarybill; + +import com.engine.salary.enums.BaseEnum; + +import java.util.Arrays; + +/** + * @ClassName BillReadStatusEnum + * @author Harryxzy + * @date 2023/7/10 17:13 + * @description 工资单查看 + */ +public enum BillReadStatusEnum implements BaseEnum { + + UNREAD(0, "未查看", 93286), + READED(1, "已查看", 93212); + + private int value; + + private String defaultLabel; + + private int labelId; + + BillReadStatusEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + public static String getDefaultLabelByValue(Integer value) { + if (value == null) { + return ""; + } + BillReadStatusEnum[] enumAry = BillReadStatusEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (Integer.valueOf(enumAry[i].getValue()).equals(value)) { + return enumAry[i].getDefaultLabel(); + } + } + return ""; + } + + public static String getNameByValue(Integer value) { + if (value == null) { + return ""; + } + BillReadStatusEnum[] enumAry = BillReadStatusEnum.values(); + for(int i = 0; i < Arrays.asList(enumAry).size(); i++){ + if (Integer.valueOf(enumAry[i].getValue()).equals(value)) { + return enumAry[i].name(); + } + } + return ""; + } +} diff --git a/src/com/engine/salary/enums/salarysend/SalaryAutoSendCycleTypeEnum.java b/src/com/engine/salary/enums/salarysend/SalaryAutoSendCycleTypeEnum.java new file mode 100644 index 000000000..dfe02a0be --- /dev/null +++ b/src/com/engine/salary/enums/salarysend/SalaryAutoSendCycleTypeEnum.java @@ -0,0 +1,54 @@ +package com.engine.salary.enums.salarysend; + + +import com.engine.salary.enums.BaseEnum; + +import java.util.Objects; + +/** + * @ClassName SalaryAutoSendCycleTypeEnum + * @author Harryxzy + * @date 2023/7/4 17:30 + * @description 自动发送工资单周期 + */ +public enum SalaryAutoSendCycleTypeEnum implements BaseEnum { + + THIS_MONTH(1, "本月", 86072), + NEXT_MONTH(2, "下月", 86073); + + private int value; + + private String defaultLabel; + + private int labelId; + + SalaryAutoSendCycleTypeEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } + + public static SalaryAutoSendCycleTypeEnum parseByValue(int value) { + for (SalaryAutoSendCycleTypeEnum salaryCycleTypeEnum : SalaryAutoSendCycleTypeEnum.values()) { + if (Objects.equals(salaryCycleTypeEnum.getValue(), value)) { + return salaryCycleTypeEnum; + } + } + return null; + } +} diff --git a/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java b/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java index 200da6442..207bd1649 100644 --- a/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java +++ b/src/com/engine/salary/maintainer/salaryacct/SalaryAcctManager.java @@ -22,6 +22,9 @@ import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper; import com.engine.salary.service.*; import com.engine.salary.service.impl.*; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; @@ -140,6 +143,11 @@ public class SalaryAcctManager extends Service { return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user); } + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + + /** * 补充核算 @@ -307,6 +315,8 @@ public class SalaryAcctManager extends Service { BlockingDeque calculateResults = new LinkedBlockingDeque<>(partition.size()); // 12.3、生成本次运算的key String calculateKey = UUID.randomUUID().toString(); + // 12.4、是否采用系统算税 + TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration(); // 12.4、多线程运算,运算结果存放在临时表中 for (List acctEmployeePOS : partition) { SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO() @@ -327,7 +337,8 @@ public class SalaryAcctManager extends Service { .setIssuedFieldIds(issuedFieldIds) .setChildMonitor(childMonitor) .setResults(calculateResults) - .setCalculateKey(calculateKey); + .setCalculateKey(calculateKey) + .setTaxDeclarationFunction(taxDeclarationFunction); List finalSalarySobBackItems = salarySobBackItems; LocalRunnable localRunnable = new LocalRunnable() { @Override diff --git a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.java b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.java index 1775995f3..952c37bbb 100644 --- a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.java +++ b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.java @@ -122,4 +122,6 @@ public interface SalaryArchiveMapper { void deletePendingTodo(@Param("ids") Collection ids); void deleteSuspendTodo(@Param("ids") Collection ids); + + void deleteByIds(@Param("ids")Collection deleteIds); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml index cc03c82f0..b5adf6ec8 100644 --- a/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml +++ b/src/com/engine/salary/mapper/archive/SalaryArchiveMapper.xml @@ -154,6 +154,12 @@ AND e.status = #{param.userstatus} + + AND e.status IN + + #{userstatus} + + AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) @@ -229,7 +235,12 @@ AND e.status = #{param.userstatus} - + + AND e.status IN + + #{userstatus} + + AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) @@ -305,7 +316,12 @@ AND e.status = #{param.userstatus} - + + AND e.status IN + + #{userstatus} + + AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) @@ -487,6 +503,16 @@ + + UPDATE hrsa_salary_archive + SET delete_type=1 + WHERE delete_type = 0 + AND id IN + + #{id} + + + + + @@ -696,9 +743,6 @@ salary_month=#{salaryMonth}, - - use_type=#{useType}, - salary_acct_record_id=#{salaryAcctRecordId}, @@ -732,8 +776,27 @@ tenant_key=#{tenantKey}, + + bill_read_status=#{billReadStatus}, + + + bill_confirm_status=#{billConfirmStatus}, + WHERE id = #{id} AND delete_type = 0 + + UPDATE hrsa_salary_send_info + set + bill_confirm_status = 1 + where + delete_type = 0 + + AND id IN + + #{id} + + + diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java index d0da230f7..95e3e73ed 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.java @@ -63,4 +63,8 @@ public interface SalarySendMapper { void batchHandleSalaryAcctTypeHistory(); void deleteBySalaryAcctRecordIds(@Param("salaryAcctRecordId") Collection ids); + + List getNeedSendListBySalarySobIds(@Param("salarySobIds")List salarySobIds); + + List getByIds(@Param("ids") List salarySendId); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml index 040f23831..c78a00525 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendMapper.xml @@ -236,6 +236,34 @@ ORDER BY id DESC + + diff --git a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml index 253861502..29a016b93 100644 --- a/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalaryTemplateMapper.xml @@ -48,9 +48,16 @@ , t.salary_item_null_status , t.salary_item_zero_status , t.salary_item_setting - , replenish_name - , replenish_rule - , replenish_salary_item_setting + , t.replenish_name + , t.replenish_rule + , t.replenish_salary_item_setting + , t.auto_send_status + , t.auto_send_cycle_type + , t.auto_send_day_of_month + , t.auto_send_time_of_day + , t.ack_feedback_status + , t.auto_ack_days + , t.feedback_url , t.create_time , t.update_time , t.creator @@ -76,6 +83,13 @@ replenish_name, replenish_rule, replenish_salary_item_setting, + auto_send_status, + auto_send_cycle_type, + auto_send_day_of_month, + auto_send_time_of_day, + ack_feedback_status, + auto_ack_days, + feedback_url, create_time, update_time, creator, @@ -310,6 +324,12 @@ AND delete_type = #{deleteType} + + AND auto_send_status = #{autoSendStatus} + + + AND ack_feedback_status = #{ackFeedbackStatus} + AND salary_sob_id IN @@ -490,6 +510,27 @@ replenish_salary_item_setting=#{replenishSalaryItemSetting}, + + auto_send_status=#{autoSendStatus}, + + + auto_send_cycle_type=#{autoSendCycleType}, + + + auto_send_day_of_month=#{autoSendDayOfMonth}, + + + auto_send_time_of_day=#{autoSendTimeOfDay}, + + + ack_feedback_status=#{ackFeedbackStatus}, + + + auto_ack_days=#{autoAckDays}, + + + feedback_url=#{feedbackUrl}, + create_time=#{createTime}, @@ -568,6 +609,27 @@ replenish_salary_item_setting, + + auto_send_status, + + + auto_send_cycle_type, + + + auto_send_day_of_month, + + + auto_send_time_of_day, + + + ack_feedback_status, + + + auto_ack_days, + + + feedback_url, + create_time, @@ -642,6 +704,27 @@ #{replenishSalaryItemSetting}, + + #{autoSendStatus}, + + + #{autoSendCycleType}, + + + #{autoSendDayOfMonth}, + + + #{autoSendTimeOfDay}, + + + #{ackFeedbackStatus}, + + + #{autoAckDays}, + + + #{feedbackUrl}, + #{createTime}, @@ -726,6 +809,27 @@ replenish_salary_item_setting, + + auto_send_status, + + + auto_send_cycle_type, + + + auto_send_day_of_month, + + + auto_send_time_of_day, + + + ack_feedback_status, + + + auto_ack_days, + + + feedback_url, + create_time, @@ -800,6 +904,27 @@ #{replenishSalaryItemSetting}, + + #{autoSendStatus}, + + + #{autoSendCycleType}, + + + #{autoSendDayOfMonth}, + + + #{autoSendTimeOfDay}, + + + #{ackFeedbackStatus}, + + + #{autoAckDays}, + + + #{feedbackUrl}, + #{createTime}, diff --git a/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.java b/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.java index f210fe344..baf9716cb 100644 --- a/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.java +++ b/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.java @@ -1,7 +1,6 @@ package com.engine.salary.mapper.salaryitem; import com.engine.salary.entity.salaryitem.po.SysSalaryItemPO; -import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -62,5 +61,6 @@ public interface SysSalaryItemMapper { * @return 返回影响行数 */ int delete(SysSalaryItemPO SysSalaryItemPO); - + + SysSalaryItemPO selectOneByName(String name); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.xml b/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.xml index ed5027616..f8faf9c90 100644 --- a/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.xml +++ b/src/com/engine/salary/mapper/salaryitem/SysSalaryItemMapper.xml @@ -609,5 +609,12 @@ AND delete_type = 0 + + \ No newline at end of file diff --git a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java index cc1fe88b3..558d84eb0 100644 --- a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java +++ b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.java @@ -2,7 +2,6 @@ package com.engine.salary.mapper.siarchives; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesFundSchemePO; -import com.engine.salary.entity.siarchives.po.InsuranceArchivesSocialSchemePO; import org.apache.ibatis.annotations.Param; import java.util.Collection; @@ -80,4 +79,10 @@ public interface FundSchemeMapper { * @param ids */ void batchUpdateEndTimeToNull(@Param("ids")List ids); + + /** + * 根据id删除 + * @param fundArchiveDelIds + */ + void deleteByIds(@Param("ids")List fundArchiveDelIds); } diff --git a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml index 4f00975bc..17416d13c 100644 --- a/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/FundSchemeMapper.xml @@ -105,6 +105,19 @@ + + UPDATE hrsa_fund_archives + SET delete_type = 1 + WHERE delete_type = 0 + + AND id IN + + #{id} + + + + + UPDATE hrsa_fund_archives diff --git a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java index 7941f8cef..4f308f1b4 100644 --- a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java +++ b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.java @@ -107,4 +107,10 @@ public interface InsuranceBaseInfoMapper { * @param insuranceArchivesBaseInfoPOS */ void batchUpdate(@Param("collection") Collection insuranceArchivesBaseInfoPOS); + + /** + * 根据id删除 + * @param archiveDelIds + */ + void deleteByIds(@Param("ids")List archiveDelIds); } diff --git a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml index 7c9885e1d..2d63845b8 100644 --- a/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/InsuranceBaseInfoMapper.xml @@ -174,6 +174,18 @@ + + UPDATE hrsa_insurance_base_info + SET delete_type = 1 + WHERE delete_type = 0 + + AND id IN + + #{id} + + + + UPDATE hrsa_insurance_base_info diff --git a/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.java b/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.java index 68aa76146..80d9785f4 100644 --- a/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.java +++ b/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.java @@ -1,9 +1,7 @@ package com.engine.salary.mapper.siarchives; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; -import com.engine.salary.entity.siarchives.po.InsuranceArchivesFundSchemePO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesOtherSchemePO; -import com.engine.salary.entity.siarchives.po.InsuranceArchivesSocialSchemePO; import org.apache.ibatis.annotations.Param; import java.util.Collection; @@ -73,4 +71,10 @@ public interface OtherSchemeMapper { * @param ids */ void batchUpdateEndTimeToNull(@Param("ids")List ids); + + /** + * 根据id删除 + * @param otherArchiveDelIds + */ + void deleteByIds(@Param("ids") List otherArchiveDelIds); } diff --git a/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.xml b/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.xml index c049d2640..fcfd38706 100644 --- a/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/OtherSchemeMapper.xml @@ -92,6 +92,18 @@ + + UPDATE hrsa_other_archives + SET delete_type = 1 + WHERE delete_type = 0 + AND id IN + + + #{id} + + + + UPDATE hrsa_other_archives diff --git a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java index 8dca91da0..28f1bc511 100644 --- a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java +++ b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.java @@ -3,7 +3,6 @@ package com.engine.salary.mapper.siarchives; import com.engine.salary.entity.siarchives.param.InsuranceArchivesListParam; import com.engine.salary.entity.siarchives.po.InsuranceArchivesEmployeePO; import com.engine.salary.entity.siarchives.po.InsuranceArchivesSocialSchemePO; -import com.engine.salary.entity.sischeme.po.InsuranceSchemeDetailPO; import org.apache.ibatis.annotations.Param; import java.util.Collection; @@ -108,4 +107,10 @@ public interface SocialSchemeMapper { * @param ids */ void batchUpdateEndTimeToNull(@Param("ids")List ids); + + /** + * 根据id删除 + * @param socialArchiveDelIds + */ + void deleteByIds(@Param("ids")List socialArchiveDelIds); } diff --git a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml index 4df4edbf9..10395159b 100644 --- a/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml +++ b/src/com/engine/salary/mapper/siarchives/SocialSchemeMapper.xml @@ -101,6 +101,18 @@ + + UPDATE hrsa_social_archives + SET delete_type = 1 + WHERE delete_type = 0 + + AND id IN + + #{id} + + + + UPDATE hrsa_social_archives diff --git a/src/com/engine/salary/mapper/sys/SalarySysConfMapper.java b/src/com/engine/salary/mapper/sys/SalarySysConfMapper.java index 36e3a4d37..88f07ce7f 100644 --- a/src/com/engine/salary/mapper/sys/SalarySysConfMapper.java +++ b/src/com/engine/salary/mapper/sys/SalarySysConfMapper.java @@ -1,6 +1,7 @@ package com.engine.salary.mapper.sys; import com.engine.salary.sys.entity.po.SalarySysConfPO; +import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; @@ -73,4 +74,6 @@ public interface SalarySysConfMapper { * @date 2022/11/9 21:09 */ Date getTaxDeclarationRebootDate(); + + List getListByCodes(@Param("codes") List codes); } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/sys/SalarySysConfMapper.xml b/src/com/engine/salary/mapper/sys/SalarySysConfMapper.xml index 3d0c299c4..a30c8e822 100644 --- a/src/com/engine/salary/mapper/sys/SalarySysConfMapper.xml +++ b/src/com/engine/salary/mapper/sys/SalarySysConfMapper.xml @@ -237,4 +237,17 @@ select update_time from HRSA_SALARY_SYS_CONF WHERE conf_key = 'taxDeclarationFunction' + + \ No newline at end of file diff --git a/src/com/engine/salary/service/SIArchivesService.java b/src/com/engine/salary/service/SIArchivesService.java index 111ef9d8e..ee80e8731 100644 --- a/src/com/engine/salary/service/SIArchivesService.java +++ b/src/com/engine/salary/service/SIArchivesService.java @@ -95,4 +95,10 @@ public interface SIArchivesService { * 处理福利档案增量数据 */ void handleChangeData(long currentEmployeeId); + + /** + * 删除档案 + * @param longs + */ + void deleteArchive(Collection longs); } diff --git a/src/com/engine/salary/service/SalaryArchiveService.java b/src/com/engine/salary/service/SalaryArchiveService.java index 9ef63a791..f45bfc388 100644 --- a/src/com/engine/salary/service/SalaryArchiveService.java +++ b/src/com/engine/salary/service/SalaryArchiveService.java @@ -225,4 +225,10 @@ public interface SalaryArchiveService { * @param currentEmployeeId */ void handleChangeData(Long currentEmployeeId); + + /** + * 删除薪资档案 + * @param salaryArchiveIds + */ + void deleteSalaryArchive(Collection salaryArchiveIds); } diff --git a/src/com/engine/salary/service/SalaryBillBaseSetService.java b/src/com/engine/salary/service/SalaryBillBaseSetService.java index 42a2b5f45..4ea8ef0a6 100644 --- a/src/com/engine/salary/service/SalaryBillBaseSetService.java +++ b/src/com/engine/salary/service/SalaryBillBaseSetService.java @@ -1,5 +1,6 @@ package com.engine.salary.service; +import com.engine.salary.entity.salaryBill.dto.SalaryBillAckFeedbackDTO; import com.engine.salary.entity.salaryBill.dto.SalaryBillWatermarkDTO; import com.engine.salary.entity.salaryBill.param.SalaryBaseSetSaveParam; @@ -28,7 +29,7 @@ public interface SalaryBillBaseSetService { // SalaryBillAckFeedbackDTO getAckFeedbackSetting(); /** - * 保存工资单水印设置 + * 保存工资单模板基础设置 * * @param saveParam * @return @@ -41,4 +42,10 @@ public interface SalaryBillBaseSetService { * @return */ String previewWaterMark(Map wmSetting); + + /** + * 获取默认工资单确认反馈设置 + * @return + */ + SalaryBillAckFeedbackDTO getDefaultAckFeedbackSetting(); } diff --git a/src/com/engine/salary/service/SalaryBillService.java b/src/com/engine/salary/service/SalaryBillService.java index 9a37671a0..0f8b9030a 100644 --- a/src/com/engine/salary/service/SalaryBillService.java +++ b/src/com/engine/salary/service/SalaryBillService.java @@ -30,6 +30,18 @@ public interface SalaryBillService { */ List> getSendInfoList(Long sendId, List ids); + /** + * 确认工资单 + * @param salaryInfoId + */ + void confirmSalaryBill(Long salaryInfoId); + + /** + * 工资单反馈 + * @param salaryInfoId + */ + void feedBackSalaryBill(Long salaryInfoId); + /** * 工资单撤回 * diff --git a/src/com/engine/salary/service/SalarySendService.java b/src/com/engine/salary/service/SalarySendService.java index 36864da21..90da3440f 100644 --- a/src/com/engine/salary/service/SalarySendService.java +++ b/src/com/engine/salary/service/SalarySendService.java @@ -2,6 +2,7 @@ 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.SalarySendInfoPO; import com.engine.salary.entity.salaryBill.po.SalarySendPO; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; @@ -187,4 +188,32 @@ public interface SalarySendService { * @param param */ Boolean checkMobileCode(SMSCodeCheckParam param); + + /** + * 获取工资单id下需要发放的工资单明细 + * @return + */ + List getNeedSendInfoList(List salarySendIds); + + /** + * 获取这些模板下未发放完的工资单 + * @param salarySobIds + * @return + */ + List getNeedSendListBySalarySobIds(List salarySobIds); + + /** + * 获取所有为确认的工资单 + * @return + * @return + */ + List listUnConfirmedSendInfo(List salarySobIds); + + /** + * 自动确认工资单 + * @param needAutoIds + */ + void autoConfirmSalaryBill(List needAutoIds); + + List getByIds(List salarySendId); } diff --git a/src/com/engine/salary/service/SalaryTemplateService.java b/src/com/engine/salary/service/SalaryTemplateService.java index 6042da567..bdf8826cb 100644 --- a/src/com/engine/salary/service/SalaryTemplateService.java +++ b/src/com/engine/salary/service/SalaryTemplateService.java @@ -84,13 +84,21 @@ public interface SalaryTemplateService { List> selectSalarySobList(); /** - * 获取薪资项目设置 + * 获取薪资项目设置(不包含已隐藏的薪资项目、分类) * * @param salarySobId * @return */ List getSalaryItemSet(Long salarySobId, boolean isReplenish); + /** + * 获取薪资项目设置(包含已隐藏的薪资项目、分类) + * + * @param salarySobId + * @return + */ + List getSalaryItemSetContainHide(Long salarySobId, boolean isReplenish); + /** * 获取默认工资单模板 * @@ -112,4 +120,15 @@ public interface SalaryTemplateService { * @return */ PageInfo listPage(SalaryTemplateQueryParam queryParam); + + /** + * 获取所有设置了定时发送的默认工资单模板 + */ + List getAutoSendTemplate(); + + /** + * 获取所有开启了工资单确认反馈的默认工资单模板 + * @return + */ + List listNeedAckDefaultTemplate(); } diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index ebb461705..b8a8ecd91 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -637,11 +637,11 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction @Override public String autoAddAll(Date yearMonth, Boolean isAdmin) { String cacheKey = "addUpDeduction_autoAddAll_processing"; + Object objVal = Util_DataCache.getObjVal( cacheKey); + if(objVal != null){ + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(135788, "一键累计过于频繁,请稍后再试")); + } try { - Object objVal = Util_DataCache.getObjVal( cacheKey); - if(objVal != null){ - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(135788, "一键累计过于频繁,请稍后再试")); - } Util_DataCache.setObjVal(cacheKey,true ); //如果是定时任务直接查询所有,isAdmin传true boolean isChief = Boolean.TRUE.equals(isAdmin) @@ -717,14 +717,15 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction AddUpDeduction oldInfo = Optional.ofNullable(currentEmpInfo.get(employeeId)) .flatMap(c -> c.stream().findFirst()) .orElse(null); + Date now = new Date(); if (oldInfo == null) { - addUpDeduction.setCreateTime(yearMonth); - addUpDeduction.setUpdateTime(yearMonth); + addUpDeduction.setCreateTime(now); + addUpDeduction.setUpdateTime(now); insertList.add(encryptUtil.encrypt(addUpDeduction, AddUpDeduction.class)); } else { addUpDeduction.setId(oldInfo.getId()); addUpDeduction.setCreateTime(oldInfo.getCreateTime()); - addUpDeduction.setUpdateTime(yearMonth); + addUpDeduction.setUpdateTime(now); updateList.add(encryptUtil.encrypt(addUpDeduction, AddUpDeduction.class)); } }); diff --git a/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java b/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java index fb00653d7..3ea100d50 100644 --- a/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIArchivesServiceImpl.java @@ -27,6 +27,8 @@ import com.engine.salary.mapper.siarchives.SocialSchemeMapper; import com.engine.salary.service.SIArchivesService; import com.engine.salary.service.TaxAgentEmpChangeService; import com.engine.salary.service.TaxAgentService; +import com.engine.salary.sys.constant.SalarySysConstant; +import com.engine.salary.sys.entity.po.SalarySysConfPO; import com.engine.salary.sys.entity.vo.OrderRuleVO; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; @@ -349,6 +351,56 @@ public class SIArchivesServiceImpl extends Service implements SIArchivesService log.info("各操作计时 {}", sw.prettyPrint()); Util_DataCache.setObjVal("welfareChangeSign", "0"); } + + /** + * 删除档案 + * @param archiveIds + */ + @Override + public void deleteArchive(Collection archiveIds) { + if(CollectionUtils.isEmpty(archiveIds)){ + throw new SalaryRunTimeException("社保福利档案参数为空!"); + } + SalarySysConfPO canDelete = getSalarySysConfService(user).getOneByCode(SalarySysConstant.SALARY_ARCHIVE_DELETE); + if(Objects.isNull(canDelete) || StringUtils.equals(canDelete.getConfValue(),"0") ){ + throw new SalaryRunTimeException("不允许删除社保福利档案,请先开启删除档案规则配置!"); + } + List insuranceArchivesList = getInsuranceBaseInfoMapper().listByIds(archiveIds); + + //查询当前登录人员管理的个税扣缴义务人 + List canDeleteTaxAgentIds = getTaxAgentService(user).listAllTaxAgentsAsAdmin((long) user.getUID()) + .stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + boolean err = insuranceArchivesList.stream().anyMatch(po -> !canDeleteTaxAgentIds.contains(po.getPaymentOrganization())); + + if (CollectionUtils.isEmpty(insuranceArchivesList) || err) { + throw new SalaryRunTimeException("社保档案不存在,或没有权限删除该社保案!"); + } + + Optional fixedList = insuranceArchivesList.stream().filter(archive -> !StringUtils.equals(archive.getRunStatus(), EmployeeStatusEnum.STAY_ADD.getValue()) + && !StringUtils.equals(archive.getRunStatus(), EmployeeStatusEnum.STOP_PAYMENT_FROM_ADD.getValue())).findFirst(); + if(fixedList.isPresent()){ + throw new SalaryRunTimeException("在缴员工、待减员、停止缴纳-来自待减员,无法删除薪资档案!"); + } + List archiveDelIds = insuranceArchivesList.stream().map(InsuranceArchivesBaseInfoPO::getId).collect(Collectors.toList()); + List socialArchiveDelIds = insuranceArchivesList.stream().map(InsuranceArchivesBaseInfoPO::getSocialArchivesId).collect(Collectors.toList()); + List fundArchiveDelIds = insuranceArchivesList.stream().map(InsuranceArchivesBaseInfoPO::getFundArchivesId).collect(Collectors.toList()); + List otherArchiveDelIds = insuranceArchivesList.stream().map(InsuranceArchivesBaseInfoPO::getOtherArchivesId).collect(Collectors.toList()); + + // 删除社保档案主表及3张明细表数据 + if(CollectionUtils.isNotEmpty(archiveDelIds)){ + getInsuranceBaseInfoMapper().deleteByIds(archiveDelIds); + } + if(CollectionUtils.isNotEmpty(socialArchiveDelIds)){ + getSocialSchemeMapper().deleteByIds(socialArchiveDelIds); + } + if(CollectionUtils.isNotEmpty(fundArchiveDelIds)){ + getFundSchemeMapper().deleteByIds(fundArchiveDelIds); + } + if(CollectionUtils.isNotEmpty(otherArchiveDelIds)){ + getOtherSchemeMapper().deleteByIds(otherArchiveDelIds); + } + } + //新增社保、公积金、其他福利档案、福利档案基础信息 private List addNewInsuranceBaseInfo(List baseInfoPOList, Long currentEmployeeId) { List socialList = new ArrayList<>(); @@ -488,7 +540,10 @@ public class SIArchivesServiceImpl extends Service implements SIArchivesService param.setDimissionDateEnd(param.getDimissionDate()[1]); } if (Objects.equals("fromQuickSearch", param.getDataSource())) { - request.setStatuses(param.getStatuses()); +// request.setStatuses(param.getStatuses()); + if (StringUtils.isNotBlank(param.getStatusesStr())) { + request.setStatuses(Arrays.stream(param.getStatusesStr().split(",")).map(String::new).collect(Collectors.toList())); + } request.setKeyword(param.getUserName()); } else { request = param; diff --git a/src/com/engine/salary/service/impl/SIImportServiceImpl.java b/src/com/engine/salary/service/impl/SIImportServiceImpl.java index ae235c3fc..ecd8f016a 100644 --- a/src/com/engine/salary/service/impl/SIImportServiceImpl.java +++ b/src/com/engine/salary/service/impl/SIImportServiceImpl.java @@ -31,6 +31,7 @@ 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 org.apache.commons.lang.StringUtils; import org.apache.ibatis.session.SqlSession; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import weaver.conn.mybatis.MyBatisFactory; @@ -103,7 +104,9 @@ public class SIImportServiceImpl extends Service implements SIImportService { param.setDimissionDateEnd(param.getDimissionDate()[1]); } if (Objects.equals("fromQuickSearch", param.getDataSource())) { - request.setStatuses(param.getStatuses()); + if (StringUtils.isNotBlank(param.getStatusesStr())) { + request.setStatuses(Arrays.stream(param.getStatusesStr().split(",")).map(String::new).collect(Collectors.toList())); + } request.setKeyword(param.getUserName()); request.setStartNum(param.getStartNum()); request.setPageSize(param.getPageSize()); diff --git a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java index 69eb5b02e..8c46d7627 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctCalculateServiceImpl.java @@ -25,6 +25,7 @@ import com.engine.salary.entity.salarysob.po.SalarySobItemPO; import com.engine.salary.enums.salaryformula.SalaryFormulaReferenceEnum; import com.engine.salary.formlua.entity.standard.ExcelResult; import com.engine.salary.service.*; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; import com.engine.salary.util.SalaryEntityUtil; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; @@ -309,7 +310,7 @@ public class SalaryAcctCalculateServiceImpl extends Service implements SalaryAcc */ private String handleConsolidatedTax(String resultValue, SalaryItemPO salaryItemPO, SalaryAcctCalculateBO salaryAcctCalculateBO, List otherSalaryAcctEmployeePOS, List otherSalaryAcctResultPOS) { // 如果相同税款所属期内没有其他薪资核算人员,就不存在合并计税 - if (CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS) || CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) { + if (salaryAcctCalculateBO.getTaxDeclarationFunction() == TaxDeclarationFunctionEnum.CLOSURE || CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS) || CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) { return resultValue; } // 相同税款所属期内其他薪资核算记录 diff --git a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java index 25201e0b8..459873c3e 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctRecordServiceImpl.java @@ -329,32 +329,32 @@ public class SalaryAcctRecordServiceImpl extends Service implements SalaryAcctRe // 获取个税申报功能状态 TaxDeclarationFunctionEnum taxDeclarationFunctionEnum = getSalarySysConfService(user).getTaxDeclaration(); - if (taxDeclarationFunctionEnum.getValue().equals(TaxDeclarationFunctionEnum.CLOSURE.getValue())) { - // 关闭了个税申报功能 - // 如果某个月(薪资所属期)还未归档,不可以新建之后月份的薪资核算 - SalaryAcctRecordPO notArchivedSalaryAcctRecordPO = salaryAcctRecords.stream() - .filter(e -> Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()) - && e.getSalaryMonth().before(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getSalaryMonth().atDay(1)))) - .findAny() - .orElse(null); - if (Objects.nonNull(notArchivedSalaryAcctRecordPO)) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98754, "薪资所属期{0}的薪资核算结果还未归档,不能新建薪资所属期{1}的薪资核算") - .replace("{0}", SalaryDateUtil.localDate2YearMonth(notArchivedSalaryAcctRecordPO.getTaxCycle()).toString()) - .replace("{1}", salarySobCycleDTO.getTaxCycle().toString())); - } - // 如果有某个月(薪资所属期)已经归档了,不可以新建之前月份的薪资核算 - SalaryAcctRecordPO havaSalaryAcctRecordPO = salaryAcctRecords.stream() - .filter(e -> Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.ARCHIVED.getValue()) - && e.getTaxCycle().after(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getSalaryMonth().atDay(1)))) - .findAny() - .orElse(null); - if (Objects.nonNull(havaSalaryAcctRecordPO)) { - throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98755, "薪资所属期{0}的薪资核算结果已经归档,不能新建薪资所属期{1}的薪资核算") - .replace("{0}", SalaryDateUtil.localDate2YearMonth(havaSalaryAcctRecordPO.getSalaryMonth()).toString()) - .replace("{1}", salarySobCycleDTO.getSalaryMonth().toString())); - } - - } +// if (taxDeclarationFunctionEnum.getValue().equals(TaxDeclarationFunctionEnum.CLOSURE.getValue())) { +// // 关闭了个税申报功能 +// // 如果某个月(薪资所属期)还未归档,不可以新建之后月份的薪资核算 +// SalaryAcctRecordPO notArchivedSalaryAcctRecordPO = salaryAcctRecords.stream() +// .filter(e -> Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.NOT_ARCHIVED.getValue()) +// && e.getSalaryMonth().before(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getSalaryMonth().atDay(1)))) +// .findAny() +// .orElse(null); +// if (Objects.nonNull(notArchivedSalaryAcctRecordPO)) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98754, "薪资所属期{0}的薪资核算结果还未归档,不能新建薪资所属期{1}的薪资核算") +// .replace("{0}", SalaryDateUtil.localDate2YearMonth(notArchivedSalaryAcctRecordPO.getTaxCycle()).toString()) +// .replace("{1}", salarySobCycleDTO.getTaxCycle().toString())); +// } +// // 如果有某个月(薪资所属期)已经归档了,不可以新建之前月份的薪资核算 +// SalaryAcctRecordPO havaSalaryAcctRecordPO = salaryAcctRecords.stream() +// .filter(e -> Objects.equals(e.getStatus(), SalaryAcctRecordStatusEnum.ARCHIVED.getValue()) +// && e.getTaxCycle().after(SalaryDateUtil.localDateToDate(salarySobCycleDTO.getSalaryMonth().atDay(1)))) +// .findAny() +// .orElse(null); +// if (Objects.nonNull(havaSalaryAcctRecordPO)) { +// throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98755, "薪资所属期{0}的薪资核算结果已经归档,不能新建薪资所属期{1}的薪资核算") +// .replace("{0}", SalaryDateUtil.localDate2YearMonth(havaSalaryAcctRecordPO.getSalaryMonth()).toString()) +// .replace("{1}", salarySobCycleDTO.getSalaryMonth().toString())); +// } +// +// } if (taxDeclarationFunctionEnum.getValue().equals(TaxDeclarationFunctionEnum.OPEN.getValue())) { // 开启了个税申报功能 // 如果某个月(税款所属期)已经归档了,不可以新建之前月份的薪资核算 diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index 0fbcf6ee6..c2b522a62 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -35,6 +35,7 @@ import com.engine.salary.report.service.impl.SalaryStatisticsReportServiceImpl; import com.engine.salary.service.*; import com.engine.salary.sys.constant.SalarySysConstant; import com.engine.salary.sys.entity.po.SalarySysConfPO; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryDateUtil; @@ -754,7 +755,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe BlockingDeque calculateResults = new LinkedBlockingDeque<>(partition.size()); // 12.3、生成本次运算的key String calculateKey = UUID.randomUUID().toString(); - // 12.4、多线程运算,运算结果存放在临时表中 + // 12.4、是否采用系统算税 + TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration(); + // 12.5、多线程运算,运算结果存放在临时表中 for (List acctEmployeePOS : partition) { SalaryAcctCalculateBO salaryAcctCalculateBO = new SalaryAcctCalculateBO() .setSalaryAcctRecordPO(salaryAcctRecordPO) @@ -774,7 +777,8 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe .setIssuedFieldIds(issuedFieldIds) .setChildMonitor(childMonitor) .setResults(calculateResults) - .setCalculateKey(calculateKey); + .setCalculateKey(calculateKey) + .setTaxDeclarationFunction(taxDeclarationFunction); List finalSalarySobBackItems = salarySobBackItems; LocalRunnable localRunnable = new LocalRunnable() { @Override diff --git a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java index 2ce7e1916..fd43040ac 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveExcelServiceImpl.java @@ -388,8 +388,8 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // 4.注释 List excelComments = Lists.newArrayList(); String requireI18n = SalaryI18nUtil.getI18nLabel(100344, "必填"); - excelComments.add(new ExcelComment(0, 0, 3, 2, requireI18n)); - excelComments.add(new ExcelComment(1, 0, 4, 2, requireI18n)); + excelComments.add(new ExcelComment(0, 0, 1, 2, requireI18n)); + excelComments.add(new ExcelComment(1, 0, 2, 2, requireI18n)); //收入所得项目 // List incomeCategoryOptions = Arrays.stream(IncomeCategoryEnum.values()).map(e -> // SalaryI18nUtil.getI18nLabel(e.getLabelId(), e.getDefaultLabel()) @@ -399,16 +399,16 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch // SalaryArchiveExcelBO.createExcelComment(excelComments, requireI18n + ',' + SalaryI18nUtil.getI18nLabel(127641, "多个账套之间用,分隔"), 0, 0, 3, 3); // int i = enableHr ? 10 : 9; if (isPendingList) { - excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'"))); + excelComments.add(new ExcelComment(6, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'"))); // excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'"))); } else if (isFixedList) { if (isInit) { - excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); - excelComments.add(new ExcelComment(6, 0, 9, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'"))); - excelComments.add(new ExcelComment(7, 0, 10, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); + excelComments.add(new ExcelComment(6, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); + excelComments.add(new ExcelComment(7, 0, 9, 2, SalaryI18nUtil.getI18nLabel(100458, "格式样例为'2022-01-01'、'2022/1/1'"))); + excelComments.add(new ExcelComment(8, 0, 10, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); } else if (isSalaryItemAdjust) { - excelComments.add(new ExcelComment(5, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,可填写如:入职,转正,调薪,调岗调薪,离职,其他,初始化"))); - excelComments.add(new ExcelComment(6, 0, 9, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); + excelComments.add(new ExcelComment(6, 0, 8, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,可填写如:入职,转正,调薪,调岗调薪,离职,其他,初始化"))); + excelComments.add(new ExcelComment(7, 0, 9, 2, SalaryI18nUtil.getI18nLabel(100458, "必填,格式样例为'2022-01-01'、'2022/1/1'"))); } } else if (isSuspendList) { // SalaryArchiveExcelBO.createExcelComment(excelComments, SalaryI18nUtil.getI18nLabel(109736, "格式样例为'2022-01-01'、'2022/1/1'"), 0, 0, i + 1, i + 1); diff --git a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java index 3d4724e55..b6c786fc4 100644 --- a/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryArchiveServiceImpl.java @@ -307,6 +307,37 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe } + @Override + public void deleteSalaryArchive(Collection salaryArchiveIds) { + if(CollectionUtils.isEmpty(salaryArchiveIds)){ + throw new SalaryRunTimeException("薪资档案参数为空!"); + } + SalarySysConfPO canDelete = getSalarySysConfService(user).getOneByCode(SalarySysConstant.SALARY_ARCHIVE_DELETE); + if(Objects.isNull(canDelete) || StringUtils.equals(canDelete.getConfValue(),"0") ){ + throw new SalaryRunTimeException("不允许删除薪资档案,请先开启删除档案规则配置!"); + } + List salaryArchiveList = getSalaryArchiveMapper().listSome(SalaryArchivePO.builder().ids(salaryArchiveIds).build()); + + //查询当前登录人员管理的个税扣缴义务人 + List canDeleteTaxAgentIds = getTaxAgentService(user).listAllTaxAgentsAsAdmin((long) user.getUID()) + .stream().map(TaxAgentPO::getId).collect(Collectors.toList()); + boolean err = salaryArchiveList.stream().anyMatch(po -> !canDeleteTaxAgentIds.contains(po.getTaxAgentId())); + if(CollectionUtils.isEmpty(salaryArchiveList) || err){ + throw new SalaryRunTimeException("薪资档案不存在,或没有权限删除该薪资档案!"); + } + Optional fixedList = salaryArchiveList.stream().filter(archive -> !StringUtils.equals(archive.getRunStatus(), SalaryArchiveStatusEnum.PENDING.getValue()) + && !StringUtils.equals(archive.getRunStatus(), SalaryArchiveStatusEnum.STOP_FROM_PENDING.getValue())).findFirst(); + if(fixedList.isPresent()){ + throw new SalaryRunTimeException("发薪员工、待停薪员工、停薪_来自待停薪,无法删除薪资档案!"); + } + List deleteIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList()); + // 删除薪资档案及档案项目 + if(CollectionUtils.isNotEmpty(deleteIds)){ + getSalaryArchiveMapper().deleteByIds(deleteIds); + getSalaryArchiveItemMapper().deleteBySalaryArchiveId(deleteIds); + } + } + @Override public List list(SalaryArchiveQueryParam queryParam) { diff --git a/src/com/engine/salary/service/impl/SalaryBillBaseSetServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillBaseSetServiceImpl.java index 28d96c728..73a5a184b 100644 --- a/src/com/engine/salary/service/impl/SalaryBillBaseSetServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillBaseSetServiceImpl.java @@ -6,6 +6,7 @@ import com.engine.core.impl.Service; import com.engine.salary.constant.SalaryDefaultTenantConstant; import com.engine.salary.entity.datacollection.DataCollectionEmployee; import com.engine.salary.entity.salaryBill.bo.SalaryBillBO; +import com.engine.salary.entity.salaryBill.dto.SalaryBillAckFeedbackDTO; import com.engine.salary.entity.salaryBill.dto.SalaryBillWatermarkDTO; import com.engine.salary.entity.salaryBill.param.SalaryBaseSetSaveParam; import com.engine.salary.entity.salaryBill.po.SalaryBillWatermarkPO; @@ -13,7 +14,12 @@ import com.engine.salary.enums.salarybill.SalaryTemplateWatermarkTypeEnum; import com.engine.salary.service.SalaryBillBaseSetService; import com.engine.salary.service.SalaryBillWatermarkService; import com.engine.salary.service.SalaryEmployeeService; +import com.engine.salary.sys.constant.SalarySysConstant; +import com.engine.salary.sys.entity.po.SalarySysConfPO; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.JsonUtil; +import com.engine.salary.util.SalaryEntityUtil; import com.google.common.collect.Lists; import dm.jdbc.util.IdGenerator; import org.apache.commons.collections.CollectionUtils; @@ -21,10 +27,9 @@ import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.StringUtils; import weaver.hrm.User; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; + +import static com.engine.salary.sys.constant.SalarySysConstant.*; /** * @Description: 工资单水印 @@ -42,6 +47,10 @@ public class SalaryBillBaseSetServiceImpl extends Service implements SalaryBillB return ServiceUtil.getService(SalaryEmployeeServiceImpl.class, user); } + public SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + @Override public SalaryBillWatermarkDTO getWatermarkSetting() { List list = getSalaryBillWatermarkService(user).listAll(); @@ -96,23 +105,16 @@ public class SalaryBillBaseSetServiceImpl extends Service implements SalaryBillB .build()); -// // 工资单确认和反馈 =========================================================== -// new LambdaUpdateChainWrapper<>(salaryBillAckFeedbackMapper) -// .eq(SalaryBillAckFeedbackPO::getDeleteType, 0) -// .eq(SalaryBillAckFeedbackPO::getTenantKey, tenantKey) -// .set(SalaryBillAckFeedbackPO::getDeleteType, 3) -// .update(); -// salaryBillAckFeedbackMapper.insert(SalaryBillAckFeedbackPO.builder() -// .id(IdGenerator.generate()) -// .ackStatus(saveParam.getAckStatus() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO) -// .feedbackStatus(saveParam.getFeedbackStatus() ? NumberUtils.INTEGER_ONE : NumberUtils.INTEGER_ZERO) -// .createTime(now) -// .updateTime(now) -// .creator(employeeId) -// .deleteType(NumberUtils.INTEGER_ZERO) -// .tenantKey(tenantKey) -// .build()); - + // 工资单确认和反馈 =========================================================== + SalaryBillAckFeedbackDTO ackFeedbackSetting = saveParam.getAckFeedbackSetting(); + // 1.保存确认反馈开关状态 + getSalarySysConfService(user).saveSettingByType(ackFeedbackSetting.getAckStatus(), SALARY_SEND_FEEDBACK, "工资单确认反馈状态", "billSend"); + if(StringUtils.equals(ackFeedbackSetting.getAckStatus(),"1")){ + // 2.保存反馈地址 + getSalarySysConfService(user).saveSettingByType(ackFeedbackSetting.getFeedBackUrl(), SALARY_FEEDBACK_URL, "工资单反馈地址", "billSend"); + // 3.保存自动确认时间 + getSalarySysConfService(user).saveSettingByType(ackFeedbackSetting.getAutoAckDays().toString(), SALARY_AUTO_ACK_DAYS, "工资单反馈自动确认", "billSend"); + } return StringUtils.EMPTY; } @@ -126,4 +128,30 @@ public class SalaryBillBaseSetServiceImpl extends Service implements SalaryBillB DataCollectionEmployee simpleEmployee = getSalaryEmployeeService(user).getEmployeeById(Long.valueOf(user.getUID())); return SalaryBillBO.handleWmText(wmText, wmTextFieldIds, simpleEmployee); } + + @Override + public SalaryBillAckFeedbackDTO getDefaultAckFeedbackSetting() { + // 获取反馈开启状态、自动确认时长、反馈地址 + List codes = Arrays.asList(SalarySysConstant.SALARY_SEND_FEEDBACK, SalarySysConstant.SALARY_AUTO_ACK_DAYS, SalarySysConstant.SALARY_FEEDBACK_URL); + List sysConfList= getSalarySysConfService(user).getListByCodes(codes); + Map sysConfMap = SalaryEntityUtil.convert2Map(sysConfList, SalarySysConfPO::getConfKey, SalarySysConfPO::getConfValue); + + SalaryBillAckFeedbackDTO defaultAckFeedBackDTO = SalaryBillAckFeedbackDTO.builder().build(); + String ackStatus = sysConfMap.getOrDefault(SalarySysConstant.SALARY_SEND_FEEDBACK, "0"); + if (StringUtils.equals(ackStatus,"0")) { + // 未开启工资单确认 + defaultAckFeedBackDTO.setAckStatus("0"); + defaultAckFeedBackDTO.setAutoAckDays(0); + defaultAckFeedBackDTO.setFeedBackUrl("/"); + return defaultAckFeedBackDTO; + } + defaultAckFeedBackDTO.setAckStatus(ackStatus); + // 获取超时自动确认时间 + Integer autoAckDays = Integer.valueOf(sysConfMap.getOrDefault(SalarySysConstant.SALARY_AUTO_ACK_DAYS, "7")); + defaultAckFeedBackDTO.setAutoAckDays(autoAckDays); + // 反馈地址 + String feedbackUrl = sysConfMap.getOrDefault(SalarySysConstant.SALARY_FEEDBACK_URL, ""); + defaultAckFeedBackDTO.setFeedBackUrl(feedbackUrl); + return defaultAckFeedBackDTO; + } } diff --git a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java index 8700fb87f..6b438b564 100644 --- a/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryBillServiceImpl.java @@ -24,9 +24,7 @@ import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO; import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.entity.taxagent.po.TaxAgentPO; -import com.engine.salary.enums.salarybill.MessageChannelEnum; -import com.engine.salary.enums.salarybill.SalarySendStatusEnum; -import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum; +import com.engine.salary.enums.salarybill.*; import com.engine.salary.enums.salarysend.SalarySendGrantTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salarybill.SalarySendInfoMapper; @@ -42,6 +40,7 @@ import com.weaver.util.threadPool.entity.LocalRunnable; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; @@ -426,6 +425,28 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService .buildDetailList(list, salaryAcctEmployees, salaryAcctResultValues); } + @Override + public void confirmSalaryBill(Long salaryInfoId) { + SalarySendInfoPO sendInfoPO = getSalarySendInfoMapper().getById(salaryInfoId); + if(ObjectUtils.isEmpty(sendInfoPO)){ + throw new SalaryRunTimeException("工资单不存在或已被删除!"); + } + sendInfoPO.setBillConfirmStatus(BillConfimStatusEnum.CONFIRMED.getValue()); + sendInfoPO.setUpdateTime(new Date()); + getSalarySendInfoMapper().updateIgnoreNull(sendInfoPO); + } + + @Override + public void feedBackSalaryBill(Long salaryInfoId) { + SalarySendInfoPO sendInfoPO = getSalarySendInfoMapper().getById(salaryInfoId); + if(ObjectUtils.isEmpty(sendInfoPO)){ + throw new SalaryRunTimeException("工资单不存在或已被删除!"); + } + sendInfoPO.setBillConfirmStatus(BillConfimStatusEnum.FEEDBACK.getValue()); + sendInfoPO.setUpdateTime(new Date()); + getSalarySendInfoMapper().updateIgnoreNull(sendInfoPO); + } + public List> getSendInfoList(Long sendId, List ids) { SalarySendPO salarySend = getSalarySendMapper().getById(sendId); @@ -631,6 +652,9 @@ public class SalaryBillServiceImpl extends Service implements SalaryBillService po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); po.setSendTime(sendTime); po.setSalaryTemplate(JsonUtil.toJsonString(salaryTemplate)); + po.setBillReadStatus(BillReadStatusEnum.UNREAD.getValue()); + po.setBillConfirmStatus(BillConfimStatusEnum.UNCONFIRMED.getValue()); + po.setSendEmployeeId(Long.valueOf(user.getUID())); partition.forEach(idsp -> { salarySendInfoMapper.updateGrantWithdraw(po, salarySend.getId(), Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), idsp); }); diff --git a/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java b/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java index 248ab4b6b..95b6bf39e 100644 --- a/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryItemServiceImpl.java @@ -71,7 +71,7 @@ public class SalaryItemServiceImpl extends Service implements SalaryItemService private SysSalaryItemBiz sysSalaryItemBiz = new SysSalaryItemBiz(); -// +// @Autowired // private LoggerTemplate salaryItemLoggerTemplate; @Override @@ -140,27 +140,13 @@ public class SalaryItemServiceImpl extends Service implements SalaryItemService .sorted(new Comparator() { @Override public int compare(SalaryItemPO o1, SalaryItemPO o2) { - if(o1 == null) - return 1; - if(o2 == null) - return -1; - if(o1 == null && o2 == null) - return 0; if(o1.getSortedIndex() == null && o2.getSortedIndex() == null){ - Integer systemType1=o1.getSystemType(); - Integer systemType2=o2.getSystemType(); - if(systemType1 == null) - systemType1=0; - if(systemType2 == null) - systemType2=0; + Integer systemType1=o1.getSystemType() == null ? 0 : o1.getSystemType(); + Integer systemType2=o2.getSystemType() == null ? 0 : o2.getSystemType(); return systemType1.compareTo(systemType2); }else{ - Integer sortedIndex1=o1.getSortedIndex(); - Integer sortedIndex2=o2.getSortedIndex(); - if(sortedIndex1 == null) - sortedIndex1=0; - if(sortedIndex2 == null) - sortedIndex2=0; + Integer sortedIndex1=o1.getSortedIndex() == null ? 0 : o1.getSortedIndex(); + Integer sortedIndex2=o2.getSortedIndex() == null ? 0 : o2.getSortedIndex(); return sortedIndex2.compareTo(sortedIndex1); } } @@ -203,8 +189,8 @@ public class SalaryItemServiceImpl extends Service implements SalaryItemService throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98326, "薪资项目名称已存在,请重新命名")); } // 名称不能和已有的系统薪资项目重名 - List sysSalaryItemPOS = sysSalaryItemBiz.listSome(SysSalaryItemPO.builder().name(saveParam.getName()).build()); - if (CollectionUtils.isNotEmpty(sysSalaryItemPOS)) { + SysSalaryItemPO sysSalaryItem = sysSalaryItemBiz.selectOneByName(saveParam.getName()); + if (sysSalaryItem != null) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98328, "自定义薪资项目的名称不能和系统薪资项目的名称重名")); } SalaryItemPO salaryItemPO = SalaryItemBO.convert2SalaryItemPO(saveParam, (long) user.getUID()); diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 64253642f..f6b149e70 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -1,7 +1,7 @@ package com.engine.salary.service.impl; -import com.alibaba.fastjson.JSON; import cn.hutool.core.lang.Validator; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.api.formmode.mybatis.util.SqlProxyHandle; import com.cloudstore.dev.api.bean.MessageBean; @@ -37,6 +37,8 @@ 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.salaryarchive.SalaryArchiveFieldTypeEnum; +import com.engine.salary.enums.salarybill.BillConfimStatusEnum; +import com.engine.salary.enums.salarybill.BillReadStatusEnum; import com.engine.salary.enums.salarybill.SalarySendStatusEnum; import com.engine.salary.enums.salarybill.SalaryTemplateReplenishRuleEnum; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; @@ -63,6 +65,7 @@ import com.google.common.collect.Lists; import dm.jdbc.util.IdGenerator; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -417,11 +420,6 @@ public class SalarySendServiceImpl extends Service implements SalarySendService } Long salaryAcctId = salarySend.getSalaryAccountingId(); SalarySobCycleDTO salarySobCycleDTO = getSalaryAcctRecordService(user).getSalarySobCycleById(salaryAcctId); -// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); -// List salaryAcctRecordPOS = getSalaryAcctRecordService(user).listBySalarySobIds(Collections.singletonList(salarySobCycleDTO.getSalarySobId())); -// // 是否有回算记录 -// boolean haveBackCalc = salaryAcctRecordPOS.stream().filter(PO -> Objects.equals(PO.getBackCalcStatus(), NumberUtils.INTEGER_ONE) && -// Objects.equals(sdf.format(PO.getSalaryMonth()), SalaryDateUtil.MONTH_FORMATTER.format(salarySobCycleDTO.getSalaryMonth()))).collect(Collectors.toList()).size() > 0; String template = ""; // 获取默认模板 List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySend.getSalarySobId())); @@ -475,6 +473,16 @@ public class SalarySendServiceImpl extends Service implements SalarySendService throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100511, "当前账号无法查看此工资单")); } SalarySendInfoPO salarySendInfo = salarySendInfos.get(0); + // 获取默认模板信息 + SalarySendPO salarySendPO = getSalarySendMapper().getById(salarySendInfo.getSalarySendId()); + if(ObjectUtils.isEmpty(salarySendPO)) + throw new SalaryRunTimeException("工资单不存在"); + // 更新查看状态 + if (salarySendInfo.getBillReadStatus() == null || NumberUtils.compare(salarySendInfo.getBillReadStatus(),BillReadStatusEnum.UNREAD.getValue()) == 0) { + salarySendInfo.setBillReadStatus(BillReadStatusEnum.READED.getValue()); + salarySendInfo.setUpdateTime(new Date()); + getSalarySendInfoMapper().updateIgnoreNull(salarySendInfo); + } // List salarySends = new LambdaQueryChainWrapper<>(mapper) // .eq(SalarySendPO::getDeleteType, 0) // .eq(SalarySendPO::getTenantKey, currentTenantKey) @@ -598,6 +606,13 @@ public class SalarySendServiceImpl extends Service implements SalarySendService handleSalaryWatermark(salaryTemplate, salarySendInfo, currentEmployeeId); map.put("salaryTemplate", salaryTemplate); map.put("salaryAcctResult", salaryAcctResultS); + // 工资单发送人、是否已确认 + if (NumberUtils.compare(salaryTemplate.getAckFeedbackStatus(),1) == 0) { + map.put("confirmStatus", salarySendInfo.getBillConfirmStatus() == null ? "0" : salarySendInfo.getBillConfirmStatus().toString()); + map.put("sendEmployeeId", salarySendInfo.getSendEmployeeId()); + }else{ + map.put("confirmStatus", "1"); + } return map; } @@ -611,7 +626,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService */ private void handleSalaryWatermark(SalaryTemplatePO salaryTemplate, SalarySendInfoPO salarySendInfo, Long currentEmployeeId) { SalaryBillWatermarkDTO salaryBillWatermark = JsonUtil.parseObject(salaryTemplate.getSalaryWatermark(), SalaryBillWatermarkDTO.class); - if (Objects.isNull(salaryBillWatermark) || !salaryBillWatermark.getWatermarkStatus() ) { + if (Objects.isNull(salaryBillWatermark) || Boolean.FALSE.equals(salaryBillWatermark.getWatermarkStatus()) ) { return; } // 发送时已经处理好变量字段,可直接获取判断 @@ -643,8 +658,30 @@ public class SalarySendServiceImpl extends Service implements SalarySendService queryParam.setOrderRule(orderRule); List page = salarySendInfoMapper.list(queryParam); - return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), + PageInfo pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), page, SalarySendInfoListDTO.class); + SalarySendPO salarySendPO = getSalarySendMapper().getById(queryParam.getSalarySendId()); + if (ObjectUtils.isEmpty(salarySendPO)) + throw new SalaryRunTimeException("工资单不存在或已被删除"); + List salaryTemplates = getSalaryTemplateService(user).getDefaultTemplates(Collections.singletonList(salarySendPO.getSalarySobId())); + Integer ackFeedbackStatus = salaryTemplates.get(0).getAckFeedbackStatus(); + if (ackFeedbackStatus!=null && NumberUtils.compare(ackFeedbackStatus,1) == 0) { + // 默认为空时,未读未确认 + pageInfo.getList().stream().forEach(obj -> { + SalarySendInfoListDTO dto = (SalarySendInfoListDTO) obj; + if (StringUtils.isBlank( dto.getBillReadStatus() )){ + dto.setBillReadStatus(BillReadStatusEnum.UNREAD.getDefaultLabel()); + } else { + dto.setBillReadStatus(BillReadStatusEnum.getDefaultLabelByValue( Integer.valueOf(dto.getBillReadStatus()) )); + } + if (StringUtils.isBlank(dto.getBillConfirmStatus())){ + dto.setBillConfirmStatus(BillConfimStatusEnum.UNCONFIRMED.getDefaultLabel()); + } else { + dto.setBillConfirmStatus(BillConfimStatusEnum.getDefaultLabelByValue( Integer.valueOf(dto.getBillConfirmStatus()) )); + } + }); + } + return pageInfo; } @Override @@ -728,6 +765,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService Map map = JsonUtil.parseMap(salaryTemplateContent, Object.class); return SalaryTemplatePO.builder() .id(Long.valueOf(map.getOrDefault("id", "0").toString())) + .ackFeedbackStatus(Integer.valueOf(map.getOrDefault("ackFeedbackStatus", "0").toString())) + .autoAckDays(Integer.valueOf(map.getOrDefault("autoAckDays", "0").toString())) + .feedbackUrl(map.getOrDefault("feedbackUrl", "").toString()) .name(map.getOrDefault("name", "").toString()) .salarySobId(Long.valueOf(map.getOrDefault("salarySobId", "0").toString())) .useType(Integer.valueOf(map.getOrDefault("useType", "0").toString())) @@ -960,9 +1000,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService if (isReplenish && StringUtils.isNotEmpty(salaryTemplate.getReplenishSalaryItemSetting())) { List salaryTemplateShowSetData = JsonUtil.parseList(salaryTemplate.getReplenishSalaryItemSetting(), SalaryTemplateSalaryItemSetListDTO.class); - salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e -> { - salaryItems.addAll(e.getItems()); - }); + salaryTemplateShowSetData.stream().filter(f -> !f.getGroupId().equals(SalaryTemplateSalaryItemSetGroupConstant.EMPLOYEE_INFO_GROUP_ID)).forEach(e -> + salaryItems.addAll(e.getItems()) + ); } return salaryItems; } @@ -1008,6 +1048,9 @@ public class SalarySendServiceImpl extends Service implements SalarySendService po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue()); po.setSendTime(sendTime); po.setSalaryTemplate(JsonUtil.toJsonString(templatePO)); + po.setBillReadStatus(BillReadStatusEnum.UNREAD.getValue()); + po.setBillConfirmStatus(BillConfimStatusEnum.UNCONFIRMED.getValue()); + po.setSendEmployeeId(Long.valueOf(user.getUID())); salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids); @@ -1242,6 +1285,8 @@ public class SalarySendServiceImpl extends Service implements SalarySendService // 撤回 SalarySendInfoPO po = new SalarySendInfoPO(); po.setSendStatus(SalarySendStatusEnum.WITHDRAW.getValue()); + po.setBillReadStatus(BillReadStatusEnum.UNREAD.getValue()); + po.setBillConfirmStatus(BillConfimStatusEnum.UNCONFIRMED.getValue()); List statusList = new ArrayList<>(); statusList.add(SalarySendStatusEnum.ALREADYSEND.getValue()); salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, statusList, ids); @@ -1440,7 +1485,6 @@ public class SalarySendServiceImpl extends Service implements SalarySendService if (Objects.isNull(salarySendPO)) { throw new SalaryRunTimeException("工资发放记录不存在或已被删除"); } -// return getSalaryAcctResultService(user).sumRow(); SalaryAcctResultQueryParam queryParam = SalaryAcctResultQueryParam.builder().salaryAcctRecordId(salarySendPO.getSalaryAccountingId()).build(); // 查询薪资核算人员 @@ -1448,7 +1492,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService .listByResultQueryParam(queryParam); if (org.apache.commons.collections4.CollectionUtils.isEmpty(salaryAcctEmployeePOS)) { - return null; + return Collections.emptyMap(); } // 查询薪资核算记录 SalaryAcctRecordPO salaryAcctRecordPO = getSalaryAcctRecordService(user).getById(queryParam.getSalaryAcctRecordId()); @@ -1471,7 +1515,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService // 是否是补发工资单 List salarySendInfoPOS = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build()); List sendEmployeeIds = salarySendInfoPOS.stream().map(SalarySendInfoPO::getEmployeeId).collect(Collectors.toList()); - salaryAcctResultPOS = salaryAcctResultPOS.stream().filter(PO -> sendEmployeeIds.contains(PO.getEmployeeId())).collect(Collectors.toList()); + salaryAcctResultPOS = salaryAcctResultPOS.stream().filter(po -> sendEmployeeIds.contains(po.getEmployeeId())).collect(Collectors.toList()); Map map = new HashMap<>(); Map> acctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultPOS, SalaryAcctResultPO::getSalaryItemId); @@ -1557,4 +1601,44 @@ public class SalarySendServiceImpl extends Service implements SalarySendService return true; } + + @Override + public List getNeedSendInfoList(List salarySendIds) { + if(CollectionUtils.isEmpty(salarySendIds)){ + return Collections.emptyList(); + } + return getSalarySendInfoMapper().getNeedSendInfoList(salarySendIds); + } + + @Override + public List getNeedSendListBySalarySobIds(List salarySobIds) { + if(CollectionUtils.isEmpty(salarySobIds)){ + return Collections.emptyList(); + } + return getSalarySendMapper().getNeedSendListBySalarySobIds(salarySobIds); + } + + @Override + public List listUnConfirmedSendInfo(List salarySobIds) { + if(CollectionUtils.isEmpty(salarySobIds)) + return Collections.emptyList(); + return getSalarySendInfoMapper().listUnConfirmedSendInfo(salarySobIds); + } + + @Override + public void autoConfirmSalaryBill(List needAutoSendIds) { + if(CollectionUtils.isEmpty(needAutoSendIds)){ + return; + } + List> partition = Lists.partition((List) needAutoSendIds, 500); + partition.forEach(getSalarySendInfoMapper()::autoConfirmSalaryBill); + } + + @Override + public List getByIds(List salarySendId) { + if(CollectionUtils.isEmpty(salarySendId)){ + return Collections.emptyList(); + } + return getSalarySendMapper().getByIds(salarySendId); + } } diff --git a/src/com/engine/salary/service/impl/SalarySobServiceImpl.java b/src/com/engine/salary/service/impl/SalarySobServiceImpl.java index f10e53149..1cf4943b6 100644 --- a/src/com/engine/salary/service/impl/SalarySobServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySobServiceImpl.java @@ -26,6 +26,9 @@ import com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.salarysob.SalarySobMapper; import com.engine.salary.service.*; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; @@ -117,6 +120,9 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); } + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } @Override @@ -310,6 +316,14 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum.parseByValue(salarySobPO.getIncomeCategory()); List salarySobDefaultItemGroupPOS = defaultItemGroupBiz.listByIncomeCategory(incomeCategoryEnum); List salarySobDefaultItemPOS = salarySobDefaultItemService.listByIncomeCategory(SalarySobDefaultItemPO.builder().incomeCategory(incomeCategoryEnum.getValue()).build()); + + //是否需要系统算税,不需要则去除系统项目 + TaxDeclarationFunctionEnum taxDeclarationFunctionEnum = getSalarySysConfService(user).getTaxDeclaration(); + if (taxDeclarationFunctionEnum == TaxDeclarationFunctionEnum.CLOSURE) { + salarySobDefaultItemGroupPOS = new ArrayList<>(); + salarySobDefaultItemPOS = new ArrayList<>(); + } + // 2、薪资账套默认引用的系统薪资项目如果没有添加到薪资项目中,这里要给添加保存 // 2.1、查询已经添加到薪资项目中的系统薪资项目 Set defaultSysSalaryItemIds = SalaryEntityUtil.properties(salarySobDefaultItemPOS, SalarySobDefaultItemPO::getSysSalaryItemId); @@ -325,7 +339,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { .filter(sysSalaryItemId -> !sysSalaryItemIds.contains(sysSalaryItemId)) .collect(Collectors.toSet()); // 需要添加进薪资项目中的回算薪资项目 - needAddSysSalaryItemIds.addAll( SalarySobBackItemIds.stream().filter(salarySobBackItemId -> !sysSalaryItemIds.contains(salarySobBackItemId)).collect(Collectors.toList()) ); + needAddSysSalaryItemIds.addAll(SalarySobBackItemIds.stream().filter(salarySobBackItemId -> !sysSalaryItemIds.contains(salarySobBackItemId)).collect(Collectors.toList())); List needAddSysSalaryItemPOS = getSysSalaryItemService(user).listByIds(needAddSysSalaryItemIds); // 2.3、需要保存的薪资项目 List needInsertSalaryItemPOS = SysSalaryItemBO.convert2SalaryItemPO(needAddSysSalaryItemPOS, (long) user.getUID()); @@ -361,8 +375,8 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { } /** - * @description 新建薪资账套时,保存默认的关联人员范围及从范围中排除 * @return void + * @description 新建薪资账套时,保存默认的关联人员范围及从范围中排除 * @author Harryxzy * @date 2022/10/9 15:30 */ @@ -372,16 +386,16 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { queryParam.setCurrent(1); queryParam.setPageSize(100000); List includeList = (List) getTaxAgentManageRangeService(user).listPageByParamAndIncludeType(queryParam, NumberUtils.INTEGER_ONE).getList(); - includeList.stream().forEach(item->{ + includeList.stream().forEach(item -> { item.setEmployeeStatus(parseEnum2ValueStr(item.getEmployeeStatus())); }); // 获取从范围中排除 List excludeList = (List) getTaxAgentManageRangeService(user).listPageByParamAndIncludeType(queryParam, NumberUtils.INTEGER_ZERO).getList(); - excludeList.stream().forEach(item->{ + excludeList.stream().forEach(item -> { item.setEmployeeStatus(parseEnum2ValueStr(item.getEmployeeStatus())); }); // 将TaxAgentManageRangeListDTO转换为SalarySobRangePO - List rangeList = convert2SalarySobRangePO(salarySobPO.getId(),includeList,excludeList); + List rangeList = convert2SalarySobRangePO(salarySobPO.getId(), includeList, excludeList); // 保存SalarySobRangePO if (CollectionUtils.isNotEmpty(rangeList)) { salarySobRangeBiz.batchInsert(rangeList); @@ -391,16 +405,16 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { /** - * @description 将TaxAgentManageRangeListDTO转换为SalarySobRangePO * @return List + * @description 将TaxAgentManageRangeListDTO转换为SalarySobRangePO * @author Harryxzy * @date 2022/10/9 16:06 */ - private List convert2SalarySobRangePO(Long salarySobID,List includeList, List excludeList) { + private List convert2SalarySobRangePO(Long salarySobID, List includeList, List excludeList) { Date now = new Date(); ArrayList result = new ArrayList(); // 关联人员范围 - includeList.stream().forEach(item->{ + includeList.stream().forEach(item -> { SalarySobRangePO salarySobRangePO = SalarySobRangePO.builder() .salarySobId(salarySobID) .targetType(item.getTargetType().getValue()) @@ -416,7 +430,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { result.add(salarySobRangePO); }); // 从范围中排除 - excludeList.stream().forEach(item->{ + excludeList.stream().forEach(item -> { SalarySobRangePO salarySobRangePO = SalarySobRangePO.builder() .salarySobId(salarySobID) .targetType(item.getTargetType().getValue()) @@ -436,8 +450,8 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { /** - * @description 将枚举的defaultLabel转换为value * @return String + * @description 将枚举的defaultLabel转换为value * @author Harryxzy * @date 2022/10/9 16:56 */ @@ -445,10 +459,10 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { String[] split = employeeStatus.split(","); StringBuilder sb = new StringBuilder(); for (SalaryEmployeeStatusEnum statusEnum : SalaryEmployeeStatusEnum.values()) { - for(int i =0;i salaryTemplatePOS = getSalaryTemplateService(user).getBySalarySobIds(ids); - if(CollectionUtils.isNotEmpty(salaryTemplatePOS)){ + if (CollectionUtils.isNotEmpty(salaryTemplatePOS)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(99713, "账套存在工资单模板,不能删除,请先删除该账套所对应的工资单模板")); } @@ -605,7 +619,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { if (CollectionUtils.isNotEmpty(salarySobPOS)) { throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98403, "薪资账套名称已存在")); } - + Boolean openDevolution = getTaxAgentService(user).isOpenDevolution(); if (openDevolution) { Collection taxAgentPOS = getTaxAgentService(user).listAllTaxAgentsAsAdmin((long) user.getUID()); @@ -664,7 +678,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { } // 复制薪资账套的回算薪资项目 - if (CollectionUtils.isNotEmpty(result.getSalarySobBackItems())){ + if (CollectionUtils.isNotEmpty(result.getSalarySobBackItems())) { getSalarySobBackItemService(user).batchInsert(result.getSalarySobBackItems()); } @@ -672,7 +686,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { if (CollectionUtils.isNotEmpty(result.getSalarySobItems())) { List salarySobItems = result.getSalarySobItems(); Date now = new Date(); - salarySobItems.stream().forEach(k->{ + salarySobItems.stream().forEach(k -> { Long salarySobItemShowId = IdGenerator.generate(); SalarySobItemHidePO salarySobItemHidePO = SalarySobItemHidePO.builder() .id(salarySobItemShowId) @@ -680,13 +694,13 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { .salaryItemId(k.getSalaryItemId()) .isGroup(0) .itemHide(k.getItemHide()) - .creator((long)user.getUID()) + .creator((long) user.getUID()) .deleteType(NumberUtils.INTEGER_ZERO) .createTime(now) .updateTime(now) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); - if(k.getItemHide()==null){ + if (k.getItemHide() == null) { salarySobItemHidePO.setItemHide(Long.valueOf(0)); } salarySobItemService.InsertItemShow(salarySobItemHidePO); @@ -702,7 +716,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { if (CollectionUtils.isNotEmpty(result.getSalarySobItemGroups())) { List salarySobItemGroups = result.getSalarySobItemGroups(); Date now = new Date(); - salarySobItemGroups.stream().forEach(k->{ + salarySobItemGroups.stream().forEach(k -> { Long salarySobItemShowId = IdGenerator.generate(); SalarySobItemHidePO salarySobItemHidePO = SalarySobItemHidePO.builder() .id(salarySobItemShowId) @@ -710,13 +724,13 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { .salaryItemId(k.getId()) .isGroup(1) .itemHide(k.getItemHide()) - .creator((long)user.getUID()) + .creator((long) user.getUID()) .deleteType(NumberUtils.INTEGER_ZERO) .createTime(now) .updateTime(now) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) .build(); - if(k.getItemHide()==null){ + if (k.getItemHide() == null) { salarySobItemHidePO.setItemHide(Long.valueOf(0)); } salarySobItemService.InsertItemShow(salarySobItemHidePO); @@ -781,7 +795,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService { @Override public List listByTaxAgentIds(Collection taxAgentIds) { - if(CollectionUtils.isEmpty(taxAgentIds)){ + if (CollectionUtils.isEmpty(taxAgentIds)) { return new ArrayList<>(); } return getSalarySobMapper().listSome(SalarySobPO.builder().taxAgentIds(taxAgentIds).build()); diff --git a/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java b/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java index 0e270fed8..7d0b790c5 100644 --- a/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryTemplateServiceImpl.java @@ -14,13 +14,13 @@ import com.engine.salary.entity.salaryBill.param.SalaryTemplateQueryParam; import com.engine.salary.entity.salaryBill.param.SalaryTemplateSaveParam; import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; import com.engine.salary.entity.salarysob.dto.SalarySobItemAggregateDTO; +import com.engine.salary.entity.salarysob.dto.SalarySobItemDTO; +import com.engine.salary.entity.salarysob.dto.SalarySobItemGroupDTO; +import com.engine.salary.entity.salarysob.po.SalarySobItemHidePO; import com.engine.salary.entity.salarysob.po.SalarySobPO; import com.engine.salary.enums.salarybill.SalaryTemplateWhetherEnum; import com.engine.salary.exception.SalaryRunTimeException; -import com.engine.salary.service.SalarySobItemService; -import com.engine.salary.service.SalarySobService; -import com.engine.salary.service.SalaryTemplateService; -import com.engine.salary.service.TaxAgentService; +import com.engine.salary.service.*; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; @@ -55,6 +55,10 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } + private SalarySobItemHideService getSalarySobItemHideService(User user) { + return ServiceUtil.getService(SalarySobItemHideServiceImpl.class, user); + } + @Override public SalaryTemplatePO getById(Long id) { return mapper.getById(id); @@ -126,12 +130,13 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate // todo 薪资项目设置检查校验 // 保存 SalaryTemplatePO salaryTemplate = SalaryTemplateBO.convertToPO(saveParam, (long) user.getUID()); - salaryTemplate.setSendEmailId(saveParam.getSendEmail()); +// salaryTemplate.setSendEmailId(saveParam.getSendEmail()); salaryTemplate.setEmailStatus(saveParam.getEmailStatus()?1:0); salaryTemplate.setMsgStatus(saveParam.getMsgStatus()?1:0); salaryTemplate.setTextContentPosition(saveParam.getTextContentPosition()); salaryTemplate.setSalaryItemNullStatus(saveParam.getSalaryItemNullStatus()?1:0); salaryTemplate.setSalaryItemZeroStatus(saveParam.getSalaryItemZeroStatus()?1:0); + salaryTemplate.setAutoSendCycleType(saveParam.getAutoSendCycleType()); mapper.insert(salaryTemplate); // 记录日志 // SalaryLoggerUtil.recordAddSingleLog(salaryTemplateLoggerTemplate, @@ -184,12 +189,17 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate BeanUtils.copyProperties(salaryTemplate, salaryTemplateNew); BeanUtils.copyProperties(saveParam, salaryTemplateNew); salaryTemplateNew.setUpdateTime(new Date()); - salaryTemplateNew.setSendEmailId(saveParam.getSendEmail()); + salaryTemplateNew.setSendEmailId(0L); salaryTemplateNew.setEmailStatus(saveParam.getEmailStatus()?1:0); salaryTemplateNew.setMsgStatus(saveParam.getMsgStatus()?1:0); salaryTemplateNew.setTextContentPosition(saveParam.getTextContentPosition()); salaryTemplateNew.setSalaryItemNullStatus(saveParam.getSalaryItemNullStatus()?1:0); salaryTemplateNew.setSalaryItemZeroStatus(saveParam.getSalaryItemZeroStatus()?1:0); + salaryTemplateNew.setAutoSendStatus(saveParam.getAutoSendStatus()?1:0); + salaryTemplateNew.setAutoSendCycleType(saveParam.getAutoSendCycleType()); + salaryTemplateNew.setAckFeedbackStatus(saveParam.getAckFeedbackStatus()?1:0); + salaryTemplateNew.setAutoAckDays(saveParam.getAutoAckDays()); + salaryTemplateNew.setFeedbackUrl(saveParam.getFeedbackUrl()); // todo 薪资项目设置检查校验 salaryTemplateNew.setSalaryItemSetting(saveParam.getSalaryItemSetting() != null ? JSONUtil.toJsonStr(saveParam.getSalaryItemSetting()) : ""); salaryTemplateNew.setReplenishSalaryItemSetting(saveParam.getReplenishSalaryItemSetting() != null ? JSONUtil.toJsonStr(saveParam.getReplenishSalaryItemSetting()) : ""); @@ -274,6 +284,31 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate @Override public List getSalaryItemSet(Long salarySobId, boolean isReplenish) { + SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId); + // 处理薪资账套中隐藏的分类和项目 + // 获取关闭显示的分类 + List hideGroupIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(1).build()); + // 过滤关闭显示的薪资项目分类 + List itemGroupDTOS = salarySobItemAggregate.getItemGroups().stream().filter(group -> !(hideGroupIDs.contains(group.getId()))).collect(Collectors.toList()); + // 获取关闭显示的薪资项目 + List hideItemIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(0).build()); + for(SalarySobItemGroupDTO DTO : itemGroupDTOS){ + List items = DTO.getItems(); + DTO.setItems( items.stream().filter(item -> !(hideItemIDs.contains(item.getSalaryItemId()))).collect(Collectors.toList()) ); + } + itemGroupDTOS = itemGroupDTOS.stream().filter(DTO -> CollectionUtils.isNotEmpty(DTO.getItems())).collect(Collectors.toList()); + salarySobItemAggregate.setItemGroups(itemGroupDTOS); + if(hideGroupIDs.contains(0L)){ + // 隐藏了未分类 + salarySobItemAggregate.setItems(Collections.emptyList()); + }else{ + salarySobItemAggregate.setItems( salarySobItemAggregate.getItems().stream().filter( item -> !(hideItemIDs.contains(item.getSalaryItemId())) ).collect(Collectors.toList()) ); + } + return SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID()), isReplenish); + } + + @Override + public List getSalaryItemSetContainHide(Long salarySobId, boolean isReplenish) { SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId); return SalaryTemplateBO.convertSalarySobItemAggregateToSalaryItemSet(salarySobItemAggregate, new Long(user.getUID()), isReplenish); } @@ -315,4 +350,14 @@ public class SalaryTemplateServiceImpl extends Service implements SalaryTemplate PageInfo page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryTemplateDTOList, SalaryTemplateListDTO.class); return page; } + + @Override + public List getAutoSendTemplate() { + return mapper.listSome(SalaryTemplatePO.builder().autoSendStatus(NumberUtils.INTEGER_ONE).useType(NumberUtils.INTEGER_ONE).deleteType(NumberUtils.INTEGER_ZERO).build()); + } + + @Override + public List listNeedAckDefaultTemplate() { + return mapper.listSome(SalaryTemplatePO.builder().useType(NumberUtils.INTEGER_ONE).ackFeedbackStatus(NumberUtils.INTEGER_ONE).build()); + } } diff --git a/src/com/engine/salary/sys/constant/SalarySysConstant.java b/src/com/engine/salary/sys/constant/SalarySysConstant.java index c6ab2e6ab..b6d49d941 100644 --- a/src/com/engine/salary/sys/constant/SalarySysConstant.java +++ b/src/com/engine/salary/sys/constant/SalarySysConstant.java @@ -71,4 +71,28 @@ public class SalarySysConstant { */ public static final String SALARY_PAYROLL_CHECK_TYPE = "SALARY_PAYROLL_CHECK_TYPE"; + /** + * 个税申报撤回 + */ + public static final String WITHDRAW_TAX_DECLARATION ="WITHDRAW_TAX_DECLARATION"; + + /** + * 删除薪资档案 + */ + public static final String SALARY_ARCHIVE_DELETE = "salaryArchiveDelete"; + + /** + * 工资单确认反馈状态 + */ + public static final String SALARY_SEND_FEEDBACK = "SALARY_SEND_FEEDBACK"; + + /** + * 工资单反馈自动确认 + */ + public static final String SALARY_AUTO_ACK_DAYS = "SALARY_AUTO_ACK_DAYS"; + /** + * 工资单反馈地址 + */ + public static final String SALARY_FEEDBACK_URL = "SALARY_FEEDBACK_URL"; + } diff --git a/src/com/engine/salary/sys/entity/vo/AppSettingVO.java b/src/com/engine/salary/sys/entity/vo/AppSettingVO.java index a19830fbd..f4b9ac890 100644 --- a/src/com/engine/salary/sys/entity/vo/AppSettingVO.java +++ b/src/com/engine/salary/sys/entity/vo/AppSettingVO.java @@ -70,4 +70,19 @@ public class AppSettingVO { */ private String salaryAcctEmployeeRule; + /** + * 撤回个税申报表 + */ + private String withDrawTaxDeclaration; + + /** + * 薪资档案删除 + */ + private String salaryArchiveDelete; + + /** + * 工资单反馈 + */ + private String salarySendFeedback; + } diff --git a/src/com/engine/salary/sys/enums/TaxDeclarationFunctionEnum.java b/src/com/engine/salary/sys/enums/TaxDeclarationFunctionEnum.java index 325c5463e..9ab77c7fd 100644 --- a/src/com/engine/salary/sys/enums/TaxDeclarationFunctionEnum.java +++ b/src/com/engine/salary/sys/enums/TaxDeclarationFunctionEnum.java @@ -4,7 +4,7 @@ import com.engine.salary.enums.BaseEnum; import org.apache.commons.lang3.StringUtils; /** - * 申报功能启用枚举 + * 个税计算启用状态 *

Copyright: Copyright (c) 2022

*

Company: 泛微软件

* @@ -12,8 +12,8 @@ import org.apache.commons.lang3.StringUtils; * @version 1.0 **/ public enum TaxDeclarationFunctionEnum implements BaseEnum { - OPEN("1", "开启申报功能", 1), - CLOSURE("0", "关闭申报功能", 1), + OPEN("1", "开启", 1), + CLOSURE("0", "关闭", 1), REBOOT("2", "重启", 1); private String value; diff --git a/src/com/engine/salary/sys/service/SalarySysConfService.java b/src/com/engine/salary/sys/service/SalarySysConfService.java index 956979d74..e92637840 100644 --- a/src/com/engine/salary/sys/service/SalarySysConfService.java +++ b/src/com/engine/salary/sys/service/SalarySysConfService.java @@ -96,4 +96,38 @@ public interface SalarySysConfService { * @param rule */ void saveSalaryAcctEmployeeRule(String rule); + + /** + * 个税申报撤回开关 + * @param param + */ + void saveWithDrawTaxDeclaration(SalarySysConfPO param); + + /** + * 保存档案删除规则 + * @param setting + */ + void saveArchiveDelete(String setting); + + /** + * 保存工资单反馈 + * @param param + */ + void saveSalarySendFeedback(SalarySysConfPO param); + + /** + * 根据code返回list + * @param codes + * @return + */ + List getListByCodes(List codes); + + /** + * 保存或者修改应用设置 + * @param confValue + * @param confKey + * @param title + * @param app + */ + void saveSettingByType(String confValue, String confKey, String title, String app); } diff --git a/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java b/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java index 30b16e5c1..eb0001d40 100644 --- a/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java +++ b/src/com/engine/salary/sys/service/impl/SalarySysConfServiceImpl.java @@ -416,6 +416,38 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe saveSettingByType(rule, SALARY_ACCT_EMPLOYEE_RULE, "薪资、社保福利核算包含人员规则", "basic"); } + @Override + public void saveWithDrawTaxDeclaration(SalarySysConfPO param) { + if (StringUtils.isBlank(param.getConfValue())) { + throw new SalaryRunTimeException("无效规则!"); + } + saveSettingByType(param.getConfValue(), WITHDRAW_TAX_DECLARATION, "个税申报撤回", "basic"); + } + + @Override + public void saveArchiveDelete(String setting) { + if (StringUtils.isBlank(setting)) { + throw new SalaryRunTimeException("无效规则!"); + } + saveSettingByType(setting, SALARY_ARCHIVE_DELETE, "薪资、社保福利档案删除规则", "basic"); + } + + @Override + public void saveSalarySendFeedback(SalarySysConfPO param) { + if (StringUtils.isBlank(param.getConfValue())) { + throw new SalaryRunTimeException("无效规则!"); + } + saveSettingByType(param.getConfValue(), SALARY_SEND_FEEDBACK, "工资单反馈", "basic"); + } + + @Override + public List getListByCodes(List codes) { + if(CollectionUtils.isEmpty(codes)){ + return Collections.emptyList(); + } + return getSalarySysConfMapper().getListByCodes(codes); + } + /** * 保存或者修改应用设置 * @@ -424,7 +456,8 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe * @param title * @param app */ - private void saveSettingByType(String confValue, String confKey, String title, String app) { + @Override + public void saveSettingByType(String confValue, String confKey, String title, String app) { SalarySysConfPO po = getOneByCode(confKey); if (po == null) { SalarySysConfPO build = SalarySysConfPO.builder() @@ -488,6 +521,31 @@ public class SalarySysConfServiceImpl extends Service implements SalarySysConfSe appSettingVO.setSalaryAcctEmployeeRule( SalaryAcctEmployeeRuleEnum.parseByValue(salaryAcctEmployeeRule.getConfValue()).getValue() ); } + SalarySysConfPO withDrawRule = salarySysConfMap.get(WITHDRAW_TAX_DECLARATION); + if (withDrawRule == null ) { + // 个税申报撤回 + appSettingVO.setWithDrawTaxDeclaration("0"); + } else { + appSettingVO.setWithDrawTaxDeclaration( withDrawRule.getConfValue() ); + } + + SalarySysConfPO salaryArchiveDeletePO = salarySysConfMap.get(SALARY_ARCHIVE_DELETE); + if (salaryArchiveDeletePO == null ) { + // 是否允许删除薪资、社保档案,默认不允许删除 + appSettingVO.setSalaryArchiveDelete("0"); + } else { + appSettingVO.setSalaryArchiveDelete(salaryArchiveDeletePO.getConfValue()); + } + + + SalarySysConfPO salarySendFeedbackPO = salarySysConfMap.get(SALARY_SEND_FEEDBACK); + if (salarySendFeedbackPO == null ) { + // 是否开启工资单反馈,默认不开启 + appSettingVO.setSalarySendFeedback("0"); + } else { + appSettingVO.setSalarySendFeedback(salarySendFeedbackPO.getConfValue()); + } + //默认加密开启 if (StringUtils.isEmpty(appSettingVO.getIsOpenEncrypt())) { appSettingVO.setIsOpenEncrypt(OpenEnum.OPEN.getValue()); diff --git a/src/com/engine/salary/timer/AutoConfirmSalaryBillCronJob.java b/src/com/engine/salary/timer/AutoConfirmSalaryBillCronJob.java new file mode 100644 index 000000000..9ddee0497 --- /dev/null +++ b/src/com/engine/salary/timer/AutoConfirmSalaryBillCronJob.java @@ -0,0 +1,71 @@ +package com.engine.salary.timer; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryBill.po.SalarySendInfoPO; +import com.engine.salary.entity.salaryBill.po.SalarySendPO; +import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.service.SalarySendService; +import com.engine.salary.service.SalaryTemplateService; +import com.engine.salary.service.impl.SalarySendServiceImpl; +import com.engine.salary.service.impl.SalaryTemplateServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; +import org.apache.commons.lang3.ObjectUtils; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author Harryxzy + * @ClassName AutoConfirmSalaryBill + * @date 2023/07/11 15:50 + * @description 自动确认工资单 + */ +public class AutoConfirmSalaryBillCronJob extends BaseCronJob { + private SalarySendService getSalarySendService(User user) { + return ServiceUtil.getService(SalarySendServiceImpl.class, user); + } + + private SalaryTemplateService getSalaryTemplateService(User user) { + return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); + } + + @Override + public void execute() { + User user = new User(); + user.setUid(1); + user.setLoginid("sysadmin"); + // 获取所有需要确认反馈的默认工资单模板 + List templates = getSalaryTemplateService(user).listNeedAckDefaultTemplate(); + // key:薪资账套id,value:对应的自动确认天数 + Map salarySobAckDaysMap = SalaryEntityUtil.convert2Map(templates, SalaryTemplatePO::getSalarySobId, SalaryTemplatePO::getAutoAckDays); + // 根据薪资账套id获取已发送,确认状态为未确认的工资单 + List unConfirmedList = getSalarySendService(user).listUnConfirmedSendInfo(new ArrayList<>(salarySobAckDaysMap.keySet())); + List sendList = getSalarySendService(user).getByIds(unConfirmedList.stream().map(SalarySendInfoPO::getSalarySendId).distinct().collect(Collectors.toList())); + // key:工资单发放id,value:自动确认超时天数 + HashMap autoAckDaysMap = new HashMap<>(); + sendList.stream().forEach(send -> { + Integer autoAckDays = salarySobAckDaysMap.getOrDefault(send.getSalarySobId(), 7); + autoAckDaysMap.put(send.getId(), autoAckDays); + }); + LocalDateTime now = LocalDateTime.now(); + List needAutoIds = unConfirmedList.stream().filter(po -> { + LocalDateTime sendDateTime = SalaryDateUtil.dateToLocalDateTime(po.getSendTime()); + Integer autoDays = autoAckDaysMap.get(po.getSalarySendId()); + if (ObjectUtils.isEmpty(autoDays)) + return false; + LocalDateTime autoDateTime = sendDateTime.plus(autoDays, ChronoUnit.DAYS); + return !autoDateTime.isAfter(now); + }).map(SalarySendInfoPO::getId).collect(Collectors.toList()); + // 自动确认 + getSalarySendService(user).autoConfirmSalaryBill(needAutoIds); + } + +} diff --git a/src/com/engine/salary/timer/AutoSendSalaryJob.java b/src/com/engine/salary/timer/AutoSendSalaryJob.java new file mode 100644 index 000000000..30777f606 --- /dev/null +++ b/src/com/engine/salary/timer/AutoSendSalaryJob.java @@ -0,0 +1,101 @@ +package com.engine.salary.timer; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryBill.param.SalarySendGrantParam; +import com.engine.salary.entity.salaryBill.po.SalarySendInfoPO; +import com.engine.salary.entity.salaryBill.po.SalarySendPO; +import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO; +import com.engine.salary.service.SalaryBillService; +import com.engine.salary.service.SalarySendService; +import com.engine.salary.service.SalaryTemplateService; +import com.engine.salary.service.impl.SalaryBillServiceImpl; +import com.engine.salary.service.impl.SalarySendServiceImpl; +import com.engine.salary.service.impl.SalaryTemplateServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import com.engine.salary.util.SalaryEntityUtil; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Harryxzy + * @ClassName AutoSendSalaryJob + * @date 2023/07/03 10:39 + * @description 自动发送工资单 + */ +public class AutoSendSalaryJob extends BaseCronJob { + + private SalarySendService getSalarySendService(User user) { + return ServiceUtil.getService(SalarySendServiceImpl.class, user); + } + + private SalaryTemplateService getSalaryTemplateService(User user) { + return ServiceUtil.getService(SalaryTemplateServiceImpl.class, user); + } + + private SalaryBillService getSalaryBillService(User user) { + return ServiceUtil.getService(SalaryBillServiceImpl.class, user); + } + + @Override + public void execute() { + User tempUser = new User(); + tempUser.setUid(1); + tempUser.setLoginid("sysadmin"); + // 获取所有设置了定时发送的默认工资单模板 + List autoSendTemplate = getSalaryTemplateService(tempUser).getAutoSendTemplate(); + Map autoSendTypeMap = SalaryEntityUtil.convert2Map(autoSendTemplate, SalaryTemplatePO::getSalarySobId); + List salarySobIds = autoSendTemplate.stream().map(SalaryTemplatePO::getSalarySobId).collect(Collectors.toList()); + // 获取这些模板下未发放完的正常(非补发、非冻结)工资单 + List salarySendList = getSalarySendService(tempUser).getNeedSendListBySalarySobIds(salarySobIds); + + LocalDateTime nowLocalDateTime = SalaryDateUtil.dateToLocalDateTime(new Date()); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); + List needSendIds = salarySendList.stream().filter(sendPO -> { + SalaryTemplatePO templatePO = autoSendTypeMap.get(sendPO.getSalarySobId()); + if (templatePO == null) { + return false; + } + LocalDate autoSendDate = null; + if (templatePO.getAutoSendCycleType() == 1) { + // 薪资所属月当月 + autoSendDate = SalaryDateUtil.dateToLocalDate(sendPO.getSalaryMonth()); + } else { + // 薪资所属月下月 + autoSendDate = SalaryDateUtil.dateToLocalDate(sendPO.getSalaryMonth()).plusMonths(1); + } + int maxDays = autoSendDate.lengthOfMonth(); + Integer sendDays = Integer.valueOf(templatePO.getAutoSendDayOfMonth()); + if (sendDays.intValue() > maxDays) { + sendDays = maxDays; + } + autoSendDate = autoSendDate.withDayOfMonth(sendDays); + LocalDateTime autoSendDateTime = null; + try { + // 加上时间 + autoSendDateTime = autoSendDate.atTime(SalaryDateUtil.dateToLocalDateTime(timeFormat.parse(templatePO.getAutoSendTimeOfDay())).toLocalTime()); + } catch (ParseException e) { + throw new RuntimeException(e); + } + if (!autoSendDateTime.isAfter(nowLocalDateTime)) { + // 自动发放时间早于或等于现在的发放记录 + return true; + } + return false; + }).map(SalarySendPO::getId).collect(Collectors.toList()); + + // 获取工资单发放记录下需要发放的工资单明细 + List needSendInfoList = getSalarySendService(tempUser).getNeedSendInfoList(needSendIds); + Map> sendMap = SalaryEntityUtil.group2Map(needSendInfoList, SalarySendInfoPO::getSalarySendId, SalarySendInfoPO::getId); + for(Map.Entry> entry : sendMap.entrySet()){ + // 发放 + getSalaryBillService(tempUser).grant(SalarySendGrantParam.builder().salarySendId(entry.getKey()).ids(new ArrayList(entry.getValue())).build()); + } + } +} diff --git a/src/com/engine/salary/web/SIArchivesController.java b/src/com/engine/salary/web/SIArchivesController.java index f8167723d..0724cf7f1 100644 --- a/src/com/engine/salary/web/SIArchivesController.java +++ b/src/com/engine/salary/web/SIArchivesController.java @@ -19,7 +19,6 @@ import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import java.util.Collection; -import java.util.List; import java.util.Map; /** @@ -223,4 +222,15 @@ public class SIArchivesController { User user = HrmUserVarify.getUser(request, response); return new ResponseResult>(user).run(getService(user)::allStayAddToPay); } + + /** + * 删除档案 + */ + @POST + @Path("/deleteArchive") + @Produces(MediaType.APPLICATION_JSON) + public String deleteArchive(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, Map>(user).run(getService(user)::deleteArchive, ids); + } } diff --git a/src/com/engine/salary/web/SISchemeController.java b/src/com/engine/salary/web/SISchemeController.java index 4270508d1..842c8b0eb 100644 --- a/src/com/engine/salary/web/SISchemeController.java +++ b/src/com/engine/salary/web/SISchemeController.java @@ -21,6 +21,7 @@ import com.engine.salary.wrapper.SISchemeWrapper; import io.swagger.v3.oas.annotations.parameters.RequestBody; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.jetbrains.annotations.NotNull; import weaver.hrm.HrmUserVarify; import weaver.hrm.User; @@ -32,6 +33,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; import java.net.URLEncoder; import java.time.LocalDate; import java.util.Arrays; @@ -172,16 +174,7 @@ public class SISchemeController { @Path("/export") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response export(@Context HttpServletRequest request, @Context HttpServletResponse response) { - InsuranceArchivesListParam param = new InsuranceArchivesListParam(); - String ids = request.getParameter("ids"); - if(StringUtils.isNotBlank(ids)){ - param.setIds( Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList())); - } - - String runStatuses = request.getParameter("runStatuses"); - if(StringUtils.isNotBlank(runStatuses)){ - param.setRunStatuses( Arrays.stream(runStatuses.split(",")).map(String::valueOf).collect(Collectors.toList())); - } + InsuranceArchivesListParam param = buildInsuranceArchivesListParam(request); User user = HrmUserVarify.getUser(request, response); XSSFWorkbook workbook = getService(user).export(param); String fileName ; @@ -298,6 +291,63 @@ public class SISchemeController { .header("Cache-Control", "no-cache").build(); } + @NotNull + private InsuranceArchivesListParam buildInsuranceArchivesListParam(HttpServletRequest request) { + InsuranceArchivesListParam param = new InsuranceArchivesListParam(); + + String ids = request.getParameter("ids"); + if(StringUtils.isNotBlank(ids)){ + param.setIds( Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList())); + } + + String runStatuses = request.getParameter("runStatuses"); + if(StringUtils.isNotBlank(runStatuses)){ + param.setRunStatuses( Arrays.stream(runStatuses.split(",")).map(String::valueOf).collect(Collectors.toList())); + } + + String statusesStr = request.getParameter("statusesStr"); + if (StringUtils.isNotBlank(statusesStr)) { + param.setStatuses(Arrays.stream(statusesStr.split(",")).map(String::new).collect(Collectors.toList())); + } + String userName = request.getParameter("username"); + if (StringUtils.isNotBlank(userName)) { + param.setUserName(userName); + } + String jobNum = request.getParameter("jobNum"); + if (StringUtils.isNotBlank(jobNum)) { + param.setJobNum(jobNum); + } + String taxAgentId = request.getParameter("taxAgentId"); + if (StringUtils.isNotBlank(taxAgentId)) { + param.setTaxAgentId(Long.parseLong(taxAgentId)); + } + String departmentIds = request.getParameter("departmentIdsStr"); + if (StringUtils.isNotBlank(departmentIds)) { + param.setDepartmentIds(Arrays.stream(departmentIds.split(",")).map(BigDecimal::new).collect(Collectors.toList())); + } + String subcompanyIds = request.getParameter("subcompanyIdsStr"); + if (StringUtils.isNotBlank(subcompanyIds)) { + param.setSubcompanyIds(Arrays.stream(subcompanyIds.split(",")).map(BigDecimal::new).collect(Collectors.toList())); + } + String positions = request.getParameter("positionsStr"); + if (StringUtils.isNotBlank(positions)) { + param.setPositions(Arrays.stream(positions.split(",")).map(BigDecimal::new).collect(Collectors.toList())); + } + String siSchemeId = request.getParameter("siSchemeId"); + if (StringUtils.isNotBlank(siSchemeId)) { + param.setSiSchemeId(Long.valueOf(siSchemeId)); + } + String fundSchemeId = request.getParameter("fundSchemeId"); + if (StringUtils.isNotBlank(fundSchemeId)) { + param.setFundSchemeId(Long.valueOf(fundSchemeId)); + } + String otherSchemeId = request.getParameter("otherSchemeId"); + if (StringUtils.isNotBlank(otherSchemeId)) { + param.setOtherSchemeId(Long.valueOf(otherSchemeId)); + } + return param; + } + } diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index b6b0d7e38..078060a02 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -297,6 +297,10 @@ public class SalaryAcctController { if (StringUtils.isNotBlank(status)) { param.setStatus(SalaryEmployeeStatusEnum.parseByValue(Integer.parseInt(status))); } + String statuses = request.getParameter("statuses"); + if (StringUtils.isNotBlank(statuses)) { + param.setStatuses(Arrays.stream(statuses.split(",")).map(String::valueOf).collect(Collectors.toList())); + } //fixme 日期 request.getParameter("dismissDate"); String ids = request.getParameter("ids"); @@ -760,6 +764,10 @@ public class SalaryAcctController { if (StringUtils.isNotBlank(status)) { param.setStatus(SalaryEmployeeStatusEnum.parseByValue(Integer.parseInt(status))); } + String statuses = request.getParameter("statuses"); + if (StringUtils.isNotBlank(statuses)) { + param.setStatuses(Arrays.stream(statuses.split(",")).map(String::valueOf).collect(Collectors.toList())); + } //fixme 日期 request.getParameter("dismissDate"); String consolidatedTaxation = request.getParameter("consolidatedTaxation"); @@ -770,6 +778,14 @@ public class SalaryAcctController { if (StringUtils.isNotBlank(ids)) { param.setIds(Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList())); } + String workcode = request.getParameter("workcode"); + if (StringUtils.isNotBlank(workcode)) { + param.setWorkcode(workcode); + } + String subcompanyIds = request.getParameter("subcompanyIds"); + if (StringUtils.isNotBlank(subcompanyIds)) { + param.setSubcompanyIds(Arrays.stream(subcompanyIds.split(",")).map(Long::valueOf).collect(Collectors.toList())); + } } diff --git a/src/com/engine/salary/web/SalaryArchiveController.java b/src/com/engine/salary/web/SalaryArchiveController.java index 28e773578..d39a6bf67 100644 --- a/src/com/engine/salary/web/SalaryArchiveController.java +++ b/src/com/engine/salary/web/SalaryArchiveController.java @@ -135,6 +135,20 @@ public class SalaryArchiveController { return new ResponseResult, String>(user).run(getSalaryArchiveWrapper(user)::deletePendingTodo, ids); } + /** + * 删除薪资档案(待定薪、停薪来自待定薪) + * + * @param ids + * @return + */ + @POST + @Path("/deleteSalaryArchive") + @Produces(MediaType.APPLICATION_JSON) + public String deleteSalaryArchive(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection ids) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult, String>(user).run(getSalaryArchiveWrapper(user)::deleteSalaryArchive, ids); + } + /** * 发薪列表 @@ -442,6 +456,10 @@ public class SalaryArchiveController { if (StringUtils.isNotBlank(username)) { param.setUsername(username); } + String workcode = request.getParameter("workcode"); + if (StringUtils.isNotBlank(workcode)) { + param.setWorkcode(workcode); + } String taxAgentId = request.getParameter("taxAgentId"); if (StringUtils.isNotBlank(taxAgentId)) { param.setTaxAgentId(Long.valueOf(taxAgentId)); @@ -450,6 +468,10 @@ public class SalaryArchiveController { if (StringUtils.isNotBlank(departmentIds)) { param.setDepartmentIds(Arrays.stream(departmentIds.split(",")).map(Long::valueOf).collect(Collectors.toList())); } + String subcompanyIds = request.getParameter("subcompanyIds"); + if (StringUtils.isNotBlank(subcompanyIds)) { + param.setSubcompanyIds(Arrays.stream(subcompanyIds.split(",")).map(Long::valueOf).collect(Collectors.toList())); + } String positionIds = request.getParameter("positionIds"); if (StringUtils.isNotBlank(positionIds)) { param.setPositionIds(Arrays.stream(positionIds.split(",")).map(Long::valueOf).collect(Collectors.toList())); @@ -458,6 +480,10 @@ public class SalaryArchiveController { if (StringUtils.isNotBlank(userstatus)) { param.setUserstatus(userstatus); } + String statuses = request.getParameter("statuses"); + if (StringUtils.isNotBlank(statuses)) { + param.setStatuses(Arrays.stream(statuses.split(",")).map(String::valueOf).collect(Collectors.toList())); + } String hiredate = request.getParameter("hiredate"); if (StringUtils.isNotBlank(hiredate)) { param.setHiredate(Arrays.asList(hiredate.split(","))); diff --git a/src/com/engine/salary/web/SalaryBillController.java b/src/com/engine/salary/web/SalaryBillController.java index 785d8aa88..ea5cdeece 100644 --- a/src/com/engine/salary/web/SalaryBillController.java +++ b/src/com/engine/salary/web/SalaryBillController.java @@ -545,6 +545,54 @@ public class SalaryBillController { } return new ResponseResult>(user).run(getSalarySendWrapper(user)::mySalaryBill, salaryInfoId); } + + /** + * 确认工资单 + * + * @param salaryInfoId + * @return + */ + @GET + @Path("/confirmSalaryBill") + @Produces(MediaType.APPLICATION_JSON) + public String confirmSalaryBill(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryInfoId") Long salaryInfoId) { + User user = null; + String recipient = request.getParameter("recipient"); + String em_auth_userid = request.getParameter("em_auth_userid"); + log.info("salary recipient: {} em_auth_userid: {}", recipient, em_auth_userid); + if (StringUtils.isNotBlank(recipient) && NumberUtils.isCreatable(recipient)) { + user = new User(Integer.parseInt(recipient)); + } else if (StringUtils.isNotBlank(em_auth_userid) && NumberUtils.isCreatable(em_auth_userid)) { + user = new User(Integer.parseInt(em_auth_userid)); + } else { + user = HrmUserVarify.getUser(request, response); + } + return new ResponseResult>(user).run(getSalarySendWrapper(user)::confirmSalaryBill, salaryInfoId); + } + + /** + * 工资单反馈 + * + * @param salaryInfoId + * @return + */ + @GET + @Path("/feedBackSalaryBill") + @Produces(MediaType.APPLICATION_JSON) + public String feedBackSalaryBill(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam(value = "salaryInfoId") Long salaryInfoId) { + User user = null; + String recipient = request.getParameter("recipient"); + String em_auth_userid = request.getParameter("em_auth_userid"); + log.info("salary recipient: {} em_auth_userid: {}", recipient, em_auth_userid); + if (StringUtils.isNotBlank(recipient) && NumberUtils.isCreatable(recipient)) { + user = new User(Integer.parseInt(recipient)); + } else if (StringUtils.isNotBlank(em_auth_userid) && NumberUtils.isCreatable(em_auth_userid)) { + user = new User(Integer.parseInt(em_auth_userid)); + } else { + user = HrmUserVarify.getUser(request, response); + } + return new ResponseResult>(user).run(getSalarySendWrapper(user)::feedBackSalaryBill, salaryInfoId); + } /******** 工资单发放 end ***********************************************************************************************/ /** diff --git a/src/com/engine/salary/web/SalarySystemConfigController.java b/src/com/engine/salary/web/SalarySystemConfigController.java index e747d7393..9614ef61a 100644 --- a/src/com/engine/salary/web/SalarySystemConfigController.java +++ b/src/com/engine/salary/web/SalarySystemConfigController.java @@ -47,7 +47,7 @@ public class SalarySystemConfigController { } /** - * 申报前置 + * 是否开启系统算税 * * @param request * @param response @@ -63,6 +63,7 @@ public class SalarySystemConfigController { return new ResponseResult(user).run(getSalarySystemConfigWrapper(user)::operateTaxDeclarationFunction, TaxDeclarationFunctionEnum.parseByValue(param.getOperateTaxDeclaration())); } + /** * 获取系统配置 * @@ -180,6 +181,13 @@ public class SalarySystemConfigController { return new ResponseResult(user).run(getSalarySystemConfigWrapper(user)::saveMatchEmployeeModeRule, param); } + /** + * 薪资核算人员匹配规则 + * @param request + * @param response + * @param param + * @return + */ @POST @Path("/saveSalaryAcctEmployeeRule") @Produces(MediaType.APPLICATION_JSON) @@ -188,6 +196,50 @@ public class SalarySystemConfigController { return new ResponseResult(user).run(getSalarySystemConfigWrapper(user)::saveSalaryAcctEmployeeRule, param.getRule()); } + /** + * 工资单反馈 + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/saveSalarySendFeedback") + @Produces(MediaType.APPLICATION_JSON) + public String saveSalarySendFeedback(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySysConfPO param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalarySystemConfigWrapper(user)::saveSalarySendFeedback, param); + } + + /** + * 撤回个税申报 + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/saveWithDrawTaxDeclaration") + @Produces(MediaType.APPLICATION_JSON) + public String saveWithDrawTaxDeclaration(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySysConfPO param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalarySystemConfigWrapper(user)::saveWithDrawTaxDeclaration, param); + } + + /** + * 删除档案 + * @param request + * @param response + * @param param + * @return + */ + @POST + @Path("/saveArchiveDelete") + @Produces(MediaType.APPLICATION_JSON) + public String saveArchiveDelete(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody SalarySysConfPO param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult(user).run(getSalarySystemConfigWrapper(user)::saveArchiveDelete, param.getConfValue()); + } /** * 应用设置 diff --git a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java index 42496ef08..9a27f7e86 100644 --- a/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryArchiveWrapper.java @@ -571,4 +571,13 @@ public class SalaryArchiveWrapper extends Service { } return list.get(0); } + + + /** + * 删除薪资档案 + * @param salaryArchiveIds + */ + public void deleteSalaryArchive(Collection salaryArchiveIds) { + getSalaryArchiveService(user).deleteSalaryArchive(salaryArchiveIds); + } } diff --git a/src/com/engine/salary/wrapper/SalaryBillBaseSetWrapper.java b/src/com/engine/salary/wrapper/SalaryBillBaseSetWrapper.java index 033dbd18e..63f0b3d37 100644 --- a/src/com/engine/salary/wrapper/SalaryBillBaseSetWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryBillBaseSetWrapper.java @@ -3,6 +3,7 @@ package com.engine.salary.wrapper; import com.engine.common.util.ServiceUtil; import com.engine.core.impl.Service; import com.engine.salary.entity.salaryBill.dto.SalaryBaseSetFormDTO; +import com.engine.salary.entity.salaryBill.dto.SalaryBillAckFeedbackDTO; import com.engine.salary.entity.salaryBill.dto.SalaryBillWatermarkDTO; import com.engine.salary.entity.salaryBill.param.SalaryBaseSetSaveParam; import com.engine.salary.service.SalaryBillBaseSetService; @@ -45,7 +46,7 @@ public class SalaryBillBaseSetWrapper extends Service { public SalaryBaseSetFormDTO getBaseSetForm() { SalaryBaseSetFormDTO dto = new SalaryBaseSetFormDTO(); SalaryBillWatermarkDTO salaryBillWatermark = getSalaryBillBaseSetService(user).getWatermarkSetting(); -// SalaryBillAckFeedbackDTO salaryBillAckFeedback = salaryBillBaseSetService.getAckFeedbackSetting(); + SalaryBillAckFeedbackDTO salaryBillAckFeedback = getSalaryBillBaseSetService(user).getDefaultAckFeedbackSetting(); if (Objects.isNull(salaryBillWatermark)) { dto.setWatermarkStatus(false); @@ -57,16 +58,16 @@ public class SalaryBillBaseSetWrapper extends Service { dto.setWatermarkSetting(salaryBillWatermark.getWmSetting()); dto.setWatermark(salaryBillWatermark.getWatermarkType()); } -// if (Objects.nonNull(salaryBillAckFeedback)) { -// data.put("ackStatus", salaryBillAckFeedback.getAckStatus()); -// data.put("feedbackStatus", salaryBillAckFeedback.getFeedbackStatus()); -// } + if (Objects.nonNull(salaryBillAckFeedback)) { + // 工资单反馈默认设置 + dto.setAckFeedbackSetting(salaryBillAckFeedback); + } return dto; } /** - * 保存工资单水印设置 + * 保存工资单模板基础设置 * * @param saveParam * @return diff --git a/src/com/engine/salary/wrapper/SalaryFieldWrapper.java b/src/com/engine/salary/wrapper/SalaryFieldWrapper.java index 00ec26ebf..38f53c4fb 100644 --- a/src/com/engine/salary/wrapper/SalaryFieldWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryFieldWrapper.java @@ -25,6 +25,9 @@ import com.engine.salary.service.impl.SalaryFormulaServiceImpl; import com.engine.salary.service.impl.SalaryItemServiceImpl; import com.engine.salary.service.impl.SalarySobItemServiceImpl; import com.engine.salary.service.impl.SysSalaryItemServiceImpl; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.Column; @@ -49,11 +52,11 @@ import java.util.*; public class SalaryFieldWrapper extends Service { private SalaryItemService getSalaryItemService(User user) { - return ServiceUtil.getService(SalaryItemServiceImpl.class, user); + return ServiceUtil.getService(SalaryItemServiceImpl.class, user); } private SalaryFormulaService getSalaryFormulaService(User user) { - return ServiceUtil.getService(SalaryFormulaServiceImpl.class, user); + return ServiceUtil.getService(SalaryFormulaServiceImpl.class, user); } @@ -69,6 +72,10 @@ public class SalaryFieldWrapper extends Service { return ServiceUtil.getService(SysSalaryItemServiceImpl.class, user); } + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + /** * 薪资项目列表 * @@ -100,6 +107,9 @@ public class SalaryFieldWrapper extends Service { salaryItemListDTOPage.getColumns().clear(); salaryItemListDTOPage.setColumns(fieldColumns); + //是否需要系统算税,不需要则去除系统项目 + TaxDeclarationFunctionEnum taxDeclarationFunctionEnum = getSalarySysConfService(user).getTaxDeclaration(); + // 被薪资账套引用的薪资项目 if (CollectionUtils.isNotEmpty(salaryItemList)) { // 查询系统薪资项目 @@ -109,7 +119,9 @@ public class SalaryFieldWrapper extends Service { List salaryItemListDTOS = SalaryItemBO.convert2ListDTO(salaryItemList, Collections.emptyList(), sysSalaryItemPOS); //系统项目不删除 salaryItemListDTOS.forEach(dto -> { - if (StringUtils.isNotBlank(dto.getSystemName()) || usingItemIds.contains(dto.getId()) || usingCodes.contains(dto.getCode())) { + if ((taxDeclarationFunctionEnum != TaxDeclarationFunctionEnum.CLOSURE && StringUtils.isNotBlank(dto.getSystemName())) + || usingItemIds.contains(dto.getId()) + || usingCodes.contains(dto.getCode())) { dto.setCanDelete(false); } }); @@ -207,6 +219,7 @@ public class SalaryFieldWrapper extends Service { /** * 保存字段排序信息 + * * @param salaryItemPOS */ public void saveSortedIndex(List salaryItemPOS) { diff --git a/src/com/engine/salary/wrapper/SalaryItemWrapper.java b/src/com/engine/salary/wrapper/SalaryItemWrapper.java index 3a03a30d3..84355ade6 100644 --- a/src/com/engine/salary/wrapper/SalaryItemWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryItemWrapper.java @@ -18,6 +18,9 @@ import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.service.*; import com.engine.salary.service.impl.*; +import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; +import com.engine.salary.sys.service.SalarySysConfService; +import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; @@ -61,6 +64,10 @@ public class SalaryItemWrapper extends Service { return ServiceUtil.getService(SalarySobBackItemServiceImpl.class, user); } + private SalarySysConfService getSalarySysConfService(User user) { + return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); + } + /** * 薪资项目列表 * @@ -89,6 +96,10 @@ public class SalaryItemWrapper extends Service { salaryItemListDTOPage.setPageNum(page.getPageNum()); salaryItemListDTOPage.setTotal(page.getTotal()); + //是否需要系统算税,不需要则去除系统项目 + TaxDeclarationFunctionEnum taxDeclarationFunctionEnum = getSalarySysConfService(user).getTaxDeclaration(); + + // 被薪资账套引用的薪资项目 if (CollectionUtils.isNotEmpty(salaryItemList)) { //2、填充公式内容 @@ -101,7 +112,9 @@ public class SalaryItemWrapper extends Service { List salaryItemListDTOS = SalaryItemBO.convert2ListDTO(salaryItemList, expressFormulas, sysSalaryItemPOS); //系统项目不删除 salaryItemListDTOS.forEach(dto -> { - if (StringUtils.isNotBlank(dto.getSystemName()) || usingItemIds.contains(dto.getId()) || usingCodes.contains(dto.getCode())) { + if ((taxDeclarationFunctionEnum != TaxDeclarationFunctionEnum.CLOSURE && StringUtils.isNotBlank(dto.getSystemName())) + || usingItemIds.contains(dto.getId()) + || usingCodes.contains(dto.getCode())) { dto.setCanDelete(false); } }); diff --git a/src/com/engine/salary/wrapper/SalarySendWrapper.java b/src/com/engine/salary/wrapper/SalarySendWrapper.java index 1613de006..60a480841 100644 --- a/src/com/engine/salary/wrapper/SalarySendWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySendWrapper.java @@ -1,5 +1,6 @@ package com.engine.salary.wrapper; +import cn.hutool.core.util.ObjectUtil; import com.api.browser.bean.SearchConditionGroup; import com.api.browser.bean.SearchConditionItem; import com.api.browser.bean.SearchConditionOption; @@ -147,22 +148,10 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy // todo 目前就一个回算,那么没有冻结且是回算,就展示补发名称 e.setTemplate(NumberUtils.INTEGER_ONE.equals(e.getSalaryAcctType()) ? optional.get().getReplenishName() : optional.get().getName()); e.setTemplateId(optional.get().getId()); + e.setAckFeedbackStatus(optional.get().getAckFeedbackStatus() == null ? 0 : optional.get().getAckFeedbackStatus()); } -// e.setHaveBackCalc(NumberUtils.INTEGER_ZERO); }); } - // 薪资核算ID - Set salaryAcctIds = SalaryEntityUtil.properties(pageList, SalarySendListDTO::getSalaryAcctId); - // 获取是回算的薪资核算ID - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - List salaryAcctRecordPOS = getSalaryAcctRecordService(user).getBackCalcRecordByIds(salaryAcctIds); -// Set backCalcSalarySobs = SalaryEntityUtil.properties(salaryAcctRecordPOS, salaryAcctRecordPO -> salaryAcctRecordPO.getSalarySobId() + "-" + sdf.format(salaryAcctRecordPO.getSalaryMonth())); -// // 判断是否回算过,haveBackCalc 属性 -// pageList.stream().forEach(salarySendDTO -> { -// if (backCalcSalarySobs.contains(salarySendDTO.getSalarySobId() + "-" + sdf.format(salarySendDTO.getSalaryYearMonth()))) { -// salarySendDTO.setHaveBackCalc(NumberUtils.INTEGER_ONE); -// } -// }); List columns = buildWeaTableColumns(); WeaTable table = new WeaTable(); table.setColumns(columns); @@ -327,7 +316,6 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy PageInfo pageInfo = getSalarySendService(user).salarySendInfoListPage(queryParam); - return pageInfo; } @@ -691,6 +679,20 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy return PayrollCheckTypeEnum.parseByValue(conf.getConfValue()); } + + public void confirmSalaryBill(Long salaryInfoId) { + if(ObjectUtil.isNull(salaryInfoId)){ + throw new SalaryRunTimeException("工资单id不能为空!"); + } + getSalaryBillService(user).confirmSalaryBill(salaryInfoId); + } + + public void feedBackSalaryBill(Long salaryInfoId) { + if(ObjectUtil.isNull(salaryInfoId)){ + throw new SalaryRunTimeException("工资单id不能为空!"); + } + getSalaryBillService(user).feedBackSalaryBill(salaryInfoId); + } } diff --git a/src/com/engine/salary/wrapper/SalarySystemConfigWrapper.java b/src/com/engine/salary/wrapper/SalarySystemConfigWrapper.java index a29b94c6b..f4fed1948 100644 --- a/src/com/engine/salary/wrapper/SalarySystemConfigWrapper.java +++ b/src/com/engine/salary/wrapper/SalarySystemConfigWrapper.java @@ -12,6 +12,7 @@ import com.engine.salary.sys.entity.vo.OrderRuleVO; import com.engine.salary.sys.enums.TaxDeclarationFunctionEnum; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; +import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.engine.salary.util.valid.RuntimeTypeEnum; @@ -43,11 +44,18 @@ public class SalarySystemConfigWrapper extends Service { String log = baseBean.getPropValue("hrmSalary", "log"); String version = baseBean.getPropValue("hrmSalary", "version"); String openFormulaForcedEditing = baseBean.getPropValue("hrmSalary", "openFormulaForcedEditing"); + String showEncryptOperationButton = baseBean.getPropValue("hrmSalary", "showEncryptOperationButton"); Map o = new HashMap<>(); o.put("log", log); o.put("version", version); o.put("openFormulaForcedEditing", openFormulaForcedEditing); + o.put("showEncryptOperationButton", showEncryptOperationButton); + + + List confPOS = getSalarySysConfService(user).listSome(SalarySysConfPO.builder().build()); + Map map = SalaryEntityUtil.convert2Map(confPOS, SalarySysConfPO::getConfKey, SalarySysConfPO::getConfValue); + o.putAll(map); return o; } @@ -143,4 +151,16 @@ public class SalarySystemConfigWrapper extends Service { public void saveSalaryAcctEmployeeRule(String rule) { getSalarySysConfService(user).saveSalaryAcctEmployeeRule(rule); } + + public void saveWithDrawTaxDeclaration(SalarySysConfPO param) { + getSalarySysConfService(user).saveWithDrawTaxDeclaration(param); + } + + public void saveArchiveDelete(String setting) { + getSalarySysConfService(user).saveArchiveDelete(setting); + } + + public void saveSalarySendFeedback(SalarySysConfPO param) { + getSalarySysConfService(user).saveSalarySendFeedback(param); + } } diff --git a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java index 7639f4e13..d5d7a68cf 100644 --- a/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryTemplateWrapper.java @@ -20,6 +20,7 @@ import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.page.PageInfo; import com.mzlion.core.utils.BeanUtils; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import weaver.hrm.User; @@ -60,6 +61,10 @@ public class SalaryTemplateWrapper extends Service { return ServiceUtil.getService(TaxAgentServiceImpl.class, user); } + private SalaryBillBaseSetService getSalaryBillBaseSetService(User user) { + return ServiceUtil.getService(SalaryBillBaseSetServiceImpl.class, user); + } + /** * 工资单模板列表 * @@ -153,6 +158,9 @@ public class SalaryTemplateWrapper extends Service { salaryTemplateBaseSetDTO.setMsgStatus(po.getMsgStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())); salaryTemplateBaseSetDTO.setSalarySob(po.getSalarySobId()); salaryTemplateBaseSetDTO.setSendEmail(po.getSendEmailId()); + salaryTemplateBaseSetDTO.setAutoSendStatus(po.getAutoSendStatus() == null ? false : po.getAutoSendStatus().equals(SalaryTemplateWhetherEnum.TRUE.getValue())); + salaryTemplateBaseSetDTO.setAckFeedbackStatus(po.getAckFeedbackStatus() == null ? false : NumberUtils.compare(po.getAckFeedbackStatus(), 1) == 0); + salaryTemplateBaseSetDTO.setAutoAckDays(ObjectUtils.isEmpty(po.getAutoAckDays()) ? 7 : po.getAutoAckDays()); // 规则赋值 如果为ALL传“” 如果为byRule传薪资项目ID salaryTemplateBaseSetDTO.setReplenishRule(SalaryTemplateReplenishRuleEnum.ALL.getValue().equals(po.getReplenishRule()) ? "" : po.getReplenishRule()); // 规则设置赋值 @@ -181,6 +189,13 @@ public class SalaryTemplateWrapper extends Service { // WeaForm salaryTemplateBase = SalaryFormatUtil.getInstance().buildForm(SalaryTemplateBaseSetDTO.class, SalaryTemplateBaseSetDTO.builder().salarySobOptions(salarySobOptions).sendEmailOptions(sendEmailOptions).build()); + if(id == null){ + // 新建,获取默认的确认反馈信息 + SalaryBillAckFeedbackDTO defaultAckFeedback = getSalaryBillBaseSetService(user).getDefaultAckFeedbackSetting(); + salaryTemplateBaseSetDTO.setAckFeedbackStatus(StringUtils.equals(defaultAckFeedback.getAckStatus(),"1")); + salaryTemplateBaseSetDTO.setAutoAckDays(defaultAckFeedback.getAutoAckDays()); + salaryTemplateBaseSetDTO.setFeedbackUrl(defaultAckFeedback.getFeedBackUrl()); + } Map salaryTemplateBase = new HashMap<>(); salaryTemplateBase.put("data", salaryTemplateBaseSetDTO); salaryTemplateBase.put("salarySobOptions", salarySobOptions); @@ -415,7 +430,7 @@ public class SalaryTemplateWrapper extends Service { Boolean isReplenish = Optional.ofNullable(param.getIsReplenish()) .orElse(false); List salaryItemSet - = getSalaryTemplateService(user).getSalaryItemSet(param.getSalarySobId(), isReplenish); + = getSalaryTemplateService(user).getSalaryItemSetContainHide(param.getSalarySobId(), isReplenish); Long groupId = param.getGroupId(); return salaryItemSet.stream() .filter(s -> Objects.equals(s.getGroupId(), groupId + "")) @@ -437,7 +452,7 @@ public class SalaryTemplateWrapper extends Service { public List getSalaryGroupSet(SalaryBillSalaryGroupQueryParam param) { Boolean isReplenish = Optional.ofNullable(param.getIsReplenish()) .orElse(false); - return getSalaryTemplateService(user).getSalaryItemSet(param.getSalarySobId(), isReplenish) + return getSalaryTemplateService(user).getSalaryItemSetContainHide(param.getSalarySobId(), isReplenish) .stream() .filter(group -> !Optional.ofNullable(param.getExistSalaryGroupIds()).orElse(Collections.emptyList()) .contains(group.getGroupId())