diff --git a/hangtag-module-infra/hangtag-module-infra-biz/pom.xml b/hangtag-module-infra/hangtag-module-infra-biz/pom.xml index 40612e5..d32cbe9 100644 --- a/hangtag-module-infra/hangtag-module-infra-biz/pom.xml +++ b/hangtag-module-infra/hangtag-module-infra-biz/pom.xml @@ -124,7 +124,6 @@ org.apache.tika tika-core - diff --git a/hangtag-module-oms/hangtag-module-oms-biz/pom.xml b/hangtag-module-oms/hangtag-module-oms-biz/pom.xml index 1f643c7..d69a4d7 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/pom.xml +++ b/hangtag-module-oms/hangtag-module-oms-biz/pom.xml @@ -64,6 +64,32 @@ 2.1.0-jdk8-snapshot compile + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + org.xhtmlrenderer + flying-saucer-core + 9.1.20 + + + org.xhtmlrenderer + flying-saucer-pdf-openpdf + 9.1.20 + + + + com.github.librepdf + openpdf + 1.3.14 + diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppBrandController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppBrandController.java index 8af9e53..adb7386 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppBrandController.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppBrandController.java @@ -51,7 +51,11 @@ public class AppBrandController { public CommonResult> getSimpleBrandList() { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); CustomerDO customer = customerService.getCustomerByUserId(loginUser.getId()); - List listByCustomerId = customerBrandService.getListByCustomerId(customer.getId()); + Long customerId = null; + if(customer!=null){ + customerId = customer.getId(); + } + List listByCustomerId = customerBrandService.getListByCustomerId(customerId); List brandIds = new ArrayList<>(); for (CustomerBrandDO customerBrandDO : listByCustomerId) { brandIds.add(customerBrandDO.getBrandId()); diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java index 566787f..698dd4f 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java @@ -1,5 +1,7 @@ package cn.hangtag.module.oms.controller.admin.saleorder; +import com.alibaba.fastjson.JSONObject; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -8,6 +10,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; +import javax.annotation.security.PermitAll; import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; @@ -129,9 +132,30 @@ public class SaleOrderController { return success(true); } + @PostMapping("/rejectOrder") + @Operation(summary = "驳回") + @PreAuthorize("@ss.hasPermission('oms:sale-order:rejectOrder')") + public CommonResult rejectOrder(@RequestBody JSONObject jobs) { + Long[] ids = jobs.getObject("ids", new Long[0].getClass()); + String reason = jobs.getString("reason"); + return success(true); + } + + /** + * 生成PDF文档并下载 + * @param response HTTP响应 + * @throws Exception 异常 + */ + @GetMapping("/download") + @PermitAll + public void downloadPdf(HttpServletResponse response) throws Exception { + String htmlContent = saleOrderService.generateHtmlContent(); + saleOrderService.generatePdf(response, htmlContent); + } + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java index 5b5a7cc..dec48f6 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java @@ -70,4 +70,8 @@ public class SaleOrderRespVO { @ExcelProperty("备注") private String remarks; + @Schema(description = "驳回原因") + @ExcelProperty("驳回原因") + private String rejectReason; + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderSaveReqVO.java index 75a47d3..d7e9593 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderSaveReqVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderSaveReqVO.java @@ -62,6 +62,9 @@ public class SaleOrderSaveReqVO { @Schema(description = "订单状态", example = "2") private Integer orderStatus; + @Schema(description = "驳回原因", example = "2") + private String rejectReason; + @Schema(description = "销售订单明细列表") private List saleOrderEntrys; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java index 97b0969..56a331f 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/saleorder/SaleOrderDO.java @@ -102,5 +102,9 @@ public class SaleOrderDO extends BaseDO { * 发票备注 */ private String invoiceRemarks; + /** + * 驳回原因 + */ + private String rejectReason; } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java index 9b36cc5..c575468 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java @@ -1,6 +1,8 @@ package cn.hangtag.module.oms.service.saleorder; +import java.io.IOException; import java.util.*; +import javax.servlet.http.HttpServletResponse; import javax.validation.*; import cn.hangtag.module.oms.controller.admin.saleorder.vo.*; import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; @@ -68,4 +70,8 @@ public interface SaleOrderService { void updateSaleOrderBillStatus(List ids, String status); void generateProduceOrder(List ids); + + String generateHtmlContent(); + + void generatePdf(HttpServletResponse response, String htmlContent) throws IOException; } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java index 89b1d8d..ac76f0c 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java @@ -12,12 +12,24 @@ import cn.hangtag.module.oms.dal.mysql.saleorderentry.SaleOrderEntryMapper; import cn.hangtag.module.oms.enums.saleorder.SaleOrderStatusEnum; import cn.hangtag.module.oms.service.produceorder.ProduceOrderService; import com.google.common.collect.Maps; +import com.lowagie.text.pdf.PdfWriter; import lombok.extern.slf4j.Slf4j; +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.validation.annotation.Validated; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; +import org.xhtmlrenderer.pdf.ITextFontResolver; +import org.xhtmlrenderer.pdf.ITextRenderer; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -42,6 +54,9 @@ public class SaleOrderServiceImpl implements SaleOrderService { @Resource private ProduceOrderService produceOrderService; + @Resource + private TemplateEngine templateEngine; + @Override @Transactional(rollbackFor = Exception.class) public Long createSaleOrder(SaleOrderSaveReqVO createReqVO) { @@ -148,6 +163,52 @@ public class SaleOrderServiceImpl implements SaleOrderService { } } + @Override + public String generateHtmlContent() { + Context context = new Context(); + context.setVariable("title", "PDF文档标题"); + context.setVariable("content", + "这是PDF文档的主要内容:" + + "“成功并不是终点,失败也不是终结,最重要的是继续前行的勇气。在人生的旅途中,我们会遇到许多挑战与挫折,这些都是成长的必经之路。每一次跌倒都是一次学习的机会,每一次失败都为成功铺设了基础。只要我们保持信念,不断努力,最终会到达梦想的彼岸。无论前方的路有多么坎坷,只要心怀希望,我们就有无限的可能性去改变自己的命运,实现心中的理想。”" + + "由Thymeleaf模板引擎渲染。" + + ""); + return templateEngine.process("pdf_template", context); + } + + @Override + public void generatePdf(HttpServletResponse response, String htmlContent) throws IOException { + // 设置响应类型 + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "attachment; filename=generated.pdf"); + + // 创建ITextRenderer实例 + ITextRenderer renderer = new ITextRenderer(); + + // 设置字体路径,使用 classpath 加载字体 + ITextFontResolver fontResolver = renderer.getFontResolver(); + ClassPathResource fontResource = new ClassPathResource("fonts/SimSun.ttf"); + System.out.println(fontResource.getFile().getAbsolutePath()); + fontResolver.addFont(fontResource.getFile().getAbsolutePath(), "Identity-H", true); + + renderer.setDocumentFromString(htmlContent); + renderer.layout(); + + // 输出PDF到响应输出流 + try (OutputStream outputStream = response.getOutputStream()) { + renderer.createPDF(outputStream); + outputStream.flush(); + } + +/* + // 设置输出PDF文件 + OutputStream os = new FileOutputStream("index.pdf"); + renderer.createPDF(os); + os.flush(); + os.close();*/ + + + } + private void createSaleOrderEntryList(Long parentId, List list) { list.forEach(o -> o.setParentId(parentId)); diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/fonts/SimSun.ttf b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/fonts/SimSun.ttf new file mode 100644 index 0000000..e0115ab Binary files /dev/null and b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/fonts/SimSun.ttf differ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/pdf_template.html b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/pdf_template.html new file mode 100644 index 0000000..4fd5faf --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/pdf_template.html @@ -0,0 +1,37 @@ + + + + + PDF文档 + + + +

PDF文档标题

+

这是PDF文档的内容部分,由Thymeleaf模板引擎渲染。

+ + + \ No newline at end of file diff --git a/hangtag-server/src/main/resources/application.yaml b/hangtag-server/src/main/resources/application.yaml index 106ba6f..e6ddef5 100644 --- a/hangtag-server/src/main/resources/application.yaml +++ b/hangtag-server/src/main/resources/application.yaml @@ -40,6 +40,12 @@ spring: redis: time-to-live: 1h # 设置过期时间为 1 小时 + thymeleaf: + prefix: classpath:/templates/ + suffix: .html + mode: HTML + encoding: UTF-8 + cache: false --- #################### 接口文档配置 #################### springdoc: diff --git a/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts b/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts index 0bdaad5..2ca4d49 100644 --- a/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts +++ b/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts @@ -81,4 +81,14 @@ export const SaleOrderApi = { }) }, + // 驳回 + rejectOrder: async (data) => { + return await request.post({ + url: `/oms/sale-order/rejectOrder`, + data: data + }) + }, + + + } diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue index 9b37c7a..13f5201 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue @@ -118,6 +118,7 @@ 驳回 @@ -267,17 +268,17 @@ - - - - - - - - - - - + + + + + + + + @@ -340,7 +341,7 @@ const exportLoading = ref(false) // 导出的加载中 //驳回参数 const rejectOpen = ref(false) -const rejectTitle = ref() +const rejectTitle = ref('') const rejectform = reactive({ rejectReason: undefined }) @@ -400,29 +401,12 @@ const handleDelete = async (id: number) => { } -/** 反审核按钮操作 */ -// const handleReject = async () => { -// try { -// let ids = selectionList; -// /*let auditStatuss = row.ifaudit || this.auditStatuss; -// -// for(var vals of auditStatuss) { -// if(vals!='0'){ -// message.error("请选择待审核数据"); -// return; -// } -// }*/ -// -// rejectform = { -// rejectReason: null -// }; -// this.resetForm("rejectform"); -// this.rejectTitle = "是否驳回选中的数据项?"; -// this.rejectOpen = true; -// } catch {} -// }, - - +/** 驳回操作 */ +const handleReject = async (ids: number[]) => { + rejectform.rejectReason = undefined + rejectTitle.value = "是否驳回选中的数据项?" + rejectOpen.value = true +} /** 审批/反审批操作 */ const handleUpdateBillStatus = async (ids: number[], operateKey: string) => { try { @@ -494,23 +478,29 @@ const handleSelectionChange = (rows: SaleOrderVO[]) => { /** 驳回提交按钮 */ -/*const submitRejectForm = async () => { - const ids = selectionList.map((item) => item.id - if (this.rejectform.rejectReason != null) { +const submitRejectForm = async () => { + const ids = selectionList.value.map((item) => item.id) + if(rejectform.rejectReason != null) { const data = { ids:ids, - reason:this.rejectform.rejectReason + reason:rejectform.rejectReason } - /!* notAuditOrder(data).then(response => { - this.msgSuccess("驳回成功"); - this.rejectOpen = false; - this.getList(); - });*!/ - + await SaleOrderApi.rejectOrder(data).then(response => { + message.success("驳回成功"); + rejectOpen.value = false; + getList(); + }); }else { - message.error(`请选择驳回原因!`) + message.error(`请填写驳回原因!`) } -}*/ +} + + +/** 驳回取消按钮 */ +const rejectCancel = () =>{ + rejectOpen.value = false + rejectform.rejectReason = undefined +} /** 激活时 */