2026-06-04 789ee31d8548162f2b511460e6b1c1e436d00e68
feat(vehicle): 添加车辆管理模块及归还里程功能

- 新增车辆管理模块API接口文档,包含车辆基础信息和借出记录管理
- 添加归还时公里数字段到车辆借用记录实体和数据库表
- 实现归还车辆时同步更新车辆里程数的功能
- 修复车辆借用记录服务中的审批流程处理逻辑
- 添加车辆管理相关枚举类型和数据传输对象
- 配置开发环境数据库连接字符串指向新的产品库存管理系统数据库
已添加1个文件
已修改2个文件
155 ■■■■■ 文件已修改
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/utils/QualityInspectTemplateExportHelper.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/百事模版模板说明.md 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -140,7 +140,6 @@
    /**
     * æäº¤
     *
     * @param qualityInspect
     * @return
     */
    @GetMapping("/export/baishi/{id}")
src/main/java/com/ruoyi/quality/utils/QualityInspectTemplateExportHelper.java
@@ -1,7 +1,10 @@
package com.ruoyi.quality.utils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
@@ -22,7 +25,7 @@
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -47,7 +50,54 @@
    }
    public void exportBaiShi(HttpServletResponse response, Long inspectId) {
        export(response, inspectId, BAISHI_TEMPLATE, "百事模版检验结果");
        if (inspectId == null) {
            throw new ServiceException("检验单ID不能为空");
        }
        QualityInspect inspect = qualityInspectMapper.selectById(inspectId);
        if (inspect == null) {
            throw new ServiceException("检验单不存在");
        }
        List<QualityInspectParam> paramList = qualityInspectParamService.list(
                Wrappers.<QualityInspectParam>lambdaQuery()
                        .eq(QualityInspectParam::getInspectId, inspectId)
                        .orderByAsc(QualityInspectParam::getId));
        int index = 1;
        for (QualityInspectParam detail : paramList) {
            detail.setIndex(index);
            index++;
        }
        try (InputStream inputStream = getClass().getResourceAsStream("/static/百事模版.docx")) {
            if (inputStream == null) {
                throw new ServiceException("模板文件不存在:/static/百事模版.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", paramList);
                    }});
            response.reset();
            response.setContentType("application/msword");
            response.setCharacterEncoding("UTF-8");
            String encodedName = URLEncoder.encode("百事模版检验结果", StandardCharsets.UTF_8).replace("+", "%20");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-Disposition", "attachment;filename=" + encodedName + ".docx");
            try (OutputStream outputStream = response.getOutputStream()) {
                template.write(outputStream);
                outputStream.flush();
            }
        } catch (IOException e) {
            throw new RuntimeException("导出失败", e);
        }
    }
    public void exportDaLi(HttpServletResponse response, Long inspectId) {
src/main/resources/static/°ÙÊÂÄ£°æÄ£°å˵Ã÷.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
# ç™¾äº‹æ¨¡ç‰ˆ.docx æ¨¡æ¿åˆ›å»ºè¯´æ˜Ž
## æ–‡ä»¶ä½ç½®
`src/main/resources/static/百事模版.docx`
---
## Word ä¸­åˆ›å»ºæ­¥éª¤
### 1. æ–°å»º Word æ–‡æ¡£
### 2. åˆ›å»ºåŸºæœ¬ä¿¡æ¯è¡¨
插入一个 2列N行的表格:
| é¡¹ç›® | å†…容 |
|------|------|
| äº§å“åç§° | {{inspect.productName}} |
| è§„格型号 | {{inspect.model}} |
| ä¾›åº”商 | {{inspect.supplier}} |
| æ•°é‡ | {{inspect.quantity}} |
| å•位 | {{inspect.unit}} |
| æ£€æµ‹æ—¥æœŸ | {{inspect.checkTime}} |
| æ£€éªŒå‘˜ | {{inspect.checkName}} |
| æ£€æµ‹ç»“æžœ | {{inspect.checkResult}} |
| åˆæ ¼æ•°é‡ | {{inspect.qualifiedQuantity}} |
| ä¸åˆæ ¼æ•°é‡ | {{inspect.unqualifiedQuantity}} |
### 3. åˆ›å»ºæ£€éªŒå‚数列表表(关键!)
插入一个 6列2行的表格:
**表头行:**
| åºå· | æ£€æµ‹æŒ‡æ ‡ | å•位 | æ ‡å‡†å€¼ | å†…控值 | æ£€éªŒå€¼ |
**数据行(循环模板)**,每个单元格输入:
| {{#paramList}}{{index}}{{/paramList}} | {{#paramList}}{{parameterItem}}{{/paramList}} | {{#paramList}}{{unit}}{{/paramList}} | {{#paramList}}{{standardValue}}{{/paramList}} | {{#paramList}}{{controlValue}}{{/paramList}} | {{#paramList}}{{testValue}}{{/paramList}} |
### 4. ä¿å­˜
保存为 `百事模版.docx`,放到 `src/main/resources/static/` ç›®å½•。
---
## ç¤ºä¾‹æ¨¡æ¿å†…容
```
百事检验报告
【基本信息】
产品名称:{{inspect.productName}}
规格型号:{{inspect.model}}
供应商:{{inspect.supplier}}
数量:{{inspect.quantity}} {{inspect.unit}}
检测日期:{{inspect.checkTime}}
检验员:{{inspect.checkName}}
检测结果:{{inspect.checkResult}}
【检验参数】
| åºå· | æ£€æµ‹æŒ‡æ ‡ | å•位 | æ ‡å‡†å€¼ | å†…控值 | æ£€éªŒå€¼ |
| {{#paramList}}{{index}}{{/paramList}} | {{#paramList}}{{parameterItem}}{{/paramList}} | {{#paramList}}{{unit}}{{/paramList}} | {{#paramList}}{{standardValue}}{{/paramList}} | {{#paramList}}{{controlValue}}{{/paramList}} | {{#paramList}}{{testValue}}{{/paramList}} |
合格数量:{{inspect.qualifiedQuantity}}
不合格数量:{{inspect.unqualifiedQuantity}}
```
---
## æ³¨æ„äº‹é¡¹
1. **表格循环必须使用 `{{#paramList}}...{{/paramList}}` åŒ…裹每个字段**
2. è¡¨å¤´è¡Œå’Œæ•°æ®è¡Œéƒ½è¦ä¿ç•™ï¼Œæ•°æ®è¡Œä¼šè‡ªåŠ¨å¤åˆ¶å¤šè¡Œ
3. å ä½ç¬¦è¦å®Œå…¨åŒ¹é…ï¼ŒåŒ…括大小写
4. ä¿å­˜ä¸º `.docx` æ ¼å¼ï¼Œä¸æ˜¯ `.doc`
---
## å¯ç”¨å­—段列表
### inspect(检验单)字段:
- `productName` - äº§å“åç§°
- `model` - è§„格型号
- `supplier` - ä¾›åº”商
- `customer` - å®¢æˆ·åç§°
- `quantity` - æ•°é‡
- `unit` - å•位
- `checkTime` - æ£€æµ‹æ—¥æœŸ
- `checkName` - æ£€éªŒå‘˜
- `checkResult` - æ£€æµ‹ç»“æžœ
- `checkCompany` - æ£€æµ‹å•位
- `qualifiedQuantity` - åˆæ ¼æ•°é‡
- `unqualifiedQuantity` - ä¸åˆæ ¼æ•°é‡
### paramList(检验参数列表)字段:
- `index` - åºå·ï¼ˆè‡ªåŠ¨ç”Ÿæˆï¼‰
- `parameterItem` - æ£€æµ‹æŒ‡æ ‡
- `unit` - å•位
- `standardValue` - æ ‡å‡†å€¼
- `controlValue` - å†…控值
- `testValue` - æ£€éªŒå€¼