package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.constant.MenuJumpPathConstants;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.device.dto.DeviceImpowerDetailsDto;
import com.ruoyi.device.dto.DeviceImpowerDto;
import com.ruoyi.device.mapper.DeviceImpowerDetailsMapper;
import com.ruoyi.device.pojo.DeviceImpower;
import com.ruoyi.device.mapper.DeviceImpowerMapper;
import com.ruoyi.device.pojo.DeviceImpower;
import com.ruoyi.device.pojo.DeviceImpowerDetails;
import com.ruoyi.device.service.DeviceImpowerService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.service.DeviceImpowerDetailsService;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.InformationNotificationService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 设备使用表 服务实现类
*
*
* @author
* @since 2025-04-17 03:23:23
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceImpowerServiceImpl extends ServiceImpl implements DeviceImpowerService {
@Resource
private DeviceImpowerDetailsService deviceImpowerDetailsService;
@Resource
private DeviceImpowerDetailsMapper deviceImpowerDetailsMapper;
@Resource
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Resource
private InformationNotificationService informationNotificationService;
@Resource
private UserMapper userMapper;
/**
* 分页查询设备使用
*
* @param page
* @return
*/
@Override
public Result> selectDeviceImpowerByPage(Page page, DeviceImpowerDto deviceImpowerDto) {
IPage iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceImpowerDto));
return Result.success(iPage);
}
/**
* 新增设备使用
*
* @param deviceImpowerDto 设备使用
*/
@Override
public Result addImpower(DeviceImpowerDto deviceImpowerDto) {
Integer userId = SecurityUtils.getUserId().intValue();
User user = userMapper.selectById(userId);
deviceImpowerDto.setCompilerId(userId);
deviceImpowerDto.setCompiler(user.getName());
deviceImpowerDto.setDatePreparation(LocalDateTime.now());
// 查询审核人id
if (deviceImpowerDto.getAuditId() != null) {
User auditUser = userMapper.selectById(deviceImpowerDto.getAuditId());
deviceImpowerDto.setAudit(auditUser.getName());
}
this.saveOrUpdate(deviceImpowerDto);
// 详情赋值并保存
List deviceImpowerDetails = deviceImpowerDto.getDeviceImpowerDetails();
if (CollectionUtils.isNotEmpty(deviceImpowerDetails)) { // 详情不为空
List collect = deviceImpowerDetails.stream().map(detailsDto -> {
detailsDto.setImpowerId(deviceImpowerDto.getImpowerId()); // 使用ID
DeviceImpowerDetails details = new DeviceImpowerDetails();
BeanUtils.copyProperties(detailsDto, details);
return details;
}).collect(Collectors.toList());
deviceImpowerDetailsService.saveBatch(collect);
}
return Result.success();
}
/**
* 修改设备使用
*
* @param deviceImpowerDto 设备使用
*/
@Override
public Result updateImpower(DeviceImpowerDto deviceImpowerDto) {
// 查询审核人id
if (deviceImpowerDto.getAuditId() != null) {
User auditUser = userMapper.selectById(deviceImpowerDto.getAuditId());
deviceImpowerDto.setAudit(auditUser.getName());
}
this.saveOrUpdate(deviceImpowerDto);
// 删除原本的详情
deviceImpowerDetailsService.remove(Wrappers.lambdaQuery().eq(DeviceImpowerDetails::getImpowerId, deviceImpowerDto.getImpowerId()));
// 详情赋值并保存
List deviceImpowerDetails = deviceImpowerDto.getDeviceImpowerDetails();
if (CollectionUtils.isNotEmpty(deviceImpowerDetails)) { // 详情不为空
List collect = deviceImpowerDetails.stream().map(detailsDto -> {
detailsDto.setImpowerId(deviceImpowerDto.getImpowerId()); // 使用ID
DeviceImpowerDetails details = new DeviceImpowerDetails();
BeanUtils.copyProperties(detailsDto, details);
return details;
}).collect(Collectors.toList());
deviceImpowerDetailsService.saveBatch(collect);
}
return Result.success();
}
/**
* 删除设备使用
*
* @param deviceImpowerDto 设备使用
*/
@Override
public Result deleteImpower(DeviceImpowerDto deviceImpowerDto) {
this.removeById(deviceImpowerDto);
deviceImpowerDetailsService.remove(Wrappers.lambdaQuery().eq(DeviceImpowerDetails::getImpowerId, deviceImpowerDto.getImpowerId()));
return Result.success();
}
/**
* 查询设备使用详情
*
* @param impowerId 设备使用id
*/
@Override
public Result getImpowerDetail(Integer impowerId) {
// 查询设备使用
DeviceImpower deviceImpower = baseMapper.selectById(impowerId);
// 查询详情
DeviceImpowerDto deviceImpowerDto = new DeviceImpowerDto();
BeanUtils.copyProperties(deviceImpower, deviceImpowerDto);
deviceImpowerDto.setDeviceImpowerDetails(deviceImpowerDetailsMapper.deviceImpowerDetailsList(impowerId));
return Result.success(deviceImpowerDto);
}
/**
* 提交批准
* @param deviceImpowerDto
* @return
*/
@Override
public Result submitReviewImpowerStatus(DeviceImpowerDto deviceImpowerDto) {
User audit = userMapper.selectById(deviceImpowerDto.getAuditId());
this.update(Wrappers.lambdaUpdate()
.eq(DeviceImpower::getImpowerId, deviceImpowerDto.getImpowerId())
.set(DeviceImpower::getAuditId, audit.getId())
.set(DeviceImpower::getAudit, audit.getName())
.set(DeviceImpower::getAuditDate, null)
.set(DeviceImpower::getStatus, null)
.set(DeviceImpower::getAuditRemark, null));
DeviceImpower deviceImpower = baseMapper.selectById(deviceImpowerDto.getImpowerId());
// // 发送消息
// Integer userId = SecurityUtils.getUserId().intValue();
// User user = userMapper.selectById(userId);
// // 消息发送
// InformationNotification info = new InformationNotification();
// // 发送人
// info.setCreateUser(user.getName());
// info.setMessageType("6");
// info.setTheme("CNAS设备使用批准通知");
// info.setContent(deviceImpower.getPlanYear() + "年的设备使用待批准");
// info.setSenderId(userId);
// // 接收人
// info.setConsigneeId(audit.getId());
// info.setJumpPath(MenuJumpPathConstants.DEVICE);
// informationNotificationService.addInformationNotification(info);
//
// // 发送企业微信通知
// threadPoolTaskExecutor.execute(() -> {
// String message = "";
// message += "CNAS设备使用核通知";
// message += "\n请去资源管理-设备一层目录-设备使用填写";
// message += "\n" + deviceImpower.getPlanYear() + "年的设备使用待批准";
// //发送企业微信消息通知
// try {
// WxCpUtils.inform(audit.getAccount(), message, null);
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// });
return Result.success();
}
/**
*
*
* @param deviceImpowerDto
*/
@Override
public Result reviewImpowerStatus(DeviceImpowerDto deviceImpowerDto) {
LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate()
.eq(DeviceImpower::getImpowerId, deviceImpowerDto.getImpowerId())
.set(DeviceImpower::getAuditDate, LocalDateTime.now())
.set(DeviceImpower::getStatus, deviceImpowerDto.getStatus()) // 审核状态
.set(DeviceImpower::getAuditRemark, deviceImpowerDto.getAuditRemark());// 审核备注
this.update(wrapper); // 更新
return Result.success();
}
/**
* 导出设备使用
*
* @param impowerId 设备使用id
*/
@Override
public Result exportDeviceImpowerDto(Integer impowerId, HttpServletResponse response) {
// 查询设备使用授权计划
DeviceImpower deviceImpower = baseMapper.selectById(impowerId);
DeviceImpowerDto deviceImpowerDto = new DeviceImpowerDto();
BeanUtils.copyProperties(deviceImpower, deviceImpowerDto);
// 格式化日期中英文
DateTimeFormatter formatterCH = DateTimeFormatter.ofPattern("yyyy 年 MM 月 dd 日");
DateTimeFormatter formatterEN = DateTimeFormatter.ofPattern("yyyy 'Year' MM 'Month' dd 'Day'");
deviceImpowerDto.setAuditDateCH(deviceImpower.getAuditDate() == null ? null : deviceImpower.getAuditDate().format(formatterCH));
deviceImpowerDto.setAuditDateEN(deviceImpower.getAuditDate() == null ? null : deviceImpower.getAuditDate().format(formatterEN));
// 查询设备保养计划详情
List deviceImpowerDetailsDtoList = deviceImpowerDetailsMapper.deviceImpowerDetailsList(impowerId);
// 设置序号
deviceImpowerDetailsDtoList.forEach(deviceImpowerDetails -> {
deviceImpowerDetails.setIndex(deviceImpowerDetailsDtoList.indexOf(deviceImpowerDetails) + 1);
});
// 获取路径
InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-impower.docx");
Configure configure = Configure.builder()
.bind("deviceImpowerDetailsDtoList", new HackLoopTableRenderPolicy())
.build();
XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
new HashMap() {{
put("deviceImpower", deviceImpowerDto);
put("deviceImpowerDetailsDtoList", deviceImpowerDetailsDtoList);
// 授权人地址
put("auditUrl", UserUtils.getFinalUserSignatureUrl(deviceImpower.getAuditId()));
}});
try {
response.setContentType("application/msword");
String fileName = URLEncoder.encode(
"设备使用授权", "UTF-8");
response.setHeader("Content-disposition",
"attachment;filename=" + fileName + ".docx");
OutputStream os = response.getOutputStream();
template.write(os);
os.flush();
os.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("导出失败");
}
return Result.success();
}
}