package com.ruoyi.manage.service.impl; import cn.hutool.core.lang.UUID; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.ruoyi.common.core.domain.entity.User; import com.ruoyi.common.numgen.NumberGenerator; import com.ruoyi.common.utils.QueryWrappers; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.manage.excel.ManageDocumentControlledImportDto; import com.ruoyi.manage.mapper.ManageDocumentControlledMapper; import com.ruoyi.manage.mapper.ManageDocumentListMapper; import com.ruoyi.manage.mapper.ManageRecordCheckMapper; import com.ruoyi.manage.pojo.ManageDocumentControlled; import com.ruoyi.manage.pojo.ManageDocumentList; import com.ruoyi.manage.pojo.ManageRecordCheck; import com.ruoyi.manage.service.ManageDocumentControlledService; import com.ruoyi.manage.util.DocumentPreviewUtils; import com.ruoyi.system.mapper.UserMapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

* 文件受控 服务实现类 *

* * @author * @since 2024-11-08 02:54:44 */ @Service @Transactional(rollbackFor = Exception.class) public class ManageDocumentControlledServiceImpl extends ServiceImpl implements ManageDocumentControlledService { @Resource private ManageDocumentControlledMapper manageDocumentControlledMapper; @Resource private ManageDocumentListMapper manageDocumentListMapper; @Resource private ManageRecordCheckMapper manageRecordCheckMapper; @Value("${wordUrl}") private String wordUrl; @Resource private UserMapper userMapper; @Resource private NumberGenerator numberGenerator; private static final DateTimeFormatter CODE_DATE_FORMAT = DateTimeFormatter.ofPattern("yyMMdd"); @Override public IPage pageManageDocumentControlled(Page page, ManageDocumentControlled manageDocumentControlled) { return manageDocumentControlledMapper.pageManageDocumentControlled(page, QueryWrappers.queryWrappers(manageDocumentControlled)); } @Override public int addManageDocumentControlled(ManageDocumentControlled manageDocumentControlled) { manageDocumentControlled.setState("待审核"); // 提交日期不再在界面填写,入库时自动写当天,保留原有字段含义 if (manageDocumentControlled.getSubmitDate() == null) { manageDocumentControlled.setSubmitDate(LocalDate.now()); } String urlString; String pathName; String path; if (ObjectUtils.isNotEmpty(manageDocumentControlled.getFile())) { MultipartFile file = manageDocumentControlled.getFile(); //上传新文件 path = wordUrl; try { File realpath = new File(path); if (!realpath.exists()) { realpath.mkdirs(); } pathName = UUID.randomUUID() + "_" + file.getOriginalFilename(); urlString = realpath + "/" + pathName; file.transferTo(new File(urlString)); } catch (Exception e) { e.printStackTrace(); System.err.println("附件上传错误"); return 0; } manageDocumentControlled.setUrl(pathName); } return manageDocumentControlledMapper.insert(manageDocumentControlled); } @Override public int delManageDocumentControlled(Long id) { ManageDocumentControlled manageDocumentControlled = manageDocumentControlledMapper.selectById(id); if (ObjectUtils.isNotEmpty(manageDocumentControlled.getUrl())) { // 删除旧文件 File oldFile = new File(wordUrl + "/" + manageDocumentControlled.getUrl()); oldFile.delete(); } return manageDocumentControlledMapper.deleteById(id); } @Override public ManageDocumentControlled getManageDocumentControlled(Long id) { ManageDocumentControlled manageDocumentControlled = manageDocumentControlledMapper.getManageDocumentControlled(id); //获取部门信息 String departmentLimsName = userMapper.selectUserDepartmentLimsName(manageDocumentControlled.getCreateUser()); manageDocumentControlled.setCreateUserDepartLims(departmentLimsName); return manageDocumentControlled; } @Override public int doManageDocumentControlled(ManageDocumentControlled manageDocumentControlled) { ManageDocumentControlled manageDocumentControlled1 = manageDocumentControlledMapper.selectById(manageDocumentControlled.getId()); if (ObjectUtils.isNotEmpty(manageDocumentControlled.getFile())) { if (ObjectUtils.isNotEmpty(manageDocumentControlled1.getUrl())) { // 删除旧文件 File oldFile = new File(wordUrl + "/" + manageDocumentControlled1.getUrl()); oldFile.delete(); } //上传新文件 String urlString; String pathName; String path; MultipartFile file = manageDocumentControlled.getFile(); path = wordUrl; try { File realpath = new File(path); if (!realpath.exists()) { realpath.mkdirs(); } pathName = UUID.randomUUID() + "_" + file.getOriginalFilename(); urlString = realpath + "/" + pathName; file.transferTo(new File(urlString)); manageDocumentControlled.setUrl(pathName); } catch (Exception e) { e.printStackTrace(); System.err.println("附件上传错误"); return 0; } } return manageDocumentControlledMapper.updateById(manageDocumentControlled); } @Override public int checkManageDocumentControlled(ManageDocumentControlled manageDocumentControlled) { ManageDocumentControlled documentControlled = manageDocumentControlledMapper.selectById(manageDocumentControlled.getId()); if (documentControlled == null) { throw new ErrorException("申请记录不存在"); } // 已通过的申请不能再审核,否则会重复生成文件清单和审批记录 if ("通过".equals(documentControlled.getState())) { throw new ErrorException("该申请已审核通过,不能重复审核"); } if (manageDocumentControlled.getState().equals("通过")) { // 删除旧文件 File oldFile = new File(wordUrl + "/" + documentControlled.getUrl()); oldFile.delete(); //上传新文件 String urlString; String pathName; String path; MultipartFile file = manageDocumentControlled.getFile(); path = wordUrl; try { File realpath = new File(path); if (!realpath.exists()) { realpath.mkdirs(); } pathName = UUID.randomUUID() + "_" + file.getOriginalFilename(); urlString = realpath + "/" + pathName; file.transferTo(new File(urlString)); manageDocumentControlled.setUrl(pathName); } catch (Exception e) { e.printStackTrace(); System.err.println("附件上传错误"); return 0; } //将文件受控已知文件清单 ManageDocumentList manageDocumentList = new ManageDocumentList(); manageDocumentList.setDocumentCode(documentControlled.getDocumentCode()); manageDocumentList.setType(documentControlled.getType()); manageDocumentList.setName(documentControlled.getName()); manageDocumentList.setVersion(documentControlled.getVersion()); manageDocumentList.setWriter(documentControlled.getWriter()); // 文件清单的生效日期取申请的“实施日期”,没填才用当天 manageDocumentList.setEffectiveDate(documentControlled.getImplementDate() != null ? documentControlled.getImplementDate() : LocalDate.now()); manageDocumentList.setState("有效"); manageDocumentList.setUrl(manageDocumentControlled.getUrl()); manageDocumentListMapper.insert(manageDocumentList); } /*新增8.4的文件审批记录*/ ManageRecordCheck manageRecordCheck = new ManageRecordCheck(); manageRecordCheck.setDocumentCode(documentControlled.getDocumentCode()); manageRecordCheck.setDocumentName(documentControlled.getName()); manageRecordCheck.setDocumentVersion(documentControlled.getVersion()); // 作者可能不是系统用户(历史数据/手填),查不到时不再空指针 User writerUser = null; if (documentControlled.getWriter() != null && !documentControlled.getWriter().trim().isEmpty()) { writerUser = userMapper.selectOne(Wrappers.lambdaQuery() .eq(User::getName, documentControlled.getWriter()) .last("limit 1")); } manageRecordCheck.setWriteUser(writerUser == null ? null : writerUser.getId()); manageRecordCheck.setCheckUser(documentControlled.getDutyUser()); manageRecordCheck.setCheckState(manageDocumentControlled.getState()); manageRecordCheck.setRemark(documentControlled.getInstructions()); manageRecordCheckMapper.insert(manageRecordCheck); return manageDocumentControlledMapper.updateById(manageDocumentControlled); } @Override public int importManageDocumentControlled(List rows) { LocalDate today = LocalDate.now(); LocalDateTime now = LocalDateTime.now(); String codePrefix = "WT" + CODE_DATE_FORMAT.format(today); int count = 0; for (ManageDocumentControlledImportDto dto : rows) { Map row = new HashMap<>(); row.put("documentCode", numberGenerator.generateNumberWithPrefix( 3, codePrefix, ManageDocumentControlled::getDocumentCode)); row.put("type", null); row.put("name", dto.getName().trim()); row.put("version", trimToNull(dto.getVersion())); row.put("writer", null); row.put("submitDate", today); row.put("publishDate", dto.getPublishDateValue()); row.put("implementDate", dto.getImplementDateValue()); row.put("instructions", null); row.put("state", "草稿"); row.put("url", null); row.put("dutyUser", null); row.put("createTime", now); row.put("updateTime", now); count += manageDocumentControlledMapper.insertImportedDraft(row); } return count; } private String trimToNull(String value) { return value == null || value.trim().isEmpty() ? null : value.trim(); } @Override public void checkManageDocumentControlledPdf(Long id, HttpServletResponse response) throws Exception { ManageDocumentControlled manageDocumentControlled = manageDocumentControlledMapper.selectById(id); if (manageDocumentControlled == null || ObjectUtils.isEmpty(manageDocumentControlled.getUrl())) { throw new ErrorException("文件未上传"); } // PDF 直接输出,Word/图片在线转 PDF,供前端预览盖章 DocumentPreviewUtils.writeAsPdf(new File(wordUrl + "/" + manageDocumentControlled.getUrl()), response); } }