Merge remote-tracking branch 'remotes/origin/release/2.9.2.2307.02' into feature/230701-薪资核算-导出功能可选择字段导出

This commit is contained in:
sy 2023-07-19 10:04:58 +08:00
commit 4b503513f2
98 changed files with 2133 additions and 237 deletions

View File

@ -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');

View File

@ -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;
/

View File

@ -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;
/

View File

@ -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;
/

View File

@ -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;
/

View File

@ -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;

View File

@ -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;

View File

@ -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
/

View File

@ -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
/

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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();
}
}
}

View File

@ -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)

View File

@ -29,10 +29,7 @@ public class SalaryBaseSetFormDTO {
// 水印设置
private Object watermarkSetting;
// 签名确认
private Boolean ackStatus;
// 员工反馈
private Boolean feedbackStatus;
// 工资单反馈设置
private SalaryBillAckFeedbackDTO ackFeedbackSetting;
}

View File

@ -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 {
/**
* 工资单确认反馈是否开启01
*/
private String ackStatus;
/**
* 反馈地址
*/
private String feedBackUrl;
/**
* 超时自动确认天数
*/
private Integer autoAckDays;
}

View File

@ -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;
}

View File

@ -141,5 +141,10 @@ public class SalarySendListDTO {
*/
// private Integer haveBackCalc;
/**
* 工资单确认反馈状态
*/
private Integer ackFeedbackStatus;
}

View File

@ -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;
}

View File

@ -54,4 +54,5 @@ public class SalaryTemplateShowSetDTO {
// 薪资项为0时不显示")
private Boolean salaryItemZeroStatus;
}

View File

@ -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<String, Object> 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, "是否启用反馈必传"));
// }
}
}

View File

@ -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时不显示开启状态falsetrue
private Boolean salaryItemZeroStatus;
// 是否启用工资单定时发送0未启用1已启用
private Boolean autoSendStatus;
// 自动发送工资单周期1本月2上月
private Integer autoSendCycleType;
// 每月几号自动发送工资单
private String autoSendDayOfMonth;
// 自动发放时间
private String autoSendTimeOfDay;
// 薪资项目设置
private List<SalaryTemplateSalaryItemSetListDTO> salaryItemSetting;
@ -75,6 +88,22 @@ public class SalaryTemplateSaveParam {
// 补发薪资项目设置
private List<SalaryTemplateSalaryItemSetListDTO> 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, "自动发放时间不能为空"));
}
}
}

View File

@ -52,6 +52,21 @@ public class SalarySendInfoPO {
*/
private Integer sendStatus;
/**
* 查看状态0未查看1已查看
*/
private Integer billReadStatus;
/**
* 确认状态 0未确认1已确认
*/
private Integer billConfirmStatus;
/**
* 操作发送工资单人员id
*/
private Long sendEmployeeId;
/**
* 发送时间
*/

View File

@ -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<Long> salarySobIds;
}

View File

@ -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<Result> results;
/**
* 系统算税启用状态
*/
private TaxDeclarationFunctionEnum taxDeclarationFunction;
@Data
@AllArgsConstructor
public static class Result {

View File

@ -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())

View File

@ -50,6 +50,8 @@ public class SalaryAcctEmployeeQueryParam extends BaseQueryParam {
*/
private SalaryEmployeeStatusEnum status;
//状态(多选)
private List<String> statuses;
//离职日期")
private LocalDateRange dismissDate;

View File

@ -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<String> statuses;
//离职日期
private LocalDateRange dismissDate;

View File

@ -48,6 +48,8 @@ public class SalaryArchiveQueryParam extends BaseQueryParam {
//状态
private String userstatus;
//状态(多选)
private List<String> statuses;
//入职日期
private List<String> hiredate;

View File

@ -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());
}
}

View File

@ -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()))

View File

@ -38,6 +38,7 @@ public class InsuranceArchivesListParam extends BaseQueryParam {
//状态(多线)")
private List<String> statuses;
private String statusesStr;
//岗位(多选)")
private List<BigDecimal> positions;

View File

@ -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<Integer> {
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 "";
}
}

View File

@ -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<Integer> {
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 "";
}
}

View File

@ -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<Integer> {
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;
}
}

View File

@ -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<SalaryAcctCalculateBO.Result> calculateResults = new LinkedBlockingDeque<>(partition.size());
// 12.3生成本次运算的key
String calculateKey = UUID.randomUUID().toString();
// 12.4是否采用系统算税
TaxDeclarationFunctionEnum taxDeclarationFunction = getSalarySysConfService(user).getTaxDeclaration();
// 12.4多线程运算运算结果存放在临时表中
for (List<SalaryAcctEmployeePO> 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<SalarySobBackItemPO> finalSalarySobBackItems = salarySobBackItems;
LocalRunnable localRunnable = new LocalRunnable() {
@Override

View File

@ -122,4 +122,6 @@ public interface SalaryArchiveMapper {
void deletePendingTodo(@Param("ids") Collection<Long> ids);
void deleteSuspendTodo(@Param("ids") Collection<Long> ids);
void deleteByIds(@Param("ids")Collection<Long> deleteIds);
}

View File

@ -154,6 +154,12 @@
<if test="param.userstatus != null and param.userstatus != ''">
AND e.status = #{param.userstatus}
</if>
<if test="param.statuses != null and param.statuses.size()>0">
AND e.status IN
<foreach collection="param.statuses" open="(" item="userstatus" separator="," close=")">
#{userstatus}
</foreach>
</if>
<!-- 入职日期 -->
<if test="param.hiredate != null and param.hiredate.size() == 2">
AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]})
@ -229,7 +235,12 @@
<if test="param.userstatus != null and param.userstatus != ''">
AND e.status = #{param.userstatus}
</if>
<if test="param.statuses != null and param.statuses.size()>0">
AND e.status IN
<foreach collection="param.statuses" open="(" item="userstatus" separator="," close=")">
#{userstatus}
</foreach>
</if>
<if test="param.hiredate != null and param.hiredate.size() == 2">
AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]})
</if>
@ -305,7 +316,12 @@
<if test="param.userstatus != null and param.userstatus != ''">
AND e.status = #{param.userstatus}
</if>
<if test="param.statuses != null and param.statuses.size()>0">
AND e.status IN
<foreach collection="param.statuses" open="(" item="userstatus" separator="," close=")">
#{userstatus}
</foreach>
</if>
<if test="param.hiredate != null and param.hiredate.size() == 2">
AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]})
</if>
@ -487,6 +503,16 @@
</foreach>
</delete>
<delete id="deleteByIds">
UPDATE hrsa_salary_archive
SET delete_type=1
WHERE delete_type = 0
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="listSome" resultType="com.engine.salary.entity.salaryarchive.po.SalaryArchivePO">
SELECT
<include refid="baseColumns"/>

View File

@ -497,6 +497,7 @@
or (param.subcompanyIds != null and param.subcompanyIds.size()>0)
or (param.departmentIds != null and param.departmentIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.statuses != null and param.statuses.size()>0)
or (param.status != null and param.status.toString != 'ALL')">
AND t.employee_id IN
(
@ -528,6 +529,12 @@
#{positionId}
</foreach>
</if>
<if test="param.statuses != null and param.statuses.size()>0">
AND em.status IN
<foreach collection="param.statuses" open="(" item="userStatus" separator="," close=")">
#{userStatus}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND em.status in (0,1,2,3)
@ -579,8 +586,10 @@
</if>
<if test="(param.employeeName != null and param.employeeName != '')
or (param.workcode != null and param.workcode != '')
or (param.subcompanyIds != null and param.subcompanyIds.size()>0)
or (param.departmentIds != null and param.departmentIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.statuses != null and param.statuses.size()>0)
or (param.status != null and param.status.toString != 'ALL')">
AND t.employee_id IN
(
@ -592,6 +601,12 @@
<if test="param.workcode != null and param.workcode != ''">
AND em.workcode like '%'||#{param.workcode}||'%'
</if>
<if test="param.subcompanyIds != null and param.subcompanyIds.size()>0">
AND em.subcompanyid1 IN
<foreach collection="param.subcompanyIds" open="(" item="subcompanyId" separator="," close=")">
#{subcompanyId}
</foreach>
</if>
<if test="param.departmentIds != null and param.departmentIds.size()>0">
AND em.departmentid IN
<foreach collection="param.departmentIds" open="(" item="departmentId" separator="," close=")">
@ -604,6 +619,12 @@
#{positionId}
</foreach>
</if>
<if test="param.statuses != null and param.statuses.size()>0">
AND em.status IN
<foreach collection="param.statuses" open="(" item="userStatus" separator="," close=")">
#{userStatus}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND em.status in (0,1,2,3)
@ -655,8 +676,10 @@
</if>
<if test="(param.employeeName != null and param.employeeName != '')
or (param.workcode != null and param.workcode != '')
or (param.subcompanyIds != null and param.subcompanyIds.size()>0)
or (param.departmentIds != null and param.departmentIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.positionIds != null and param.positionIds.size()>0)
or (param.statuses != null and param.statuses.size()>0)
or (param.status != null and param.status.toString != 'ALL')">
AND t.employee_id IN
(
@ -668,6 +691,12 @@
<if test="param.workcode != null and param.workcode != ''">
AND em.workcode like '%'+#{param.workcode}+'%'
</if>
<if test="param.subcompanyIds != null and param.subcompanyIds.size()>0">
AND em.subcompanyid1 IN
<foreach collection="param.subcompanyIds" open="(" item="subcompanyId" separator="," close=")">
#{subcompanyId}
</foreach>
</if>
<if test="param.departmentIds != null and param.departmentIds.size()>0">
AND em.departmentid IN
<foreach collection="param.departmentIds" open="(" item="departmentId" separator="," close=")">
@ -680,6 +709,12 @@
#{positionId}
</foreach>
</if>
<if test="param.statuses != null and param.statuses.size()>0">
AND em.status IN
<foreach collection="param.statuses" open="(" item="userStatus" separator="," close=")">
#{userStatus}
</foreach>
</if>
-- 在职
<if test="param.status != null and param.status.toString == 'NORMAL'">
AND em.status in (0,1,2,3)

View File

@ -99,4 +99,19 @@ public interface SalarySendInfoMapper {
void updateIgnoreNull(SalarySendInfoPO po);
void deleteBySalaryAcctRecordIds(@Param("salaryAcctRecordId") Collection<Long> ids);
List<SalarySendInfoPO> getNeedSendInfoList(@Param("salarySendIds") List<Long> salarySendIds);
/**
* 自动确认工资单
* @param needAutoIds
*/
void autoConfirmSalaryBill(@Param("ids") List<Long> needAutoIds);
/**
* 根据薪资账套id获取已发送确认状态为未确认的工资单
* @param salarySobIds
* @return
*/
List<SalarySendInfoPO> listUnConfirmedSendInfo(@Param("salarySobIds") List<Long> salarySobIds);
}

View File

@ -36,6 +36,9 @@
, t.delete_type
, t.tenant_key
, t.salary_acct_type
, t.bill_read_status
, t.bill_confirm_status
, t.send_employee_id
</sql>
<update id="deleteBySalaryAcctRecordIds">
update hrsa_salary_send_info
@ -168,6 +171,8 @@
t1.send_status,
t1.employee_id,
t1.salary_month,
t1.bill_read_status as billReadStatus,
t1.bill_confirm_status as billConfirmStatus,
e.email
</sql>
@ -609,7 +614,16 @@
delete_type = #{po.deleteType},
</if>
<if test="po.salaryTemplate != null">
salary_template = #{po.salaryTemplate}
salary_template = #{po.salaryTemplate},
</if>
<if test="po.billReadStatus != null">
bill_read_status = #{po.billReadStatus},
</if>
<if test="po.billConfirmStatus != null">
bill_confirm_status = #{po.billConfirmStatus},
</if>
<if test="po.sendEmployeeId != null">
send_employee_id = #{po.sendEmployeeId}
</if>
</set>
@ -682,8 +696,41 @@
<if test="tenantKey != null and tenantKey != ''">
AND tenant_key = #{tenantKey}
</if>
<if test="billConfirmStatus != null and billConfirmStatus != ''">
AND bill_confirm_status = #{billConfirmStatus}
</if>
<if test="billReadStatus != null and billReadStatus != ''">
AND bill_read_status = #{billReadStatus}
</if>
ORDER BY id DESC
</select>
<select id="getNeedSendInfoList" resultType="com.engine.salary.entity.salaryBill.po.SalarySendInfoPO">
select id,salary_send_id
from hrsa_salary_send_info a
where a.delete_type=0
and a.send_status in (0,2)
and (a.salary_acct_type!=1 or a.salary_acct_type is null)
<if test="salarySendIds != null and salarySendIds.size() > 0">
AND a.salary_send_id IN
<foreach collection="salarySendIds" open="(" item="salarySendId" separator="," close=")">
#{salarySendId}
</foreach>
</if>
</select>
<select id="listUnConfirmedSendInfo" resultType="com.engine.salary.entity.salaryBill.po.SalarySendInfoPO">
SELECT
<include refid="baseColumns" />
FROM hrsa_salary_send_info t
LEFT JOIN hrsa_salary_send s
ON t.salary_send_id = s.id
WHERE t.delete_type = 0
AND t.send_status = 1
AND s.salary_sob_id IN
<foreach collection="salarySobIds" separator="," item="salarySobId" open="(" close=")">
#{salarySobId}
</foreach>
AND (t.bill_confirm_status = 0 or bill_confirm_status is null)
</select>
<!-- 更新不为NULL的字段 -->
@ -696,9 +743,6 @@
<if test="salaryMonth != null">
salary_month=#{salaryMonth},
</if>
<if test="useType != null">
use_type=#{useType},
</if>
<if test="salaryAcctRecordId != null">
salary_acct_record_id=#{salaryAcctRecordId},
</if>
@ -732,8 +776,27 @@
<if test="tenantKey != null">
tenant_key=#{tenantKey},
</if>
<if test="billReadStatus != null">
bill_read_status=#{billReadStatus},
</if>
<if test="billConfirmStatus != null">
bill_confirm_status=#{billConfirmStatus},
</if>
</set>
WHERE id = #{id} AND delete_type = 0
</update>
<update id="autoConfirmSalaryBill">
UPDATE hrsa_salary_send_info
set
bill_confirm_status = 1
where
delete_type = 0
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
</update>
</mapper>

View File

@ -63,4 +63,8 @@ public interface SalarySendMapper {
void batchHandleSalaryAcctTypeHistory();
void deleteBySalaryAcctRecordIds(@Param("salaryAcctRecordId") Collection<Long> ids);
List<SalarySendPO> getNeedSendListBySalarySobIds(@Param("salarySobIds")List<Long> salarySobIds);
List<SalarySendPO> getByIds(@Param("ids") List<Long> salarySendId);
}

View File

@ -236,6 +236,34 @@
</if>
ORDER BY id DESC
</select>
<select id="getNeedSendListBySalarySobIds"
resultType="com.engine.salary.entity.salaryBill.po.SalarySendPO">
select
<include refid="salarySendPOColumn" />
from hrsa_salary_send
where
delete_type=0 and send_total != send_num
and (salary_acct_type = 0 or salary_acct_type is null )
and (send_status = 0 or send_status is null)
<if test="salarySobIds != null and salarySobIds.size() > 0">
AND salary_sob_id IN
<foreach collection="salarySobIds" open="(" item="salarySobId" separator="," close=")">
#{salarySobId}
</foreach>
</if>
</select>
<select id="getByIds" resultType="com.engine.salary.entity.salaryBill.po.SalarySendPO">
SELECT
<include refid="salarySendPOColumn" />
FROM hrsa_salary_send t
WHERE delete_type = 0
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
</select>
<!-- 插入不为NULL的字段 -->

View File

@ -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 @@
<if test="deleteType != null and deleteType != ''">
AND delete_type = #{deleteType}
</if>
<if test="autoSendStatus != null and autoSendStatus != ''">
AND auto_send_status = #{autoSendStatus}
</if>
<if test="ackFeedbackStatus != null and ackFeedbackStatus != ''">
AND ack_feedback_status = #{ackFeedbackStatus}
</if>
<if test="salarySobIds != null and salarySobIds.size() > 0">
AND salary_sob_id IN
<foreach collection="salarySobIds" open="(" item="id" separator="," close=")">
@ -490,6 +510,27 @@
<if test="replenishSalaryItemSetting != null">
replenish_salary_item_setting=#{replenishSalaryItemSetting},
</if>
<if test="autoSendStatus != null">
auto_send_status=#{autoSendStatus},
</if>
<if test="autoSendCycleType != null">
auto_send_cycle_type=#{autoSendCycleType},
</if>
<if test="autoSendDayOfMonth != null">
auto_send_day_of_month=#{autoSendDayOfMonth},
</if>
<if test="autoSendTimeOfDay != null">
auto_send_time_of_day=#{autoSendTimeOfDay},
</if>
<if test="ackFeedbackStatus!= null">
ack_feedback_status=#{ackFeedbackStatus},
</if>
<if test="autoAckDays != null">
auto_ack_days=#{autoAckDays},
</if>
<if test="feedbackUrl != null">
feedback_url=#{feedbackUrl},
</if>
<if test="createTime != null">
create_time=#{createTime},
</if>
@ -568,6 +609,27 @@
<if test="replenishSalaryItemSetting != null">
replenish_salary_item_setting,
</if>
<if test="autoSendStatus != null">
auto_send_status,
</if>
<if test="autoSendCycleType != null">
auto_send_cycle_type,
</if>
<if test="autoSendDayOfMonth != null">
auto_send_day_of_month,
</if>
<if test="autoSendTimeOfDay != null">
auto_send_time_of_day,
</if>
<if test="ackFeedbackStatus != null">
ack_feedback_status,
</if>
<if test="autoAckDays != null">
auto_ack_days,
</if>
<if test="feedbackUrl != null">
feedback_url,
</if>
<if test="createTime != null">
create_time,
</if>
@ -642,6 +704,27 @@
<if test="replenishSalaryItemSetting != null">
#{replenishSalaryItemSetting},
</if>
<if test="autoSendStatus != null">
#{autoSendStatus},
</if>
<if test="autoSendCycleType != null">
#{autoSendCycleType},
</if>
<if test="autoSendDayOfMonth != null">
#{autoSendDayOfMonth},
</if>
<if test="autoSendTimeOfDay != null">
#{autoSendTimeOfDay},
</if>
<if test="ackFeedbackStatus != null">
#{ackFeedbackStatus},
</if>
<if test="autoAckDays != null">
#{autoAckDays},
</if>
<if test="feedbackUrl != null">
#{feedbackUrl},
</if>
<if test="createTime != null">
#{createTime},
</if>
@ -726,6 +809,27 @@
<if test="replenishSalaryItemSetting != null">
replenish_salary_item_setting,
</if>
<if test="autoSendStatus != null">
auto_send_status,
</if>
<if test="autoSendCycleType != null">
auto_send_cycle_type,
</if>
<if test="autoSendDayOfMonth != null">
auto_send_day_of_month,
</if>
<if test="autoSendTimeOfDay != null">
auto_send_time_of_day,
</if>
<if test="ackFeedbackStatus != null">
ack_feedback_status,
</if>
<if test="autoAckDays != null">
auto_ack_days,
</if>
<if test="feedbackUrl != null">
feedback_url,
</if>
<if test="createTime != null">
create_time,
</if>
@ -800,6 +904,27 @@
<if test="replenishSalaryItemSetting != null">
#{replenishSalaryItemSetting},
</if>
<if test="autoSendStatus != null">
#{autoSendStatus},
</if>
<if test="autoSendCycleType != null">
#{autoSendCycleType},
</if>
<if test="autoSendDayOfMonth != null">
#{autoSendDayOfMonth},
</if>
<if test="autoSendTimeOfDay != null">
#{autoSendTimeOfDay},
</if>
<if test="ackFeedbackStatus != null">
#{ackFeedbackStatus},
</if>
<if test="autoAckDays != null">
#{autoAckDays},
</if>
<if test="feedbackUrl != null">
#{feedbackUrl},
</if>
<if test="createTime != null">
#{createTime},
</if>

View File

@ -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);
}

View File

@ -609,5 +609,12 @@
AND delete_type = 0
</delete>
<!-- 根据主键获取单条记录 -->
<select id="selectOneByName" resultMap="BaseResultMap">
SELECT
<include refid="baseColumns"/>
FROM hrsa_sys_salary_item t
WHERE name = #{name} AND delete_type = 0
</select>
</mapper>

View File

@ -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<Long> ids);
/**
* 根据id删除
* @param fundArchiveDelIds
*/
void deleteByIds(@Param("ids")List<Long> fundArchiveDelIds);
}

View File

@ -105,6 +105,19 @@
</delete>
<delete id="deleteByIds">
UPDATE hrsa_fund_archives
SET delete_type = 1
WHERE delete_type = 0
<if test="ids != null and ids.size()>0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
</delete>
<!-- 根据人员id和个税扣缴义务人删除档案 -->
<update id="deleteByEmployeeIdAndPayOrg" parameterType="com.engine.salary.entity.siarchives.po.InsuranceArchivesFundSchemePO">
UPDATE hrsa_fund_archives

View File

@ -107,4 +107,10 @@ public interface InsuranceBaseInfoMapper {
* @param insuranceArchivesBaseInfoPOS
*/
void batchUpdate(@Param("collection") Collection<InsuranceArchivesBaseInfoPO> insuranceArchivesBaseInfoPOS);
/**
* 根据id删除
* @param archiveDelIds
*/
void deleteByIds(@Param("ids")List<Long> archiveDelIds);
}

View File

@ -174,6 +174,18 @@
</if>
</delete>
<delete id="deleteByIds">
UPDATE hrsa_insurance_base_info
SET delete_type = 1
WHERE delete_type = 0
<if test="ids != null and ids.size()>0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
</delete>
<!-- 根据人员id和个税扣缴义务人删除档案 -->
<update id="deleteByEmployeeIdAndPayOrg" parameterType="com.engine.salary.entity.siarchives.po.InsuranceArchivesBaseInfoPO">
UPDATE hrsa_insurance_base_info

View File

@ -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<Long> ids);
/**
* 根据id删除
* @param otherArchiveDelIds
*/
void deleteByIds(@Param("ids") List<Long> otherArchiveDelIds);
}

View File

@ -92,6 +92,18 @@
</delete>
<delete id="deleteByIds">
UPDATE hrsa_other_archives
SET delete_type = 1
WHERE delete_type = 0
AND id IN
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
</delete>
<!-- 根据人员id和个税扣缴义务人删除档案 -->
<update id="deleteByEmployeeIdAndPayOrg" parameterType="com.engine.salary.entity.siarchives.po.InsuranceArchivesOtherSchemePO">
UPDATE hrsa_other_archives

View File

@ -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<Long> ids);
/**
* 根据id删除
* @param socialArchiveDelIds
*/
void deleteByIds(@Param("ids")List<Long> socialArchiveDelIds);
}

View File

@ -101,6 +101,18 @@
</if>
</delete>
<delete id="deleteByIds">
UPDATE hrsa_social_archives
SET delete_type = 1
WHERE delete_type = 0
<if test="ids != null and ids.size()>0">
AND id IN
<foreach collection="ids" open="(" item="id" separator="," close=")">
#{id}
</foreach>
</if>
</delete>
<!-- 根据人员id和个税扣缴义务人删除档案 -->
<update id="deleteByEmployeeIdAndPayOrg" parameterType="com.engine.salary.entity.siarchives.po.InsuranceArchivesSocialSchemePO">
UPDATE hrsa_social_archives

View File

@ -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<SalarySysConfPO> getListByCodes(@Param("codes") List<String> codes);
}

View File

@ -237,4 +237,17 @@
select update_time from HRSA_SALARY_SYS_CONF WHERE conf_key = 'taxDeclarationFunction'
</select>
<select id="getListByCodes" resultType="com.engine.salary.sys.entity.po.SalarySysConfPO">
SELECT
<include refid="baseColumns"/>
FROM hrsa_salary_sys_conf t
WHERE delete_type = 0
<if test="codes != null and codes.size()>0">
and conf_key IN
<foreach collection="codes" open="(" close=")" item="code" separator=",">
#{code}
</foreach>
</if>
</select>
</mapper>

View File

@ -95,4 +95,10 @@ public interface SIArchivesService {
* 处理福利档案增量数据
*/
void handleChangeData(long currentEmployeeId);
/**
* 删除档案
* @param longs
*/
void deleteArchive(Collection<Long> longs);
}

View File

@ -225,4 +225,10 @@ public interface SalaryArchiveService {
* @param currentEmployeeId
*/
void handleChangeData(Long currentEmployeeId);
/**
* 删除薪资档案
* @param salaryArchiveIds
*/
void deleteSalaryArchive(Collection<Long> salaryArchiveIds);
}

View File

@ -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<String, Object> wmSetting);
/**
* 获取默认工资单确认反馈设置
* @return
*/
SalaryBillAckFeedbackDTO getDefaultAckFeedbackSetting();
}

View File

@ -30,6 +30,18 @@ public interface SalaryBillService {
*/
List<Map<String, Object>> getSendInfoList(Long sendId, List<Long> ids);
/**
* 确认工资单
* @param salaryInfoId
*/
void confirmSalaryBill(Long salaryInfoId);
/**
* 工资单反馈
* @param salaryInfoId
*/
void feedBackSalaryBill(Long salaryInfoId);
/**
* 工资单撤回
*

View File

@ -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<SalarySendInfoPO> getNeedSendInfoList(List<Long> salarySendIds);
/**
* 获取这些模板下未发放完的工资单
* @param salarySobIds
* @return
*/
List<SalarySendPO> getNeedSendListBySalarySobIds(List<Long> salarySobIds);
/**
* 获取所有为确认的工资单
* @return
* @return
*/
List<SalarySendInfoPO> listUnConfirmedSendInfo(List<Long> salarySobIds);
/**
* 自动确认工资单
* @param needAutoIds
*/
void autoConfirmSalaryBill(List<Long> needAutoIds);
List<SalarySendPO> getByIds(List<Long> salarySendId);
}

View File

@ -84,13 +84,21 @@ public interface SalaryTemplateService {
List<Map<String, Object>> selectSalarySobList();
/**
* 获取薪资项目设置
* 获取薪资项目设置(不包含已隐藏的薪资项目分类)
*
* @param salarySobId
* @return
*/
List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId, boolean isReplenish);
/**
* 获取薪资项目设置(包含已隐藏的薪资项目分类)
*
* @param salarySobId
* @return
*/
List<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSetContainHide(Long salarySobId, boolean isReplenish);
/**
* 获取默认工资单模板
*
@ -112,4 +120,15 @@ public interface SalaryTemplateService {
* @return
*/
PageInfo<SalaryTemplateListDTO> listPage(SalaryTemplateQueryParam queryParam);
/**
* 获取所有设置了定时发送的默认工资单模板
*/
List<SalaryTemplatePO> getAutoSendTemplate();
/**
* 获取所有开启了工资单确认反馈的默认工资单模板
* @return
*/
List<SalaryTemplatePO> listNeedAckDefaultTemplate();
}

View File

@ -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));
}
});

View File

@ -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<Long> 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<InsuranceArchivesBaseInfoPO> insuranceArchivesList = getInsuranceBaseInfoMapper().listByIds(archiveIds);
//查询当前登录人员管理的个税扣缴义务人
List<Long> 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<InsuranceArchivesBaseInfoPO> 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<Long> archiveDelIds = insuranceArchivesList.stream().map(InsuranceArchivesBaseInfoPO::getId).collect(Collectors.toList());
List<Long> socialArchiveDelIds = insuranceArchivesList.stream().map(InsuranceArchivesBaseInfoPO::getSocialArchivesId).collect(Collectors.toList());
List<Long> fundArchiveDelIds = insuranceArchivesList.stream().map(InsuranceArchivesBaseInfoPO::getFundArchivesId).collect(Collectors.toList());
List<Long> 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<InsuranceArchivesBaseInfoPO> addNewInsuranceBaseInfo(List<InsuranceArchivesBaseInfoPO> baseInfoPOList, Long currentEmployeeId) {
List<InsuranceArchivesSocialSchemePO> 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;

View File

@ -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());

View File

@ -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<SalaryAcctEmployeePO> otherSalaryAcctEmployeePOS, List<SalaryAcctResultPO> otherSalaryAcctResultPOS) {
// 如果相同税款所属期内没有其他薪资核算人员就不存在合并计税
if (CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS) || CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) {
if (salaryAcctCalculateBO.getTaxDeclarationFunction() == TaxDeclarationFunctionEnum.CLOSURE || CollectionUtils.isEmpty(otherSalaryAcctEmployeePOS) || CollectionUtils.isEmpty(otherSalaryAcctResultPOS)) {
return resultValue;
}
// 相同税款所属期内其他薪资核算记录

View File

@ -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())) {
// 开启了个税申报功能
// 如果某个月税款所属期已经归档了不可以新建之前月份的薪资核算

View File

@ -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<SalaryAcctCalculateBO.Result> 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<SalaryAcctEmployeePO> 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<SalarySobBackItemPO> finalSalarySobBackItems = salarySobBackItems;
LocalRunnable localRunnable = new LocalRunnable() {
@Override

View File

@ -388,8 +388,8 @@ public class SalaryArchiveExcelServiceImpl extends Service implements SalaryArch
// 4.注释
List<ExcelComment> 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<String> 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);

View File

@ -307,6 +307,37 @@ public class SalaryArchiveServiceImpl extends Service implements SalaryArchiveSe
}
@Override
public void deleteSalaryArchive(Collection<Long> 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<SalaryArchivePO> salaryArchiveList = getSalaryArchiveMapper().listSome(SalaryArchivePO.builder().ids(salaryArchiveIds).build());
//查询当前登录人员管理的个税扣缴义务人
List<Long> 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<SalaryArchivePO> 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<Long> deleteIds = salaryArchiveList.stream().map(SalaryArchivePO::getId).collect(Collectors.toList());
// 删除薪资档案及档案项目
if(CollectionUtils.isNotEmpty(deleteIds)){
getSalaryArchiveMapper().deleteByIds(deleteIds);
getSalaryArchiveItemMapper().deleteBySalaryArchiveId(deleteIds);
}
}
@Override
public List<SalaryArchiveListDTO> list(SalaryArchiveQueryParam queryParam) {

View File

@ -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<SalaryBillWatermarkPO> 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<String> codes = Arrays.asList(SalarySysConstant.SALARY_SEND_FEEDBACK, SalarySysConstant.SALARY_AUTO_ACK_DAYS, SalarySysConstant.SALARY_FEEDBACK_URL);
List<SalarySysConfPO> sysConfList= getSalarySysConfService(user).getListByCodes(codes);
Map<String, String> 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;
}
}

View File

@ -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<Map<String, Object>> getSendInfoList(Long sendId, List<Long> 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);
});

View File

@ -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<SalaryItemPO>() {
@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<SysSalaryItemPO> 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());

View File

@ -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<SalaryAcctRecordPO> 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<SalaryTemplatePO> 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<SalarySendPO> 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<SalarySendInfoListDTO> page = salarySendInfoMapper.list(queryParam);
return SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(),
PageInfo<SalarySendInfoListDTO> pageInfo = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(),
page, SalarySendInfoListDTO.class);
SalarySendPO salarySendPO = getSalarySendMapper().getById(queryParam.getSalarySendId());
if (ObjectUtils.isEmpty(salarySendPO))
throw new SalaryRunTimeException("工资单不存在或已被删除");
List<SalaryTemplatePO> 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<String, Object> 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<SalaryTemplateSalaryItemSetListDTO> 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<Integer> 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<SalarySendInfoPO> salarySendInfoPOS = getSalarySendInfoMapper().listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build());
List<Long> 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<String, Object> map = new HashMap<>();
Map<Long, List<SalaryAcctResultPO>> acctResultMap = SalaryEntityUtil.group2Map(salaryAcctResultPOS, SalaryAcctResultPO::getSalaryItemId);
@ -1557,4 +1601,44 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
return true;
}
@Override
public List<SalarySendInfoPO> getNeedSendInfoList(List<Long> salarySendIds) {
if(CollectionUtils.isEmpty(salarySendIds)){
return Collections.emptyList();
}
return getSalarySendInfoMapper().getNeedSendInfoList(salarySendIds);
}
@Override
public List<SalarySendPO> getNeedSendListBySalarySobIds(List<Long> salarySobIds) {
if(CollectionUtils.isEmpty(salarySobIds)){
return Collections.emptyList();
}
return getSalarySendMapper().getNeedSendListBySalarySobIds(salarySobIds);
}
@Override
public List<SalarySendInfoPO> listUnConfirmedSendInfo(List<Long> salarySobIds) {
if(CollectionUtils.isEmpty(salarySobIds))
return Collections.emptyList();
return getSalarySendInfoMapper().listUnConfirmedSendInfo(salarySobIds);
}
@Override
public void autoConfirmSalaryBill(List<Long> needAutoSendIds) {
if(CollectionUtils.isEmpty(needAutoSendIds)){
return;
}
List<List<Long>> partition = Lists.partition((List) needAutoSendIds, 500);
partition.forEach(getSalarySendInfoMapper()::autoConfirmSalaryBill);
}
@Override
public List<SalarySendPO> getByIds(List<Long> salarySendId) {
if(CollectionUtils.isEmpty(salarySendId)){
return Collections.emptyList();
}
return getSalarySendMapper().getByIds(salarySendId);
}
}

View File

@ -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<SalarySobDefaultItemGroupPO> salarySobDefaultItemGroupPOS = defaultItemGroupBiz.listByIncomeCategory(incomeCategoryEnum);
List<SalarySobDefaultItemPO> 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<Long> 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<SysSalaryItemPO> needAddSysSalaryItemPOS = getSysSalaryItemService(user).listByIds(needAddSysSalaryItemIds);
// 2.3需要保存的薪资项目
List<SalaryItemPO> 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<TaxAgentManageRangeListDTO> includeList = (List<TaxAgentManageRangeListDTO>) getTaxAgentManageRangeService(user).listPageByParamAndIncludeType(queryParam, NumberUtils.INTEGER_ONE).getList();
includeList.stream().forEach(item->{
includeList.stream().forEach(item -> {
item.setEmployeeStatus(parseEnum2ValueStr(item.getEmployeeStatus()));
});
// 获取从范围中排除
List<TaxAgentManageRangeListDTO> excludeList = (List<TaxAgentManageRangeListDTO>) getTaxAgentManageRangeService(user).listPageByParamAndIncludeType(queryParam, NumberUtils.INTEGER_ZERO).getList();
excludeList.stream().forEach(item->{
excludeList.stream().forEach(item -> {
item.setEmployeeStatus(parseEnum2ValueStr(item.getEmployeeStatus()));
});
// 将TaxAgentManageRangeListDTO转换为SalarySobRangePO
List<SalarySobRangePO> rangeList = convert2SalarySobRangePO(salarySobPO.getId(),includeList,excludeList);
List<SalarySobRangePO> 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<SalarySobRangePO>
* @description 将TaxAgentManageRangeListDTO转换为SalarySobRangePO
* @author Harryxzy
* @date 2022/10/9 16:06
*/
private List<SalarySobRangePO> convert2SalarySobRangePO(Long salarySobID,List<TaxAgentManageRangeListDTO> includeList, List<TaxAgentManageRangeListDTO> excludeList) {
private List<SalarySobRangePO> convert2SalarySobRangePO(Long salarySobID, List<TaxAgentManageRangeListDTO> includeList, List<TaxAgentManageRangeListDTO> excludeList) {
Date now = new Date();
ArrayList<SalarySobRangePO> result = new ArrayList<SalarySobRangePO>();
// 关联人员范围
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<split.length;i++){
if(statusEnum.getDefaultLabel().equals(split[i])){
for (int i = 0; i < split.length; i++) {
if (statusEnum.getDefaultLabel().equals(split[i])) {
sb.append(statusEnum.getValue());
if(i+1 != split.length){
if (i + 1 != split.length) {
sb.append(",");
}
}
@ -556,7 +570,7 @@ public class SalarySobServiceImpl extends Service implements SalarySobService {
// 根据薪资账套id查询工资单模板存在该账套下的工资单模板就不能删除账套了
List<SalaryTemplatePO> 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<TaxAgentPO> 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<SalarySobItemPO> 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<SalarySobItemGroupPO> 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<SalarySobPO> listByTaxAgentIds(Collection<Long> taxAgentIds) {
if(CollectionUtils.isEmpty(taxAgentIds)){
if (CollectionUtils.isEmpty(taxAgentIds)) {
return new ArrayList<>();
}
return getSalarySobMapper().listSome(SalarySobPO.builder().taxAgentIds(taxAgentIds).build());

View File

@ -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<SalaryTemplateSalaryItemSetListDTO> getSalaryItemSet(Long salarySobId, boolean isReplenish) {
SalarySobItemAggregateDTO salarySobItemAggregate = getSalarySobItemService(user).getAggregateBySalarySobId(salarySobId);
// 处理薪资账套中隐藏的分类和项目
// 获取关闭显示的分类
List<Long> hideGroupIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(1).build());
// 过滤关闭显示的薪资项目分类
List<SalarySobItemGroupDTO> itemGroupDTOS = salarySobItemAggregate.getItemGroups().stream().filter(group -> !(hideGroupIDs.contains(group.getId()))).collect(Collectors.toList());
// 获取关闭显示的薪资项目
List<Long> hideItemIDs = getSalarySobItemHideService(user).listHideGroupBysalarySobId(SalarySobItemHidePO.builder().salarySobId(salarySobId).isGroup(0).build());
for(SalarySobItemGroupDTO DTO : itemGroupDTOS){
List<SalarySobItemDTO> 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<SalaryTemplateSalaryItemSetListDTO> 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<SalaryTemplateListDTO> page = SalaryPageUtil.buildPage(queryParam.getCurrent(), queryParam.getPageSize(), salaryTemplateDTOList, SalaryTemplateListDTO.class);
return page;
}
@Override
public List<SalaryTemplatePO> getAutoSendTemplate() {
return mapper.listSome(SalaryTemplatePO.builder().autoSendStatus(NumberUtils.INTEGER_ONE).useType(NumberUtils.INTEGER_ONE).deleteType(NumberUtils.INTEGER_ZERO).build());
}
@Override
public List<SalaryTemplatePO> listNeedAckDefaultTemplate() {
return mapper.listSome(SalaryTemplatePO.builder().useType(NumberUtils.INTEGER_ONE).ackFeedbackStatus(NumberUtils.INTEGER_ONE).build());
}
}

View File

@ -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";
}

View File

@ -70,4 +70,19 @@ public class AppSettingVO {
*/
private String salaryAcctEmployeeRule;
/**
* 撤回个税申报表
*/
private String withDrawTaxDeclaration;
/**
* 薪资档案删除
*/
private String salaryArchiveDelete;
/**
* 工资单反馈
*/
private String salarySendFeedback;
}

View File

@ -4,7 +4,7 @@ import com.engine.salary.enums.BaseEnum;
import org.apache.commons.lang3.StringUtils;
/**
* 申报功能启用枚举
* 个税计算启用状态
* <p>Copyright: Copyright (c) 2022</p>
* <p>Company: 泛微软件</p>
*
@ -12,8 +12,8 @@ import org.apache.commons.lang3.StringUtils;
* @version 1.0
**/
public enum TaxDeclarationFunctionEnum implements BaseEnum<String> {
OPEN("1", "开启申报功能", 1),
CLOSURE("0", "关闭申报功能", 1),
OPEN("1", "开启", 1),
CLOSURE("0", "关闭", 1),
REBOOT("2", "重启", 1);
private String value;

View File

@ -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<SalarySysConfPO> getListByCodes(List<String> codes);
/**
* 保存或者修改应用设置
* @param confValue
* @param confKey
* @param title
* @param app
*/
void saveSettingByType(String confValue, String confKey, String title, String app);
}

View File

@ -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<SalarySysConfPO> getListByCodes(List<String> 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());

View File

@ -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<SalaryTemplatePO> templates = getSalaryTemplateService(user).listNeedAckDefaultTemplate();
// key:薪资账套idvalue对应的自动确认天数
Map<Long, Integer> salarySobAckDaysMap = SalaryEntityUtil.convert2Map(templates, SalaryTemplatePO::getSalarySobId, SalaryTemplatePO::getAutoAckDays);
// 根据薪资账套id获取已发送确认状态为未确认的工资单
List<SalarySendInfoPO> unConfirmedList = getSalarySendService(user).listUnConfirmedSendInfo(new ArrayList<>(salarySobAckDaysMap.keySet()));
List<SalarySendPO> sendList = getSalarySendService(user).getByIds(unConfirmedList.stream().map(SalarySendInfoPO::getSalarySendId).distinct().collect(Collectors.toList()));
// key:工资单发放idvalue自动确认超时天数
HashMap<Long, Integer> autoAckDaysMap = new HashMap<>();
sendList.stream().forEach(send -> {
Integer autoAckDays = salarySobAckDaysMap.getOrDefault(send.getSalarySobId(), 7);
autoAckDaysMap.put(send.getId(), autoAckDays);
});
LocalDateTime now = LocalDateTime.now();
List<Long> 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);
}
}

View File

@ -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<SalaryTemplatePO> autoSendTemplate = getSalaryTemplateService(tempUser).getAutoSendTemplate();
Map<Long, SalaryTemplatePO> autoSendTypeMap = SalaryEntityUtil.convert2Map(autoSendTemplate, SalaryTemplatePO::getSalarySobId);
List<Long> salarySobIds = autoSendTemplate.stream().map(SalaryTemplatePO::getSalarySobId).collect(Collectors.toList());
// 获取这些模板下未发放完的正常(非补发非冻结)工资单
List<SalarySendPO> salarySendList = getSalarySendService(tempUser).getNeedSendListBySalarySobIds(salarySobIds);
LocalDateTime nowLocalDateTime = SalaryDateUtil.dateToLocalDateTime(new Date());
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
List<Long> 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<SalarySendInfoPO> needSendInfoList = getSalarySendService(tempUser).getNeedSendInfoList(needSendIds);
Map<Long, Set<Long>> sendMap = SalaryEntityUtil.group2Map(needSendInfoList, SalarySendInfoPO::getSalarySendId, SalarySendInfoPO::getId);
for(Map.Entry<Long, Set<Long>> entry : sendMap.entrySet()){
// 发放
getSalaryBillService(tempUser).grant(SalarySendGrantParam.builder().salarySendId(entry.getKey()).ids(new ArrayList<Long>(entry.getValue())).build());
}
}
}

View File

@ -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<String, Map<String, Object>>(user).run(getService(user)::allStayAddToPay);
}
/**
* 删除档案
*/
@POST
@Path("/deleteArchive")
@Produces(MediaType.APPLICATION_JSON)
public String deleteArchive(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody Collection<Long> ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Collection<Long>, Map<String, Object>>(user).run(getService(user)::deleteArchive, ids);
}
}

View File

@ -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;
}
}

View File

@ -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()));
}
}

View File

@ -135,6 +135,20 @@ public class SalaryArchiveController {
return new ResponseResult<Collection<Long>, 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<Long> ids) {
User user = HrmUserVarify.getUser(request, response);
return new ResponseResult<Collection<Long>, 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(",")));

View File

@ -545,6 +545,54 @@ public class SalaryBillController {
}
return new ResponseResult<Long, Map<String, Object>>(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<Long, Map<String, Object>>(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<Long, Map<String, Object>>(user).run(getSalarySendWrapper(user)::feedBackSalaryBill, salaryInfoId);
}
/******** 工资单发放 end ***********************************************************************************************/
/**

View File

@ -47,7 +47,7 @@ public class SalarySystemConfigController {
}
/**
* 申报前置
* 是否开启系统算税
*
* @param request
* @param response
@ -63,6 +63,7 @@ public class SalarySystemConfigController {
return new ResponseResult<TaxDeclarationFunctionEnum, Boolean>(user).run(getSalarySystemConfigWrapper(user)::operateTaxDeclarationFunction, TaxDeclarationFunctionEnum.parseByValue(param.getOperateTaxDeclaration()));
}
/**
* 获取系统配置
*
@ -180,6 +181,13 @@ public class SalarySystemConfigController {
return new ResponseResult<MatchEmployeeModeSaveParam, String>(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<String, String>(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<SalarySysConfPO, String>(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<SalarySysConfPO, String>(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<String, String>(user).run(getSalarySystemConfigWrapper(user)::saveArchiveDelete, param.getConfValue());
}
/**
* 应用设置

View File

@ -571,4 +571,13 @@ public class SalaryArchiveWrapper extends Service {
}
return list.get(0);
}
/**
* 删除薪资档案
* @param salaryArchiveIds
*/
public void deleteSalaryArchive(Collection<Long> salaryArchiveIds) {
getSalaryArchiveService(user).deleteSalaryArchive(salaryArchiveIds);
}
}

View File

@ -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

View File

@ -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<SalaryItemListDTO> 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<SalaryItemPO> salaryItemPOS) {

View File

@ -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<SalaryItemListDTO> 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);
}
});

View File

@ -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<Long> salaryAcctIds = SalaryEntityUtil.properties(pageList, SalarySendListDTO::getSalaryAcctId);
// 获取是回算的薪资核算ID
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<SalaryAcctRecordPO> salaryAcctRecordPOS = getSalaryAcctRecordService(user).getBackCalcRecordByIds(salaryAcctIds);
// Set<String> 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<WeaTableColumn> columns = buildWeaTableColumns();
WeaTable table = new WeaTable();
table.setColumns(columns);
@ -327,7 +316,6 @@ public class SalarySendWrapper extends Service implements SalarySendWrapperProxy
PageInfo<SalarySendInfoListDTO> 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);
}
}

View File

@ -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<String, Object> o = new HashMap<>();
o.put("log", log);
o.put("version", version);
o.put("openFormulaForcedEditing", openFormulaForcedEditing);
o.put("showEncryptOperationButton", showEncryptOperationButton);
List<SalarySysConfPO> confPOS = getSalarySysConfService(user).listSome(SalarySysConfPO.builder().build());
Map<String, String> 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);
}
}

View File

@ -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.<SalaryTemplateBaseSetDTO>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<String, Object> 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<SalaryTemplateSalaryItemSetListDTO> 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<SalaryTemplateSalaryItemSetListDTO> 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())