chenrui
2025-02-27 146edfb05602373ad5b36771e1ede1e395d8ab62
Merge branch 'dev' of http://114.132.189.42:9002/r/lims-ruoyi-after into dev_cr
已修改29个文件
已添加1个文件
495 ■■■■ 文件已修改
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTemplateController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTemplateServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessComplainController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessDealController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessEvaluateController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotalSampleController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotaldealController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderStandardTemplate.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java 186 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/banner.txt 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/GZipUtil.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
basic-server/src/main/java/com/ruoyi/basic/controller/StandardTemplateController.java
@@ -56,8 +56,7 @@
    @ApiOperation(value = "编辑模板编制")
    @GetMapping("/getEditTemplatePreparation")
    public Result<?> getEditTemplatePreparation(@RequestParam("id") Integer id) {
        StandardTemplate byId = standardTemplateService.getById(id);
        return Result.success(byId.getThing());
        return Result.success(standardTemplateService.getStandTempThingById(id));
    }
    @ApiOperation(value = "复制原始记录模板")
basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTemplateServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.GZipUtil;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.basic.mapper.StandardTemplateMapper;
import com.ruoyi.basic.pojo.StandardTemplate;
@@ -45,12 +46,19 @@
                    StandardTemplate::getNumber);
            standardTemplate.setNumber(giveCode);
        }
        if (StringUtils.isNotBlank(standardTemplate.getThing())) {
            standardTemplate.setThing(GZipUtil.compress(standardTemplate.getThing()));
        } else {
            standardTemplate.setThing(null);
        }
        return standardTemplateMapper.insert(standardTemplate);
    }
    @Override
    public int upStandardTemplate(StandardTemplate standardTemplate) {
        if(standardTemplate.getThing().equals("")){
        if (StringUtils.isNotBlank(standardTemplate.getThing())) {
            standardTemplate.setThing(GZipUtil.compress(standardTemplate.getThing()));
        } else {
            standardTemplate.setThing(null);
        }
        return standardTemplateMapper.updateById(standardTemplate);
@@ -74,19 +82,8 @@
        if(standardTemplate==null){
            return null;
        }else{
            return standardTemplate.getThing();
            return GZipUtil.uncompress(standardTemplate.getThing());
        }
        // æŸ¥è¯¢åŽ‹ç¼©åŽçš„æ•°æ®
//        String thing = standardTemplateMapper.selectCompressThing(templateId);
//        if (StringUtils.isNotBlank(thing)) {
//            try {
//                return DecompressMySQLData.decompress(java.util.Base64.getDecoder().decode(thing));
//            } catch (Exception e) {
//                throw new RuntimeException(e);
//            }
//        } else {
//            return null;
//        }
    }
    @Override
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessComplainController.java
@@ -48,7 +48,7 @@
    }
    @ApiOperation(value = "投诉详情")
    @PostMapping("/getProcessComplain")
    @GetMapping("/getProcessComplain")
    public Result getProcessComplain(Long id) {
        return Result.success(processComplainService.getProcessComplain(id));
    }
@@ -60,9 +60,8 @@
    }
    @ApiOperation(value = "导出列表")
    @PostMapping("/exportProcessComplain")
    public void exportProcessComplain(@RequestBody Map<String, Object> data,HttpServletResponse response) throws Exception {
        ProcessComplain processComplain = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), ProcessComplain.class);
    @GetMapping("/exportProcessComplain")
    public void exportProcessComplain(ProcessComplain processComplain,HttpServletResponse response) throws Exception {
        processComplainService.exportProcessComplain(processComplain,response);
    }
}
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessDealController.java
@@ -29,7 +29,7 @@
    private ProcessDealService processDealService;
    @ApiOperation(value = "查询检测或校准物品的处置详情")
    @PostMapping("/pageProcessDeal")
    @GetMapping("/pageProcessDeal")
    public Result pageProcessDeal(ProcessDeal processDeal, Page page) throws Exception {
        return Result.success(processDealService.pageProcessDeal(page, processDeal));
    }
@@ -53,7 +53,7 @@
    }
    @ApiOperation(value = "查看检测或校准物品的处置")
    @PostMapping("/getProcessDeal")
    @GetMapping("/getProcessDeal")
    public Result getProcessDeal(Integer id) {
        return Result.success(processDealService.getById(id));
    }
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessEvaluateController.java
@@ -30,7 +30,7 @@
    private ProcessEvaluateService processEvaluateService;
    @ApiOperation(value = "查询测量不确定度的评定列表")
    @PostMapping("/pageProcessEvaluate")
    @GetMapping("/pageProcessEvaluate")
    public Result pageProcessEvaluate(ProcessEvaluate processEvaluate,Page page) throws Exception {
        return Result.success(processEvaluateService.pageProcessEvaluate(page, processEvaluate));
    }
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java
@@ -78,7 +78,7 @@
     * @return
     */
    @ApiOperation(value = "导入标准查新")
    @GetMapping("/importMethodSearchNew")
    @PostMapping("/importMethodSearchNew")
    public Result importMethodSearchNew(MultipartFile file){
        return Result.success(processMethodSearchNewService.importMethodSearchNew(file));
    }
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java
@@ -47,7 +47,7 @@
     * @return
     */
    @ApiOperation(value = "标准方法更新验证列表")
    @PostMapping("/pagesMethodVerify")
    @GetMapping("/pagesMethodVerify")
    public Result<IPage<ProcessMethodVerify>> pagesMethodVerify(ProcessMethodVerifyDto methodVerifyDto,Page page) throws Exception {
        return Result.success(processMethodVerifyService.pagesMethodVerify(page, methodVerifyDto));
    }
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java
@@ -7,10 +7,7 @@
import com.ruoyi.process.service.ProcessReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
@@ -32,7 +29,7 @@
    private ProcessReportService processReportService;
    @ApiOperation(value = "查询检验报告发放登记列表")
    @PostMapping("/pageProcessReport")
    @GetMapping("/pageProcessReport")
    public Result pageProcessReport(ProcessReport processReport , Page page) throws Exception {
        return Result.success(processReportService.pageProcessReport(page, processReport));
    }
@@ -44,13 +41,13 @@
    }
    @ApiOperation(value = "删除检验报告发放登记")
    @PostMapping("/delProcessReport")
    @DeleteMapping("/delProcessReport")
    public Result delProcessReport(Long id) {
        return Result.success(processReportService.removeById(id));
    }
    @ApiOperation(value = "查看检验报告发放登记详情")
    @PostMapping("/getProcessReport")
    @GetMapping("/getProcessReport")
    public Result getProcessReport(Long id)  {
        return Result.success(processReportService.getById(id));
    }
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotalSampleController.java
@@ -35,19 +35,24 @@
    @ApiOperation(value = "提交样品接收")
    @PostMapping("/submitProcessTotalSample")
    public Result submitProcessTotalSample(Integer id) {
    public Result submitProcessTotalSample(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        return Result.success(processTotalSampleService.submitProcessTotalSample(id));
    }
    @ApiOperation(value = "审核样品接收")
    @PostMapping("/checkProcessTotalSample")
    public Result checkProcessTotalSample(Integer id, String state) {
    public Result checkProcessTotalSample(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        String state = (String) param.get("state");
        return Result.success(processTotalSampleService.checkProcessTotalSample(id, state));
    }
    @ApiOperation(value = "批准样品接收")
    @PostMapping("/ratifyProcessTotalSample")
    public Result ratifyProcessTotalSample(Integer id,String state) {
    public Result ratifyProcessTotalSample(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        String state = (String) param.get("state");
        return Result.success(processTotalSampleService.ratifyProcessTotalSample(id,state));
    }
cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotaldealController.java
@@ -35,19 +35,24 @@
    @ApiOperation(value = "提交检测或校准物品的处置")
    @PostMapping("/submitProcessTotaldeal")
    public Result submitProcessTotaldeal(Integer id) {
    public Result submitProcessTotaldeal(@RequestBody Map<String, Integer> param) {
        Integer id = param.get("id");
        return Result.success(processTotaldealService.submitProcessTotaldeal(id));
    }
    @ApiOperation(value = "审核检测或校准物品的处置")
    @PostMapping("/checkProcessTotaldeal")
    public Result checkProcessTotaldeal(Integer id, String state) {
    public Result checkProcessTotaldeal(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        String state = (String) param.get("state");
        return Result.success(processTotaldealService.checkProcessTotaldeal(id, state));
    }
    @ApiOperation(value = "批准检测或校准物品的处置")
    @PostMapping("/ratifyProcessTotaldeal")
    public Result ratifyProcessTotaldeal(Integer id,String state) {
    public Result ratifyProcessTotaldeal(@RequestBody Map<String, Object> param) {
        Integer id = (Integer) param.get("id");
        String state = (String) param.get("state");
        return Result.success(processTotaldealService.ratifyProcessTotaldeal(id,state));
    }
cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java
@@ -21,5 +21,5 @@
    IPage<ProcessReport> pageProcessReport(Page page, @Param("ew") QueryWrapper<ProcessReport> queryWrappers);
    List<ProcessReport> getIds(List<Integer> ids);
    List<ProcessReport> getIds(@Param("ids") List<Integer> ids);
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -38,7 +38,7 @@
    List<CostStatisticsDto> selectCostStatistics2(@Param("ew") QueryWrapper<CostStatisticsDto> ew);
    List<Map<String, String>> selectDeviceList(@Param("names") Set<String> names);
    List<Map<String, String>> selectDeviceList(@Param("managementNumbers") Set<String> managementNumbers);
    List<SampleDefectsFatherVo> selectSampleDefects(Page page, @Param("inspectionItems") String inspectionItems, @Param("orderNumber") String orderNumber);
    Long getCount(@Param("inspectionItems") String inspectionItems, @Param("orderNumber") String orderNumber);
inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderStandardTemplate.java
@@ -4,6 +4,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
/**
@@ -44,11 +45,11 @@
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty("创建时间")
    private Date createTime;
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty("修改时间")
    private Date updateTime;
    private LocalDateTime updateTime;
    @ApiModelProperty("模板编号")
    private String number;
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -34,7 +34,6 @@
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.common.core.domain.entity.Custom;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.*;
import com.ruoyi.framework.exception.ErrorException;
@@ -42,6 +41,7 @@
import com.ruoyi.inspect.mapper.*;
import com.ruoyi.inspect.pojo.*;
import com.ruoyi.inspect.service.*;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo;
import com.ruoyi.inspect.vo.InsOrderPlanVO;
import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
@@ -55,6 +55,7 @@
import com.ruoyi.system.service.InformationNotificationService;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xwpf.usermodel.*;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -590,8 +591,27 @@
        return insSampleUserMapper.insert(insSampleUser);
    }
    /**
     * æŸ¥è¯¢æ¨¡æ¿å†…容
     * @param order
     * @param insProducts
     */
    private void getTemplateThing(InsOrder order, List<InsProduct> insProducts) {
        Set<Integer> set = new HashSet<>();
        // æ£€éªŒé¡¹åˆ†ç±»+检验项+检验子项的拼接
        List<String> itemNameList = insProducts.stream().map(insProduct -> {
            String itemName = "";
            if (StringUtils.isNotBlank(insProduct.getInspectionItemClass())) {
                itemName += insProduct.getInspectionItemClass().trim();
            }
            if (StringUtils.isNotBlank(insProduct.getInspectionItem())) {
                itemName += insProduct.getInspectionItem().trim();
            }
            if (StringUtils.isNotBlank(insProduct.getInspectionItemSubclass())) {
                itemName += insProduct.getInspectionItemSubclass().trim();
            }
            return itemName;
        }).collect(Collectors.toList());
        // æŸ¥è¯¢è®¢å•状态判断是否是查历史模板
        if (order.getIsFirstSubmit() != null && order.getIsFirstSubmit().equals(1)) {
            InsOrderState insOrderState = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery()
@@ -611,7 +631,11 @@
                                .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()));
                        thing = one.getThing();
                        if (StrUtil.isNotEmpty(thing)) {
                            thing = GZipUtil.uncompress(thing);
                            JSONObject sheet = JSON.parseObject(JSON.toJSONString(JSON.parseArray(JSON.toJSONString(JSON.parseObject(thing).get("data"))).get(0)));
                            // æ¸…除没有关联的检验项
                            eliminateItem(sheet, itemNameList);
                            JSONObject config = JSON.parseObject(JSON.toJSONString(sheet.get("config")));
                            List<JSONObject> cellData = JSON.parseArray(JSON.toJSONString(sheet.get("celldata")), JSONObject.class);
                            Map<String, Object> style = new HashMap<>();
@@ -636,6 +660,8 @@
            }
            if (StrUtil.isNotEmpty(thing)) {
                JSONObject sheet = JSON.parseObject(JSON.toJSONString(JSON.parseArray(JSON.toJSONString(JSON.parseObject(thing).get("data"))).get(0)));
                // æ¸…除没有关联的检验项
                eliminateItem(sheet, itemNameList);
                JSONObject config = JSON.parseObject(JSON.toJSONString(sheet.get("config")));
                List<JSONObject> cellData = JSON.parseArray(JSON.toJSONString(sheet.get("celldata")), JSONObject.class);
                Map<String, Object> style = new HashMap<>();
@@ -646,6 +672,90 @@
                product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId()));
            }
        }
    }
    /**
     * æ¸…除没有使用的检验项
     * @param sheet
     * @param itemNameList
     */
    private static void eliminateItem(JSONObject sheet, List<String> itemNameList) {
        // èŽ·å–åˆ° æ£€éªŒé¡¹åˆ†ç±»+检验项+检验子项的拼接,如果模板里的信息跟接口返回的检验项信息能够匹配则展示出来
        // å¾ªçŽ¯è¡Œæ•°åˆ¤æ–­æ˜¯å¦
        JSONArray dataListJSONArray = sheet.getJSONArray("data");
        // æ·»åŠ åæ ‡map
        Map<String, String> coordinatesMap = new HashMap<>();
        // éœ€è¦ç§»é™¤çš„索引
        List<Integer> deleteIndex = new ArrayList<>();
        // å¾ªçŽ¯åˆ—
        for (int r = 0; r < dataListJSONArray.size(); r++) {
            JSONArray dataList = dataListJSONArray.getJSONArray(r);
            // å¾ªçŽ¯è¡Œ
            String itemName = "";
            // åˆ¤æ–­æ˜¯å¦æ˜¾ç¤º
            boolean isShow = false;
            for (int c = 0; c < dataList.size(); c++) {
                // æŸ¥è¯¢æ‰¹æ³¨
                JSONObject jsonObject = dataList.getJSONObject(c);
                try {
                    if (jsonObject.getJSONObject("ps").getString("value").equals("检验项分类")) {
                        String value = jsonObject.getString("v").trim();
                        itemName += value;
                        // æ·»åŠ åæ ‡
                        String coordinates = coordinatesJoint(r, c);
                        coordinatesMap.put(coordinates, value);
                        isShow = true;
                    } else if (jsonObject.getJSONObject("ps").getString("value").equals("检验项")) {
                        String value = jsonObject.getString("v").trim();
                        itemName += value;
                        // æ·»åŠ åæ ‡
                        String coordinates = coordinatesJoint(r, c);
                        coordinatesMap.put(coordinates, value);
                        isShow = true;
                    } else if (jsonObject.getJSONObject("ps").getString("value").equals("检验子项")) {
                        String value = jsonObject.getString("v").trim();
                        itemName += value;
                        // æ·»åŠ åæ ‡
                        String coordinates = coordinatesJoint(r, c);
                        coordinatesMap.put(coordinates, value);
                        isShow = true;
                    }
                } catch (Exception e) {
                    // åˆ¤æ–­æ˜¯å¦æœ‰mc合并单元格
                    if (jsonObject != null && jsonObject.getJSONObject("mc") != null) {
                        // æŸ¥è¯¢åæ ‡è¿›è¡Œæ·»åŠ 
                        String value = coordinatesMap.get(coordinatesJoint(jsonObject.getJSONObject("mc").getInteger("r"), jsonObject.getJSONObject("mc").getInteger("c")));
                        if (StringUtils.isNotBlank(value) && !itemName.contains(value)) {
                            itemName += value;
                        }
                    }
                }
            }
            // åˆ¤æ–­è¯¥è®¢å•是否有改检验项, æ²¡æœ‰å‰”除
            if (isShow) {
                if (!itemNameList.contains(itemName)) {
                    dataListJSONArray.remove(r);
                    r--;
                }
            }
        }
    }
    /**
     * åæ ‡æ‹¼æŽ¥
     * @param r æ¨ªåæ ‡
     * @param c çºµåæ ‡
     * @return
     */
    private static String coordinatesJoint(int r, int c) {
        String coordinates = "";
        coordinates = "r:" + r + ",c:" + c;
        return coordinates;
    }
    @Override
@@ -1880,6 +1990,8 @@
                    put("seal1", null);
                }});
        try {
            // ä¿®æ”¹æ¢è¡Œå’Œåˆå¹¶é—®é¢˜
            updaeMerge(template.getXWPFDocument(), true);
            String name = insReport.getCode().replace("/", "") + "-J.docx";
            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
            insReport.setUrl("/word/" + name);
@@ -1894,8 +2006,6 @@
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // ä¿®æ”¹æ¢è¡Œå’Œåˆå¹¶é—®é¢˜
        updaeMerge(insReport, null, true);
    }
    /**
@@ -2263,10 +2373,19 @@
        tables.forEach(table -> {
            table.put("tableSize", tables.size() + 1);
        });
        // è®¾å¤‡ä¿¡æ¯
        List<Map<String, String>> deviceList = null;
        if (deviceSet.size() != 0) {
        if (CollectionUtils.isNotEmpty(deviceSet)) {
            deviceList = insOrderMapper.selectDeviceList(deviceSet);
        }
        if (CollectionUtils.isNotEmpty(deviceList)) {
            int count = 1;
            for (Map<String, String> stringMap : deviceList) {
                stringMap.put("index", String.valueOf(count));
                count++;
            }
        }
        Map<String, String> codeStr = new HashMap<>();
        codeStr.put("报告编号", insReport.getCode());
        codeStr.put("样品名称", insOrder.getSample());
@@ -2274,7 +2393,6 @@
        codeStr.put("发放日期", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        String modelStr = CollUtil.join(models, "\n");
        String finalModelStr = modelStr;
        // æ£€æµ‹ç±»åž‹
        String orderType = null;
@@ -2288,11 +2406,10 @@
        String formType = iSysDictTypeService.selectLabelByDict(DictDataConstants.FORM_TYPE, insOrder.getFormType());
        // æ ·å“çŠ¶æ€
        String sampleStatus = iSysDictTypeService.selectLabelByDict(DictDataConstants.SAMPLE_STATUS_LIST, insOrder.getSampleStatus());;
        String sampleStatus = iSysDictTypeService.selectLabelByDict(DictDataConstants.SAMPLE_STATUS_LIST, insOrder.getSampleStatus());
        ;
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        List<Map<String, String>> finalDeviceList = deviceList;
        // å…¬å¸ä¿¡æ¯
        Custom custom = customMapper.selectById(insOrder.getCompanyId());
        // æŸ¥è¯¢åˆ¤æ–­æ˜¯å¦æœ‰ä¸åˆ¤å®šé¡¹ç›®,和全都是判定项
@@ -2382,12 +2499,18 @@
        environment = (ObjectUtils.isNotEmpty(insOrder.getTemperature()) ? insOrder.getTemperature() + "℃ " : "") + (ObjectUtils.isNotEmpty(insOrder.getHumidity()) ? insOrder.getHumidity() + "%" : "");
        String finalEnvironment = environment;
        LocalDateTime finalSendTime = sendTime;
        String finalResultCh = resultCh;
        String finalResultEn = resultEn;
        String finalOrderType = orderType;
        List<Map<String, String>> finalDeviceList = deviceList;
        String finalModelStr = modelStr;
        InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx");
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
        Configure configure = Configure.builder()
                .bind("deviceList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("order", insOrder);
                    put("report", insReport);
@@ -2422,6 +2545,8 @@
                    put("sampleStatus", sampleStatus);
                }});
        try {
            // ä¿®æ”¹æ¢è¡Œå’Œåˆå¹¶é—®é¢˜
            updaeMerge(template.getXWPFDocument(), false);
            String name = insReport.getCode().replace("/", "") + ".docx";
            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
            insReport.setUrl("/word/" + name);
@@ -2434,8 +2559,6 @@
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // ä¿®æ”¹æ¢è¡Œå’Œåˆå¹¶é—®é¢˜
        updaeMerge(insReport, deviceList, false);
    }
    /**
@@ -2506,19 +2629,13 @@
    /**
     * åˆå¹¶å•元格
     * @param insReport
     * @param deviceList
     */
    private void updaeMerge(InsReport insReport, List<Map<String, String>> deviceList, boolean isSmall) {
    private void updaeMerge(XWPFDocument document, boolean isSmall) {
        // å¤„理合并单元格的问题
        String path = wordUrl + insReport.getUrl().replaceFirst("/word", "");
        try {
            // èŽ·å–æ–‡æ¡£ä¸­çš„æ‰€æœ‰è¡¨æ ¼
            FileInputStream stream = new FileInputStream(path);
            XWPFDocument document = new XWPFDocument(stream);
            List<XWPFTable> xwpfTables = document.getTables();
            // éåŽ†è¡¨æ ¼ï¼Œä½†è·³è¿‡ç¬¬ä¸€ä¸ªè¡¨æ ¼ï¼ˆå¦‚æžœdeviceList为null,则额外跳过第二个)
            for (int i = 1; i < xwpfTables.size() - (deviceList == null ? 1 : 2); i++) {
        // éåŽ†è¡¨æ ¼
        for (int i = 1; i < xwpfTables.size(); i++) {
                // åˆ›å»ºä¸€ä¸ªHashSet来存储唯一的字符串(这里基于"∑"分割后的第二部分)
                Set<String> set1 = new HashSet<>();
                // åˆ›å»ºä¸€ä¸ªHashMap来存储每个唯一字符串及其对应的单元格位置信息
@@ -2614,20 +2731,11 @@
                    }
                }
            }
            FileOutputStream fileOutputStream = new FileOutputStream(path);
            document.write(fileOutputStream);
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //处理中英文换行的问题
        try {
            FileInputStream stream1 = new FileInputStream(path);
            XWPFDocument document1 = new XWPFDocument(stream1);
            List<XWPFTable> xwpfTables1 = document1.getTables();
            for (int i = 1; i < xwpfTables1.size() - (deviceList == null ? 1 : 2); i++) {
        List<XWPFTable> xwpfTables1 = document.getTables();
        for (int i = 1; i < xwpfTables1.size(); i++) {
                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
@@ -2680,14 +2788,6 @@
                        }
                    }
                }
            }
            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
            document1.write(fileOutputStream1);
            fileOutputStream1.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -444,16 +444,6 @@
        Map<String, Object> map = new HashMap<>();
        InsOrder insOrder = insOrderMapper.selectById(id);
        List<SampleProductDto> list = insSampleMapper.getInsOrderAndSample(id, laboratory);
        for (SampleProductDto sampleProductDto : list) {
            List<Integer> ids = sampleProductDto.getInsProduct().stream().map(InsProduct::getId).collect(Collectors.toList());
            List<InsProductUser> insProductUsers = insProductUserMapper.selectList(Wrappers.<InsProductUser>lambdaQuery()
                    .in(InsProductUser::getInsProductId, ids));
            if (CollectionUtils.isNotEmpty(insProductUsers)) {
                List<Integer> userIds = insProductUsers.stream().map(InsProductUser::getCreateUser).distinct().collect(Collectors.toList());
                String collect = userMapper.selectBatchIds(userIds).stream().map(User::getName).collect(Collectors.joining(","));
                sampleProductDto.setCheckName(collect);
            }
        }
        map.put("insOrder", insOrder);
        map.put("sampleProduct", list);
        //查询所有记录模版去重
inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -241,7 +241,7 @@
        latest_traceability
        from device
        where device.management_number in
        <foreach collection="names" index="index" open="(" separator="," close=")" item="val">
        <foreach collection="managementNumbers" index="index" open="(" separator="," close=")" item="val">
            #{val}
        </foreach>
    </select>
inspect-server/src/main/resources/static/report-template.docx
Binary files differ
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -14,7 +14,7 @@
{
    public static void main(String[] args)
    {
//        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(RuoYiApplication.class, args);
        System.out.println("<=====================>LIMS系统启动成功<=====================>");
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
@@ -1,6 +1,8 @@
package com.ruoyi.web.controller.system;
import java.util.List;
import com.ruoyi.common.core.domain.TreeSelect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
@@ -72,6 +74,8 @@
    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
    {
        List<SysMenu> menus = menuService.selectMenuList(getUserId());
        // æ·»åŠ åªçœ‹æˆ‘
        menuService.addIsRersonal(menus, roleId);
        AjaxResult ajax = AjaxResult.success();
        ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
        ajax.put("menus", menuService.buildMenuTreeSelect(menus));
ruoyi-admin/src/main/resources/banner.txt
@@ -1,24 +1,7 @@
Application Version: ${ruoyi.version}
Spring Boot Version: ${spring-boot.version}
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//             ä½›ç¥–保佑       æ°¸ä¸å®•机      æ°¸æ— BUG               //
////////////////////////////////////////////////////////////////////
██      â–ˆâ–ˆâ€â–ˆâ–ˆâ–ˆâ€   â–ˆâ–ˆâ–ˆâ€â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ€
██      â–ˆâ–ˆâ€â–ˆâ–ˆâ–ˆâ–ˆâ€ â–ˆâ–ˆâ–ˆâ–ˆâ€â–ˆâ–ˆâ€â€â€â€â€â€
██      â–ˆâ–ˆâ€â–ˆâ–ˆâ€â–ˆâ–ˆâ–ˆâ–ˆâ€â–ˆâ–ˆâ€â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ€
██      â–ˆâ–ˆâ€â–ˆâ–ˆâ€â€â–ˆâ–ˆâ€â€â–ˆâ–ˆâ€â€â€â€â€â€â–ˆâ–ˆâ€
███████ ██ ██  â€â€â€ â–ˆâ–ˆâ€â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ€
                   â€â€â€â€â€â€â€â€â€â€â€
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
@@ -27,6 +27,9 @@
    /** æ˜¯å¦å¯ä»¥é€‰æ‹©ä»…看我, 0:否, 1:是 */
    private Integer isRersonalButton;
    /** æ˜¯å¦ç¡®è®¤åªçœ‹æˆ‘, 0:否, 1:是 */
    private Integer isRersonal;
    /** èŠ‚ç‚¹ç¦ç”¨ */
    private boolean disabled = false;
@@ -52,6 +55,7 @@
        this.id = menu.getMenuId();
        this.label = menu.getMenuName();
        this.isRersonalButton = menu.getIsRersonalButton();
        this.isRersonal = menu.getIsRersonal();
        this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
    }
@@ -95,7 +99,7 @@
        this.children = children;
    }
    public Integer geIsRersonalButton()
    public Integer getIsRersonalButton()
    {
        return isRersonalButton;
    }
@@ -104,4 +108,14 @@
    {
        this.isRersonalButton = isRersonalButton;
    }
    public Integer getIsRersonal()
    {
        return isRersonal;
    }
    public void setIsRersonal(Integer isRersonalButton)
    {
        this.isRersonal = isRersonal;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
@@ -69,6 +69,10 @@
    /** æ˜¯å¦å¯ä»¥é€‰æ‹©ä»…看我, 0:否, 1:是 */
    private Integer isRersonalButton;
    /** ä»…看我, 0:否, 1:是 */
    private Integer isRersonal;
    /** å­èœå• */
    private List<SysMenu> children = new ArrayList<SysMenu>();
@@ -249,6 +253,16 @@
        this.isRersonalButton = isRersonalButton;
    }
    public Integer getIsRersonal()
    {
        return isRersonal;
    }
    public void setIsRersonal(Integer isRersonal)
    {
        this.isRersonal = isRersonal;
    }
    public List<SysMenu> getChildren()
    {
        return children;
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java
@@ -58,6 +58,9 @@
    /** èœå•组 */
    private Long[] menuIds;
    /** åªçœ‹æˆ‘菜单组 */
    private Long[] isRersonalMenuIds;
    /** éƒ¨é—¨ç»„(数据权限) */
    private Long[] deptIds;
@@ -199,6 +202,17 @@
        this.menuIds = menuIds;
    }
    public Long[] getIsRersonalMenuIds()
    {
        return isRersonalMenuIds;
    }
    public void setIsRersonalMenuIds(Long[] isRersonalMenuIds)
    {
        this.isRersonalMenuIds = isRersonalMenuIds;
    }
    public Long[] getDeptIds()
    {
        return deptIds;
ruoyi-common/src/main/java/com/ruoyi/common/utils/GZipUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.common.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
 * åŽ‹ç¼©è§£åŽ‹å·¥å…·ç±»
 */
public class GZipUtil {
    /**
     * åŽ‹ç¼©
     * @param str
     * @return
     */
    public static String compress(String str) {
        if (str == null || str.trim().length() == 0) {
            return null;
        }
        try (ByteArrayOutputStream out = new ByteArrayOutputStream();
             GZIPOutputStream gzip = new GZIPOutputStream(out)) {
            gzip.write(str.getBytes("utf-8"));
            gzip.close();
            return new String(out.toByteArray(), "iso-8859-1");
        } catch (Exception e) {
            e.printStackTrace();
            return str;
        }
    }
    /**
     * è§£åŽ‹
     * @param str
     * @return
     */
    public static String uncompress(String str) {
        if (str == null || str.trim().length() == 0) {
            return null;
        }
        try (ByteArrayOutputStream out = new ByteArrayOutputStream();
             ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes("iso-8859-1"))){
            GZIPInputStream ungzip = new GZIPInputStream(in);
            byte[] buffer = new byte[1024];
            int n;
            while ((n = ungzip.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
            return new String(out.toByteArray(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
            return str;
        }
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
@@ -16,6 +16,9 @@
    /** èœå•ID */
    private Long menuId;
    /** æ˜¯å¦åªçœ‹æˆ‘0否, 1是 */
    private Integer isRersonal;
    public Long getRoleId()
    {
        return roleId;
@@ -36,6 +39,16 @@
        this.menuId = menuId;
    }
    public Integer getIsRersonal()
    {
        return isRersonal;
    }
    public void setIsRersonal(Integer isRersonal)
    {
        this.isRersonal = isRersonal;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
@@ -51,4 +51,11 @@
     * @return
     */
    SysRoleVo selectRoleMenu(@Param("permsName") String permsName, @Param("userId") Long userId);
    /**
     * æŸ¥è¯¢åªçœ‹æˆ‘菜单id
     * @param roleId
     * @return
     */
    List<Long> selectIsRersonalMenu(@Param("roleId") Long roleId);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
@@ -141,4 +141,11 @@
     * @return ç»“æžœ
     */
    public boolean checkMenuNameUnique(SysMenu menu);
    /**
     * æ·»åŠ åªçœ‹æˆ‘
     * @param menus
     * @param roleId
     */
    void addIsRersonal(List<SysMenu> menus, Long roleId);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
@@ -347,6 +347,23 @@
    }
    /**
     * æ·»åŠ åªçœ‹æˆ‘
     * @param menus
     * @param roleId
     */
    @Override
    public void addIsRersonal(List<SysMenu> menus, Long roleId) {
        // æŸ¥è¯¢åªçœ‹æˆ‘菜单id
        List<Long> menuIds = roleMenuMapper.selectIsRersonalMenu(roleId);
        for (SysMenu menu : menus) {
            if (menuIds.contains(menu.getMenuId())) {
                menu.setIsRersonal(1);
            }
        }
    }
    /**
     * èŽ·å–è·¯ç”±åç§°
     * 
     * @param menu èœå•信息
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -5,6 +5,9 @@
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -301,7 +304,16 @@
            SysRoleMenu rm = new SysRoleMenu();
            rm.setRoleId(role.getRoleId());
            rm.setMenuId(menuId);
            // åˆ¤æ–­æ˜¯å¦æœ‰åªçœ‹æˆ‘权限
            if (ArrayUtils.isNotEmpty(role.getIsRersonalMenuIds())) {
                for (Long isRersonalMenuId : role.getIsRersonalMenuIds()) {
                    if (isRersonalMenuId.equals(menuId)) {
                        rm.setIsRersonal(1);
                    }
                }
            }
            list.add(rm);
        }
        if (list.size() > 0)
        {
ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
@@ -26,6 +26,14 @@
        group by sm.menu_id
    </select>
    <!-- æŸ¥è¯¢åªçœ‹æˆ‘菜单id -->
    <select id="selectIsRersonalMenu" resultType="java.lang.Long">
        select menu_id
        from sys_role_menu
        where role_id = #{roleId}
        and is_rersonal = 1
    </select>
    <delete id="deleteRoleMenuByRoleId" parameterType="Long">
        delete from sys_role_menu where role_id=#{roleId}
    </delete>
@@ -38,9 +46,9 @@
     </delete>
    <insert id="batchRoleMenu">
        insert into sys_role_menu(role_id, menu_id) values
        insert into sys_role_menu(role_id, menu_id, is_rersonal) values
        <foreach item="item" index="index" collection="list" separator=",">
            (#{item.roleId},#{item.menuId})
            (#{item.roleId},#{item.menuId},#{item.isRersonal})
        </foreach>
    </insert>