package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.basic.mapper.LaboratoryMapper;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceStateDto;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.mapper.DeviceStateMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.pojo.DeviceState;
import com.ruoyi.device.service.DeviceStateService;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
/**
*
* 设备停用/启用 服务实现类
*
*
* @author
* @since 2024-09-26 09:51:40
*/
@Service
public class DeviceStateServiceImpl extends ServiceImpl implements DeviceStateService {
@Resource
private LaboratoryMapper laboratoryMapper;
@Resource
private UserMapper userMapper;
@Resource
private DeviceMapper deviceMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveDeviceState(DeviceState deviceState) {
User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
if (deviceState.getStateId() != null) {
DeviceState existing = baseMapper.selectById(deviceState.getStateId());
if (existing == null) {
throw new ServiceException("单据不存在");
}
if ("关闭".equals(existing.getCurrentState())) {
throw new ServiceException("该流程已结束,不能再操作");
}
if (StringUtils.isNotBlank(existing.getCurrentResponsible())
&& !existing.getCurrentResponsible().equals(user.getName())) {
throw new ServiceException("您不是当前环节责任人,无权操作");
}
}
boolean saved = saveOrUpdate(deviceState);
if (saved && "关闭".equals(deviceState.getCurrentState())) {
updateDeviceStatus(deviceState);
}
return saved;
}
/**
* 流程最终批准后,把停用/启用结果同步到设备档案状态
*/
private void updateDeviceStatus(DeviceState deviceState) {
if (deviceState.getDeviceId() == null) {
return;
}
Device device = deviceMapper.selectById(deviceState.getDeviceId());
if (device == null) {
return;
}
Integer status = null;
if ("0scrap".equals(deviceState.getDeviceStatus())) {
status = 3;
} else if ("1startUsing".equals(deviceState.getDeviceStatus())) {
status = 0;
} else if ("2stopUsing".equals(deviceState.getDeviceStatus())) {
status = 2;
}
if (status != null) {
device.setDeviceStatus(status);
deviceMapper.updateById(device);
}
}
@Override
public IPage getDeviceStatePage(Integer deviceId, Page page, String processNumber) {
return baseMapper.getDeviceStatePage(deviceId, page, processNumber);
}
@Override
public void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response) {
// 根据流程编号 查询cnas设备状态
DeviceStateDto deviceStateDto = baseMapper.getDeviceStatePage(deviceId,new Page(1,1), processNumber).getRecords().get(0);
// 对时间进行修改
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
deviceStateDto.setSubmitDateString(deviceStateDto.getSubmitDate() != null ? deviceStateDto.getSubmitDate().format(format) : " 年 月 日");
deviceStateDto.setDepartmentDateString(deviceStateDto.getDepartmentDate() != null? deviceStateDto.getDepartmentDate().format(format) : " 年 月 日");
deviceStateDto.setMeasuringRoomDateString(deviceStateDto.getMeasuringRoomDate() != null? deviceStateDto.getMeasuringRoomDate().format(format) : " 年 月 日");
deviceStateDto.setApprovalDateString(deviceStateDto.getApprovalDate() != null? deviceStateDto.getApprovalDate().format(format) : " 年 月 日");
// 查询设备属于哪个实验室
String laboratoryName;
String largeCategory = deviceStateDto.getLargeCategory();
if (StringUtils.isNotBlank(largeCategory)) {
largeCategory = largeCategory.substring(0, 1);
Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.lambdaQuery()
.eq(Laboratory::getLaboratoryNumber, largeCategory)
.select(Laboratory::getLaboratoryName));
laboratoryName = laboratory != null ? laboratory.getLaboratoryName() : "";
} else {
laboratoryName = "";
}
// 获取路径
InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-status.docx");
Configure configure = Configure.builder()
.build();
XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
new HashMap() {{
put("deviceStateDto", deviceStateDto);
// 签名兜底: 人员未配置签名或签名文件缺失时返回透明图片, 保证导出不因空图片报错
put("submitOperatingPersonnelUrl", UserUtils.getFinalUserSignatureOrTransparent(deviceStateDto.getSubmitOperatingPersonnel()));
put("departmentNextPesponsibleUrl", UserUtils.getFinalUserSignatureOrTransparent(deviceStateDto.getDepartmentNextPesponsible()));
put("measuringRoomNextPesponsibleUrl", UserUtils.getFinalUserSignatureOrTransparent(deviceStateDto.getMeasuringRoomNextPesponsible()));
put("approvalNextPesponsibleUrl", UserUtils.getFinalUserSignatureOrTransparent(deviceStateDto.getApprovalNextPesponsible()));
put("laboratory", laboratoryName);
}});
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("导出失败");
}
}
}