客户满意度新增附件与委托单关联;供应商管理新增附件;标准物质接收、记录、验收模块调整;委托单新增已完成列表接口(满意度下拉用);管理记录服务调整
已修改26个文件
已添加4个文件
603 ■■■■■ 文件已修改
cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionAttachmentMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfaction.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfactionAttachment.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/service/ClientSatisfactionService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordVerifyServiceImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceAcceptanceController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceRecordController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/controller/SupplierManagementController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/dto/AcceptanceDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceExcel.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceImport.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/mapper/SupplierManagementAttachmentMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstance.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptance.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceRecord.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/pojo/SupplierManagementAttachment.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceRecordService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/service/SupplierManagementService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/service/impl/SupplierManagementServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceVo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/java/com/ruoyi/require/vo/SubstanceRecordVo.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/resources/mapper/FeStandardSubstanceAcceptanceMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-require/src/main/resources/mapper/FeStandardSubstanceRecordMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
@@ -136,5 +136,33 @@
    public Result delAnalyseFile(Integer analyseFileId){
        return Result.success(clientSatisfactionAnalyseFileMapper.deleteById(analyseFileId));
    }
    /**
     * æŸ¥è¯¢æ»¡æ„åº¦é™„ä»¶
     */
    @Operation(summary = "查询满意度附件")
    @GetMapping("/selectAttachments")
    public Result selectAttachments(Integer clientSatisfactionId) {
        return Result.success(clientSatisfactionService.selectAttachments(clientSatisfactionId));
    }
    /**
     * ä¸Šä¼ æ»¡æ„åº¦é™„ä»¶
     */
    @Operation(summary = "上传满意度附件")
    @PostMapping("/uploadAttachment")
    public Result uploadAttachment(@RequestParam("clientSatisfactionId") Integer clientSatisfactionId,
                                   @RequestParam("file") MultipartFile file) {
        return Result.success(clientSatisfactionService.uploadAttachment(clientSatisfactionId, file));
    }
    /**
     * åˆ é™¤æ»¡æ„åº¦é™„ä»¶
     */
    @Operation(summary = "删除满意度附件")
    @DeleteMapping("/deleteAttachment")
    public Result deleteAttachment(Long id) {
        return Result.success(clientSatisfactionService.deleteAttachment(id));
    }
}
cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionAttachmentMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.manage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.manage.pojo.ClientSatisfactionAttachment;
import org.apache.ibatis.annotations.Mapper;
/**
 * å®¢æˆ·æ»¡æ„åº¦é™„ä»¶
 */
@Mapper
public interface ClientSatisfactionAttachmentMapper extends BaseMapper<ClientSatisfactionAttachment> {
}
cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfaction.java
@@ -73,6 +73,15 @@
    @Schema(description = "备注(对我们的希望)")
    private String remark;
    @Schema(description = "委托单id(ins_order.id)")
    private Integer orderId;
    @Schema(description = "委托单编号")
    private String entrustCode;
    @Schema(description = "样品名称")
    private String sampleName;
    @Schema(description = "创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfactionAttachment.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.manage.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * å®¢æˆ·æ»¡æ„åº¦é™„ä»¶
 */
@Data
@TableName("cnas_client_satisfaction_attachment")
public class ClientSatisfactionAttachment {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Integer clientSatisfactionId;
    private String fileName;
    private String fileUrl;
    private Integer sort;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
cnas-manage/src/main/java/com/ruoyi/manage/service/ClientSatisfactionService.java
@@ -5,9 +5,11 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.manage.pojo.ClientSatisfaction;
import com.ruoyi.manage.pojo.ClientSatisfactionAnalyseFile;
import com.ruoyi.manage.pojo.ClientSatisfactionAttachment;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * å®¢æˆ·æ»¡æ„åº¦
@@ -55,5 +57,27 @@
     * @param userId             ä¿®æ”¹äººid
     */
    void confirmClientSatisfaction(ClientSatisfaction clientSatisfaction, Integer userId);
    /**
     * æŸ¥è¯¢æ»¡æ„åº¦é™„ä»¶
     * @param clientSatisfactionId æ»¡æ„åº¦è®°å½•id
     * @return
     */
    List<ClientSatisfactionAttachment> selectAttachments(Integer clientSatisfactionId);
    /**
     * ä¸Šä¼ æ»¡æ„åº¦é™„ä»¶
     * @param clientSatisfactionId æ»¡æ„åº¦è®°å½•id
     * @param file
     * @return
     */
    ClientSatisfactionAttachment uploadAttachment(Integer clientSatisfactionId, MultipartFile file);
    /**
     * åˆ é™¤æ»¡æ„åº¦é™„ä»¶
     * @param id é™„ä»¶id
     * @return
     */
    boolean deleteAttachment(Long id);
}
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.manage.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,13 +10,16 @@
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.manage.dto.ClientSatisfactionDto;
import com.ruoyi.manage.mapper.ClientSatisfactionAnalyseFileMapper;
import com.ruoyi.manage.mapper.ClientSatisfactionAttachmentMapper;
import com.ruoyi.manage.mapper.ClientSatisfactionMapper;
import com.ruoyi.manage.pojo.ClientSatisfaction;
import com.ruoyi.manage.pojo.ClientSatisfactionAnalyseFile;
import com.ruoyi.manage.pojo.ClientSatisfactionAttachment;
import com.ruoyi.manage.service.ClientSatisfactionService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Value;
@@ -24,12 +28,14 @@
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
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;
/**
@@ -43,6 +49,9 @@
    @Resource
    private ClientSatisfactionAnalyseFileMapper clientSatisfactionAnalyseFileMapper;
    @Resource
    private ClientSatisfactionAttachmentMapper clientSatisfactionAttachmentMapper;
    @Resource
    private UserMapper userMapper;
@@ -184,5 +193,75 @@
        clientSatisfaction.setConfirmStatus(1);
        baseMapper.updateById(clientSatisfaction);
    }
    /**
     * æŸ¥è¯¢æ»¡æ„åº¦é™„ä»¶
     *
     * @param clientSatisfactionId æ»¡æ„åº¦è®°å½•id
     * @return
     */
    @Override
    public List<ClientSatisfactionAttachment> selectAttachments(Integer clientSatisfactionId) {
        return clientSatisfactionAttachmentMapper.selectList(new QueryWrapper<ClientSatisfactionAttachment>().lambda()
                .eq(ClientSatisfactionAttachment::getClientSatisfactionId, clientSatisfactionId)
                .orderByAsc(ClientSatisfactionAttachment::getSort, ClientSatisfactionAttachment::getId));
    }
    /**
     * ä¸Šä¼ æ»¡æ„åº¦é™„ä»¶
     *
     * @param clientSatisfactionId æ»¡æ„åº¦è®°å½•id
     * @param file
     * @return
     */
    @Override
    public ClientSatisfactionAttachment uploadAttachment(Integer clientSatisfactionId, MultipartFile file) {
        if (baseMapper.selectById(clientSatisfactionId) == null) {
            throw new BaseException("客户满意度调查不存在");
        }
        if (file == null || file.isEmpty()) {
            throw new BaseException("附件不能为空");
        }
        // ç³»ç»Ÿå…¨å±€ä¸Šä¼ ä¸Šé™ä¸º200MB,这里提前给出友好提示
        if (file.getSize() > 200L * 1024 * 1024) {
            throw new BaseException("附件不能超过200MB");
        }
        String originalName = file.getOriginalFilename();
        if (originalName == null || originalName.trim().isEmpty()) {
            originalName = "未命名文件";
        }
        // ä¸ªåˆ«æµè§ˆå™¨å¯èƒ½å¸¦ä¸Šè·¯å¾„前缀,只保留文件名本身
        originalName = originalName.replaceAll(".*[/\\\\]", "");
        try {
            // å›¾ç‰‡æ”¾å›¾ç‰‡ç›®å½•(/img é™æ€è·¯å¾„),其余任意格式放 word ç›®å½•(/word é™æ€è·¯å¾„)
            boolean image = originalName.matches("(?i).+\\.(jpg|jpeg|png|gif)$");
            File directory = new File(image ? imgUrl : wordUrl);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            String fileUrl = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmssSSS")) + "-" + originalName;
            file.transferTo(new File(directory, fileUrl));
            ClientSatisfactionAttachment attachment = new ClientSatisfactionAttachment();
            attachment.setClientSatisfactionId(clientSatisfactionId);
            attachment.setFileName(originalName);
            attachment.setFileUrl(fileUrl);
            attachment.setSort(selectAttachments(clientSatisfactionId).size());
            clientSatisfactionAttachmentMapper.insert(attachment);
            return attachment;
        } catch (IOException e) {
            throw new BaseException("附件上传失败");
        }
    }
    /**
     * åˆ é™¤æ»¡æ„åº¦é™„ä»¶
     *
     * @param id é™„ä»¶id
     * @return
     */
    @Override
    public boolean deleteAttachment(Long id) {
        return clientSatisfactionAttachmentMapper.deleteById(id) > 0;
    }
}
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java
@@ -428,13 +428,7 @@
        List<ManageRecordIntervals> manageRecordIntervalsList = new ArrayList<>();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        //获取当前年份
        LocalDate currentDate = LocalDate.now();
        // å®šä¹‰æ—¥æœŸæ ¼å¼
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
        // æ ¼å¼åŒ–当前日期
        String currentMonth = currentDate.format(formatter);
        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectOne(Wrappers.<ManageRecordIntervalsTotal>lambdaQuery().eq(ManageRecordIntervalsTotal::getYear, currentMonth));
        ManageRecordIntervalsTotal manageRecordIntervalsTotal = getOrCreateCurrentYearTotal();
        try {
            InputStream inputStream = file.getInputStream();
            XWPFDocument document = new XWPFDocument(inputStream);
@@ -482,13 +476,7 @@
    @Override
    public int addManageRecordIntervals(ManageRecordIntervals manageRecordIntervals) {
        //获取当前年份
        LocalDate currentDate = LocalDate.now();
        // å®šä¹‰æ—¥æœŸæ ¼å¼
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
        // æ ¼å¼åŒ–当前日期
        String currentMonth = currentDate.format(formatter);
        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectOne(Wrappers.<ManageRecordIntervalsTotal>lambdaQuery().eq(ManageRecordIntervalsTotal::getYear, currentMonth));
        ManageRecordIntervalsTotal manageRecordIntervalsTotal = getOrCreateCurrentYearTotal();
        manageRecordIntervals.setRecordIntervalsTotalId(manageRecordIntervalsTotal.getId());
        manageRecordIntervalsMapper.insert(manageRecordIntervals);
        manageRecordIntervalsTotal.setTotalNum(1 + manageRecordIntervalsTotal.getTotalNum());
@@ -500,10 +488,28 @@
        ManageRecordIntervals manageRecordIntervals = manageRecordIntervalsMapper.selectById(id);
        manageRecordIntervalsMapper.deleteById(id);
        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectById(manageRecordIntervals.getRecordIntervalsTotalId());
        manageRecordIntervalsTotal.setTotalNum(manageRecordIntervalsTotal.getTotalNum() - 1);
        if (manageRecordIntervalsTotal == null) {
            return 0;
        }
        manageRecordIntervalsTotal.setTotalNum((manageRecordIntervalsTotal.getTotalNum() == null ? 0 : manageRecordIntervalsTotal.getTotalNum()) - 1);
        return manageRecordIntervalsTotalMapper.updateById(manageRecordIntervalsTotal);
    }
    // å¹´åº¦æ±‡æ€»è®°å½•原本由每年 1 æœˆ 1 æ—¥çš„定时任务创建,任务未启用时此处兜底自动补建,避免取 id æ—¶æŠ¥ç©ºæŒ‡é’ˆ
    private ManageRecordIntervalsTotal getOrCreateCurrentYearTotal() {
        String year = String.valueOf(LocalDate.now().getYear());
        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectOne(Wrappers.<ManageRecordIntervalsTotal>lambdaQuery().eq(ManageRecordIntervalsTotal::getYear, year));
        if (manageRecordIntervalsTotal == null) {
            manageRecordIntervalsTotal = new ManageRecordIntervalsTotal();
            manageRecordIntervalsTotal.setYear(year);
            manageRecordIntervalsTotal.setTotalNum(0);
            manageRecordIntervalsTotalMapper.insert(manageRecordIntervalsTotal);
        } else if (manageRecordIntervalsTotal.getTotalNum() == null) {
            manageRecordIntervalsTotal.setTotalNum(0);
        }
        return manageRecordIntervalsTotal;
    }
    // æ°´å¹³åˆå¹¶å•元格
    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
        for (int i = fromCol; i <= toCol; i++) {
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordVerifyServiceImpl.java
@@ -53,28 +53,14 @@
    @Override
    public IPage<ManageRecordVerify> pageManageRecordVerify(Page page, ManageRecordVerify manageRecordVerify) {
        if (ObjectUtils.isEmpty(manageRecordVerify.getManageRecordTotalId())) {
            //获取当前年份
            LocalDate currentDate = LocalDate.now();
            // å®šä¹‰æ—¥æœŸæ ¼å¼
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
            // æ ¼å¼åŒ–当前日期
            String currentMonth = currentDate.format(formatter);
            //查询历史
            ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectOne(Wrappers.<ManageRecordTotal>lambdaQuery().eq(ManageRecordTotal::getYear, currentMonth));
            manageRecordVerify.setManageRecordTotalId(manageRecordTotal.getId());
            manageRecordVerify.setManageRecordTotalId(getOrCreateCurrentYearTotal().getId());
        }
        return manageRecordVerifyMapper.pageManageRecordVerify(page, QueryWrappers.queryWrappers(manageRecordVerify));
    }
    @Override
    public int addManageRecordVerify(ManageRecordVerify manageRecordVerify) {
        //获取当前年份
        LocalDate currentDate = LocalDate.now();
        // å®šä¹‰æ—¥æœŸæ ¼å¼
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
        // æ ¼å¼åŒ–当前日期
        String currentMonth = currentDate.format(formatter);
        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectOne(Wrappers.<ManageRecordTotal>lambdaQuery().eq(ManageRecordTotal::getYear, currentMonth));
        ManageRecordTotal manageRecordTotal = getOrCreateCurrentYearTotal();
        manageRecordVerify.setManageRecordTotalId(manageRecordTotal.getId());
        manageRecordVerifyMapper.insert(manageRecordVerify);
        manageRecordTotal.setTotalNum(1 + manageRecordTotal.getTotalNum());
@@ -86,7 +72,10 @@
        ManageRecordVerify manageRecordVerify = manageRecordVerifyMapper.selectById(id);
        manageRecordVerifyMapper.deleteById(id);
        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectById(manageRecordVerify.getManageRecordTotalId());
        manageRecordTotal.setTotalNum(manageRecordTotal.getTotalNum() - 1);
        if (manageRecordTotal == null) {
            return 0;
        }
        manageRecordTotal.setTotalNum((manageRecordTotal.getTotalNum() == null ? 0 : manageRecordTotal.getTotalNum()) - 1);
        return manageRecordTotalMapper.updateById(manageRecordTotal);
    }
@@ -94,13 +83,7 @@
    public int exportManageRecordVerify(MultipartFile file) {
        List<ManageRecordVerify> manageRecordVerifyList = new ArrayList<>();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        //获取当前年份
        LocalDate currentDate = LocalDate.now();
        // å®šä¹‰æ—¥æœŸæ ¼å¼
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
        // æ ¼å¼åŒ–当前日期
        String currentMonth = currentDate.format(formatter);
        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectOne(Wrappers.<ManageRecordTotal>lambdaQuery().eq(ManageRecordTotal::getYear, currentMonth));
        ManageRecordTotal manageRecordTotal = getOrCreateCurrentYearTotal();
        try {
            InputStream inputStream = file.getInputStream();
            XWPFDocument document = new XWPFDocument(inputStream);
@@ -154,4 +137,19 @@
        }
        return 0;
    }
    // å¹´åº¦æ±‡æ€»è®°å½•原本由每年 1 æœˆ 1 æ—¥çš„定时任务创建,任务未启用时此处兜底自动补建,避免取 id æ—¶æŠ¥ç©ºæŒ‡é’ˆ
    private ManageRecordTotal getOrCreateCurrentYearTotal() {
        String year = String.valueOf(LocalDate.now().getYear());
        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectOne(Wrappers.<ManageRecordTotal>lambdaQuery().eq(ManageRecordTotal::getYear, year));
        if (manageRecordTotal == null) {
            manageRecordTotal = new ManageRecordTotal();
            manageRecordTotal.setYear(year);
            manageRecordTotal.setTotalNum(0);
            manageRecordTotalMapper.insert(manageRecordTotal);
        } else if (manageRecordTotal.getTotalNum() == null) {
            manageRecordTotal.setTotalNum(0);
        }
        return manageRecordTotal;
    }
}
cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceAcceptanceController.java
@@ -4,9 +4,11 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.require.dto.AcceptanceDto;
import com.ruoyi.require.pojo.FeStandardSubstance;
import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
import com.ruoyi.require.service.FeStandardSubstanceAcceptanceInspectionService;
import com.ruoyi.require.service.FeStandardSubstanceAcceptanceService;
import com.ruoyi.require.service.FeStandardSubstanceService;
import com.ruoyi.require.vo.AcceptanceVo;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
@@ -34,6 +36,8 @@
    private FeStandardSubstanceAcceptanceInspectionService inspectionService;
    @Resource
    private FeStandardSubstanceAcceptanceService feStandardSubstanceAcceptanceService;
    @Resource
    private FeStandardSubstanceService feStandardSubstanceService;
    @Operation(summary = "新增")
    @PostMapping("/addAcceptance")
@@ -58,7 +62,20 @@
    @Operation(summary = "编辑")
    @PostMapping("/updateAcceptance")
    @Transactional
    public Result updateAcceptance(@RequestBody AcceptanceDto acceptanceDto) {
        FeStandardSubstance substance = acceptanceDto.getSubstance();
        if (substance != null) {
            if (substance.getId() == null) {
                substance.setState(0);
                feStandardSubstanceService.save(substance);
            } else {
                // é¢†ç”¨çŠ¶æ€ç”±é¢†ç”¨/归还操作维护,编辑验收单时不回写
                substance.setState(null);
                feStandardSubstanceService.updateById(substance);
            }
            acceptanceDto.getAcceptance().setSubstanceId(substance.getId());
        }
        feStandardSubstanceAcceptanceService.updateById(acceptanceDto.getAcceptance());
        for (FeStandardSubstanceAcceptanceInspection v : acceptanceDto.getList()) {
            if (v.getId()== null) {
cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceRecordController.java
@@ -37,12 +37,10 @@
        return Result.success();
    }
    @Operation(summary = "标准物质清单归还")
    @PostMapping("/returnSubstance")
    @Transactional
    public Result returnSubstance(@RequestBody FeStandardSubstanceRecord record) {
        feStandardSubstanceRecordService.returnSubstance(record);
        return Result.success();
    @Operation(summary = "查询标准物质剩余可领用数量")
    @GetMapping("/getRemainingQuantity/{substanceId}")
    public Result<Long> getRemainingQuantity(@PathVariable("substanceId") Integer substanceId) {
        return Result.success(feStandardSubstanceRecordService.getRemainingQuantity(substanceId));
    }
    @Operation(summary = "标准物质清单领用查询")
cnas-require/src/main/java/com/ruoyi/require/controller/SupplierManagementController.java
@@ -12,6 +12,7 @@
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
@@ -88,4 +89,23 @@
        return Result.success(supplierManagementService.selectSupplierManagementAll());
    }
    @Operation(summary = "查询供应商附件")
    @GetMapping("/selectAttachments")
    public Result selectAttachments(Integer supplierManagementId) {
        return Result.success(supplierManagementService.selectAttachments(supplierManagementId));
    }
    @Operation(summary = "上传供应商附件")
    @PostMapping("/uploadAttachment")
    public Result uploadAttachment(@RequestParam("supplierManagementId") Integer supplierManagementId,
                                   @RequestParam("file") MultipartFile file) {
        return Result.success(supplierManagementService.uploadAttachment(supplierManagementId, file));
    }
    @Operation(summary = "删除供应商附件")
    @DeleteMapping("/deleteAttachment")
    public Result deleteAttachment(Long id) {
        return Result.success(supplierManagementService.deleteAttachment(id));
    }
}
cnas-require/src/main/java/com/ruoyi/require/dto/AcceptanceDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.require.dto;
import com.ruoyi.require.pojo.FeStandardSubstance;
import com.ruoyi.require.pojo.FeStandardSubstanceAcceptance;
import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
import lombok.Data;
@@ -11,5 +12,7 @@
    private FeStandardSubstanceAcceptance acceptance;
    private FeStandardSubstance substance;
    private List<FeStandardSubstanceAcceptanceInspection> list;
}
cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceExcel.java
@@ -16,7 +16,7 @@
    @ExcelProperty("生产厂家")
    private String factoryManufacturer;
    @ExcelProperty("出场编号")
    @ExcelProperty("出厂编号")
    private String factoryNum;
    @ExcelProperty("管理编号")
@@ -34,7 +34,7 @@
    @ExcelProperty("有效期")
    private LocalDateTime effectiveDate;
    @ExcelProperty("文档编号")
    @ExcelProperty("档案编号")
    private String fileNum;
    @ExcelProperty("存放位置")
cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceImport.java
@@ -14,7 +14,7 @@
    @ExcelProperty("规格型号*")
    private String model;
    @ExcelProperty("生产厂家*")
    @ExcelProperty("生产厂家")
    private String factoryManufacturer;
    @ExcelProperty("出厂编号*")
@@ -29,6 +29,9 @@
    @ExcelProperty("数量*")
    private String quantity;
    @ExcelProperty("单位")
    private String unit;
    @ExcelProperty("购置日期*(yyyy-MM-dd)")
    private String acquisitionDate;
cnas-require/src/main/java/com/ruoyi/require/mapper/SupplierManagementAttachmentMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.require.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.require.pojo.SupplierManagementAttachment;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SupplierManagementAttachmentMapper extends BaseMapper<SupplierManagementAttachment> {
}
cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstance.java
@@ -1,6 +1,7 @@
package com.ruoyi.require.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -36,7 +37,10 @@
    @Schema(description = "生产厂家")
    private String factoryManufacturer;
    @Schema(description = "出场编号")
    @Schema(description = "供应商")
    private String supplier;
    @Schema(description = "出厂编号")
    private String factoryNum;
    @Schema(description = "管理编号")
@@ -48,13 +52,18 @@
    @Schema(description = "数量")
    private Long quantity;
    @Schema(description = "单位")
    private String unit;
    @Schema(description = "购置日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime acquisitionDate;
    @Schema(description = "有效期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime effectiveDate;
    @Schema(description = "文档编号")
    @Schema(description = "档案编号")
    private String fileNum;
    @Schema(description = "存放位置")
@@ -70,11 +79,13 @@
    private String createUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptance.java
@@ -3,6 +3,7 @@
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -78,6 +79,7 @@
    @ExcelIgnore
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ExcelIgnore
@@ -86,5 +88,6 @@
    @ExcelIgnore
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceRecord.java
@@ -1,6 +1,7 @@
package com.ruoyi.require.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -30,6 +31,15 @@
    @Schema(description = "物质id")
    private Integer substanceId;
    @Schema(description = "本次领用数量")
    private Long borrowQuantity;
    @Schema(description = "原始数量(领用时快照)")
    private Long originalQuantity;
    @Schema(description = "领用后剩余数量")
    private Long remainingQuantity;
    @Schema(description = "借用-完好性")
    private String integrity;
@@ -40,9 +50,11 @@
    private String phone;
    @Schema(description = "借用-借出日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime borrowDate;
    @Schema(description = "归还日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime borrowReturnDate;
    @Schema(description = "借出人")
@@ -58,6 +70,7 @@
    private String returnedPerson;
    @Schema(description = "归还-日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime returnDate;
    @Schema(description = "归还-完好性")
@@ -67,11 +80,13 @@
    private String createUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
cnas-require/src/main/java/com/ruoyi/require/pojo/SupplierManagementAttachment.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.require.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("cnas_supplier_management_attachment")
public class SupplierManagementAttachment {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Integer supplierManagementId;
    private String fileName;
    private String fileUrl;
    private Integer sort;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}
cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceRecordService.java
@@ -21,10 +21,10 @@
    void borrowSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord);
    void returnSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord);
    List<FeStandardSubstanceRecord> getSubstanceRecord(Integer id);
    IPage<SubstanceRecordVo> getPage(Page page, SubstanceRecordVo vo);
    Long getRemainingQuantity(Integer substanceId);
}
cnas-require/src/main/java/com/ruoyi/require/service/SupplierManagementService.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.require.pojo.SupplierManagement;
import com.ruoyi.require.pojo.SupplierManagementAttachment;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
@@ -29,4 +31,10 @@
    List<SupplierManagement> selectSupplierManagementByParentId(Integer parentId);
    List<SupplierManagement> selectSupplierManagementAll();
    List<SupplierManagementAttachment> selectAttachments(Integer supplierManagementId);
    SupplierManagementAttachment uploadAttachment(Integer supplierManagementId, MultipartFile file);
    boolean deleteAttachment(Long id);
}
cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceServiceImpl.java
@@ -53,6 +53,14 @@
    @Override
    public void addAcceptance(AcceptanceDto dto) {
        FeStandardSubstanceAcceptance acceptance = dto.getAcceptance();
        FeStandardSubstance substance = dto.getSubstance();
        if (substance != null) {
            if (substance.getId() == null) {
                substance.setState(0);
                feStandardSubstanceMapper.insert(substance);
            }
            acceptance.setSubstanceId(substance.getId());
        }
        this.baseMapper.insert(acceptance);
        List<FeStandardSubstanceAcceptanceInspection> list = dto.getList();
        if (CollectionUtils.isNotEmpty(list)) {
cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java
@@ -36,31 +36,51 @@
    @Override
    public void borrowSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord) {
        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectOne(Wrappers.<FeStandardSubstance>lambdaQuery()
                .eq(FeStandardSubstance::getId, feStandardSubstanceRecord.getSubstanceId())
                .eq(FeStandardSubstance::getState, 0)
                .last("limit 1"));
        if (ObjectUtils.isEmpty(standardSubstance)){
            throw new ErrorException("该物质已被借出!");
        Long borrowQuantity = feStandardSubstanceRecord.getBorrowQuantity();
        if (borrowQuantity == null || borrowQuantity <= 0) {
            throw new ErrorException("请填写正确的领用数量!");
        }
        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectById(feStandardSubstanceRecord.getSubstanceId());
        if (ObjectUtils.isEmpty(standardSubstance)){
            throw new ErrorException("该标准物质不存在!");
        }
        long remaining = calcRemaining(standardSubstance);
        if (remaining <= 0) {
            throw new ErrorException("该标准物质已全部领用,剩余数量为0!");
        }
        if (borrowQuantity > remaining) {
            throw new ErrorException("领用数量不能超过剩余数量(当前剩余" + remaining + ")!");
        }
        long remainingAfter = remaining - borrowQuantity;
        feStandardSubstanceRecord.setRemainingQuantity(remainingAfter);
        // è®°å½•领用当时的原始数量快照,之后清单里再改数量不影响历史领用记录
        feStandardSubstanceRecord.setOriginalQuantity(standardSubstance.getQuantity());
        this.baseMapper.insert(feStandardSubstanceRecord);
        standardSubstance.setState(1);
        standardSubstance.setState(remainingAfter == 0 ? 1 : 0);
        feStandardSubstanceMapper.updateById(standardSubstance);
    }
    @Override
    public void returnSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord) {
        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectOne(Wrappers.<FeStandardSubstance>lambdaQuery()
                .eq(FeStandardSubstance::getId, feStandardSubstanceRecord.getSubstanceId())
                .eq(FeStandardSubstance::getState, 1));
    public Long getRemainingQuantity(Integer substanceId) {
        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectById(substanceId);
        if (ObjectUtils.isEmpty(standardSubstance)){
            throw new ErrorException("该物质未被领用,无需归还!");
            return 0L;
        }
        standardSubstance.setState(0);
        feStandardSubstanceMapper.updateById(standardSubstance);
        baseMapper.update(feStandardSubstanceRecord, Wrappers.<FeStandardSubstanceRecord>lambdaUpdate()
                .eq(FeStandardSubstanceRecord::getSubstanceId, feStandardSubstanceRecord.getSubstanceId())
                .eq(FeStandardSubstanceRecord::getStatus, 0));
        return Math.max(calcRemaining(standardSubstance), 0L);
    }
    private long calcRemaining(FeStandardSubstance substance) {
        long total = substance.getQuantity() == null ? 0L : substance.getQuantity();
        long borrowed = 0L;
        List<FeStandardSubstanceRecord> records = this.baseMapper.selectList(Wrappers.<FeStandardSubstanceRecord>lambdaQuery()
                .eq(FeStandardSubstanceRecord::getSubstanceId, substance.getId()));
        for (FeStandardSubstanceRecord record : records) {
            if ("1".equals(record.getStatus())) { // åŽ†å²å½’è¿˜è®°å½•ä¸è®¡å…¥å·²é¢†ç”¨
                continue;
            }
            borrowed += record.getBorrowQuantity() == null ? total : record.getBorrowQuantity();
        }
        return total - borrowed;
    }
    @Override
cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceServiceImpl.java
@@ -90,11 +90,12 @@
            FeStandardSubstance substance = new FeStandardSubstance();
            substance.setName(required(row.getName(), rowNumber, "标准物质名称"));
            substance.setModel(required(row.getModel(), rowNumber, "规格型号"));
            substance.setFactoryManufacturer(required(row.getFactoryManufacturer(), rowNumber, "生产厂家"));
            substance.setFactoryManufacturer(trim(row.getFactoryManufacturer()));
            substance.setFactoryNum(required(row.getFactoryNum(), rowNumber, "出厂编号"));
            substance.setManageNum(manageNum);
            substance.setUncertainty(required(row.getUncertainty(), rowNumber, "不确定度"));
            substance.setQuantity(parseQuantity(row.getQuantity(), rowNumber));
            substance.setUnit(trim(row.getUnit()));
            substance.setAcquisitionDate(parseDate(row.getAcquisitionDate(), rowNumber, "购置日期"));
            substance.setEffectiveDate(parseDate(row.getEffectiveDate(), rowNumber, "有效期"));
            substance.setFileNum(required(row.getFileNum(), rowNumber, "档案编号"));
cnas-require/src/main/java/com/ruoyi/require/service/impl/SupplierManagementServiceImpl.java
@@ -8,18 +8,26 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.require.dto.SupplierManagementDto;
import com.ruoyi.require.mapper.SupplierManagementAttachmentMapper;
import com.ruoyi.require.mapper.SupplierManagementMapper;
import com.ruoyi.require.pojo.SupplierManagement;
import com.ruoyi.require.pojo.SupplierManagementAttachment;
import com.ruoyi.require.service.SupplierManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
@@ -35,6 +43,15 @@
    @Autowired
    private SupplierManagementMapper supplierManagementMapper;
    @Autowired
    private SupplierManagementAttachmentMapper supplierManagementAttachmentMapper;
    @Value("${file.path}")
    private String filePath;
    @Value("${wordUrl}")
    private String wordUrl;
    public SupplierManagementServiceImpl(SupplierManagementMapper supplierManagementMapper) {
        this.supplierManagementMapper = supplierManagementMapper;
@@ -88,4 +105,55 @@
    public List<SupplierManagement> selectSupplierManagementAll() {
        return supplierManagementMapper.selectList(null);
    }
    @Override
    public List<SupplierManagementAttachment> selectAttachments(Integer supplierManagementId) {
        return supplierManagementAttachmentMapper.selectList(new QueryWrapper<SupplierManagementAttachment>().lambda()
                .eq(SupplierManagementAttachment::getSupplierManagementId, supplierManagementId)
                .orderByAsc(SupplierManagementAttachment::getSort, SupplierManagementAttachment::getId));
    }
    @Override
    public SupplierManagementAttachment uploadAttachment(Integer supplierManagementId, MultipartFile file) {
        if (supplierManagementMapper.selectById(supplierManagementId) == null) {
            throw new BaseException("供应商不存在");
        }
        if (file == null || file.isEmpty()) {
            throw new BaseException("附件不能为空");
        }
        // ç³»ç»Ÿå…¨å±€ä¸Šä¼ ä¸Šé™ä¸º200MB,这里提前给出友好提示
        if (file.getSize() > 200L * 1024 * 1024) {
            throw new BaseException("附件不能超过200MB");
        }
        String originalName = file.getOriginalFilename();
        if (originalName == null || originalName.trim().isEmpty()) {
            originalName = "未命名文件";
        }
        // ä¸ªåˆ«æµè§ˆå™¨å¯èƒ½å¸¦ä¸Šè·¯å¾„前缀,只保留文件名本身
        originalName = originalName.replaceAll(".*[/\\\\]", "");
        try {
            // å›¾ç‰‡æ”¾å›¾ç‰‡ç›®å½•(/img é™æ€è·¯å¾„),其余任意格式放 word ç›®å½•(/word é™æ€è·¯å¾„)
            boolean image = originalName.matches("(?i).+\\.(jpg|jpeg|png|gif)$");
            File directory = new File(image ? filePath : wordUrl);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            String fileUrl = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmssSSS")) + "-" + originalName;
            file.transferTo(new File(directory, fileUrl));
            SupplierManagementAttachment attachment = new SupplierManagementAttachment();
            attachment.setSupplierManagementId(supplierManagementId);
            attachment.setFileName(originalName);
            attachment.setFileUrl(fileUrl);
            attachment.setSort(selectAttachments(supplierManagementId).size());
            supplierManagementAttachmentMapper.insert(attachment);
            return attachment;
        } catch (IOException e) {
            throw new BaseException("附件上传失败");
        }
    }
    @Override
    public boolean deleteAttachment(Long id) {
        return supplierManagementAttachmentMapper.deleteById(id) > 0;
    }
}
cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceVo.java
@@ -1,5 +1,6 @@
package com.ruoyi.require.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -20,7 +21,7 @@
    @Schema(description = "生产厂家")
    private String factoryManufacturer;
    @Schema(description = "出场编号")
    @Schema(description = "出厂编号")
    private String factoryNum;
    @Schema(description = "管理编号")
@@ -32,15 +33,24 @@
    @Schema(description = "数量")
    private Long quantity;
    @Schema(description = "单位")
    private String unit;
    @Schema(description = "购置日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime acquisitionDate;
    @Schema(description = "有效期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime effectiveDate;
    @Schema(description = "文档编号")
    @Schema(description = "档案编号")
    private String fileNum;
    @Schema(description = "存放位置")
    private String position;
    @Schema(description = "提交时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}
cnas-require/src/main/java/com/ruoyi/require/vo/SubstanceRecordVo.java
@@ -1,5 +1,6 @@
package com.ruoyi.require.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -17,29 +18,27 @@
    @Schema(description = "规格型号")
    private String model;
    @Schema(description = "出场编号")
    @Schema(description = "出厂编号")
    private String factoryNum;
    @Schema(description = "数量")
    private Long quantity;
    @Schema(description = "单位")
    private String unit;
    @Schema(description = "本次领用数量")
    private Long borrowQuantity;
    @Schema(description = "领用后剩余数量")
    private Long remainingQuantity;
    @Schema(description = "领用人")
    private String borrowUser;
    @Schema(description = "借出日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime borrowDate;
    @Schema(description = "归还日期")
    private LocalDateTime returnDate;
    @Schema(description = "归还人")
    private String returnedPerson;
    @Schema(description = "完好性")
    private String returnIntegrity;
    @Schema(description = "0:借用 1:归还")
    private String status;
    @Schema(description = "备注")
    private String remark;
cnas-require/src/main/resources/mapper/FeStandardSubstanceAcceptanceMapper.xml
@@ -30,10 +30,12 @@
            ss.manage_num,
            ss.uncertainty,
            ss.quantity,
            ss.unit,
            ss.acquisition_date,
            ss.effective_date,
            ss.file_num,
            ss.position
            ss.position,
            sa.create_time
        FROM cnas_fe_standard_substance_acceptance sa
                 LEFT JOIN cnas_fe_standard_substance ss on ss.id = sa.substance_id
        <where>
cnas-require/src/main/resources/mapper/FeStandardSubstanceRecordMapper.xml
@@ -25,13 +25,13 @@
        ss.name,
        ss.model,
        ss.factory_num,
        ss.quantity,
        COALESCE(ssr.original_quantity, ss.quantity) AS quantity,
        ss.unit,
        COALESCE(ssr.borrow_quantity, ss.quantity) AS borrowQuantity,
        COALESCE(ssr.remaining_quantity, 0) AS remainingQuantity,
        ssr.borrow_user,
        ssr.borrow_date,
        ssr.return_date,
        ssr.integrity,
        ssr.return_integrity,
        ssr.returned_person,
        ss.remark
        FROM cnas_fe_standard_substance_record ssr
        LEFT JOIN cnas_fe_standard_substance ss on ss.id = ssr.substance_id
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -1,5 +1,6 @@
package com.ruoyi.inspect.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.InventoryDetailDTO;
@@ -287,4 +288,16 @@
        return insOrderService.judgeNotSpotCheckOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getInsOrder());
    }
    @Operation(summary = "查询已完成委托单(客户满意度下拉用, ä»…已检验state=4)")
    @GetMapping("/selectCompletedOrders")
    public Result selectCompletedOrders() {
        LambdaQueryWrapper<InsOrder> qw = new LambdaQueryWrapper<>();
        qw.select(InsOrder::getId, InsOrder::getEntrustCode, InsOrder::getCompany,
                        InsOrder::getCompanyId, InsOrder::getSampleView)
                .eq(InsOrder::getState, 4)
                .isNotNull(InsOrder::getCompany)
                .orderByDesc(InsOrder::getCreateTime);
        return Result.success(insOrderService.page(new Page<>(1, 500), qw).getRecords());
    }
}