liding
2026-03-16 3322c20909d2cc762b9a7a4a4c8b2bb728ebebd9
Merge remote-tracking branch 'origin/dev_New_kthg' into dev_New_kthg
已添加1个文件
已修改20个文件
517 ■■■■ 文件已修改
doc/20260313_坤泰化工.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/FileNameType.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/RawMaterialCheckResult.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/RawMaterialCheckType.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/RawMaterialInspectState.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceRepair.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/QualityInspectItem.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/service/TempFileService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/RawMaterialController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/dto/RawMaterialDto.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/dto/RawMaterialQualityInspectItemDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/RawMaterial.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/RawMaterialQualityInspectItem.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/RawMaterialService.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/RawMaterialServiceImpl.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-kthg.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/RawMaterialMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260313_À¤Ì©»¯¹¤.sql
@@ -25,3 +25,5 @@
    update_time             datetime null comment '更新时间',
    unique idx_raw_material_id_quality_inspect_item_id (raw_material_id, quality_inspect_item_id)
);
alter table raw_material
    add quantity decimal(18, 2) null;
src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -14,7 +14,8 @@
    SHIP(9),//发货台账
    INSPECTION_PRODUCTION_BEFORE(10),
    INSPECTION_PRODUCTION_AFTER(11),
    INSPECTION(12);//巡检 ç”Ÿäº§å‰
    INSPECTION(12),//巡检 ç”Ÿäº§å‰
    DeviceRepair(13);// è®¾å¤‡ç»´ä¿®
    private final int value;
src/main/java/com/ruoyi/common/enums/RawMaterialCheckResult.java
@@ -26,10 +26,10 @@
     */
    public static RawMaterialCheckResult fromValue(Integer value) {
        for (RawMaterialCheckResult type : values()) {
            if (type.getValue().equals(value)) {
            if (type.getCode().equals(value)) {
                return type;
            }
        }
        throw new IllegalArgumentException("未知的 RawMaterialCheckResult å€¼: " + value);
        return null;
    }
}
src/main/java/com/ruoyi/common/enums/RawMaterialCheckType.java
@@ -27,10 +27,10 @@
     */
    public static RawMaterialCheckType fromValue(Integer value) {
        for (RawMaterialCheckType type : values()) {
            if (type.getValue().equals(value)) {
            if (type.getCode().equals(value)) {
                return type;
            }
        }
        throw new IllegalArgumentException("未知的 RawMaterialCheckType å€¼: " + value);
        return null;
    }
}
src/main/java/com/ruoyi/common/enums/RawMaterialInspectState.java
@@ -26,10 +26,10 @@
     */
    public static RawMaterialInspectState fromValue(Integer value) {
        for (RawMaterialInspectState type : values()) {
            if (type.getValue().equals(value)) {
            if (type.getCode().equals(value)) {
                return type;
            }
        }
        throw new IllegalArgumentException("未知的 RawMaterialInspectState å€¼: " + value);
        return null;
    }
}
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
@@ -3,11 +3,13 @@
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
public class DeviceRepairDto {
@@ -74,5 +76,7 @@
    private String sparePartsNames;
    private List<CommonFile> fileList;
}
src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -4,12 +4,14 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.other.pojo.TempFile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
@TableName("device_repair")
@@ -76,5 +78,6 @@
    @ApiModelProperty("领用备件ids")
    private String sparePartsIds;
    @ApiModelProperty("文件列表")
    private List<TempFile> fileList;
}
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -1,11 +1,12 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.xiaoymin.knife4j.core.util.StrUtil;
import com.google.common.collect.Lists;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
@@ -20,14 +21,15 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
import com.ruoyi.other.pojo.TempFile;
import com.ruoyi.other.service.TempFileService;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@@ -46,12 +48,20 @@
    private IDeviceLedgerService deviceLedgerService;
    @Autowired
    private SparePartsMapper sparePartsMapper;
    @Autowired
    private TempFileService tempFileService;
    @Autowired
    private CommonFileMapper commonFileMapper;
    @Override
    public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) {
        IPage<DeviceRepairDto> deviceRepairDtoIPage = deviceRepairMapper.queryPage(page, deviceRepairDto);
        List<DeviceRepairDto> records = deviceRepairDtoIPage.getRecords();
        List<Long> recordIds = records.stream()
                .map(DeviceRepairDto::getId)
                .collect(Collectors.toList());
        if (!CollectionUtils.isEmpty(records)) {
            // 1. èŽ·å–æ‰€æœ‰å”¯ä¸€çš„å¤‡ä»¶ID
            Set<String> allIds = records.stream()
@@ -86,6 +96,12 @@
                    record.setSparePartsNames(names);
                });
            }
            // å¤„理文件
            List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().in(CommonFile::getCommonId, recordIds)
                    .eq(CommonFile::getType, FileNameType.DeviceRepair.getValue()));
            Map<Long, List<CommonFile>> collect = commonFiles.stream()
                    .collect(Collectors.groupingBy(CommonFile::getCommonId));
            records.forEach(record -> record.setFileList(collect.get(record.getId())));
        }
        return deviceRepairDtoIPage;
@@ -94,6 +110,17 @@
    @Override
    public AjaxResult saveDeviceRepair(DeviceRepair deviceRepair) {
        DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId());
        if (CollectionUtils.isNotEmpty(deviceRepair.getFileList())) {
            List<String> fileIds = deviceRepair.getFileList().stream()
                    .map(TempFile::getTempId)
                    .collect(Collectors.toList());
            try {
                tempFileService.migrateTempFilesToFormal(deviceRepair.getId(), fileIds, FileNameType.DeviceRepair.getValue());
            } catch (Exception e) {
                log.error("设备维修文件迁移错误", e);
            }
        }
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        boolean save = this.save(deviceRepair);
@@ -106,6 +133,16 @@
    @Override
    public AjaxResult updateDeviceRepair(DeviceRepair deviceRepair) {
        if (this.updateById(deviceRepair)) {
            if (CollectionUtils.isNotEmpty(deviceRepair.getFileList())) {
                List<String> fileIds = deviceRepair.getFileList().stream()
                        .map(TempFile::getTempId)
                        .collect(Collectors.toList());
                try {
                    tempFileService.migrateTempFilesToFormal(deviceRepair.getId(), fileIds, FileNameType.DeviceRepair.getValue());
                } catch (Exception e) {
                    log.error("设备维修文件迁移错误", e);
                }
            }
            Long id = deviceRepair.getId();
            //
            DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto();
src/main/java/com/ruoyi/inspectiontask/pojo/QualityInspectItem.java
@@ -1,10 +1,12 @@
package com.ruoyi.inspectiontask.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
/**
 * è´¨é‡æ£€æµ‹é¡¹
@@ -59,12 +61,16 @@
     * 
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * 
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
src/main/java/com/ruoyi/other/service/TempFileService.java
@@ -4,9 +4,12 @@
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
public interface TempFileService {
    TempFile uploadFile(MultipartFile file,Integer type) throws IOException;
    String uploadByCommon(MultipartFile file, Integer type, Long id) throws IOException;
    void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds, Integer fileType) throws IOException;
}
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -9,16 +9,13 @@
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.util.URLEncoder;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -98,6 +95,7 @@
     * @param fileType     æ–‡ä»¶ç±»åž‹(来自FileNameType)
     * @throws IOException æ–‡ä»¶æ“ä½œå¼‚常
     */
    @Override
    public void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds, Integer fileType) throws IOException {
        if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(tempFileIds)) {
            return;
src/main/java/com/ruoyi/quality/controller/RawMaterialController.java
@@ -1,12 +1,17 @@
package com.ruoyi.quality.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.enums.RawMaterialInspectState;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.quality.dto.RawMaterialDto;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.RawMaterial;
import com.ruoyi.quality.service.RawMaterialService;
import com.ruoyi.staff.pojo.StaffOnJob;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -31,6 +36,13 @@
        return AjaxResult.success(rawMaterialService.listPage(page, rawMaterialDto));
    }
    /**
     * åŽŸæ–™è¯¦æƒ…
     */
    @GetMapping("/detail/{id}")
    public AjaxResult detail(@PathVariable Long id) {
        return AjaxResult.success(rawMaterialService.detail(id));
    }
    /**
     * åŽŸæ–™æ–°å¢ž
@@ -41,11 +53,37 @@
    }
    /**
     * æ£€æµ‹æäº¤
     * @param id åŽŸæ–™id
     * @return
     */
    @PatchMapping("/submit/{id}")
    public AjaxResult submit(@PathVariable Long id) {
        RawMaterial rawMaterial = new RawMaterial();
        rawMaterial.setId(id);
        rawMaterial.setInspectState(RawMaterialInspectState.RawMaterialInspectStateSubmitted.getCode());
        return AjaxResult.success(rawMaterialService.updateById(rawMaterial));
    }
    /**
     * ä¿®æ”¹æ£€éªŒäºº
     * @param rawMaterialDto åŽŸæ–™
     * @return
     */
    @PatchMapping("/updateCheckUserName")
    public AjaxResult updateCheckUserName(@RequestBody RawMaterialDto rawMaterialDto) {
        RawMaterial rawMaterial = new RawMaterial();
        rawMaterial.setId(rawMaterialDto.getId());
        rawMaterial.setCheckUserName(rawMaterialDto.getCheckUserName());
        return AjaxResult.success(rawMaterialService.updateById(rawMaterial));
    }
    /**
     * åŽŸæ–™æ›´æ–°
     */
    @PutMapping("")
    public AjaxResult update(@RequestBody RawMaterialDto rawMaterialDto) {
        return AjaxResult.success(rawMaterialService.updateById(rawMaterialDto));
        return AjaxResult.success(rawMaterialService.update(rawMaterialDto));
    }
    /**
@@ -55,4 +93,17 @@
    public AjaxResult delete(@RequestBody List<Integer> ids) {
        return AjaxResult.success(rawMaterialService.removeByIds(ids));
    }
    /**
     * å¯¼å‡ºåŽŸæ–™æ•°æ®
     */
    @PostMapping("/export")
    public void export(HttpServletResponse response, RawMaterialDto rawMaterialDto) {
        rawMaterialService.export(response, rawMaterialDto);
    }
    @PostMapping("/down")
    public void down(HttpServletResponse response,@RequestBody RawMaterialDto rawMaterialDto) {
        rawMaterialService.down(response, rawMaterialDto);
    }
}
src/main/java/com/ruoyi/quality/dto/RawMaterialDto.java
@@ -1,16 +1,13 @@
package com.ruoyi.quality.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.inspectiontask.pojo.QualityInspectItem;
import com.ruoyi.quality.pojo.RawMaterial;
import com.ruoyi.quality.pojo.RawMaterialQualityInspectItem;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
/**
@@ -24,18 +21,14 @@
    /**
     * å¼€å§‹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty("表单搜索时间范围:开始时间")
    private LocalDate entryDateStart;
    private String entryDateStart;
    /**
     * ç»“束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty("表单搜索时间范围:结束时间")
    private LocalDate entryDateEnd;
    private String entryDateEnd;
    @ApiModelProperty("检验类型 0入场检 1车间检 2出厂检")
    private String checkTypeText;
@@ -46,6 +39,20 @@
     @ApiModelProperty("类别(0:未提交;1:已提交)")
    private String inspectStateText;
     @ApiModelProperty("原料检测项列表ids")
     private List<Long> qualityInspectItemIds;
    @ApiModelProperty("原料检测项列表")
    private List<QualityInspectItem> qualityInspectItem;
    @ApiModelProperty("产品名称")
    @Excel(name = "产品名称")
    private String productName;
    @ApiModelProperty("规格型号")
    @Excel(name = "规格型号")
    private String model;
    @ApiModelProperty("产品id")
    private Long productId;
    @ApiModelProperty("单位")
    private String unit;
}
src/main/java/com/ruoyi/quality/dto/RawMaterialQualityInspectItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.quality.dto;
import com.ruoyi.quality.pojo.RawMaterialQualityInspectItem;
import lombok.Data;
@Data
public class RawMaterialQualityInspectItemDto extends RawMaterialQualityInspectItem {
    /**
     * é¡¹ç›®åç§°
     */
    private String name;
    /**
     * å•位
     */
    private String unit;
    /**
     * æ ‡å‡†å€¼
     */
    private String standardValue;
    /**
     * å†…控值
     */
    private String internalControl;
}
src/main/java/com/ruoyi/quality/pojo/RawMaterial.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -35,19 +36,28 @@
    @ApiModelProperty("产品型号id")
    private Long productModelId;
    @ApiModelProperty("批次号")
    private String batchNo;
    @ApiModelProperty("检验类型 0入场检 1车间检 2出厂检")
    @ApiModelProperty("检验类型 0入厂检 1车间检 2出厂检")
    @Excel(name = "检验类型", readConverterExp = "0=入厂检,1=车间检,2=出厂检")
    private Integer checkType;
    @ApiModelProperty("批次号")
    @Excel(name = "批次号")
    private String batchNo;
    @ApiModelProperty("数量")
    @Excel(name = "数量")
    private BigDecimal quantity;
    @ApiModelProperty("检验结果 0合格 1不合格")
    @Excel(name = "检验结果", readConverterExp = "0=合格,1=不合格")
    private Integer checkResult;
    @ApiModelProperty("类别(0:未提交;1:已提交)")
    @Excel(name = "提交状态", readConverterExp = "0=未提交,1=已提交")
    private Integer inspectState;
    @ApiModelProperty("检验员名称")
    @Excel(name = "检验员")
    private String checkUserName;
    @ApiModelProperty("检验日期")
src/main/java/com/ruoyi/quality/pojo/RawMaterialQualityInspectItem.java
@@ -1,16 +1,13 @@
package com.ruoyi.quality.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
@@ -37,6 +34,9 @@
    @ApiModelProperty("质量检验项id")
    private Long qualityInspectItemId;
    @ApiModelProperty("化验值")
    private String testValue;
    @ApiModelProperty("录入时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
@@ -44,4 +44,7 @@
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(select = false, exist = false)
    private Integer index;
}
src/main/java/com/ruoyi/quality/service/RawMaterialService.java
@@ -2,10 +2,11 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.quality.dto.RawMaterialDto;
import com.ruoyi.quality.pojo.QualityInspectFile;
import com.ruoyi.quality.pojo.RawMaterial;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.quality.dto.RawMaterialDto;
import com.ruoyi.quality.pojo.RawMaterial;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
@@ -18,5 +19,13 @@
public interface RawMaterialService extends IService<RawMaterial> {
    IPage<RawMaterialDto> listPage(Page page, RawMaterialDto rawMaterialDto);
    RawMaterialDto detail(Long id);
    boolean add(RawMaterialDto rawMaterialDto);
    boolean update(RawMaterialDto rawMaterialDto);
    void export(HttpServletResponse response, RawMaterialDto rawMaterialDto);
    void down(HttpServletResponse response, RawMaterialDto rawMaterialDto);
}
src/main/java/com/ruoyi/quality/service/impl/RawMaterialServiceImpl.java
@@ -1,25 +1,42 @@
package com.ruoyi.quality.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.dto.DutyPlanDTO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.RawMaterialCheckResult;
import com.ruoyi.common.enums.RawMaterialCheckType;
import com.ruoyi.common.enums.RawMaterialInspectState;
import com.ruoyi.production.mapper.ProductProcessRouteMapper;
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.inspectiontask.mapper.QualityInspectItemMapper;
import com.ruoyi.inspectiontask.pojo.QualityInspectItem;
import com.ruoyi.quality.dto.RawMaterialDto;
import com.ruoyi.quality.mapper.RawMaterialQualityInspectItemMapper;
import com.ruoyi.quality.pojo.RawMaterial;
import com.ruoyi.quality.dto.RawMaterialQualityInspectItemDto;
import com.ruoyi.quality.mapper.RawMaterialMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.RawMaterial;
import com.ruoyi.quality.pojo.RawMaterialQualityInspectItem;
import com.ruoyi.quality.service.RawMaterialQualityInspectItemService;
import com.ruoyi.quality.service.RawMaterialService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
@@ -38,33 +55,236 @@
    private RawMaterialQualityInspectItemService rawMaterialQualityInspectItemService;
    private QualityInspectItemMapper qualityInspectItemMapper;
    private ProductModelMapper productModelMapper;
    private ProductMapper productMapper;
    @Override
    public IPage<RawMaterialDto> listPage(Page page, RawMaterialDto rawMaterialDto) {
        IPage<RawMaterialDto> rawMaterials = rawMaterialMapper.listPage(page, rawMaterialDto);
        for (RawMaterialDto rawMaterial : rawMaterials.getRecords()) {
            rawMaterial.setCheckTypeText(RawMaterialCheckType.fromValue(rawMaterial.getCheckType()).getValue());
            rawMaterial.setCheckResultText(RawMaterialCheckResult.fromValue(rawMaterial.getCheckResult()).getValue());
            rawMaterial.setInspectStateText(RawMaterialInspectState.fromValue(rawMaterial.getInspectState()).getValue());
        IPage<RawMaterialDto> pageRes = rawMaterialMapper.listPage(page, rawMaterialDto);
        List<RawMaterialDto> rawMaterials = pageRes.getRecords();
        Map<Long, ProductModel> productModelMap = new HashMap<>();
        Map<Long, Product> productMap = new HashMap<>();
        if (CollectionUtils.isNotEmpty(rawMaterials)) {
            List<Long> productModelIds = rawMaterials.stream().map(RawMaterialDto::getProductModelId).collect(Collectors.toList());
            List<ProductModel> productModels = productModelMapper.selectList(new LambdaQueryWrapper<ProductModel>()
                    .in(ProductModel::getId, productModelIds));
            productModelMap = productModels.stream().collect(Collectors.toMap(ProductModel::getId, productModel -> productModel));
            List<Long> productIds = productModels.stream().map(ProductModel::getProductId).collect(Collectors.toList());
            List<Product> products = productMapper.selectList(new LambdaQueryWrapper<Product>()
                    .in(Product::getId, productIds));
            productMap = products.stream().collect(Collectors.toMap(Product::getId, product -> product));
        }
        return rawMaterials;
        for (RawMaterialDto rawMaterial : pageRes.getRecords()) {
            rawMaterial.setCheckTypeText(RawMaterialCheckType.fromValue(rawMaterial.getCheckType()) == null ? "" : RawMaterialCheckType.fromValue(rawMaterial.getCheckType()).getValue());
            rawMaterial.setCheckResultText(RawMaterialCheckResult.fromValue(rawMaterial.getCheckResult()) == null ? "" : RawMaterialCheckResult.fromValue(rawMaterial.getCheckResult()).getValue());
            rawMaterial.setInspectStateText(RawMaterialInspectState.fromValue(rawMaterial.getInspectState()) == null ? "" : RawMaterialInspectState.fromValue(rawMaterial.getInspectState()).getValue());
            rawMaterial.setProductName(productMap.get(productModelMap.get(rawMaterial.getProductModelId()).getProductId()).getProductName());
            rawMaterial.setModel(productModelMap.get(rawMaterial.getProductModelId()).getModel());
            rawMaterial.setProductId(productModelMap.get(rawMaterial.getProductModelId()).getProductId());
        }
        return pageRes;
    }
    @Override
    public RawMaterialDto detail(Long id) {
        RawMaterial rawMaterial = rawMaterialMapper.selectById(id);
        RawMaterialDto rawMaterialDto = new RawMaterialDto();
        BeanUtils.copyBeanProp(rawMaterialDto, rawMaterial);
        // èŽ·å–æ£€æµ‹é¡¹å…³è”å…³ç³»
        List<RawMaterialQualityInspectItem> rawQualityList = rawMaterialQualityInspectItemService.list(new LambdaQueryWrapper<RawMaterialQualityInspectItem>()
                .eq(RawMaterialQualityInspectItem::getRawMaterialId, id));
        Map<Long, RawMaterialQualityInspectItem> map = rawQualityList.stream().collect(Collectors.toMap(RawMaterialQualityInspectItem::getQualityInspectItemId, qualityInspectItem -> qualityInspectItem));
        // èŽ·å–æ£€éªŒé¡¹ç›®
        List<QualityInspectItem> qualityInspectItems = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(rawQualityList)) {
            List<Long> qualityInspectItemIds = rawQualityList.stream().map(RawMaterialQualityInspectItem::getQualityInspectItemId).collect(Collectors.toList());
            qualityInspectItems = qualityInspectItemMapper.selectList(new LambdaQueryWrapper<QualityInspectItem>()
                    .in(QualityInspectItem::getId, qualityInspectItemIds));
        }
        // æ›¿æ¢åŒ–验值
        qualityInspectItems.forEach(qualityInspectItem -> {
            qualityInspectItem.setTestValue(map.get(qualityInspectItem.getId()).getTestValue());
        });
        rawMaterialDto.setQualityInspectItem(qualityInspectItems);
        // æŸ¥è¯¢äº§å“id
        ProductModel productModel = productModelMapper.selectById(rawMaterialDto.getProductModelId());
        rawMaterialDto.setProductId(productModel.getProductId());
        rawMaterialDto.setUnit(productModel.getUnit());
        return rawMaterialDto;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean add(RawMaterialDto rawMaterialDto) {
        rawMaterialDto.setInspectState(RawMaterialInspectState.RawMaterialInspectStateUnsubmitted.getCode());
        // æ–°å¢žåŽŸæ–™
        int i = rawMaterialMapper.insert(rawMaterialDto);
        // æ–°å¢žæ£€æµ‹é¡¹å…³è”关系
        if (rawMaterialDto.getQualityInspectItemIds() != null && !rawMaterialDto.getQualityInspectItemIds().isEmpty()) {
            List<RawMaterialQualityInspectItem> rawMaterialQualityInspectItems = rawMaterialDto.getQualityInspectItemIds().stream()
                    .map(id -> {
        if (CollectionUtils.isNotEmpty(rawMaterialDto.getQualityInspectItem())) {
            List<RawMaterialQualityInspectItem> rawMaterialQualityInspectItems = rawMaterialDto.getQualityInspectItem().stream()
                    .map(qualityInspectItem -> {
                        RawMaterialQualityInspectItem item = new RawMaterialQualityInspectItem();
                        item.setRawMaterialId(rawMaterialDto.getId());
                        item.setQualityInspectItemId(id);
                        item.setQualityInspectItemId(qualityInspectItem.getId());
                        item.setTestValue(qualityInspectItem.getTestValue());
                        return item;
                    })
                    .collect(Collectors.toList());
            rawMaterialQualityInspectItemService.saveBatch(rawMaterialQualityInspectItems);
        }
        // æ–°å¢žåŽŸæ–™
        return rawMaterialMapper.insert(rawMaterialDto) > 0;
        return i > 0;
    }
}
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean update(RawMaterialDto rawMaterialDto) {
        // æ›´æ–°åŽŸæ–™
        if (rawMaterialMapper.updateById(rawMaterialDto) <= 0) {
            return false;
        }
        Long rawMaterialId = rawMaterialDto.getId();
        List<QualityInspectItem> newQualityInspectItems = rawMaterialDto.getQualityInspectItem();
        // èŽ·å–çŽ°æœ‰æ£€éªŒé¡¹å…³è”è®°å½•
        List<RawMaterialQualityInspectItem> existingItems = rawMaterialQualityInspectItemService.list(
                new LambdaQueryWrapper<RawMaterialQualityInspectItem>()
                        .eq(RawMaterialQualityInspectItem::getRawMaterialId, rawMaterialId)
        );
        // åˆ é™¤ä¸å­˜åœ¨çš„关联记录
        if (CollectionUtils.isEmpty(newQualityInspectItems)) {
            // å¦‚果没有检验项,删除所有现有关联记录
            if (CollectionUtils.isNotEmpty(existingItems)) {
                List<Long> existingIds = existingItems.stream()
                        .map(RawMaterialQualityInspectItem::getId)
                        .collect(Collectors.toList());
                rawMaterialQualityInspectItemService.removeByIds(existingIds);
            }
            return true;
        }
        // èŽ·å–æ–°æ£€éªŒé¡¹çš„ID集合和测试值映射
        Set<Long> newItemIds = newQualityInspectItems.stream()
                .map(QualityInspectItem::getId)
                .collect(Collectors.toSet());
        Map<Long, String> testValueMap = newQualityInspectItems.stream()
                .collect(Collectors.toMap(QualityInspectItem::getId, QualityInspectItem::getTestValue));
        // åˆ é™¤ä¸å­˜åœ¨çš„关联记录
        List<Long> toDelete = existingItems.stream()
                .filter(item -> !newItemIds.contains(item.getQualityInspectItemId()))
                .map(RawMaterialQualityInspectItem::getId)
                .collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(toDelete)) {
            rawMaterialQualityInspectItemService.removeByIds(toDelete);
        }
        // å¤„理更新数据
        List<RawMaterialQualityInspectItem> toUpdate = existingItems.stream()
                .filter(item -> newItemIds.contains(item.getQualityInspectItemId()))
                .peek(item -> item.setTestValue(testValueMap.get(item.getQualityInspectItemId())))
                .collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(toUpdate)) {
            rawMaterialQualityInspectItemService.updateBatchById(toUpdate);
        }
        // å¤„理新增数据
        Set<Long> existingItemIds = existingItems.stream()
                .map(RawMaterialQualityInspectItem::getQualityInspectItemId)
                .collect(Collectors.toSet());
        List<RawMaterialQualityInspectItem> toCreate = newQualityInspectItems.stream()
                .filter(item -> !existingItemIds.contains(item.getId()))
                .map(item -> {
                    RawMaterialQualityInspectItem newItem = new RawMaterialQualityInspectItem();
                    newItem.setRawMaterialId(rawMaterialId);
                    newItem.setQualityInspectItemId(item.getId());
                    newItem.setTestValue(item.getTestValue());
                    return newItem;
                })
                .collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(toCreate)) {
            rawMaterialQualityInspectItemService.saveBatch(toCreate);
        }
        return true;
    }
    @Override
    public void export(HttpServletResponse response, RawMaterialDto rawMaterialDto) {
        List<RawMaterialDto> rawMaterials = rawMaterialMapper.listPage(new Page<>(1, Integer.MAX_VALUE), rawMaterialDto).getRecords();
        ExcelUtil<RawMaterialDto> util = new ExcelUtil<RawMaterialDto>(RawMaterialDto.class);
        util.exportExcel(response, rawMaterials, "原料检验导出");
    }
    @Override
    public void down(HttpServletResponse response, RawMaterialDto rawMaterialDto) {
        RawMaterial rawMaterial = rawMaterialMapper.selectById(rawMaterialDto.getId());
        // èŽ·å–äº§å“åž‹å·ä¿¡æ¯
        ProductModel productModel = productModelMapper.selectById(rawMaterial.getProductModelId());
        Product product = productMapper.selectById(productModel.getProductId());
        RawMaterialDto inspect = new RawMaterialDto();
        BeanUtils.copyProperties(rawMaterial, inspect);
        inspect.setModel(productModel.getModel());
        inspect.setProductName(product.getProductName());
        inspect.setCheckTypeText(RawMaterialCheckType.fromValue(rawMaterial.getCheckType()) == null ? "" : RawMaterialCheckType.fromValue(rawMaterial.getCheckType()).getValue());
        inspect.setCheckResultText(RawMaterialCheckResult.fromValue(rawMaterial.getCheckResult()) == null ? "" : RawMaterialCheckResult.fromValue(rawMaterial.getCheckResult()).getValue());
        List<RawMaterialQualityInspectItem> paramList = rawMaterialQualityInspectItemService.list(
                new LambdaQueryWrapper<RawMaterialQualityInspectItem>()
                        .eq(RawMaterialQualityInspectItem::getRawMaterialId, rawMaterialDto.getId())
        );
        List<RawMaterialQualityInspectItemDto> inspectItems = new ArrayList<>();
        int index = 1;
        for (RawMaterialQualityInspectItem item : paramList) {
            RawMaterialQualityInspectItemDto dto = new RawMaterialQualityInspectItemDto();
            BeanUtils.copyProperties(item, dto);
            QualityInspectItem qualityInspectItem = qualityInspectItemMapper.selectById(item.getQualityInspectItemId());
            dto.setName(qualityInspectItem.getName());
            dto.setUnit(qualityInspectItem.getUnit());
            dto.setStandardValue(qualityInspectItem.getStandardValue());
            dto.setInternalControl(qualityInspectItem.getInternalControl());
            dto.setIndex(index);
            inspectItems.add(dto);
            index++;
        }
        InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx");
        Configure configure = Configure.builder()
                .bind("paramList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("inspect", inspect);
                    put("paramList", inspectItems);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "检验报告", "UTF-8");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            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("导出失败");
        }
    }
}
src/main/resources/application-kthg.yml
@@ -75,7 +75,7 @@
      # ä¸»åº“数据源
      master:
        #        url: jdbc:mysql://localhost:3306/product-inventory-management-new?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://1.15.17.182:9999/product-inventory-management-kthg?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-kthg?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: xd@123456..
      # ä»Žåº“数据源
@@ -256,4 +256,4 @@
#  temp-dir: D:/ruoyi/temp/uploads   # ä¸´æ—¶ç›®å½•
#  upload-dir: D:/ruoyi/prod/uploads # æ­£å¼ç›®å½•
  temp-dir: /javaWork/product-inventory-management/file/temp/uploads
  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
  upload-dir: /javaWork/product-inventory-management/file/prod/uploads
src/main/resources/mapper/quality/RawMaterialMapper.xml
@@ -28,10 +28,10 @@
            AND rm.check_type = #{params.checkType}
        </if>
        <if test="params.entryDateStart != null and params.entryDateStart != '' ">
            AND rm.check_time &gt;= DATE_FORMAT(#{params.entryDateStart},'%Y-%m-%d')
            AND rm.check_time &gt;= #{params.entryDateStart}
        </if>
        <if test="params.entryDateEnd != null and params.entryDateEnd != '' ">
            AND rm.check_time &lt;= DATE_FORMAT(#{params.entryDateEnd},'%Y-%m-%d')
            AND rm.check_time &lt;= #{params.entryDateEnd}
        </if>
        ORDER BY rm.check_time DESC
    </select>
src/main/resources/static/report-template.docx
Binary files differ