zhangherong
2025-04-01 92bd9ed78ad1da026b81fcd8e88445b6834bba76
art: 设备管理-保养标准-点检导入功能
已添加1个文件
已修改8个文件
286 ■■■■■ 文件已修改
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/FileUtil.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamMaintenanceStandardController.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandard.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamMaintenanceStandardRequest.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBusinessCodeRuleServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-boot-base-core/src/main/java/org/jeecg/common/util/FileUtil.java
@@ -1,5 +1,7 @@
package org.jeecg.common.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.api.vo.FileUploadResult;
import org.jeecg.common.exception.ExceptionCast;
import org.springframework.beans.factory.annotation.Value;
@@ -9,10 +11,13 @@
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@Component
public class FileUtil {
@@ -60,6 +65,42 @@
        return dto;
    }
    public static FileUploadResult uploadFile(byte[] fileData, String fileName) {
        String suffix = getFileSuffix(fileName);
        Date currentDate = DateUtils.getDate();
        String monthStr = DateUtils.date2Str(currentDate, DateUtils.monthFormat.get());
        // ç›¸å¯¹è·¯å¾„
        String relativePath = "/" + monthStr + "/" + DateUtils.getDayStr(currentDate) + "/";
        // ç»å¯¹è·¯å¾„
        String absolutePath = fileUploadFolder + "/" + monthStr + "/" + DateUtils.getDayStr(currentDate) + "/";
        String fileNameNonSuffix = getFilenameNonSuffix(fileName);
        if (StringUtils.isBlank(fileNameNonSuffix)) {
            return null;
        }
        // èŽ·å–æ–‡ä»¶åŠ å¯†åç§° 1 ä¿è¯æ–‡ä»¶å”¯ä¸€ ä¸å­˜åœ¨è¦†ç›–问题 2 ç›®å½•下保存文件加密名称 åŽ»é™¤æ–‡ä»¶å…³é”®ä¿¡æ¯
        String encodeFileName = SHA256Util.getSHA256Str(fileNameNonSuffix + System.currentTimeMillis()) + "." + suffix;
        Long fileSize = (long) fileData.length;
        try {
            File targetFile = new File(absolutePath, encodeFileName);
            if(!targetFile.getParentFile().exists()) {
                //创建目录
                targetFile.getParentFile().mkdirs();
            }
            Files.write(Paths.get(absolutePath + encodeFileName), fileData);
            FileUploadResult dto = new FileUploadResult();
            dto.setFileName(fileNameNonSuffix);
            dto.setFileEncodeName(encodeFileName);
            dto.setFilePath(relativePath + encodeFileName);
            dto.setFileSize(fileSize);
            dto.setFileSuffix(suffix);
            return dto;
        } catch (IOException e) {
            log.error("文件写入失败: {}", e.getMessage(), e);
            return null;
        }
    }
    /**
     * @param filePath è·¯å¾„
     * @param fileName æ–‡ä»¶å
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/IEamEquipmentService.java
@@ -45,4 +45,11 @@
     * @return
     */
    List<EquipmentSearchResult> asyncLoadEquipment(String keyword, Integer pageSize, String id);
    /**
     * æŸ¥è¯¢è®¾å¤‡ä¿¡æ¯
     * @param equipmentCode
     * @return
     */
    EamEquipment selectByEquipmentCode(String equipmentCode);
}
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/service/impl/EamEquipmentServiceImpl.java
@@ -194,6 +194,7 @@
            queryWrapper.like("equipment_code", keyword);
            queryWrapper.or().like("equipment_name", keyword);
        }
        queryWrapper.eq("del_flag", CommonConstant.DEL_FLAG_0);
        IPage<EamEquipment> pageResult = eamEquipmentMapper.queryPageList(page, queryWrapper);
        if (pageResult != null && CollectionUtil.isNotEmpty(pageResult.getRecords())) {
            List<EquipmentSearchResult> resultList = new ArrayList<>();
@@ -205,6 +206,31 @@
        return Collections.emptyList();
    }
    @Override
    public EamEquipment selectByEquipmentCode(String equipmentCode) {
        if (StringUtils.isBlank(equipmentCode)) {
            return null;
        }
        QueryWrapper<EamEquipment> queryWrapper = new QueryWrapper<>();
        //用户数据权限
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        if (sysUser == null) {
            return null;
        }
        if (StringUtils.isNotBlank(sysUser.getEquipmentIds())) {
            //选择了设备,根据设备id过滤设备
            List<String> equipArr = Arrays.asList(sysUser.getEquipmentIds().split(","));
            queryWrapper.in("equipment_code", equipArr);
        } else {
            //没有选择设备,根据车间过滤设备
            queryWrapper.exists("select 1 from mdc_user_production t where t.user_id={0} and t.pro_id=org_id", sysUser.getId());
        }
        queryWrapper.eq("equipment_code", equipmentCode);
        queryWrapper.eq("del_flag", CommonConstant.DEL_FLAG_0);
        return eamEquipmentMapper.selectOne(queryWrapper);
    }
    /**
     * èŽ·å–æ‰€æœ‰çš„äº§çº¿id(包含所有上级)
     */
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamMaintenanceStandardController.java
@@ -7,22 +7,45 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jeecg.common.api.vo.FileUploadResult;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.FileUtil;
import org.jeecg.modules.eam.constant.BusinessCodeConst;
import org.jeecg.modules.eam.constant.MaintenanceCategoryEnum;
import org.jeecg.modules.eam.dto.MaintenanceStandardImport;
import org.jeecg.modules.eam.entity.EamEquipment;
import org.jeecg.modules.eam.entity.EamMaintenanceStandard;
import org.jeecg.modules.eam.entity.EamMaintenanceStandardDetail;
import org.jeecg.modules.eam.request.EamMaintenanceStandardRequest;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.eam.service.IEamMaintenanceStandardService;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.util.PoiPublicUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @Description: ä¿å…»æ ‡å‡†
@@ -39,6 +62,8 @@
    private IEamMaintenanceStandardService eamMaintenanceStandardService;
    @Autowired
    private ISysBusinessCodeRuleService businessCodeRuleService;
    @Autowired
    private IEamEquipmentService eamEquipmentService;
    /**
     * åˆ†é¡µåˆ—表查询
@@ -168,9 +193,133 @@
     * @param response
     * @return
     */
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
        return super.importExcel(request, response, EamMaintenanceStandard.class);
    @RequestMapping(value = "/inspectionImportExcel", method = RequestMethod.POST)
    public Result<?> inspectionImportExcel(HttpServletRequest request, HttpServletResponse response) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            // èŽ·å–ä¸Šä¼ æ–‡ä»¶å¯¹è±¡
            MultipartFile file = entity.getValue();
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setSheetNum(1);
            params.setNeedSave(true);
            EamMaintenanceStandardRequest standardRequest = new EamMaintenanceStandardRequest();
            try {
                //读取设备编号,图片等
                readExcel(file, standardRequest);
                EamEquipment equipment = eamEquipmentService.selectByEquipmentCode(standardRequest.getEquipmentCode());
                if(equipment == null) {
                    log.error("设备不存在:{}", standardRequest.getEquipmentCode());
                    continue;
                }
                standardRequest.setStandardName(standardRequest.getEquipmentName() + "点检标准");
                standardRequest.setMaintenanceCategory(MaintenanceCategoryEnum.POINT_INSPECTION.name());
                standardRequest.setEquipmentId(equipment.getId());
                //读取保养明细内容
                List<MaintenanceStandardImport> list = ExcelImportUtil.importExcel(file.getInputStream(), MaintenanceStandardImport.class, params);
                //明细项
                List<EamMaintenanceStandardDetail> tableList = list.stream().map(EamMaintenanceStandardDetail::new).collect(Collectors.toList());
                standardRequest.setTableDetailList(tableList);
                String codeSeq = businessCodeRuleService.generateBusinessCodeSeq(BusinessCodeConst.MAINTENANCE_STANDARD_CODE_RULE);
                standardRequest.setStandardCode(codeSeq);
                boolean b = eamMaintenanceStandardService.addMaintenanceStandard(standardRequest);
                if (!b) {
                    log.error("保存失败! {}", standardRequest.getEquipmentCode());
                }
            } catch (Exception e) {
                //update-begin-author:taoyan date:20211124 for: å¯¼å…¥æ•°æ®é‡å¤å¢žåŠ æç¤º
                String msg = e.getMessage();
                log.error("文件 {} å¤„理异常: {}", file.getOriginalFilename(), msg, e);
                //update-end-author:taoyan date:20211124 for: å¯¼å…¥æ•°æ®é‡å¤å¢žåŠ æç¤º
            } finally {
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    log.error(e.getMessage(), e);
                }
            }
        }
        return Result.ok("文件导入完成!");
    }
    /**
     * è¯»å–Excel ç¬¬ä¸€è¡Œï¼Œ ç¬¬äºŒè¡Œçš„信息,包括图片信息
     * @param file
     * @param request
     */
    private void readExcel(MultipartFile file, EamMaintenanceStandardRequest request) {
        Workbook book = null;
        boolean isXSSFWorkbook = false;
        try {
            book = WorkbookFactory.create(file.getInputStream());
            if (book instanceof XSSFWorkbook) {
                isXSSFWorkbook = true;
            }
            Sheet sheet = book.getSheetAt(0);
            //第一行读取
            Row row = sheet.getRow(0);
            //设备编码
            Cell equipmentCode = row.getCell(15);
            if(CellType.NUMERIC.equals(equipmentCode.getCellType())) {
                request.setEquipmentCode(String.valueOf((int) equipmentCode.getNumericCellValue()));
            }else if(CellType.STRING.equals(equipmentCode.getCellType())) {
                request.setEquipmentCode(equipmentCode.getStringCellValue());
            }
            if (StringUtils.isBlank(request.getEquipmentCode())) {
                throw new JeecgBootException("Excel【 " + file.getOriginalFilename() + "】没有读取到设备编号,导入失败!");
            }
            //初始日期
            Cell initialDate = row.getCell(11);
            if (DateUtil.isCellDateFormatted(initialDate)) {
                request.setInitialDate(initialDate.getDateCellValue());
            } else {
                request.setInitialDate(new Date());
            }
            //设备名称
            Cell equipmentName = row.getCell(13);
            request.setEquipmentName(equipmentName.getStringCellValue());
            //第二行读取
            row = sheet.getRow(1);
            //保养周期
            Cell period = row.getCell(11);
            if (CellType.NUMERIC.equals(period.getCellType())) {
                request.setMaintenancePeriod((int) period.getNumericCellValue());
            } else {
                //默认点检周期 1
                request.setMaintenancePeriod(1);
            }
            //文件编码
            Cell fileCode = row.getCell(13);
            request.setFileCode(fileCode.getStringCellValue());
            Map<String, PictureData> pictures;
            if (isXSSFWorkbook) {
                pictures = PoiPublicUtil.getSheetPictrues07((XSSFSheet) book.getSheetAt(0), (XSSFWorkbook) book);
            } else {
                pictures = PoiPublicUtil.getSheetPictrues03((HSSFSheet) book.getSheetAt(0), (HSSFWorkbook) book);
            }
            if (CollectionUtil.isNotEmpty(pictures)) {
                //只会存在一张图片
                PictureData pictureData = pictures.get(pictures.keySet().iterator().next());
                byte[] data = pictureData.getData();
                String fileName = request.getEquipmentCode() + "[" + request.getFileCode() + "]" + "." + pictureData.suggestFileExtension();
                FileUploadResult fileUploadResult = FileUtil.uploadFile(data, fileName);
                if(fileUploadResult != null) {
                    List<FileUploadResult> fileList = request.getFileList();
                    if(fileList == null) {
                        fileList = new ArrayList<FileUploadResult>();
                    }
                    fileList.add(fileUploadResult);
                    request.setFileList(fileList);
                }
            }
        } catch (Exception e) {
            log.error("读取Excel信息失败:{}", e.getMessage(), e);
        }
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/dto/MaintenanceStandardImport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.jeecg.modules.eam.dto;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.io.Serializable;
@Data
public class MaintenanceStandardImport implements Serializable {
    @Excel(name = "图号", width = 15)
    private Integer itemCode;
    @Excel(name = "点检项目", width = 15)
    private String itemName;
    @Excel(name = "点检部位", width = 15)
    private String itemPart;
    @Excel(name = "点检内容", width = 15)
    private String itemContent;
    @Excel(name = "点检要求", width = 15)
    private String itemDemand;
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandard.java
@@ -10,7 +10,6 @@
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
@@ -33,66 +32,53 @@
    @ApiModelProperty(value = "主键")
    private String id;
    /**创建人*/
    @Excel(name = "创建人", width = 15)
    @ApiModelProperty(value = "创建人")
    private String createBy;
    /**创建时间*/
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    /**更新人*/
    @Excel(name = "更新人", width = 15)
    @ApiModelProperty(value = "更新人")
    private String updateBy;
    /**更新时间*/
    @ApiModelProperty(value = "更新时间")
    private Date updateTime;
    /**删除标记*/
    @Excel(name = "删除标记", width = 15)
    @ApiModelProperty(value = "删除标记")
    private Integer delFlag;
    /**标准编码*/
    @Excel(name = "标准编码", width = 15)
    @ApiModelProperty(value = "标准编码")
    private String standardCode;
    /**标准名称*/
    @Excel(name = "标准名称", width = 15)
    @ApiModelProperty(value = "标准名称")
    private String standardName;
    /**保养周期;单位:天*/
    @Excel(name = "保养周期;单位:天", width = 15)
    @ApiModelProperty(value = "保养周期;单位:天")
    private Integer maintenancePeriod;
    /**初始日期 ä»Žå“ªä¸€å¤©å¼€å§‹è®¡ç®—下次保养日期*/
    @Excel(name = "初始日期", width = 15, format = "yyyy-MM-dd")
    @ApiModelProperty(value = "初始日期")
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date initialDate;
    /**保养分类*/
    @Excel(name = "保养分类", width = 15, dicCode = "maintenance_category")
    @ApiModelProperty(value = "保养分类")
    @Dict(dicCode = "maintenance_category")
    private String maintenanceCategory;
    /**设备编号*/
    @Excel(name = "设备编号", width = 15, dictTable = "eam_equipment", dicCode = "id", dicText = "equipment_code")
    @ApiModelProperty(value = "设备编号")
    @Dict(dicCode = "eam_equipment, equipment_code, id")
    private String equipmentId;
    /**标准状态*/
    @Excel(name = "标准状态", width = 15, dicCode = "maintenance_standard_status")
    @ApiModelProperty(value = "标准状态")
    @Dict(dicCode = "maintenance_standard_status")
    private String standardStatus;
    /**标准版本*/
    @Excel(name = "标准版本", width = 15)
    @ApiModelProperty(value = "标准版本")
    private Integer standardVersion;
    /**文件编号*/
    @Excel(name = "文件编号", width = 15)
    @ApiModelProperty(value = "文件编号")
    private String fileCode;
    /**参考文件*/
    @Excel(name = "参考文件", width = 15)
    @ApiModelProperty(value = "参考文件")
    private String referenceFile;
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/EamMaintenanceStandardDetail.java
@@ -8,6 +8,7 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.modules.eam.dto.MaintenanceStandardImport;
import java.io.Serializable;
import java.util.Date;
@@ -48,7 +49,7 @@
    private String standardId;
    /**保养项序号*/
    @ApiModelProperty(value = "保养项序号")
    private String itemCode;
    private Integer itemCode;
    /**保养项*/
    @ApiModelProperty(value = "保养项")
    private String itemName;
@@ -58,4 +59,13 @@
    /**保养要求*/
    @ApiModelProperty(value = "保养要求")
    private String itemDemand;
    public EamMaintenanceStandardDetail(){}
    public EamMaintenanceStandardDetail(MaintenanceStandardImport dto) {
        this.itemCode = dto.getItemCode();
        this.itemName = dto.getItemName() + " " + dto.getItemPart() + " " + dto.getItemContent();
        this.itemDemand = dto.getItemDemand();
    }
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamMaintenanceStandardRequest.java
@@ -65,6 +65,10 @@
    @ApiModelProperty(value = "删除 ä¿å…»é¡¹æ˜Žç»†")
    private List<EamMaintenanceStandardDetail> removeDetailList;
    /**
     * Excel导入时使用
     */
    private String equipmentName;
    private String equipmentCode;
}
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBusinessCodeRuleServiceImpl.java
@@ -38,7 +38,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String generateBusinessCodeSeq(String businessCode) {
    public synchronized String generateBusinessCodeSeq(String businessCode) {
        //查询生成规则
        LambdaQueryWrapper<SysBusinessCodeRule> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SysBusinessCodeRule::getBusinessCode, businessCode);