1、工资单模板

2、一键累计
This commit is contained in:
钱涛 2023-03-02 17:11:42 +08:00
parent e73ed7142f
commit 6de22b142d
9 changed files with 91 additions and 140 deletions

View File

@ -2,3 +2,8 @@ ALTER TABLE hrsa_salary_item MODIFY COLUMN shared_type int(0) NULL ;
ALTER TABLE hrsa_salary_sob_item MODIFY COLUMN tenant_key varchar(10) null ;
ALTER TABLE hrsa_salary_item ALTER COLUMN [shared_type] int NULL
GO
ALTER TABLE hrsa_salary_sob_item ALTER COLUMN [tenant_key] varchar NULL
GO

View File

@ -1,5 +1,6 @@
package com.engine.salary.entity.salaryBill.param;
import com.engine.salary.entity.salaryBill.po.SalaryTemplatePO;
import com.engine.salary.exception.SalaryRunTimeException;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -21,10 +22,10 @@ import java.util.List;
//@ApiModel("工资单发放参数")
public class SalarySendGrantParam {
// @ApiModelProperty("主键id")
// 主键id
private Collection<Long> ids;
// @ApiModelProperty("工资单发放Id")
// 工资单发放Id
private Long salarySendId;
/**
@ -32,6 +33,9 @@ public class SalarySendGrantParam {
*/
private List<Long> salarySendRangeIds;
//模板发消息用
private SalaryTemplatePO template;
public static String checkParam(SalarySendGrantParam param, Long employeeId, String tenantKey) {
if (param.getSalarySendId() == null) {
throw new SalaryRunTimeException("工资单发放Id必传");

View File

@ -17,59 +17,51 @@ import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
//@TableName("hrsa_salary_send_info")
//@ElogTransform(name = "工资单发放信息表")
//工资单发放信息表")
public class SalarySendInfoPO {
public Object get;
/**
* 主键id
*/
// @ElogTransform(name = "主键id")
private Long id;
// @ElogTransform(name = "工资单发放id")
// 工资单发放id
private Long salarySendId;
/**
* 薪资所属月
*/
// @ElogTransform(name = "薪资所属月")
private Date salaryMonth;
/**
* 薪资核算表的主键id
*/
// @ElogTransform(name = "薪资核算表的主键id")
private Long salaryAcctRecordId;
/**
* 人员信息表的主键id
*/
// @ElogTransform(name = "人员信息表的主键id")
private Long employeeId;
/**
* 人员信息表的主键id
*/
// @ElogTransform(name = "个税扣缴义务人表的主键id")
private Long taxAgentId;
/**
* 发送状态0未发送1已发送2已撤回
*/
// @ElogTransform(name = "发送状态。0未发送、1已发送、2已撤回")
private Integer sendStatus;
/**
* 发送时间
*/
// @ElogTransform(name = "发送时间")
private Date sendTime;
/**
* 核算类型0正常1补发
*/
// @ElogTransform(name = "核算类型。0正常1补发")
private Integer salaryAcctType;
/**
@ -80,30 +72,25 @@ public class SalarySendInfoPO {
/**
* 创建人
*/
// @ElogTransform(name = "创建人", ignore = true)
private Long creator;
/**
* 创建时间
*/
// @ElogTransform(name = "创建时间", ignore = true)
private Date createTime;
/**
* 更新时间
*/
// @ElogTransform(name = "更新时间", ignore = true)
private Date updateTime;
/**
* 是否已删除0未删除1已删除
*/
// @ElogTransform(name = "是否已删除。0未删除、1已删除", ignore = true)
private Integer deleteType;
/**
* 租户ID
*/
// @ElogTransform(name = "租户key", ignore = true)
private String tenantKey;
}

View File

@ -21,86 +21,72 @@ public class SalarySendPO {
/**
* 主键id
*/
// @ElogTransform(name = "主键id")
private Long id;
/**
* 薪资所属月
*/
// @ElogTransform(name = "薪资所属月")
private Date salaryMonth;
/**
* 薪资核算id
*/
// @ElogTransform(name = "薪资核算id")
private Long salaryAccountingId;
/**
* 薪资账套id
*/
// @ElogTransform(name = "薪资账套id")
private Long salarySobId;
/**
* 已发送数量
*/
// @ElogTransform(name = "已发送数量")
private Integer sendNum;
/**
* 发送总数
*/
// @ElogTransform(name = "发送总数")
private Integer sendTotal;
/**
* 最后发送时间
*/
// @ElogTransform(name = "最后发送时间")
private Date lastSendTime;
/**
* 发放状态0未冻结1已冻结
*/
// @ElogTransform(name = "发放状态。0未冻结、1已冻结")
private Integer sendStatus;
/**
* 核算类型0正常1补发
*/
// @ElogTransform(name = "核算类型。0正常1补发")
private Integer salaryAcctType;
/**
* 创建人
*/
// @ElogTransform(name = "创建人", ignore = true)
private Long creator;
/**
* 创建时间
*/
// @ElogTransform(name = "创建时间", ignore = true)
private Date createTime;
/**
* 更新时间
*/
// @ElogTransform(name = "更新时间", ignore = true)
private Date updateTime;
/**
* 是否已删除0未删除1已删除
*/
// @ElogTransform(name = "是否已删除。0未删除、1已删除", ignore = true)
private Integer deleteType;
/**
* 租户ID
*/
// @ElogTransform(name = "租户key", ignore = true)
private String tenantKey;
}

View File

@ -23,139 +23,116 @@ public class SalaryTemplatePO {
/**
* 主键
*/
// @ElogTransform(name = "主键")
private Long id;
/**
* 名称
*/
// @ElogTransform(name = "模板名称")
private String name;
/**
* 薪资账套表的主键id
*/
// @ElogTransform(name = "薪资账套表的主键id")
private Long salarySobId;
/**
* 使用类型0普通1默认
*/
// @ElogTransform(name = "使用类型。0普通、1默认")
private Integer useType;
/**
* 备注
*/
// @ElogTransform(name = "备注")
private String description;
/**
* 邮箱开启状态01
*/
// @ElogTransform(name = "邮箱开启状态。0关、1")
private Integer emailStatus;
/**
* 发送地址:公共邮箱账号id
*/
// @ElogTransform(name = "发送地址")
private Long sendEmailId;
/**
* 消息中心开启状态01
*/
// @ElogTransform(name = "消息中心开启状态。0关、1")
private Integer msgStatus;
/**
* 主题
*/
// @ElogTransform(name = "主题")
private String theme;
/**
* 背景图
*/
// @ElogTransform(name = "背景图")
private String background;
/**
* 文本内容
*/
// @ElogTransform(name = "文本内容")
private String textContent;
/**
* 文本内容显示位置1薪资项目前2薪资项目后
*/
// @ElogTransform(name = "文本内容显示位置。1薪资项目前、2薪资项目后")
private Integer textContentPosition;
/**
* 薪资项为空时不显示开启状态01
*/
// @ElogTransform(name = "薪资项为空时不显示开启状态。0关、1")
private Integer salaryItemNullStatus;
/**
* 薪资项为0时不显示开启状态01
*/
// @ElogTransform(name = "薪资项为0时不显示开启状态。0关、1")
private Integer salaryItemZeroStatus;
/**
* 薪资项目设置
*/
// @ElogTransform(name = "薪资项目设置")
private String salaryItemSetting;
//=====================补发===================
/**
* 补发工资单模板名称
*/
// @ElogTransform(name = "补发工资单模板名称")
private String replenishName;
/**
* 补发工资单名单生成规则
*/
// @ElogTransform(name = "补发工资单名单生成规则")
private String replenishRule;
/**
* 补发薪资项目设置
*/
// @ElogTransform(name = "补发薪资项目设置")
private String replenishSalaryItemSetting;
/**
* 创建时间
*/
// @ElogTransform(name = "创建时间", ignore = true)
private Date createTime;
/**
* 更新时间
*/
// @ElogTransform(name = "更新时间", ignore = true)
private Date updateTime;
/**
* 创建人
*/
// @ElogTransform(name = "创建人", ignore = true)
private Long creator;
/**
* 是否已删除0未删除1已删除
*/
// @ElogTransform(name = "是否已删除。0未删除、1已删除", ignore = true)
private Integer deleteType;
/**
* 租户ID
*/
// @ElogTransform(name = "租户key", ignore = true)
private String tenantKey;
}

View File

@ -23,6 +23,8 @@ import java.util.Set;
**/
public interface SalarySendInfoMapper {
SalarySendInfoPO getById(@Param("id") Long id);
List<Long> listSalaryAccRecordIds(@Param("param") SalarySendDetailQueryParam param);
/**

View File

@ -38,6 +38,14 @@
, t.salary_acct_type
</sql>
<select id="getById" resultType="com.engine.salary.entity.salaryBill.po.SalarySendInfoPO">
SELECT
<include refid="baseColumns"/>
FROM hrsa_salary_send_info
WHERE delete_type = 0
AND id = #{id}
</select>
<insert id="batchInsert">
INSERT INTO hrsa_salary_send_info (
id,

View File

@ -1,7 +1,6 @@
package com.engine.salary.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.api.browser.bean.SearchConditionGroup;
import com.api.browser.bean.SearchConditionItem;
import com.api.browser.util.ConditionFactory;
@ -59,7 +58,6 @@ import weaver.general.Util;
import weaver.hrm.User;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.*;
@ -771,14 +769,8 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction
}
private String plus(String var0, String var1) {
if (StrUtil.isEmpty(var0)) {
var0 = "0";
}
if (StrUtil.isEmpty(var1)) {
var1 = "0";
}
return new BigDecimal(var0)
.add(new BigDecimal(var1))
return SalaryEntityUtil.string2BigDecimalDefault0(var0)
.add(SalaryEntityUtil.string2BigDecimalDefault0(var1))
.toString();
}

View File

@ -1,10 +1,11 @@
package com.engine.salary.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.api.formmode.mybatis.util.SqlProxyHandle;
import com.cloudstore.dev.api.bean.MessageBean;
import com.cloudstore.dev.api.bean.MessageType;
import com.cloudstore.dev.api.service.ServiceMessageCustom;
import com.cloudstore.dev.api.service.ServiceMessageCustomImpl;
import com.cloudstore.dev.api.util.Util_Message;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
@ -61,8 +62,9 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import weaver.hrm.User;
import weaver.hrm.company.SubCompanyComInfo;
import weaver.hrm.resource.ResourceComInfo;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
@ -627,9 +629,20 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
private String getBillTitle(String theme, Date salaryMonth, Long currentEmployeeId) {
String yearI18n = SalaryI18nUtil.getI18nLabel(100325, "");
String monthI18n = SalaryI18nUtil.getI18nLabel(100326, "");
String companyName = "";
if (currentEmployeeId != null) {
ResourceComInfo resourceComInfo = null;
SubCompanyComInfo subCompanyComInfo = new SubCompanyComInfo();
try {
resourceComInfo = new ResourceComInfo();
subCompanyComInfo = new SubCompanyComInfo();
} catch (Exception e) {
log.error("资源异常", e);
}
companyName = subCompanyComInfo.getSubCompanyname(resourceComInfo.getSubCompanyID(currentEmployeeId + ""));
}
return theme
// TODO 设置租户名称
.replace("${companyName}", "")
.replace("${companyName}", companyName)
.replace("${salaryMonth}", new SimpleDateFormat("yyyy年MM月").format(salaryMonth));
}
@ -821,25 +834,20 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
if (CollectionUtils.isEmpty(salaryTemplates)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(100518, "没有默认模板,无法发送"));
}
SalaryTemplatePO templatePO = salaryTemplates.get(0);
Date sendTime = new Date();
// 获取可发送的列表
List<Map<String, Object>> enableSendList = getEnableSendList(salarySend, ids, salaryTemplates.get(0));
List<Map<String, Object>> enableSendList = getEnableSendList(salarySend, ids, templatePO);
// 1.发放
SalarySendInfoPO po = new SalarySendInfoPO();
po.setSendStatus(SalarySendStatusEnum.ALREADYSEND.getValue());
po.setSendTime(sendTime);
po.setSalaryTemplate(JsonUtil.toJsonString(salaryTemplates.get(0)));
po.setSalaryTemplate(JsonUtil.toJsonString(templatePO));
salarySendInfoMapper.updateGrantWithdraw(po, salarySendId, Arrays.asList(SalarySendStatusEnum.UNSEND.getValue(), SalarySendStatusEnum.WITHDRAW.getValue()), ids);
// 2.更新数量
po = new SalarySendInfoPO();
po.setDeleteType(0);
po.setSalarySendId(salarySendId);
List<SalarySendInfoPO> list = salarySendInfoMapper.listSome(po);
List<SalarySendInfoPO> list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build());
//需要发送工资的人
List<SalarySendInfoPO> sendList = list.stream().filter(e -> e.getSendStatus().equals(SalarySendStatusEnum.ALREADYSEND.getValue())).collect(Collectors.toList());
@ -859,37 +867,6 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
mapper.updateById(salarySendNew);
// List<SalarySobPO> salarySobs = new LambdaQueryChainWrapper<>(salarySobMapper)
// .eq(SalarySobPO::getTenantKey, TenantContext.getCurrentTenantKey())
// .eq(SalarySobPO::getDeleteType, 0)
// .eq(SalarySobPO::getId, salarySend.getSalarySobId())
// .list();
SalarySobPO salarySobPO = new SalarySobPO();
salarySobPO.setDeleteType(0);
salarySobPO.setId(salarySend.getSalarySobId());
// List<SalarySobPO> salarySobs = salarySobMapper.listSome(salarySobPO);
// 记录日志
// SalaryLoggerUtil.recordUpdateSingleLog(salarySendLoggerTemplate,
// salarySend.getId(),
// salarySend.getSalaryMonth() + "-" + (CollectionUtils.isNotEmpty(salarySobs) ? salarySobs.get(0).getName() : ""),
// SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 93215, "工资单发放"),
// SalaryI18nUtil.getI18nLabel(currentTenantKey, currentEmployeeId, 93215, "工资单发放"),
// salarySend,
// salarySendNew);
// 3.异步发送消息先修改数据再发消息避免出错后无法撤回
// TODO 异步发送消息
// String tenantName = TenantContext.getCurrentTenant().getTenantName();
// taskExecutor.execute(() -> {
// try {
// DSTenantKeyThreadVar.tenantKey.set(currentTenantKey);
// sendMessage(salarySend, enableSendList, salaryTemplates.get(0), tenantName, currentEmployeeId, currentTenantKey);
// } finally {
// DSTenantKeyThreadVar.tenantKey.remove();
// }
// });
List<SalarySendInfoPO> needSendList = Lists.newArrayList();
enableSendList.forEach(map -> {
sendList.forEach(item -> {
@ -900,6 +877,7 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
});
// 发送消息
param.setTemplate(templatePO);
sendMessage(true, needSendList, param, salarySend);
Map<String, Object> map = new HashMap<>(2);
@ -918,27 +896,18 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
* @param salarySend
*/
private void sendMessage(boolean sendFlag, List<SalarySendInfoPO> list, SalarySendGrantParam param, SalarySendPO salarySend) {
Date salaryMonth = salarySend.getSalaryMonth();
String month = DateUtil.format(salaryMonth, "yyyy-MM");
new Thread() {
public void run() {
List<Long> collect = new ArrayList<>();
List<SalarySendInfoPO> pos = list;
if (CollectionUtils.isNotEmpty(param.getIds())) {
collect = new ArrayList<>(param.getIds());
} else {
collect = list.stream().map(item -> item.getId()).collect(Collectors.toList());
pos = list.stream().filter(f -> param.getIds().contains(f.getId())).collect(Collectors.toList());
}
collect.forEach(item -> {
SalarySendInfoPO po = SalarySendInfoPO.builder().id(item).build();
List<SalarySendInfoPO> salarySendInfoPOS = salarySendInfoMapper.listSome(po);
if (CollectionUtils.isNotEmpty(salarySendInfoPOS)) {
Long employeeId = salarySendInfoPOS.get(0).getEmployeeId();
if (sendFlag) {
sendPayRollEMMessage(item, employeeId, month);
} else {
withdrawPayrollEMMessage(item, employeeId);
}
pos.forEach(po -> {
Long employeeId = po.getEmployeeId();
if (sendFlag) {
sendPayRollEMMessage(po, param.getTemplate(), employeeId);
} else {
withdrawPayrollEMMessage(po, employeeId);
}
});
}
@ -948,36 +917,57 @@ public class SalarySendServiceImpl extends Service implements SalarySendService
/**
* 发送Em消息
*/
private void sendPayRollEMMessage(Long id, Long employeeId, String month) {
MessageType messageType = MessageType.newInstance(499); // 消息来源见文档第四点补充 必填
private void sendPayRollEMMessage(SalarySendInfoPO po, SalaryTemplatePO template, Long employeeId) {
Long id = po.getId();
String billTitle = getBillTitle(template.getTheme(), po.getSalaryMonth(), null);
String background = template.getBackground();
Set<String> userIdList = new HashSet<>(); // 接收人id 必填
userIdList.add(employeeId.toString());
String title = month + " 工资单"; // 标题
String title = billTitle; // 标题
String context = "点击查看详情"; // 内容
String linkUrl = weaver.general.GCONST.getContextPath() + "/spa/hrmSalary/static/index.html#/main/hrmSalary/mobilepayroll?id=" + id; // PC端链接
String linkMobileUrl = weaver.general.GCONST.getContextPath() + "/spa/hrmSalary/static/index.html#/main/hrmSalary/mobilepayroll?type=phone&id=" + id; // 移动端链接
try {
MessageBean messageBean = Util_Message.createMessage(messageType, userIdList, title, context, linkUrl, linkMobileUrl);
messageBean.setCreater(user.getUID());// 创建人id
messageBean.setBizState("0");// 需要修改消息为已处理等状态时传入,表示消息最初状态为待处理
messageBean.setTargetId("499|" + id); //消息来源code +|+业务id需要修改消息为已处理等状态时传入
Util_Message.store(messageBean);
} catch (IOException e) {
e.printStackTrace();
Map<String, Object> map = new HashMap();
map.put("code", "499");
map.put("title", title);
map.put("context", context);
map.put("linkUrl", linkUrl);
map.put("linkMobileUrl", linkMobileUrl);
map.put("bizState", "0"); //在消息需要修改状态时传入表示消息初始的状态是待处理
map.put("targetId", "499|" + id);// 消息来源code +|+业务id 消息需要打上已处理标记
map.put("userIdList", userIdList); //接收人OA系统id 第一种形式 参数是userIdList
map.put("creater", user.getUID()); //创建人OA系统id 第一种形式 参数是creater
Map extraMap = new HashMap<>();
extraMap.put("linkurl", linkUrl);
if (StringUtils.isNotBlank(background)) {
extraMap.put("showimage", background);//图片地址
} else {
extraMap.put("showimage", "/hrm/hrm_e9/images/payroll.jpg?pictype=jpg");//图片地址
}
Map shareMap = new HashMap<>();
shareMap.put("extra", extraMap);
Map emParams = new HashMap<>();
emParams.put("share", shareMap);
map.put("emParams", emParams);
ServiceMessageCustom factory = new ServiceMessageCustomImpl();
factory.sendCustomMessageSingle(JSON.toJSONString(map));
}
/**
* 撤回EM消息
*
* @param id
* @param po
*/
private void withdrawPayrollEMMessage(Long id, Long employeeId) {
private void withdrawPayrollEMMessage(SalarySendInfoPO po, Long employeeId) {
try {
MessageBean messageBean = Util_Message.createMessage();
messageBean.setUserList(new HashSet<>());//接收人id
messageBean.setUserId(employeeId.intValue());
messageBean.setTargetId("499|" + id); //code + | + 业务id
messageBean.setTargetId("499|" + po.getId()); //code + | + 业务id
//messageBean.setMessageType(MessageType.newInstance(121));//消息来源code(传了代表code也做为删除时的条件默认不传
Util_Message.delMessageTargetid(messageBean);
} catch (Exception e) {