diff --git a/resource/sql/账套新建不了.sql b/resource/sql/账套新建不了.sql index f2b24059b..136519f4f 100644 --- a/resource/sql/账套新建不了.sql +++ b/resource/sql/账套新建不了.sql @@ -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 \ No newline at end of file diff --git a/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java b/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java index 12268806f..39a67bd6a 100644 --- a/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java +++ b/src/com/engine/salary/entity/salaryBill/param/SalarySendGrantParam.java @@ -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 ids; -// @ApiModelProperty("工资单发放Id") +// 工资单发放Id private Long salarySendId; /** @@ -32,6 +33,9 @@ public class SalarySendGrantParam { */ private List salarySendRangeIds; + //模板,发消息用 + private SalaryTemplatePO template; + public static String checkParam(SalarySendGrantParam param, Long employeeId, String tenantKey) { if (param.getSalarySendId() == null) { throw new SalaryRunTimeException("工资单发放Id必传"); diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java index df9c2b4f7..15171f1e3 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendInfoPO.java @@ -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; } diff --git a/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java b/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java index e4e828b23..2e39a783b 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalarySendPO.java @@ -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; } diff --git a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java index b54b870ed..60c2bc244 100644 --- a/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java +++ b/src/com/engine/salary/entity/salaryBill/po/SalaryTemplatePO.java @@ -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; /** * 邮箱开启状态。0:关、1:开 */ -// @ElogTransform(name = "邮箱开启状态。0:关、1:开") private Integer emailStatus; /** * 发送地址:公共邮箱账号id */ -// @ElogTransform(name = "发送地址") private Long sendEmailId; /** * 消息中心开启状态。0:关、1:开 */ -// @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; /** * 薪资项为空时不显示开启状态。0:关、1:开 */ -// @ElogTransform(name = "薪资项为空时不显示开启状态。0:关、1:开") private Integer salaryItemNullStatus; /** * 薪资项为0时不显示开启状态。0:关、1:开 */ -// @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; } diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java index 3821f0c17..0def86342 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.java @@ -23,6 +23,8 @@ import java.util.Set; **/ public interface SalarySendInfoMapper { + SalarySendInfoPO getById(@Param("id") Long id); + List listSalaryAccRecordIds(@Param("param") SalarySendDetailQueryParam param); /** diff --git a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml index 46a5cdea7..6fbbfd5b8 100644 --- a/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml +++ b/src/com/engine/salary/mapper/salarybill/SalarySendInfoMapper.xml @@ -38,6 +38,14 @@ , t.salary_acct_type + + INSERT INTO hrsa_salary_send_info ( id, diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index 5087c98bb..edeb2ed77 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -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(); } diff --git a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java index 1dde6c2bb..255617bb1 100644 --- a/src/com/engine/salary/service/impl/SalarySendServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalarySendServiceImpl.java @@ -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> enableSendList = getEnableSendList(salarySend, ids, salaryTemplates.get(0)); + List> 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 list = salarySendInfoMapper.listSome(po); + List list = salarySendInfoMapper.listSome(SalarySendInfoPO.builder().salarySendId(salarySendId).build()); //需要发送工资的人 List 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 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 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 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 map = new HashMap<>(2); @@ -918,27 +896,18 @@ public class SalarySendServiceImpl extends Service implements SalarySendService * @param salarySend */ private void sendMessage(boolean sendFlag, List list, SalarySendGrantParam param, SalarySendPO salarySend) { - Date salaryMonth = salarySend.getSalaryMonth(); - String month = DateUtil.format(salaryMonth, "yyyy-MM"); new Thread() { public void run() { - List collect = new ArrayList<>(); + List 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 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 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 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) {