From 0c1e3bcd7e3b3e89b9119ab12d749bb5651dac26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=85=81=E6=9E=9E?= <3422692813@qq.com> Date: Wed, 27 Nov 2024 17:54:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dl-module-inspection/pom.xml | 10 +++ .../controller/InspectionInfoController.java | 68 ++++++++++++++++- .../service/IInspectionInfoService.java | 11 +++ .../impl/InspectionInfoServiceImpl.java | 69 ++++++++++++++++++ .../inspection/vo/InspectionInfoVo.java | 2 + .../四川省超标排放汽车维护修理告知书.docx | Bin 0 -> 17548 bytes 6 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 dl-module-inspection/src/main/resources/template/word/四川省超标排放汽车维护修理告知书.docx diff --git a/dl-module-inspection/pom.xml b/dl-module-inspection/pom.xml index 03b7e017..281ec10f 100644 --- a/dl-module-inspection/pom.xml +++ b/dl-module-inspection/pom.xml @@ -32,6 +32,16 @@ 2.1.0-jdk8-snapshot compile + + + cn.afterturn + easypoi-spring-boot-starter + 4.4.0 + + + org.springframework + spring-test + 8 diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionInfoController.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionInfoController.java index b89e8e07..1810d278 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionInfoController.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/controller/InspectionInfoController.java @@ -1,16 +1,22 @@ package cn.iocoder.yudao.module.inspection.controller; -import java.util.List; +import java.util.*; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.inspection.entity.InspectionInfo; import cn.iocoder.yudao.module.inspection.entity.InspectionWorkNode; +import cn.iocoder.yudao.module.inspection.service.AppInspectionPartnerService; import cn.iocoder.yudao.module.inspection.service.IInspectionInfoService; import cn.iocoder.yudao.module.inspection.service.IInspectionWorkNodeService; +import cn.iocoder.yudao.module.inspection.vo.InspectionInfoVo; import cn.iocoder.yudao.util.ExcelUtil; +//import cn.iocoder.yudao.util.WordUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.security.access.prepost.PreAuthorize; @@ -32,6 +38,8 @@ public class InspectionInfoController extends BaseController { @Autowired private IInspectionWorkNodeService inspectionWorkNodeService; + @Autowired + private AppInspectionPartnerService partnerList; /** * 查询【请填写功能名称】列表 @@ -267,4 +275,62 @@ public class InspectionInfoController extends BaseController { public CommonResult isExamine(){ return success(inspectionInfoService.isExamine()); } + /** + * 判断当前登陆人是否有重检、重审、退办理的权限(app) + * @return + */ + @GetMapping("getRoleList") + public CommonResult getRoleList(){ + return success(inspectionInfoService.getRoleList()); + } + + @GetMapping("getWordContent") + public CommonResult getWordContent(InspectionInfo inspectionInfo) { + //根据工单id查询工单信息 + InspectionInfoVo inspectionInfoVo = partnerList.inspectionDetail(inspectionInfo.getId()); + InspectionInfo inspectionInfos = inspectionInfoService.selectInspectionInfoById(inspectionInfo.getId()); + Map map = new HashMap<>(); + Date endTime = inspectionInfos.getEndTime(); + // 创建 Calendar 实例并设置时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(endTime); + + // 获取年、月、日 + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1 + int day = calendar.get(Calendar.DAY_OF_MONTH); + + map.put("vin", inspectionInfos.getCarIdNo()); + map.put("day", day); + map.put("one","□"); + map.put("two","□"); + map.put("three","□"); + map.put("four","√"); + map.put("month", month); + map.put("year", year); + map.put("carNum", inspectionInfoVo.getCarNum()); + map.put("userName", inspectionInfos.getBuyName()); + //TODO 还差编号和检验报告编号 告知书编号规则:8位行政区划号码+2位年份号码+4位顺序号,例如:51132201240009。 暂时写死 + StringBuilder sb = new StringBuilder(); + sb.append("51132201"); + //获取年份第二位 + DateTime now = DateUtil.date(); + String yearStr = DateUtil.format(now, "yy"); + sb.append(yearStr); + sb.append("0001");//顺序号 暂时写死 + map.put("id", "1111111111"); + map.put("reportId", sb); + + return success(map); + } + + /** + * 根据模板导出word + */ + @PostMapping("/exportWord") + public CommonResult exportWord(HttpServletRequest request, HttpServletResponse response,@RequestBody Map map){ + String str = UUID.randomUUID().toString()+".docx"; + String name = inspectionInfoService.easyPoiExport("template/word/四川省超标排放汽车维护修理告知书.docx", str, map, request, response); + return CommonResult.success(name); + } } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java index c71c609d..78d0703d 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/IInspectionInfoService.java @@ -2,11 +2,14 @@ package cn.iocoder.yudao.module.inspection.service; import cn.iocoder.yudao.module.inspection.entity.InspectionWorkNode; import cn.iocoder.yudao.module.inspection.vo.DlInspectionWorkNodeVo; +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import cn.iocoder.yudao.module.inspection.entity.InspectionInfo; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -109,4 +112,12 @@ public interface IInspectionInfoService extends IService * @return */ Boolean isExamine(); + + /** + * 获取当前登陆人的角色列表 + * @return + */ + List getRoleList(); + + String easyPoiExport(String templatePath, String filename, Map data, HttpServletRequest request, HttpServletResponse response); } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java index 0d99bf6a..cd13f89b 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/service/impl/InspectionInfoServiceImpl.java @@ -1,5 +1,10 @@ package cn.iocoder.yudao.module.inspection.service.impl; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -9,9 +14,12 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; @@ -19,6 +27,7 @@ import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.appBase.controller.admin.InspectionSocket; import cn.iocoder.yudao.module.custom.entity.CustomerMain; import cn.iocoder.yudao.module.custom.service.CustomerMainService; +import cn.iocoder.yudao.module.infra.service.file.FileService; import cn.iocoder.yudao.module.inspection.vo.DlInspectionWorkNodeVo; import cn.iocoder.yudao.module.partner.entity.PartnerCustomerInfo; import cn.iocoder.yudao.module.partner.service.IPartnerCustomerInfoService; @@ -48,13 +57,20 @@ import cn.iocoder.yudao.module.payment.entity.OrderInfo; import cn.iocoder.yudao.module.payment.entity.OrderInfoDetail; import cn.iocoder.yudao.module.shop.entity.ShopMallPartners; import org.apache.commons.lang3.ObjectUtils; +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.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import static cn.iocoder.yudao.framework.common.config.CommonStr.USER_TYPE_CUS; @@ -99,6 +115,8 @@ public class InspectionInfoServiceImpl extends ServiceImpl getRoleList() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + //获取当前登陆人的所有角色 + List userRoles = roleService.getByUserId(loginUser.getId()); + List userRoleIds = userRoles.stream().map(UserRoleDO::getRoleId).collect(Collectors.toList()); + return roleService.getRoleList(userRoleIds); + } + + /** + * EasyPoi 替换数据 导出 word + * @param templatePath word模板地址 + * @param filename 文件名称 + * @param data 替换参数 + * @param request + * @param response + */ + public String easyPoiExport(String templatePath, String filename, Map data, HttpServletRequest request, HttpServletResponse response) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(filename, "文件名称不能为空"); + Assert.isTrue(filename.endsWith(".docx"), "文件名称仅支持docx格式"); + + try { + String userAgent = request.getHeader("user-agent").toLowerCase(); + if (userAgent.contains("msie") || userAgent.contains("like gecko")) { + filename = URLEncoder.encode(filename, "UTF-8"); + } else { + filename = new String(filename.getBytes("utf-8"), "ISO-8859-1"); + } + + XWPFDocument document = WordExportUtil.exportWord07(templatePath, data); + MultipartFile files = convertXWPFDocumentToMultipartFile(document, filename); + filename = fileService.createFile(files.getOriginalFilename(), "", IoUtil.readBytes(files.getInputStream())); + + } catch (Exception e) { + e.printStackTrace(); + } + return filename; + } + public static MultipartFile convertXWPFDocumentToMultipartFile(XWPFDocument document, String filename) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + document.write(bos); + byte[] bytes = bos.toByteArray(); + return new MockMultipartFile(filename, filename, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", bytes); + } } diff --git a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/vo/InspectionInfoVo.java b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/vo/InspectionInfoVo.java index d56a29b0..425d4e74 100644 --- a/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/vo/InspectionInfoVo.java +++ b/dl-module-inspection/src/main/java/cn/iocoder/yudao/module/inspection/vo/InspectionInfoVo.java @@ -90,4 +90,6 @@ public class InspectionInfoVo { List workNodes; @TableField(exist = false) private Long leadManId; + @TableField(exist = false) + private String skuName; } diff --git a/dl-module-inspection/src/main/resources/template/word/四川省超标排放汽车维护修理告知书.docx b/dl-module-inspection/src/main/resources/template/word/四川省超标排放汽车维护修理告知书.docx new file mode 100644 index 0000000000000000000000000000000000000000..acd0e5cfdbd2c95b910cd34b857144190a673a2a GIT binary patch literal 17548 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 literal 0 HcmV?d00001