From 36a20f3ddca7104ac3c91cf44e6dd800b7df22db Mon Sep 17 00:00:00 2001 From: zhangzq Date: Sat, 31 Jan 2026 15:51:23 +0800 Subject: [PATCH] =?UTF-8?q?add:=E6=96=B0=E5=A2=9E=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base-fast/Word模板标签文本.txt | 38 +++ base-fast/Word模板配置说明.md | 243 ++++++++++++++++++ base-fast/pom.xml | 36 +++ .../java/com/boge/config/ShiroConfig.java | 2 + .../controller/ContractController.java | 102 +++++++- .../controller/FlwInstanceController.java | 4 +- .../price/controller/PriceController.java | 22 +- .../controller}/LocalStorageController.java | 6 +- .../service/LocalStorageService.java | 16 +- .../service}/dao/LocalStorageMapper.java | 5 +- .../service/dto/LocalStorageDto.java | 15 ++ .../service}/entity/LocalStorage.java | 10 +- .../entity/LocalStorageQueryCriteria.java | 2 +- .../service/impl/LocalStorageServiceImpl.java | 88 ++++++- .../controller/LocalStorageController.java | 87 ------- .../tickets/controller/TicketsController.java | 16 +- .../tickets/enums/TicketsStatusEnums.java | 3 +- .../tickets/service/TicketsService.java | 2 + .../service/impl/TicketsServiceImpl.java | 38 +-- .../src/main/resources/templates/合同.docx | Bin 0 -> 33172 bytes .../main/resources/templates/报价单.xlsx | Bin 0 -> 19707 bytes .../modules/contract/temp-add-or-update.vue | 209 ++------------- .../src/views/modules/tickets/tickets.vue | 53 +++- 23 files changed, 650 insertions(+), 347 deletions(-) create mode 100644 base-fast/Word模板标签文本.txt create mode 100644 base-fast/Word模板配置说明.md rename base-fast/src/main/java/com/boge/modules/sys/{ => localStorage/controller}/LocalStorageController.java (93%) rename base-fast/src/main/java/com/boge/modules/{tickets => sys/localStorage}/service/LocalStorageService.java (58%) rename base-fast/src/main/java/com/boge/modules/{tickets => sys/localStorage/service}/dao/LocalStorageMapper.java (55%) create mode 100644 base-fast/src/main/java/com/boge/modules/sys/localStorage/service/dto/LocalStorageDto.java rename base-fast/src/main/java/com/boge/modules/{tickets => sys/localStorage/service}/entity/LocalStorage.java (69%) rename base-fast/src/main/java/com/boge/modules/{tickets => sys/localStorage/service}/entity/LocalStorageQueryCriteria.java (97%) rename base-fast/src/main/java/com/boge/modules/{tickets => sys/localStorage}/service/impl/LocalStorageServiceImpl.java (54%) delete mode 100644 base-fast/src/main/java/com/boge/modules/tickets/controller/LocalStorageController.java create mode 100644 base-fast/src/main/resources/templates/合同.docx create mode 100644 base-fast/src/main/resources/templates/报价单.xlsx diff --git a/base-fast/Word模板标签文本.txt b/base-fast/Word模板标签文本.txt new file mode 100644 index 0000000..46f6375 --- /dev/null +++ b/base-fast/Word模板标签文本.txt @@ -0,0 +1,38 @@ +# Word模板标签文本(直接复制使用) + +## 循环开始标签 +{{#rows}} + +## 循环结束标签 +{{/rows}} + +## 数据字段标签 +{{seq}} +{{materialName}} +{{materialSpec}} +{{qty}} +{{unitName}} +{{salePrice}} +{{amount}} +{{remark}} + +## 其他字段标签 +{{totalPrice}} +{{clientName}} +{{contractCode}} +{{effectiveDate}} + +--- + +## 使用说明 + +1. 从本文件复制标签文本 +2. 粘贴到Word模板的对应位置 +3. 确保使用"无格式文本"粘贴 + +## 注意事项 + +- 标签必须完全匹配,包括大小写 +- 不要有多余的空格 +- 使用英文字符,不要用中文字符 +- {{#rows}} 中的 # 是英文井号 diff --git a/base-fast/Word模板配置说明.md b/base-fast/Word模板配置说明.md new file mode 100644 index 0000000..b37ee20 --- /dev/null +++ b/base-fast/Word模板配置说明.md @@ -0,0 +1,243 @@ +# Word合同模板配置说明 + +## 📋 问题原因 + +Word模板中的动态列表数据渲染失败,主要原因是: +1. 没有配置 `LoopRowTableRenderPolicy` 循环行渲染策略 +2. 数据格式不匹配(直接传JSONArray而不是List) +3. 模板语法使用不正确 + +## ✅ 解决方案 + +### 1. Word模板正确语法 + +在Word模板的表格中,需要使用以下格式: + +``` +┌─────────┬──────────┬──────────┬──────┬──────┬──────────┬──────────┬──────┐ +│ 序号 │ 产品名称 │ 型号 │ 数量 │ 单位 │ 单价(元) │ 总价(元) │ 备注 │ +├─────────┼──────────┼──────────┼──────┼──────┼──────────┼──────────┼──────┤ +│{{#rows}}│ │ │ │ │ │ │ │ +├─────────┼──────────┼──────────┼──────┼──────┼──────────┼──────────┼──────┤ +│{{seq}} │{{materialName}}│{{materialSpec}}│{{qty}}│{{unitName}}│{{salePrice}}│{{amount}}│{{remark}}│ +├─────────┼──────────┼──────────┼──────┼──────┼──────────┼──────────┼──────┤ +│{{/rows}}│ │ │ │ │ │ │ │ +└─────────┴──────────┴──────────┴──────┴──────┴──────────┴──────────┴──────┘ +``` + +**重要说明**: +- `{{#rows}}` 必须单独占一行(表格的一行) +- 数据行包含所有字段:`{{seq}}`, `{{materialName}}` 等 +- `{{/rows}}` 必须单独占一行(表格的一行) +- 这三行构成一个完整的循环结构 + +### 2. 模板文件位置 + +将模板文件放在以下位置之一: + +**方式1:放在resources目录(推荐)** +``` +src/main/resources/templates/contract_template.docx +``` + +**方式2:使用绝对路径** +```java +/Users/mima0000/Desktop/合同.docx +``` + +### 3. 后端代码关键点 + +#### 3.1 配置循环行策略 +```java +LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); +Configure config = Configure.builder() + .bind("rows", policy) // 绑定rows标签 + .build(); +``` + +#### 3.2 数据格式转换 +```java +// 错误方式 ❌ +dataMap.put("rows", JSONArray.parseArray(materialJson)); + +// 正确方式 ✅ +List> rowsList = new ArrayList<>(); +for (int i = 0; i < materialArray.size(); i++) { + JSONObject item = materialArray.getJSONObject(i); + Map rowData = new HashMap<>(); + rowData.put("seq", i + 1); + rowData.put("materialName", item.getString("materialName")); + // ... 其他字段 + rowsList.add(rowData); +} +dataMap.put("rows", rowsList); +``` + +#### 3.3 使用配置渲染 +```java +XWPFTemplate template = XWPFTemplate.compile(templateStream, config) + .render(dataMap); +``` + +## 🎯 完整的Word模板示例 + +### 模板结构 + +``` +服务合同 + +需方:{{clientName}} 合同编号:{{contractCode}} +供方:上海诺力智能科技有限公司 签订时间:{{effectiveDate}} + +一、产品明细单 + +┌─────────┬──────────┬──────────┬──────┬──────┬──────────┬──────────┬──────┐ +│ 序号 │ 产品名称 │ 型号 │ 数量 │ 单位 │ 单价(元) │ 总价(元) │ 备注 │ +├─────────┼──────────┼──────────┼──────┼──────┼──────────┼──────────┼──────┤ +│{{#rows}}│ │ │ │ │ │ │ │ +├─────────┼──────────┼──────────┼──────┼──────┼──────────┼──────────┼──────┤ +│{{seq}} │{{materialName}}│{{materialSpec}}│{{qty}}│{{unitName}}│{{salePrice}}│{{amount}}│{{remark}}│ +├─────────┼──────────┼──────────┼──────┼──────┼──────────┼──────────┼──────┤ +│{{/rows}}│ │ │ │ │ │ │ │ +├─────────┴──────────┴──────────┴──────┴──────┴──────────┼──────────┼──────┤ +│ 共计: │{{totalPrice}}│ │ +└──────────────────────────────────────────────┴──────────┴──────┘ + +二、质量要求:{{qc}} +三、交货时间、地点:货期:{{delivery}},交货地:{{place}} +四、运输方式:{{transport}} +五、包装标准:{{packaging}} +六、结算方式:{{pay}},付款方式:{{payment}} +七、违约责任:{{breach}} +八、解决合同纠纷的方式:{{solve_dispute}} +九、其它约定事项:{{supplement}} + +┌──────────────────────────────┬──────────────────────────────┐ +│ 需方: │ 供方: │ +├──────────────────────────────┼──────────────────────────────┤ +│单位名称:{{clientName}} │单位名称:上海诺力智能科技有限公司│ +│地址:{{clientAdd}} │地址:上海青浦区徐泾镇... │ +│委托代理人:{{juridicalPerson}}│委托代理人: │ +│电话:{{clientTel}} │电话: │ +│传真:{{clientFax}} │传真: │ +│开户银行:{{clientBank}} │开户银行:招商银行虹桥支行 │ +│帐号:{{clientCard}} │帐号:12191702501091 │ +└──────────────────────────────┴──────────────────────────────┘ +``` + +## 📝 字段说明 + +### 基本信息字段 +| 字段名 | 说明 | 示例 | +|--------|------|------| +| clientName | 客户名称 | XX公司 | +| contractCode | 合同编号 | HT20250101 | +| effectiveDate | 生效日期 | 2025年01月01日 | +| totalPrice | 总价 | 100000.00 | + +### 列表字段(rows) +| 字段名 | 说明 | 示例 | +|--------|------|------| +| seq | 序号 | 1, 2, 3... | +| materialName | 产品名称 | 叉车 | +| materialSpec | 型号 | CPD15 | +| qty | 数量 | 10 | +| unitName | 单位 | 台 | +| salePrice | 单价 | 50000.00 | +| amount | 总价 | 500000.00 | +| remark | 备注 | 含税 | + +### 合同条款字段 +| 字段名 | 说明 | +|--------|------| +| qc | 质量要求 | +| delivery | 交货时间 | +| place | 交货地点 | +| transport | 运输方式 | +| packaging | 包装标准 | +| pay | 结算方式 | +| payment | 付款方式 | +| breach | 违约责任 | +| solve_dispute | 解决纠纷方式 | +| supplement | 其它约定 | + +### 客户信息字段 +| 字段名 | 说明 | +|--------|------| +| clientAdd | 客户地址 | +| juridicalPerson | 法人代表 | +| clientTel | 客户电话 | +| clientFax | 客户传真 | +| clientBank | 客户开户行 | +| clientCard | 客户账号 | + +## 🔧 常见问题 + +### 1. 列表数据不显示 +**原因**:没有配置 `LoopRowTableRenderPolicy` +**解决**:在代码中添加配置 +```java +Configure config = Configure.builder() + .bind("rows", policy) + .build(); +``` + +### 2. 列表只显示一行 +**原因**:模板中 `{{#rows}}` 和 `{{/rows}}` 没有单独占一行 +**解决**:确保循环标签单独占表格的一行 + +### 3. 数据格式错误 +**原因**:直接传JSONArray而不是List +**解决**:转换为List>格式 + +### 4. 中文乱码 +**原因**:文件名编码问题 +**解决**:使用URLEncoder编码文件名 +```java +String fileName = java.net.URLEncoder.encode("合同.docx", "UTF-8"); +``` + +## 🎉 测试步骤 + +1. **准备模板文件** + - 按照上述格式创建Word模板 + - 保存为 `contract_template.docx` + - 放到 `src/main/resources/templates/` 目录 + +2. **测试导出** + - 访问:`GET /flow/contract/export?contractId=1` + - 检查下载的Word文档 + - 验证列表数据是否正确显示 + +3. **验证数据** + - 打开导出的Word文档 + - 检查产品明细表是否有多行数据 + - 检查所有字段是否正确填充 + +## 💡 最佳实践 + +1. **模板管理** + - 将模板文件放在resources目录 + - 使用版本控制管理模板 + - 为不同类型合同创建不同模板 + +2. **错误处理** + - 添加try-catch捕获异常 + - 记录详细的错误日志 + - 返回友好的错误提示 + +3. **性能优化** + - 缓存模板对象 + - 使用流式处理大文件 + - 异步处理导出任务 + +## 📚 参考资料 + +- poi-tl官方文档:http://deepoove.com/poi-tl/ +- 循环行表格:http://deepoove.com/poi-tl/#_loop-row-table +- GitHub示例:https://github.com/Sayi/poi-tl + +--- + +**更新时间**: 2026-01-30 +**版本**: v1.0 diff --git a/base-fast/pom.xml b/base-fast/pom.xml index f9aa8ef..8616d80 100644 --- a/base-fast/pom.xml +++ b/base-fast/pom.xml @@ -71,6 +71,42 @@ org.springframework.boot spring-boot-starter-aop + + com.alibaba + easyexcel + 2.2.6 + + + + org.apache.poi + poi + 4.1.2 + + + com.deepoove + poi-tl + 1.10.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + + org.apache.commons + commons-compress + 1.21 + + + commons-io + commons-io + 2.11.0 + org.springframework.boot spring-boot-starter-data-elasticsearch diff --git a/base-fast/src/main/java/com/boge/config/ShiroConfig.java b/base-fast/src/main/java/com/boge/config/ShiroConfig.java index 832fe0d..64906cb 100644 --- a/base-fast/src/main/java/com/boge/config/ShiroConfig.java +++ b/base-fast/src/main/java/com/boge/config/ShiroConfig.java @@ -67,6 +67,8 @@ public class ShiroConfig { filterMap.put("/js/**", "anon"); filterMap.put("/img/**", "anon"); filterMap.put("/fonts/**", "anon"); + filterMap.put("/fonts/**", "anon"); + filterMap.put("/flow/contract/export", "anon"); filterMap.put("/**", "oauth2"); shiroFilter.setFilterChainDefinitionMap(filterMap); diff --git a/base-fast/src/main/java/com/boge/modules/contract/controller/ContractController.java b/base-fast/src/main/java/com/boge/modules/contract/controller/ContractController.java index 86dff5b..0c5612d 100644 --- a/base-fast/src/main/java/com/boge/modules/contract/controller/ContractController.java +++ b/base-fast/src/main/java/com/boge/modules/contract/controller/ContractController.java @@ -1,5 +1,7 @@ package com.boge.modules.contract.controller; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -10,26 +12,31 @@ import com.boge.common.utils.CodeUtil; import com.boge.common.utils.PageUtils; import com.boge.common.utils.R; import com.boge.common.utils.ShiroUtils; -import com.boge.modules.client.entity.ClientQuery; -import com.boge.modules.contract.dao.ContractDao; +import com.boge.modules.client.entity.ClientEntity; +import com.boge.modules.client.service.ClientService; import com.boge.modules.contract.entity.ContractEntity; import com.boge.modules.contract.entity.ContractQuery; import com.boge.modules.contract.service.ContractService; import com.boge.modules.orderRecord.record.RecordEvent; -import com.boge.modules.price.entity.PriceEntity; import com.boge.modules.price.enums.PriceApprovalEnum; -import com.boge.modules.tickets.entity.LocalStorage; -import com.boge.modules.tickets.service.LocalStorageService; -import lombok.val; +import com.boge.modules.sys.localStorage.service.entity.LocalStorage; +import com.boge.modules.sys.localStorage.service.LocalStorageService; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.data.RowRenderData; +import com.deepoove.poi.data.Rows; +import com.deepoove.poi.data.TableRenderData; +import com.deepoove.poi.data.Tables; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; +import javax.servlet.http.HttpServletResponse; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.stream.Collectors; @@ -46,6 +53,8 @@ public class ContractController { @Autowired private ContractService contractService; @Autowired + private ClientService clientService; + @Autowired private LocalStorageService localStorageService; @Autowired private EventPublisher eventPublisher; @@ -132,4 +141,77 @@ public class ContractController { return R.ok(); } + /** + * 导出合同 + */ + @RequestMapping("/export") + //@RequiresPermissions("flow:contract:delete") + public void export(Integer contractId, HttpServletResponse response){ + try { + // 1. 查询合同数据 + ContractEntity contract = contractService.selectDtlById(contractId); + String materialJson = contract.getMaterialJson(); + ClientEntity clientEntity = clientService.getById(contract.getClientId()); + + // 2. 构建数据Map + Map dataMap = new HashMap<>(); + dataMap.put("clientName", clientEntity.getClientName()); + dataMap.put("contractCode", contract.getContractCode()); + dataMap.put("effectiveDate", new SimpleDateFormat("yyyy年MM月dd日").format(contract.getEffectiveTime())); + dataMap.put("clientAdd", clientEntity.getAddress()); + dataMap.put("juridicalPerson", clientEntity.getJuridicalPerson()); + dataMap.put("clientTel", clientEntity.getTel()); + dataMap.put("clientFax", clientEntity.getFax()); + dataMap.put("clientBank", clientEntity.getBank()); + dataMap.put("clientCard", clientEntity.getCard()); + dataMap.put("totalPrice", contract.getTotalPrice()); + dataMap.put("qc", contract.getQc()); + dataMap.put("delivery", contract.getDelivery()); + dataMap.put("place", contract.getPlace()); + dataMap.put("transport", contract.getTransport()); + dataMap.put("packaging", contract.getPackaging()); + dataMap.put("pay", contract.getPay()); + dataMap.put("payment", contract.getPayment()); + dataMap.put("breach", contract.getBreach()); + dataMap.put("solve_dispute", contract.getSolveDispute()); + dataMap.put("supplement", contract.getSupplement()); + + // 3. 处理产品明细列表数据 + JSONArray materialArray = JSONArray.parseArray(materialJson); + List> rowsList = new ArrayList<>(); + + for (int i = 0; i < materialArray.size(); i++) { + JSONObject item = materialArray.getJSONObject(i); + Map rowData = new HashMap<>(); + rowData.put("seq", i + 1); // 序号 + rowData.put("materialName", item.getString("materialName")); + rowData.put("materialSpec", item.getString("materialSpec")); + rowData.put("qty", item.getString("qty")); + rowData.put("unitName", item.getString("unitName")); + rowData.put("salePrice", item.getString("salePrice")); + rowData.put("amount", item.getString("amount")); + rowData.put("remark", item.getString("remark")); + rowsList.add(rowData); + } + dataMap.put("goods", rowsList); + // 4. 配置循环行渲染策略 + com.deepoove.poi.config.Configure config = com.deepoove.poi.config.Configure.builder() + .bind("goods", new LoopRowTableRenderPolicy()) // 绑定rows标签使用循环行策略 + .build(); + InputStream templateStream = new java.io.FileInputStream("/Users/mima0000/Desktop/合同.docx"); + XWPFTemplate template = XWPFTemplate.compile(templateStream, config).render(dataMap); + // 6. 设置响应头 + String fileName = "合同_" + contract.getContractCode() + ".docx"; + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + + java.net.URLEncoder.encode(fileName, "UTF-8")); + // 7. 输出到响应流 + template.write(response.getOutputStream()); + template.close(); + } catch (Exception ex) { + ex.printStackTrace(); + throw new RuntimeException("导出合同失败: " + ex.getMessage()); + } + } + } diff --git a/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java b/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java index 626c46b..6619d56 100644 --- a/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java +++ b/base-fast/src/main/java/com/boge/modules/flow/controller/FlwInstanceController.java @@ -13,8 +13,8 @@ import com.boge.modules.flow.entity.FlwHiTaskEntity; import com.boge.modules.flow.service.ActHiProcessinfoService; import com.boge.modules.flow.service.FlwInstanceService; import com.boge.modules.sys.entity.SysUserEntity; -import com.boge.modules.tickets.entity.LocalStorage; -import com.boge.modules.tickets.service.LocalStorageService; +import com.boge.modules.sys.localStorage.service.entity.LocalStorage; +import com.boge.modules.sys.localStorage.service.LocalStorageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; diff --git a/base-fast/src/main/java/com/boge/modules/price/controller/PriceController.java b/base-fast/src/main/java/com/boge/modules/price/controller/PriceController.java index 947cd7d..666c67a 100644 --- a/base-fast/src/main/java/com/boge/modules/price/controller/PriceController.java +++ b/base-fast/src/main/java/com/boge/modules/price/controller/PriceController.java @@ -1,8 +1,8 @@ package com.boge.modules.price.controller; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.boge.common.publisher.EventPublisher; import com.boge.common.publisher.EventType; @@ -11,18 +11,18 @@ import com.boge.common.utils.PageUtils; import com.boge.common.utils.R; import com.boge.common.utils.ShiroUtils; import com.boge.modules.orderRecord.record.RecordEvent; -import com.boge.modules.orderRecord.record.service.PmOrderRecordService; -import com.boge.modules.price.entity.PriceDto; import com.boge.modules.price.entity.PriceEntity; import com.boge.modules.price.enums.PriceApprovalEnum; import com.boge.modules.price.service.PriceService; -import com.boge.modules.tickets.entity.LocalStorage; -import com.boge.modules.tickets.service.LocalStorageService; +import com.boge.modules.sys.localStorage.service.entity.LocalStorage; +import com.boge.modules.sys.localStorage.service.LocalStorageService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -128,4 +128,16 @@ public class PriceController { return R.ok(); } + /** + * 审核 + */ + @RequestMapping("/export") + //@RequiresPermissions("flow:contract:delete") + public R export(Integer priceId, HttpServletResponse response){ + PriceEntity contract = priceService.getById(priceId); + ClassPathResource pathResource = new ClassPathResource("static/model/报价单样式.xls");// 根目录 + String materialJson = contract.getMaterialJson(); + localStorageService.downloadExcelModel(pathResource.getPath(),response,(JSONObject)JSON.toJSON(contract),JSONArray.parseArray(materialJson)); + return R.ok(); + } } diff --git a/base-fast/src/main/java/com/boge/modules/sys/LocalStorageController.java b/base-fast/src/main/java/com/boge/modules/sys/localStorage/controller/LocalStorageController.java similarity index 93% rename from base-fast/src/main/java/com/boge/modules/sys/LocalStorageController.java rename to base-fast/src/main/java/com/boge/modules/sys/localStorage/controller/LocalStorageController.java index 228988c..4551901 100644 --- a/base-fast/src/main/java/com/boge/modules/sys/LocalStorageController.java +++ b/base-fast/src/main/java/com/boge/modules/sys/localStorage/controller/LocalStorageController.java @@ -2,12 +2,12 @@ // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // -package com.boge.modules.sys; +package com.boge.modules.sys.localStorage.controller; import com.boge.common.exception.RRException; import com.boge.common.utils.FileUtil; -import com.boge.modules.tickets.entity.LocalStorage; -import com.boge.modules.tickets.service.LocalStorageService; +import com.boge.modules.sys.localStorage.service.LocalStorageService; +import com.boge.modules.sys.localStorage.service.entity.LocalStorage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/LocalStorageService.java b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/LocalStorageService.java similarity index 58% rename from base-fast/src/main/java/com/boge/modules/tickets/service/LocalStorageService.java rename to base-fast/src/main/java/com/boge/modules/sys/localStorage/service/LocalStorageService.java index 8e2dbb8..38c5ab4 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/LocalStorageService.java +++ b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/LocalStorageService.java @@ -1,14 +1,14 @@ -package com.boge.modules.tickets.service; +package com.boge.modules.sys.localStorage.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.boge.modules.tickets.entity.LocalStorage; -import com.boge.modules.tickets.entity.TicketsEntity; +import com.boge.modules.sys.localStorage.service.entity.LocalStorage; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; public interface LocalStorageService extends IService { @@ -21,4 +21,14 @@ public interface LocalStorageService extends IService { void download(List localStorageDtos, HttpServletResponse response) throws IOException; void downloadFile(LocalStorage localStorage, HttpServletRequest request, HttpServletResponse response) throws IOException; + + /** + * + * @param fileUrl + * @param response + * @param mapParam:模版中json的数据{xxx} + * @param listParam:模版中列表的数据{date.xxx} + */ + void downloadExcelModel(String fileUrl, HttpServletResponse response, Map mapParam, List listParam); + void downloadWordModel(String fileUrl, HttpServletResponse response, Map mapParam); } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/dao/LocalStorageMapper.java b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/dao/LocalStorageMapper.java similarity index 55% rename from base-fast/src/main/java/com/boge/modules/tickets/dao/LocalStorageMapper.java rename to base-fast/src/main/java/com/boge/modules/sys/localStorage/service/dao/LocalStorageMapper.java index fb8f290..5bd2294 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/dao/LocalStorageMapper.java +++ b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/dao/LocalStorageMapper.java @@ -1,8 +1,7 @@ -package com.boge.modules.tickets.dao; +package com.boge.modules.sys.localStorage.service.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.boge.modules.tickets.entity.LocalStorage; -import com.boge.modules.tickets.entity.TicketsEntity; +import com.boge.modules.sys.localStorage.service.entity.LocalStorage; import org.apache.ibatis.annotations.Mapper; @Mapper diff --git a/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/dto/LocalStorageDto.java b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/dto/LocalStorageDto.java new file mode 100644 index 0000000..eb60a81 --- /dev/null +++ b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/dto/LocalStorageDto.java @@ -0,0 +1,15 @@ +package com.boge.modules.sys.localStorage.service.dto; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class LocalStorageDto implements Serializable { + private Long id; + private String realName; + private String name; + private String suffix; + private String type; + private String size; + +} diff --git a/base-fast/src/main/java/com/boge/modules/tickets/entity/LocalStorage.java b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/entity/LocalStorage.java similarity index 69% rename from base-fast/src/main/java/com/boge/modules/tickets/entity/LocalStorage.java rename to base-fast/src/main/java/com/boge/modules/sys/localStorage/service/entity/LocalStorage.java index df4c8ea..c03f935 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/entity/LocalStorage.java +++ b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/entity/LocalStorage.java @@ -1,19 +1,11 @@ -package com.boge.modules.tickets.entity; +package com.boge.modules.sys.localStorage.service.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import org.hibernate.annotations.CreationTimestamp; -import org.hibernate.annotations.UpdateTimestamp; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.LastModifiedBy; -import org.springframework.data.elasticsearch.annotations.Document; -import javax.persistence.*; import java.io.Serializable; -import java.sql.Timestamp; import java.util.Date; diff --git a/base-fast/src/main/java/com/boge/modules/tickets/entity/LocalStorageQueryCriteria.java b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/entity/LocalStorageQueryCriteria.java similarity index 97% rename from base-fast/src/main/java/com/boge/modules/tickets/entity/LocalStorageQueryCriteria.java rename to base-fast/src/main/java/com/boge/modules/sys/localStorage/service/entity/LocalStorageQueryCriteria.java index 6a7f995..c90a6c9 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/entity/LocalStorageQueryCriteria.java +++ b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/entity/LocalStorageQueryCriteria.java @@ -1,4 +1,4 @@ -package com.boge.modules.tickets.entity; +package com.boge.modules.sys.localStorage.service.entity; import java.sql.Timestamp; import java.util.List; diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/LocalStorageServiceImpl.java b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/impl/LocalStorageServiceImpl.java similarity index 54% rename from base-fast/src/main/java/com/boge/modules/tickets/service/impl/LocalStorageServiceImpl.java rename to base-fast/src/main/java/com/boge/modules/sys/localStorage/service/impl/LocalStorageServiceImpl.java index f044da9..645803c 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/LocalStorageServiceImpl.java +++ b/base-fast/src/main/java/com/boge/modules/sys/localStorage/service/impl/LocalStorageServiceImpl.java @@ -1,29 +1,41 @@ -package com.boge.modules.tickets.service.impl; +package com.boge.modules.sys.localStorage.service.impl; + import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import java.io.File; -import java.io.IOException; -import java.util.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillWrapper; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.boge.common.exception.RRException; +import com.boge.common.query.MapOf; import com.boge.common.utils.FileProperties; import com.boge.common.utils.FileUtil; import com.boge.modules.contract.entity.ContractEntity; import com.boge.modules.contract.service.ContractService; -import com.boge.modules.tickets.dao.LocalStorageMapper; -import com.boge.modules.tickets.entity.LocalStorage; - -import com.boge.modules.tickets.service.LocalStorageService; - +import com.boge.modules.sys.localStorage.service.LocalStorageService; +import com.boge.modules.sys.localStorage.service.dao.LocalStorageMapper; +import com.boge.modules.sys.localStorage.service.entity.LocalStorage; +import com.deepoove.poi.XWPFTemplate; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindException; import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; @Service public class LocalStorageServiceImpl extends ServiceImpl implements LocalStorageService { @@ -101,4 +113,56 @@ public class LocalStorageServiceImpl extends ServiceImpl query(@RequestParam String annex) { - List list = new ArrayList<>(); - if (StringUtils.isNotEmpty(annex)){ - String[] split = annex.split(","); - list = localStorageService.listByIds(Arrays.asList(split)); - } - return new ResponseEntity(list, HttpStatus.OK); - } - - @ApiOperation("导出数据") - @GetMapping({"/download"}) - public void download(@RequestParam Long storageId , HttpServletResponse response, HttpServletRequest request) throws IOException { - this.localStorageService.downloadFile(this.localStorageService.getById(storageId),request, response); - } - - @ApiOperation("上传文件") - @PostMapping - public ResponseEntity create(@RequestParam String name, @RequestParam("file") MultipartFile file) { - LocalStorage localStorage = this.localStorageService.create(name, file); - return new ResponseEntity(localStorage, HttpStatus.CREATED); - } - - @PostMapping({"/pictures"}) - @ApiOperation("上传图片") - public ResponseEntity upload(@RequestParam MultipartFile file) { - String suffix = FileUtil.getExtensionName(file.getOriginalFilename()); - if (!"图片".equals(FileUtil.getFileType(suffix))) { - throw new RRException("只能上传图片"); - } else { - LocalStorage localStorage = this.localStorageService.create((String)null, file); - return new ResponseEntity(localStorage, HttpStatus.OK); - } - } - - - - @DeleteMapping - @ApiOperation("多选删除") - public ResponseEntity delete(@RequestBody Long[] ids) { - localStorageService.removeByIds(Arrays.asList(ids)); - return new ResponseEntity(HttpStatus.OK); - } - - public LocalStorageController(final LocalStorageService localStorageService) { - this.localStorageService = localStorageService; - } -} diff --git a/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java b/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java index 16ba182..684d937 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/controller/TicketsController.java @@ -8,11 +8,7 @@ import com.boge.common.utils.ShiroUtils; import com.boge.modules.sys.entity.SysUserEntity; import com.boge.modules.tickets.dto.TicketsDTO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.boge.modules.tickets.entity.TicketsEntity; import com.boge.modules.tickets.service.TicketsService; @@ -78,6 +74,16 @@ public class TicketsController { ticketsService.saveTicket(tickets); return R.ok(); } + /** + * 发起 + */ + @GetMapping("/initiate") + //@RequiresPermissions("tickets:tickets:save") + public R initiate( String ticketsId){ + ticketsService.initiate(ticketsId); + return R.ok(); + } + /** * 修改 diff --git a/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java b/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java index 947af40..c3c91ba 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/enums/TicketsStatusEnums.java @@ -10,7 +10,8 @@ import lombok.Getter; UNCHECK(0, "未开始"), CHECKED(1, "已指派"), REJECT(2, "处理中"), - FINISH(3, "已完成"); + FINISH(3, "已完成"), + REFUSE(4, "拒绝"); private Integer code; private String msg; diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java b/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java index 3845e5d..4ac6222 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/service/TicketsService.java @@ -23,5 +23,7 @@ public interface TicketsService extends IService { PageUtils queryPageByType(Map params); void saveTicket(TicketsEntity tickets); + + void initiate(String ticketsId); } diff --git a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java b/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java index 8a1292d..bece410 100644 --- a/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java +++ b/base-fast/src/main/java/com/boge/modules/tickets/service/impl/TicketsServiceImpl.java @@ -3,6 +3,8 @@ package com.boge.modules.tickets.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.boge.common.exception.RRException; import com.boge.common.utils.ShiroUtils; import com.boge.modules.car.entity.CarEntity; import com.boge.modules.car.service.CarService; @@ -13,6 +15,7 @@ import com.boge.modules.sys.service.SysUserRoleService; import com.boge.modules.sys.service.impl.SysUserServiceImpl; import com.boge.modules.tickets.dto.TicketsDTO; import com.boge.modules.tickets.enums.TicketUserEnums; +import org.apache.commons.lang3.StringUtils; import org.flowable.common.engine.api.FlowableException; import org.flowable.engine.IdentityService; import org.flowable.engine.RuntimeService; @@ -115,22 +118,27 @@ public class TicketsServiceImpl extends ServiceImpl i @Override public void saveTicket(TicketsEntity tickets) { - // 启动流程 - try { - // 记录流程的发起人 - identityService.setAuthenticatedUserId(ShiroUtils.getUserId().toString()); - Map startVars = new HashMap<>(); - ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, startVars); - SysUserEntity loginUser = ShiroUtils.getUserEntity(); - tickets.setCreateTime(new Date()); - tickets.setCreateUser(loginUser.getNickname()); - tickets.setStatus(TicketsStatusEnums.REJECT.getCode()); - tickets.setAssignUserId(TicketUserEnums.SPECIALIST.getCode()); - tickets.setProcessInstance(processInstance.getProcessInstanceId()); - ticketsDao.insert(tickets); - } catch (Exception e) { - e.printStackTrace(); + SysUserEntity loginUser = ShiroUtils.getUserEntity(); + tickets.setCreateTime(new Date()); + tickets.setCreateUser(loginUser.getNickname()); + tickets.setStatus(TicketsStatusEnums.UNCHECK.getCode()); + ticketsDao.insert(tickets); + } + + @Override + public void initiate(String ticketsId) { + if (StringUtils.isEmpty(ticketsId)){ + throw new RRException("工单ID不能为空"); } + // 记录流程的发起人 + identityService.setAuthenticatedUserId(ShiroUtils.getUserId().toString()); + Map startVars = new HashMap<>(); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(defId, startVars); + this.update(new LambdaUpdateWrapper() + .set(TicketsEntity::getProcessInstance,processInstance.getProcessInstanceId()) + .set(TicketsEntity::getStatus,TicketsStatusEnums.REJECT.getCode()) + .set(TicketsEntity::getAssignUserId,ShiroUtils.getUserId()) + .eq(TicketsEntity::getTicketsId,ticketsId)); } @Override diff --git a/base-fast/src/main/resources/templates/合同.docx b/base-fast/src/main/resources/templates/合同.docx new file mode 100644 index 0000000000000000000000000000000000000000..4916ed4ff05b78842d03fc60dbf10a643d6ed90b GIT binary patch literal 33172 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 literal 0 HcmV?d00001 diff --git a/base-vue/src/views/modules/contract/temp-add-or-update.vue b/base-vue/src/views/modules/contract/temp-add-or-update.vue index 4bb6530..a8888af 100644 --- a/base-vue/src/views/modules/contract/temp-add-or-update.vue +++ b/base-vue/src/views/modules/contract/temp-add-or-update.vue @@ -52,19 +52,14 @@
- 三、 售后服务: - - -
-
- 四、 交货时间、地点: + 三、 服务时间、地点: 货期: 。交货地:
- 五、 运输方式及到达站和费用负担: + 四、 运输方式及到达站和费用负担:
@@ -285,193 +280,33 @@ export default { return result }, exportToExcel () { - // 获取客户名称 - let clientName = '' - if (this.dictData && this.dictData[1]) { - const client = this.dictData[1].find(item => item.value === this.dataForm.clientId) - clientName = client ? client.label : '' + // 检查contractId是否存在 + if (!this.dataForm.contractId) { + this.$message.error('合同ID不存在,无法导出') + return } - - // 构建Excel HTML内容 - let excelHtml = ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ` - // 添加产品明细 - this.materData.forEach((item, index) => { - excelHtml += ` - - - - - - - - - - - ` + // 调用后端接口导出Excel + const url = this.$http.adornUrl('/flow/contract/export') + const params = this.$http.adornParams({ + contractId: this.dataForm.contractId }) - // 添加合计行 - excelHtml += ` - - - - - - - - - ` + // 构建完整的URL + const fullUrl = `${url}?${new URLSearchParams(params).toString()}` - // 添加合同条款 - excelHtml += ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - ` + // 创建隐藏的iframe来下载文件 + const iframe = document.createElement('iframe') + iframe.style.display = 'none' + iframe.src = fullUrl + document.body.appendChild(iframe) - // 添加双方信息 - excelHtml += ` - - - - -
产品购销合同
需方:${clientName}合同编号:${this.dataForm.contractCode || ''}
供方:上海诺力智能科技有限公司生效日期:${this.dataForm.effectiveTime || ''}
一、产品明细单
序号产品名称订货代码型号数量单位单价(元)总价(元)
${index + 1}${item.materialName || ''}${item.materialCode || ''}${item.materialSpec || ''}${item.qty || ''}${item.unitName || ''}${item.salePrice || ''}${item.amount || ''}
共计:${this.dataForm.totalPrice || ''}
共计人民币金额:(大写)${this.toChineseCurrency(this.dataForm.totalPrice)}含13%增值税
二、质量要求、技术标准、供方对质量负责的条件和期限:${this.dataForm.qc || ''}
三、售后服务:${this.dataForm.afterSales || ''}
四、交货时间、地点:货期:${this.dataForm.delivery || ''},交货地:${this.dataForm.place || ''}
五、运输方式及到达站和费用负担:${this.dataForm.transport || ''}
六、包装标准:${this.dataForm.packaging || ''}
七、结算方式:${this.dataForm.pay || ''},付款方式:${this.dataForm.payment || ''}
八、违约责任:${this.dataForm.breach || ''}
九、解决合同纠纷的方式:${this.dataForm.solveDispute || ''}
十、其它约定事项:${this.dataForm.supplement || ''}
-
需方:
-
单位名称:${this.client.clientName || ''}
-
地址:${this.client.address || ''}
-
委托代理电话:${this.client.tel || ''}
-
传真:${this.client.fax || ''}
-
开户银行:${this.client.bank || ''}
-
帐号:${this.client.card || ''}
-
-
供方:
-
单位名称:上海诺力智能科技有限公司(盖章)
-
地址:上海青浦区徐泾镇高光路215弄99号4号楼302室
-
委托代理电话:
-
传真:
-
开户银行:招商银行虹桥支行
-
帐号:12191702501091
-
- - - ` + // 延迟移除iframe + setTimeout(() => { + document.body.removeChild(iframe) + }, 3000) - // 创建Blob对象 - const blob = new Blob(['\ufeff', excelHtml], { - type: 'application/vnd.ms-excel;charset=utf-8' - }) - - // 生成文件名 - const fileName = `产品购销合同_${this.dataForm.contractCode || new Date().getTime()}.xls` - - // 创建下载链接 - const link = document.createElement('a') - link.href = URL.createObjectURL(blob) - link.download = fileName - - // 触发下载 - document.body.appendChild(link) - link.click() - - // 清理 - document.body.removeChild(link) - URL.revokeObjectURL(link.href) - - this.$message.success('Excel文件导出成功') + this.$message.success('正在导出Excel文件,请稍候...') } } } diff --git a/base-vue/src/views/modules/tickets/tickets.vue b/base-vue/src/views/modules/tickets/tickets.vue index 77f63e3..85e9fbf 100644 --- a/base-vue/src/views/modules/tickets/tickets.vue +++ b/base-vue/src/views/modules/tickets/tickets.vue @@ -151,12 +151,26 @@ fixed="right" header-align="center" align="center" - width="170" + width="220" label="操作"> @@ -389,6 +403,37 @@ this.$message.error(data.msg) } }) + }, + // 发起流程 + initiateFlowHandle(ticketsId) { + this.$confirm('确定要发起流程吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + this.$http({ + url: this.$http.adornUrl('/tickets/tickets/initiate'), + method: 'get', + params: this.$http.adornParams({ + ticketsId: ticketsId + }) + }).then(({data}) => { + if (data && data.code === 200) { + this.$message({ + message: '流程发起成功', + type: 'success', + duration: 1500, + onClose: () => { + this.getDataList() + } + }) + } else { + this.$message.error(data.msg || '流程发起失败') + } + }).catch(() => { + this.$message.error('流程发起失败,请稍后重试') + }) + }).catch(() => {}) } } }