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("导出失败"); } } }