From 9538904f0f88953c968f85c0026911f385d8a6db Mon Sep 17 00:00:00 2001 From: wwb <782276617@qq.com> Date: Mon, 8 Dec 2025 11:59:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=80=E5=94=AE=E8=AE=A2=E5=8D=95=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=99=84=E4=BB=B6=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/infra/api/file/FileApi.java | 3 + .../module/infra/api/file/FileApiImpl.java | 7 + .../oms/enums/common/BillStatusEnum.java | 3 +- .../admin/app/AppSaleOrderController.java | 3 +- .../admin/saleorder/SaleOrderController.java | 20 +++ .../dal/dataobject/saleorder/SaleOrderDO.java | 5 + .../service/saleorder/SaleOrderService.java | 8 ++ .../saleorder/SaleOrderServiceImpl.java | 114 ++++++++++++++- .../src/api/oms/saleorder/index.ts | 17 ++- .../src/views/oms/saleorder/index.vue | 131 +++++++++++++++++- .../src/api/oms/saleorder/index.ts | 7 + .../src/views/oms/saleorder/index.vue | 59 +++++++- 12 files changed, 369 insertions(+), 8 deletions(-) diff --git a/hangtag-module-infra/hangtag-module-infra-api/src/main/java/cn/hangtag/module/infra/api/file/FileApi.java b/hangtag-module-infra/hangtag-module-infra-api/src/main/java/cn/hangtag/module/infra/api/file/FileApi.java index e43e073..94e6d96 100644 --- a/hangtag-module-infra/hangtag-module-infra-api/src/main/java/cn/hangtag/module/infra/api/file/FileApi.java +++ b/hangtag-module-infra/hangtag-module-infra-api/src/main/java/cn/hangtag/module/infra/api/file/FileApi.java @@ -69,4 +69,7 @@ public interface FileApi { * @return {@link FileInfoVO } */ FileInfoVO rename(String id, String name); + + + byte[] getFileContent(Long configId,String path) throws Exception; } diff --git a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/api/file/FileApiImpl.java b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/api/file/FileApiImpl.java index 074c51d..433e925 100644 --- a/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/api/file/FileApiImpl.java +++ b/hangtag-module-infra/hangtag-module-infra-biz/src/main/java/cn/hangtag/module/infra/api/file/FileApiImpl.java @@ -41,4 +41,11 @@ public class FileApiImpl implements FileApi { public FileInfoVO rename(String id, String name) { return fileService.rename(id, name); } + + @Override + public byte[] getFileContent(Long configId, String path) throws Exception { + return fileService.getFileContent(configId, path); + } + + } diff --git a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/common/BillStatusEnum.java b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/common/BillStatusEnum.java index c17dce8..75a1347 100644 --- a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/common/BillStatusEnum.java +++ b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/common/BillStatusEnum.java @@ -21,7 +21,8 @@ public enum BillStatusEnum { SUBMIT("B", "待审核"), AUDIT("C", "待排产"), INVALID("D", "作废"), - YPLAN("E", "已排产"); + YPLAN("E", "已排产"), + COMPLETED("F", "已完成"); /** * 状态 diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppSaleOrderController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppSaleOrderController.java index 713a323..32a4dee 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppSaleOrderController.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/app/AppSaleOrderController.java @@ -31,6 +31,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; @@ -204,5 +206,4 @@ public class AppSaleOrderController{ String code = saleOrderService.getNewContractCode2(); return success(code); } - } \ 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/SaleOrderController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java index 07686a0..73df315 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 @@ -9,7 +9,10 @@ import cn.hangtag.module.oms.service.customer.CustomerService; import cn.hangtag.module.system.api.user.AdminUserApi; import cn.hangtag.module.system.api.user.dto.AdminUserRespDTO; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; import com.alibaba.fastjson.JSONObject; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -170,6 +173,16 @@ public class SaleOrderController { } + @PostMapping("/pushOutBill") + @Operation(summary = "下推生成出货单") + @PreAuthorize("@ss.hasPermission('oms:sale-order:pushOutBill')") + public CommonResult pushOutBill(@RequestBody JSONObject jobs) { + //Long[] ids = jobs.getObject("ids", new Long[0].getClass()); + Long ids = jobs.getLong("ids"); + String logisticsCode = jobs.getString("logisticsCode"); + saleOrderService.updateSaleOrderBillStatus(Arrays.asList(ids), "updateLogisticsCode", MapUtil.of("logisticsCode",logisticsCode)); + return success(true); + } @PutMapping("/update-remark") @@ -215,4 +228,11 @@ public class SaleOrderController { saleOrderService.exportDesignSourceFile(response,ids); } + @GetMapping("/exportAttrFile") + @Operation(summary = "下载销售订单的附件文件") + @PermitAll + public void exportAttrFile(@RequestParam("id") Long id,HttpServletResponse response) throws IOException { + saleOrderService.exportAttrFile(response,id); + } + } \ No newline at end of file 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 2685705..56a919d 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 @@ -178,6 +178,11 @@ public class SaleOrderDO extends BaseDO { */ private String currencyType; + /** + * 物流单号 + */ + private String logisticsCode; + /** * 下单客户上传的 附件文件 infra_file id * 允许多个 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 1688ac5..54a9736 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 @@ -2,6 +2,7 @@ package cn.hangtag.module.oms.service.saleorder; import java.io.IOException; import java.util.*; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.*; @@ -153,4 +154,11 @@ public interface SaleOrderService { * @param ids IDs */ void exportDesignSourceFile(HttpServletResponse response, List ids); + + /** + * 下载销售订单 附件文件 + * @param response + * @param id + */ + void exportAttrFile(HttpServletResponse response, Long id); } \ 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 b1f1b5a..79f6e17 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 @@ -2,14 +2,15 @@ package cn.hangtag.module.oms.service.saleorder; import cn.hangtag.framework.common.exception.ServiceException; import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.hangtag.framework.common.pojo.FileInfoVO; import cn.hangtag.framework.common.pojo.PageResult; import cn.hangtag.framework.common.util.FuncUtil; -import cn.hangtag.framework.common.util.cache.CacheUtils; import cn.hangtag.framework.common.util.object.BeanUtils; import cn.hangtag.framework.common.util.validation.AssertUtil; import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; import cn.hangtag.framework.security.core.LoginUser; import cn.hangtag.framework.security.core.util.SecurityFrameworkUtils; +import cn.hangtag.module.infra.api.file.FileApi; import cn.hangtag.module.oms.common.utils.NumberChineseFormatterUtils; import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; import cn.hangtag.module.oms.controller.admin.produceorder.vo.ProduceOrderSaveReqVO; @@ -60,6 +61,7 @@ import cn.hangtag.module.system.service.mail.MailSendService; import cn.hangtag.module.system.service.user.AdminUserService; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileUtil; @@ -83,6 +85,7 @@ import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; import java.io.*; @@ -145,6 +148,9 @@ public class SaleOrderServiceImpl implements SaleOrderService { @Resource private AdminUserService adminUserService; + @Resource + private FileApi fileApi; + @Value("${oms.partyb}") private String partyb; @@ -315,6 +321,19 @@ public class SaleOrderServiceImpl implements SaleOrderService { } } break; + case "updateLogisticsCode": //更新物流单号 + for (SaleOrderDO saleOrder : saleOrders) { + if (!StringUtils.equalsAny(saleOrder.getBillStatus(), BillStatusEnum.YPLAN.getValue())) { + throw new ServiceException(001, "订单状态未排产,不允许生成出货单!"); + } + if (BillStatusEnum.YPLAN.getValue().equals(saleOrder.getBillStatus()) && (params != null && params.size() > 0)) { + saleOrder.setBillStatus(BillStatusEnum.COMPLETED.getValue()); + saleOrder.setOrderStatus(SaleOrderStatusEnum.YWC.getValue()); + saleOrder.setLogisticsCode((String) params.get("logisticsCode")); + saleOrderMapper.updateById(saleOrder); + } + } + break; case "submit": //提交 for (SaleOrderDO saleOrder : saleOrders) { if (BillStatusEnum.REJECT.getValue().equals(saleOrder.getBillStatus())) { @@ -776,25 +795,32 @@ public class SaleOrderServiceImpl implements SaleOrderService { } } + DateTime createTime = DateUtil.date(); + String createTimestr = DateUtil.formatDateTime(createTime); + order.setCreateTime(createTime.toLocalDateTime()); saleOrderMapper.insert(order); saleOrderEntryMapper.insertBatch(entryList); skuOrderSkuMapper.insertBatch(skuList); updateCustomerInvoiceData(order); + + //发送下单邮件 Long customerId = order.getCustomerId(); CustomerDO customerDO = customerMapper.selectById(customerId); String orderFollowerUser = order.getOrderFollowerUser(); if (StringUtils.isNotBlank(orderFollowerUser) && customerDO != null) { AdminUserDO user = adminUserService.getUser(Long.valueOf(orderFollowerUser)); + String email = user.getEmail(); MailSendMessage message = new MailSendMessage(); message.setAccountId(1L); message.setMail(email); - message.setTitle("OMS订单系统"); + message.setTitle("OMS订单系统 "+order.getSaleContractCode()+" "+createTimestr); StringBuffer content = new StringBuffer(); - content.append("您好,客户:" + customerDO.getName() + " 来新的订单啦,订单号:" + order.getBillno() + ",下单时间:" + DateUtil.date().toString() + " 请进行处理!"); + //content.append("您好,客户:【" + customerDO.getName() + "】 来新的订单啦,订单号:" + order.getBillno() + ",下单时间:" + DateUtil.date().toString() + " 请进行处理!"); + content.append("您好,客户:【" + customerDO.getName() + "】 来新的订单啦,订单号:" + order.getBillno() + ",下单时间:" + createTimestr + " 请进行处理!"); message.setContent(content.toString()); mailSendService.doSendMail(message); } @@ -1332,6 +1358,88 @@ public class SaleOrderServiceImpl implements SaleOrderService { } + @SneakyThrows + @Override + public void exportAttrFile(HttpServletResponse response, Long id){ + + // 获取销售订单 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SaleOrderDO::getId, id); + List entityData = saleOrderMapper.selectList(queryWrapper); + if (FuncUtil.isEmpty(entityData)) { + throw exception(ErrorCodeConstants.SALE_ORDER_NOT_FILE_EXPORT); + } + + String accessoryFileIds = entityData.get(0).getAccessoryFileIds(); + + if(StringUtils.isBlank(accessoryFileIds)){ + throw exception(ErrorCodeConstants.SALE_ORDER_NOT_FILE_EXPORT); + } + + List fileInfo = fileApi.getFileInfo(accessoryFileIds); + + // 通过容器创建文件 + String pathUrl = System.getProperty("user.dir") + "/attfile/orderattfile"; + pathUrl = pathUrl.replaceAll("//", "/"); + File file1 = new File(pathUrl); + if (!file1.exists()) { + System.out.println("创建目录:" + pathUrl); + file1.mkdirs(); + } + + List files = new ArrayList<>(); + List delFiles = new ArrayList<>(); + for (FileInfoVO fileInfoVO : fileInfo) { + String sourceFile = fileInfoVO.getUrl(); + if (FuncUtil.isNotEmpty(sourceFile)) { + // 创建文件 + String templatePath2 = StrUtil.format(pathUrl + "/{}", fileInfoVO.getName()); + try { + FileUtil.touch(templatePath2); + } catch (Exception e) { + e.printStackTrace(); + } + + //String htmlText = HttpUtil.get(sourceFile); + //FileUtil.writeString(htmlText, templatePath2, "UTF-8"); + // 获取请求的路径 + String path = StrUtil.subAfter(fileInfoVO.getUrl(), "/get/", false); + if (StrUtil.isEmpty(path)) { + continue; + //throw new IllegalArgumentException("结尾的 path 路径必须传递"); + } + byte[] fileContent = fileApi.getFileContent(23L, path); + File file = FileUtil.writeBytes(fileContent,templatePath2); + files.add(file); + delFiles.add(templatePath2); + } + } + if (FuncUtil.isEmpty(files)) { + throw exception(ErrorCodeConstants.SALE_ORDER_NOT_FILE_EXPORT); + } + + String zipFileName = StrUtil.format(pathUrl + "/销售订单附件_{}.zip", entityData.get(0).getBillno()); + + // 压缩到的位置 + File zipFile = new File(zipFileName); + System.out.println("文件:" + zipFileName); + ZipUtil.zip(zipFile, false, files.toArray(new File[files.size()])); + + // 设置响应类型 + //response.setContentType("application/pdf"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8")); + + // 输出PDF到响应输出流 + // 将文件内容写入响应流 + try (InputStream inputStream = new FileInputStream(zipFile)) { + IoUtil.copy(inputStream, response.getOutputStream()); + } catch (IOException e) { + // 异常处理 + log.info("写入流失败,{}", e.getMessage()); + } + } + /** * 下载ZIP压缩包(会对下载后的压缩包进行删除) * 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 a558a4e..869ebc1 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 @@ -123,5 +123,20 @@ export const SaleOrderApi = { ids: ids.join(',') } return await request.download({ url: `/oms/sale-order/exportDesignSourceFile`, params}) - } + }, + // 下载附件 + exportAttrFile: async (id: number) => { + const params = { + id: id + } + return await request.download({ url: `/oms/sale-order/exportAttrFile`, params}) + }, + // 驳回 + pushOutBill: async (data) => { + return await request.post({ + url: `/oms/sale-order/pushOutBill`, + 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 ef1bee4..1b9aa5c 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 @@ -259,7 +259,7 @@ :formatter="dateFormatter" width="180px" /> - + @@ -308,6 +335,25 @@ + + + + + + + + + + + + + + + +