资产管理定时通知

This commit is contained in:
xiao-fajia 2024-08-16 09:43:26 +08:00
parent 061989c1ab
commit 3783f054a2
7 changed files with 189 additions and 20 deletions

View File

@ -47,4 +47,8 @@ public class BaseConstants {
public static final String QUALS_INTERIM_PERIOD = "quals_interim_period"; public static final String QUALS_INTERIM_PERIOD = "quals_interim_period";
/**资质过期通知模板*/ /**资质过期通知模板*/
public static final String QUALS_EXPIRED = "quals_expired"; public static final String QUALS_EXPIRED = "quals_expired";
/** 资产临期通知模板 */
public static final String PROPERTY_INTERIM_PERIOD = "property_interim_period";
/** 资产过期通知模板 */
public static final String PROPERTY_EXPIRED = "property_expired";
} }

View File

@ -27,5 +27,6 @@ public class DictBaseConstants {
public static final String COMPANY_PROP_STATUS = "company_prop_status"; public static final String COMPANY_PROP_STATUS = "company_prop_status";
/** 时间周期字典 */ /** 时间周期字典 */
public static final String CYCLE_DICT = "cycle_dict"; public static final String CYCLE_DICT = "cycle_dict";
/** 企业资产临期判定时间 */
public static final String COMPANY_PROPERTY_EXPIRED = "company_property_expired";
} }

View File

@ -29,8 +29,6 @@ import java.util.stream.Collectors;
@Service @Service
public class CompanyQualsServiceImpl extends ServiceImpl<CompanyQualsMapper, CompanyQuals> implements CompanyQualsService { public class CompanyQualsServiceImpl extends ServiceImpl<CompanyQualsMapper, CompanyQuals> implements CompanyQualsService {
@Resource
private CompanyQualsMapper companyQualsMapper;
@Resource @Resource
private DictDataApi dataApi; private DictDataApi dataApi;
@ -84,7 +82,7 @@ public class CompanyQualsServiceImpl extends ServiceImpl<CompanyQualsMapper, Com
public void noticeCompanyQualsExpired(List<CompanyRespVO> companyRespVOS) { public void noticeCompanyQualsExpired(List<CompanyRespVO> companyRespVOS) {
// 构建分页条件 // 构建分页条件
LambdaQueryWrapper<CompanyQuals> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CompanyQuals> queryWrapper = new LambdaQueryWrapper<>();
Page<CompanyQuals> page = new Page<>(0, BaseConstants.BATCH_SIZE); Page<CompanyQuals> page = new Page<>(1, BaseConstants.BATCH_SIZE);
// 获取临期判定时间 // 获取临期判定时间
List<DictDataRespDTO> dictDataList = dataApi.getDictDataList(DictBaseConstants.COMPANY_QUALS_EXPIRED); List<DictDataRespDTO> dictDataList = dataApi.getDictDataList(DictBaseConstants.COMPANY_QUALS_EXPIRED);
Long ruleDay = null; Long ruleDay = null;
@ -110,6 +108,14 @@ public class CompanyQualsServiceImpl extends ServiceImpl<CompanyQualsMapper, Com
sendMessage(item, BaseConstants.QUALS_INTERIM_PERIOD, companyRespVOS, day); sendMessage(item, BaseConstants.QUALS_INTERIM_PERIOD, companyRespVOS, day);
} }
}); });
// 没有下一页了就退出
if (!qualsPage.hasNext()) {
break;
}
// 翻页
page.setCurrent(page.getCurrent() + 1);
} }
} }

View File

@ -1,11 +1,14 @@
package cn.iocoder.yudao.module.property.service; package cn.iocoder.yudao.module.property.service;
import cn.iocoder.yudao.module.company.vo.CompanyRespVO;
import cn.iocoder.yudao.module.property.entity.Property; import cn.iocoder.yudao.module.property.entity.Property;
import cn.iocoder.yudao.module.property.vo.PropertyReqVO; import cn.iocoder.yudao.module.property.vo.PropertyReqVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* 企业管理-资产管理 接口 * 企业管理-资产管理 接口
* @author 小李 * @author 小李
@ -53,4 +56,11 @@ public interface PropertyService extends IService<Property> {
**/ **/
void deleteProperty(String id); void deleteProperty(String id);
/**
* 检测是否有临期过期资产有就通知
* @author 小李
* @date 8:47 2024/8/16
* @param adminUsers
**/
void noticePropertyExpired(List<CompanyRespVO> adminUsers);
} }

View File

@ -1,29 +1,44 @@
package cn.iocoder.yudao.module.property.service.impl; package cn.iocoder.yudao.module.property.service.impl;
import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.common.BaseConstants;
import cn.iocoder.yudao.common.DictBaseConstants;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.company.vo.CompanyRespVO;
import cn.iocoder.yudao.module.property.entity.Property; import cn.iocoder.yudao.module.property.entity.Property;
import cn.iocoder.yudao.module.property.mapper.PropertyMapper; import cn.iocoder.yudao.module.property.mapper.PropertyMapper;
import cn.iocoder.yudao.module.property.service.PropertyService; import cn.iocoder.yudao.module.property.service.PropertyService;
import cn.iocoder.yudao.module.property.vo.PropertyReqVO; import cn.iocoder.yudao.module.property.vo.PropertyReqVO;
import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 企业管理-资产管理 接口实现类 * 企业管理-资产管理 接口实现类
*
* @author 小李 * @author 小李
* @date 16:41 2024/8/15 * @date 16:41 2024/8/15
**/ **/
@Service @Service
public class PropertyServiceImpl extends ServiceImpl<PropertyMapper, Property> implements PropertyService { public class PropertyServiceImpl extends ServiceImpl<PropertyMapper, Property> implements PropertyService {
@ -33,26 +48,34 @@ public class PropertyServiceImpl extends ServiceImpl<PropertyMapper, Property> i
@Resource @Resource
private DeptApi deptApi; private DeptApi deptApi;
@Resource
private DictDataApi dataApi;
@Resource
private NotifyMessageSendApi sendApi;
/** /**
* 企业管理-资产分页 * 企业管理-资产分页
*
* @param pageReqVO 查询对象
* @author 小李 * @author 小李
* @date 16:15 2024/8/15 * @date 16:15 2024/8/15
* @param pageReqVO 查询对象
**/ **/
@Override @Override
public IPage<Property> getPropertyPage(PropertyReqVO pageReqVO, Page<Property> page){ public IPage<Property> getPropertyPage(PropertyReqVO pageReqVO, Page<Property> page) {
return baseMapper.getPropertyPage(pageReqVO, page); return baseMapper.getPropertyPage(pageReqVO, page);
} }
/** /**
* 创建资产 * 创建资产
*
* @param createReqVO
* @author 小李 * @author 小李
* @date 18:26 2024/8/15 * @date 18:26 2024/8/15
* @param createReqVO
**/ **/
@Override @Override
@DSTransactional @DSTransactional
public void createProperty(PropertyReqVO createReqVO){ public void createProperty(PropertyReqVO createReqVO) {
// 获取当前登录用户部门ID和企业ID // 获取当前登录用户部门ID和企业ID
Long userId = SecurityFrameworkUtils.getLoginUserId(); Long userId = SecurityFrameworkUtils.getLoginUserId();
AdminUserRespDTO user = userApi.getUser(userId); AdminUserRespDTO user = userApi.getUser(userId);
@ -66,33 +89,119 @@ public class PropertyServiceImpl extends ServiceImpl<PropertyMapper, Property> i
/** /**
* 获得资产记录 * 获得资产记录
*
* @param id 资产ID
* @author 小李 * @author 小李
* @date 18:45 2024/8/15 * @date 18:45 2024/8/15
* @param id 资产ID
**/ **/
@Override @Override
public Property getProperty(String id){ public Property getProperty(String id) {
return baseMapper.selectById(id); return baseMapper.selectById(id);
} }
/** /**
* 更新资产 * 更新资产
*
* @param updateReqVO 资产对象
* @author 小李 * @author 小李
* @date 18:57 2024/8/15 * @date 18:57 2024/8/15
* @param updateReqVO 资产对象
**/ **/
@Override @Override
public void updateProperty(PropertyReqVO updateReqVO){ public void updateProperty(PropertyReqVO updateReqVO) {
baseMapper.updateById(updateReqVO); baseMapper.updateById(updateReqVO);
} }
/** /**
* 删除资产 * 删除资产
*
* @param id 资产ID
* @author 小李 * @author 小李
* @date 19:20 2024/8/15 * @date 19:20 2024/8/15
* @param id 资产ID
**/ **/
public void deleteProperty(String id){ public void deleteProperty(String id) {
baseMapper.deleteById(id); baseMapper.deleteById(id);
} }
/**
* 检测是否有临期过期资产有就通知
*
* @param adminUsers
* @author 小李
* @date 8:47 2024/8/16
**/
@Override
public void noticePropertyExpired(List<CompanyRespVO> adminUsers) {
// 构建分页
LambdaQueryWrapper<Property> queryWrapper = new LambdaQueryWrapper<>();
Page<Property> page = new Page<>(1, BaseConstants.BATCH_SIZE);
// 获取临期判定时间
List<DictDataRespDTO> dictDataList = dataApi.getDictDataList(DictBaseConstants.COMPANY_PROPERTY_EXPIRED);
Long ruleDay = null;
if (ObjectUtil.isNotEmpty(dictDataList)) {
ruleDay = Long.valueOf(dictDataList.get(0).getValue());
}
while (ObjectUtil.isNotEmpty(ruleDay)) {
// 查询一页数据
Page<Property> propertyPage = baseMapper.selectPage(page, queryWrapper);
// 分类临期和过期
// 这里重新赋值是因为不重新赋值用不了我也不知道为什么看到这里的人知道的话可以给我讲讲
Long finalRuleDay = ruleDay;
propertyPage.getRecords().forEach(item -> {
LocalDate currentDate = LocalDate.now();
LocalDate nextKeepDate = item.getNextKeepDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 计算离当前时间还有多少天
Long day = ChronoUnit.DAYS.between(currentDate, nextKeepDate);
// 拿到当前记录的管理员ID
List<CompanyRespVO> collect = adminUsers.stream().filter(company -> company.getId() == item.getCorpId()).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(collect)) {
Long userId = collect.get(0).getUserDTO().getId();
// day 小于0是过期了 小于等于finalRuleDay是临期了 其他就正常的
if (day < 0) {
// 通知管理员
sendMessage(item, BaseConstants.PROPERTY_EXPIRED, userId, day);
// 通知使用人
sendMessage(item, BaseConstants.PROPERTY_EXPIRED, Long.valueOf(item.getUserId()), day);
} else if (day <= finalRuleDay) {
// 通知管理员
sendMessage(item, BaseConstants.PROPERTY_INTERIM_PERIOD, userId, day);
// 通知使用人
sendMessage(item, BaseConstants.PROPERTY_INTERIM_PERIOD, Long.valueOf(item.getUserId()), day);
}
}
});
// 没有下一页了就退出
if (!propertyPage.hasNext()) {
break;
}
// 翻页
page.setCurrent(page.getCurrent() + 1);
}
}
/**
* 发送通知
*
* @param property 发送的资产信息
* @param templateCode 使用的模板
* @param noticeId 通知到的人
* @param day 天数
* @author 小李
* @date 9:29 2024/8/16
**/
private void sendMessage(Property property, String templateCode, Long noticeId, Long day) {
// 准备发送参数
Map<String, Object> templateParams = new HashMap<>();
// 什么资产
templateParams.put("propertyName", property.getPropName());
// 还有多少天过期或已过期多少天可能是负数绝对值一下
templateParams.put("day", Math.abs(day));
// 发送
sendApi.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO()
.setUserId(noticeId)
.setTemplateCode(templateCode).setTemplateParams(templateParams));
}
} }

View File

@ -429,7 +429,7 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
@DSTransactional @DSTransactional
public void updateStaffWorkAndJoinedYears() { public void updateStaffWorkAndJoinedYears() {
LambdaQueryWrapper<CompanyStaff> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CompanyStaff> queryWrapper = new LambdaQueryWrapper<>();
Page<CompanyStaff> page = new Page<>(0, BaseConstants.BATCH_SIZE); Page<CompanyStaff> page = new Page<>(1, BaseConstants.BATCH_SIZE);
while (true) { while (true) {
// 查询一页的数据 // 查询一页的数据
Page<CompanyStaff> companyStaffPage = baseMapper.selectPage(page, queryWrapper); Page<CompanyStaff> companyStaffPage = baseMapper.selectPage(page, queryWrapper);
@ -455,12 +455,12 @@ public class CompanyStaffServiceImpl extends ServiceImpl<CompanyStaffMapper, Com
updateBatchById(result); updateBatchById(result);
// 没有下一页了就退出 // 没有下一页了就退出
if (companyStaffPage.getRecords().isEmpty()) { if (!companyStaffPage.hasNext()) {
break; break;
} }
// 取一页 // 取一页
queryWrapper.gt(CompanyStaff::getId, page.getRecords().get(page.getRecords().size() - 1).getId()); page.setCurrent(page.getCurrent() + 1);
} }
} }

View File

@ -0,0 +1,39 @@
package cn.iocoder.yudao.scheduled;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.company.service.CompanyService;
import cn.iocoder.yudao.module.company.vo.CompanyRespVO;
import cn.iocoder.yudao.module.property.service.PropertyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 企业资产临期定时通知
* @author 小李
* @date 8:42 2024/8/16
**/
@Component
@TenantJob
@Slf4j
public class NoticeCompanyPropertyExpiredJob implements JobHandler {
@Resource
private PropertyService propertyService;
@Resource
private CompanyService companyService;
@Override
public String execute(String param) throws Exception {
// 获得所有企业的企业管理员
List<CompanyRespVO> companyAndManager = companyService.getCompanyAndManager();
// 执行定时任务
propertyService.noticePropertyExpired(companyAndManager);
return null;
}
}