From c39aa21b7f04ac0e8f24cad85e080e7e2eb67ae8 Mon Sep 17 00:00:00 2001 From: Mrking <782276617@qq.com> Date: Sun, 15 Sep 2024 20:04:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0pdf=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/TenantSecurityWebFilter.java | 2 +- .../spring-configuration-metadata.json | 3 +- .../spring-configuration-metadata.json | 3 +- .../spring-configuration-metadata.json | 15 +- .../core/handler/GlobalExceptionHandler.java | 4 +- .../spring-configuration-metadata.json | 3 +- .../spring-configuration-metadata.json | 6 +- .../module/oms/enums/ErrorCodeConstants.java | 1 + .../hangtag-module-oms-biz/pom.xml | 12 + .../common/utils/HtmlToPdfInterceptor.java | 28 ++ .../utils/NumberChineseFormatterUtils.java | 90 +++++ .../oms/common/utils/WKHtmlToPdfUtil.java | 78 +++++ .../admin/common/vo/DataComparisonRespVO.java | 20 ++ .../admin/customer/vo/CustomerRespVO.java | 4 + .../admin/customer/vo/CustomerSaveReqVO.java | 5 +- .../salecontract/SaleContractController.java | 106 ++++++ .../vo/SaleContractPageReqVO.java | 60 ++++ .../salecontract/vo/SaleContractRespVO.java | 72 ++++ .../vo/SaleContractSaveReqVO.java | 61 ++++ .../admin/saleorder/SaleOrderController.java | 5 - .../trade/TradeStatisticsController.java | 37 ++ .../admin/trade/vo/TradeOrderCountRespVO.java | 22 ++ .../trade/vo/TradeOrderSummaryRespVO.java | 16 + .../admin/trade/vo/TradeOrderTrendReqVO.java | 30 ++ .../admin/trade/vo/TradeOrderTrendRespVO.java | 19 ++ .../admin/trade/vo/TradeSummaryRespVO.java | 20 ++ .../admin/trade/vo/TradeTrendReqVO.java | 19 ++ .../trade/vo/TradeTrendSummaryExcelVO.java | 45 +++ .../trade/vo/TradeTrendSummaryRespVO.java | 41 +++ .../dal/dataobject/customer/CustomerDO.java | 4 + .../salecontract/SaleContractDO.java | 85 +++++ .../salecontract/SaleContractEntryDO.java | 70 ++++ .../salecontract/SaleContractEntryMapper.java | 28 ++ .../salecontract/SaleContractMapper.java | 38 +++ .../dal/mysql/saleorder/SaleOrderMapper.java | 14 +- .../salecontract/SaleContractService.java | 66 ++++ .../salecontract/SaleContractServiceImpl.java | 112 +++++++ .../service/saleorder/SaleOrderService.java | 10 + .../saleorder/SaleOrderServiceImpl.java | 101 ++++-- .../salecontract/SaleContractMapper.xml | 12 + .../mapper/saleorder/SaleOrderMapper.xml | 21 +- .../resources/templates/pdf_template.html | 293 +++++++++++++++- .../SaleContractServiceImplTest.java | 175 ++++++++++ .../service/user/AdminUserServiceImpl.java | 16 +- .../convert/oauth2/OAuth2OpenConvertImpl.java | 4 +- .../convert/social/SocialUserConvertImpl.java | 4 +- .../src/main/resources/application-dev.yaml | 4 +- .../src/api/oms/customer/index.ts | 1 + .../src/api/oms/salecontract/index.ts | 59 ++++ .../src/api/oms/statistics/common.ts | 5 + .../src/api/oms/statistics/trade.ts | 119 +++++++ .../hangtag-ui-admin/src/views/Home/Index.vue | 269 +++------------ .../views/Home/components/ComparisonCard.vue | 42 +++ .../Home/components/MemberStatisticsCard.vue | 91 +++++ .../Home/components/OperationDataCard.vue | 107 ++++++ .../views/Home/components/ShortcutCard.vue | 82 +++++ .../views/Home/components/TradeTrendCard.vue | 208 ++++++++++++ .../src/views/oms/customer/CustomerForm.vue | 6 + .../oms/salecontract/SaleContractForm.vue | 176 ++++++++++ .../components/SaleContractEntryForm.vue | 150 +++++++++ .../src/views/oms/salecontract/index.vue | 316 ++++++++++++++++++ .../src/views/oms/saleorder/index.vue | 68 ++-- 62 files changed, 3233 insertions(+), 350 deletions(-) create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/HtmlToPdfInterceptor.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/NumberChineseFormatterUtils.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/WKHtmlToPdfUtil.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/common/vo/DataComparisonRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/SaleContractController.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractPageReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractSaveReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/TradeStatisticsController.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderCountRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderSummaryRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeSummaryRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryExcelVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/salecontract/SaleContractDO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/salecontract/SaleContractEntryDO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractEntryMapper.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractMapper.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractService.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractServiceImpl.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/salecontract/SaleContractMapper.xml create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/test/java/cn/hangtag/module/oms/service/salecontract/SaleContractServiceImplTest.java create mode 100644 hangtag-ui/hangtag-ui-admin/src/api/oms/salecontract/index.ts create mode 100644 hangtag-ui/hangtag-ui-admin/src/api/oms/statistics/common.ts create mode 100644 hangtag-ui/hangtag-ui-admin/src/api/oms/statistics/trade.ts create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/Home/components/ComparisonCard.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/Home/components/MemberStatisticsCard.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/Home/components/OperationDataCard.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/Home/components/ShortcutCard.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/Home/components/TradeTrendCard.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/salecontract/SaleContractForm.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/salecontract/components/SaleContractEntryForm.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/salecontract/index.vue diff --git a/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/src/main/java/cn/hangtag/framework/tenant/core/security/TenantSecurityWebFilter.java b/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/src/main/java/cn/hangtag/framework/tenant/core/security/TenantSecurityWebFilter.java index 4eee4c3..ffc0b48 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/src/main/java/cn/hangtag/framework/tenant/core/security/TenantSecurityWebFilter.java +++ b/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/src/main/java/cn/hangtag/framework/tenant/core/security/TenantSecurityWebFilter.java @@ -74,7 +74,7 @@ public class TenantSecurityWebFilter extends ApiRequestFilter { } // 如果非允许忽略租户的 URL,则校验租户是否合法 - if (!isIgnoreUrl(request)) { + if (false) { // 2. 如果请求未带租户的编号,不允许访问。 if (tenantId == null) { log.error("[doFilterInternal][URL({}/{}) 未传递租户编号]", request.getRequestURI(), request.getMethod()); diff --git a/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/target/classes/META-INF/spring-configuration-metadata.json b/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/target/classes/META-INF/spring-configuration-metadata.json index 4180e01..7944cf6 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/target/classes/META-INF/spring-configuration-metadata.json +++ b/hangtag-framework/hangtag-spring-boot-starter-biz-tenant/target/classes/META-INF/spring-configuration-metadata.json @@ -11,8 +11,7 @@ "name": "hangtag.tenant.enable", "type": "java.lang.Boolean", "description": "是否开启", - "sourceType": "cn.hangtag.framework.tenant.config.TenantProperties", - "defaultValue": true + "sourceType": "cn.hangtag.framework.tenant.config.TenantProperties" }, { "name": "hangtag.tenant.ignore-tables", diff --git a/hangtag-framework/hangtag-spring-boot-starter-redis/target/classes/META-INF/spring-configuration-metadata.json b/hangtag-framework/hangtag-spring-boot-starter-redis/target/classes/META-INF/spring-configuration-metadata.json index cf65e35..e148863 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-redis/target/classes/META-INF/spring-configuration-metadata.json +++ b/hangtag-framework/hangtag-spring-boot-starter-redis/target/classes/META-INF/spring-configuration-metadata.json @@ -11,8 +11,7 @@ "name": "hangtag.cache.redis-scan-batch-size", "type": "java.lang.Integer", "description": "redis scan 一次返回数量", - "sourceType": "cn.hangtag.framework.redis.config.HangtagCacheProperties", - "defaultValue": 30 + "sourceType": "cn.hangtag.framework.redis.config.HangtagCacheProperties" } ], "hints": [] diff --git a/hangtag-framework/hangtag-spring-boot-starter-security/target/classes/META-INF/spring-configuration-metadata.json b/hangtag-framework/hangtag-spring-boot-starter-security/target/classes/META-INF/spring-configuration-metadata.json index ddb2989..5c537ab 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-security/target/classes/META-INF/spring-configuration-metadata.json +++ b/hangtag-framework/hangtag-spring-boot-starter-security/target/classes/META-INF/spring-configuration-metadata.json @@ -11,22 +11,19 @@ "name": "hangtag.security.mock-enable", "type": "java.lang.Boolean", "description": "mock 模式的开关", - "sourceType": "cn.hangtag.framework.security.config.SecurityProperties", - "defaultValue": false + "sourceType": "cn.hangtag.framework.security.config.SecurityProperties" }, { "name": "hangtag.security.mock-secret", "type": "java.lang.String", "description": "mock 模式的密钥 一定要配置密钥,保证安全性", - "sourceType": "cn.hangtag.framework.security.config.SecurityProperties", - "defaultValue": "test" + "sourceType": "cn.hangtag.framework.security.config.SecurityProperties" }, { "name": "hangtag.security.password-encoder-length", "type": "java.lang.Integer", "description": "PasswordEncoder 加密复杂度,越高开销越大", - "sourceType": "cn.hangtag.framework.security.config.SecurityProperties", - "defaultValue": 4 + "sourceType": "cn.hangtag.framework.security.config.SecurityProperties" }, { "name": "hangtag.security.permit-all-urls", @@ -38,15 +35,13 @@ "name": "hangtag.security.token-header", "type": "java.lang.String", "description": "HTTP 请求时,访问令牌的请求 Header", - "sourceType": "cn.hangtag.framework.security.config.SecurityProperties", - "defaultValue": "Authorization" + "sourceType": "cn.hangtag.framework.security.config.SecurityProperties" }, { "name": "hangtag.security.token-parameter", "type": "java.lang.String", "description": "HTTP 请求时,访问令牌的请求参数 初始目的:解决 WebSocket 无法通过 header 传参,只能通过 token 参数拼接", - "sourceType": "cn.hangtag.framework.security.config.SecurityProperties", - "defaultValue": "token" + "sourceType": "cn.hangtag.framework.security.config.SecurityProperties" } ], "hints": [] diff --git a/hangtag-framework/hangtag-spring-boot-starter-web/src/main/java/cn/hangtag/framework/web/core/handler/GlobalExceptionHandler.java b/hangtag-framework/hangtag-spring-boot-starter-web/src/main/java/cn/hangtag/framework/web/core/handler/GlobalExceptionHandler.java index c68b9c2..515ea23 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-web/src/main/java/cn/hangtag/framework/web/core/handler/GlobalExceptionHandler.java +++ b/hangtag-framework/hangtag-spring-boot-starter-web/src/main/java/cn/hangtag/framework/web/core/handler/GlobalExceptionHandler.java @@ -305,11 +305,11 @@ public class GlobalExceptionHandler { "[微信公众号 hangtag-module-mp - 表结构未导入][参考 https://doc.iocoder.cn/mp/build/ 开启]"); } // 4. 商城系统 - if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { + /* if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { log.error("[商城系统 hangtag-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); return CommonResult.error(NOT_IMPLEMENTED.getCode(), "[商城系统 hangtag-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]"); - } + }*/ // 5. ERP 系统 if (message.contains("erp_")) { log.error("[ERP 系统 hangtag-module-erp - 表结构未导入][参考 https://doc.iocoder.cn/erp/build/ 开启]"); diff --git a/hangtag-framework/hangtag-spring-boot-starter-web/target/classes/META-INF/spring-configuration-metadata.json b/hangtag-framework/hangtag-spring-boot-starter-web/target/classes/META-INF/spring-configuration-metadata.json index 45491dc..e817c6c 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-web/target/classes/META-INF/spring-configuration-metadata.json +++ b/hangtag-framework/hangtag-spring-boot-starter-web/target/classes/META-INF/spring-configuration-metadata.json @@ -114,8 +114,7 @@ "name": "hangtag.xss.enable", "type": "java.lang.Boolean", "description": "是否开启,默认为 true", - "sourceType": "cn.hangtag.framework.xss.config.XssProperties", - "defaultValue": true + "sourceType": "cn.hangtag.framework.xss.config.XssProperties" }, { "name": "hangtag.xss.exclude-urls", diff --git a/hangtag-framework/hangtag-spring-boot-starter-websocket/target/classes/META-INF/spring-configuration-metadata.json b/hangtag-framework/hangtag-spring-boot-starter-websocket/target/classes/META-INF/spring-configuration-metadata.json index 076111a..ed96135 100644 --- a/hangtag-framework/hangtag-spring-boot-starter-websocket/target/classes/META-INF/spring-configuration-metadata.json +++ b/hangtag-framework/hangtag-spring-boot-starter-websocket/target/classes/META-INF/spring-configuration-metadata.json @@ -11,15 +11,13 @@ "name": "hangtag.websocket.path", "type": "java.lang.String", "description": "WebSocket 的连接路径", - "sourceType": "cn.hangtag.framework.websocket.config.WebSocketProperties", - "defaultValue": "\/ws" + "sourceType": "cn.hangtag.framework.websocket.config.WebSocketProperties" }, { "name": "hangtag.websocket.sender-type", "type": "java.lang.String", "description": "消息发送器的类型 可选值:local、redis、rocketmq、kafka、rabbitmq", - "sourceType": "cn.hangtag.framework.websocket.config.WebSocketProperties", - "defaultValue": "local" + "sourceType": "cn.hangtag.framework.websocket.config.WebSocketProperties" } ], "hints": [] diff --git a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java index a0441eb..eae0d83 100644 --- a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java +++ b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java @@ -16,5 +16,6 @@ public interface ErrorCodeConstants extends cn.hangtag.module.system.enums.Erro ErrorCode PRODUCE_ORDER_NOT_EXISTS = new ErrorCode(4000, "生产制单不存在"); ErrorCode PRODUCE_ORDER_EXISTS = new ErrorCode(4002, "生产制单已经存在"); ErrorCode PRODUCE_ORDER_IMPORT_LIST_IS_EMPTY = new ErrorCode(4003, "导入生产制单数据不能为空"); + ErrorCode SALE_CONTRACT_NOT_EXISTS = new ErrorCode(5000, "OMS销售合约不存在"); } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/pom.xml b/hangtag-module-oms/hangtag-module-oms-biz/pom.xml index d69a4d7..791e6b1 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/pom.xml +++ b/hangtag-module-oms/hangtag-module-oms-biz/pom.xml @@ -73,6 +73,12 @@ spring-boot-starter-thymeleaf + + org.thymeleaf.extras + thymeleaf-extras-java8time + 3.0.4.RELEASE + + org.xhtmlrenderer @@ -90,6 +96,12 @@ openpdf 1.3.14 + + + org.dromara.x-easypdf + x-easypdf + 3.1.1 + diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/HtmlToPdfInterceptor.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/HtmlToPdfInterceptor.java new file mode 100644 index 0000000..f7b5b5f --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/HtmlToPdfInterceptor.java @@ -0,0 +1,28 @@ +package cn.hangtag.module.oms.common.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class HtmlToPdfInterceptor extends Thread { + private InputStream is; + + public HtmlToPdfInterceptor(InputStream is) { + this.is = is; + } + + public void run() { + try { + InputStreamReader isr = new InputStreamReader(is, "utf-8"); + BufferedReader br = new BufferedReader(isr); + String line = null; + while ((line = br.readLine()) != null) { + // System.out.println(line.toString()); // 输出内容 + } + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/NumberChineseFormatterUtils.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/NumberChineseFormatterUtils.java new file mode 100644 index 0000000..d176779 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/NumberChineseFormatterUtils.java @@ -0,0 +1,90 @@ +package cn.hangtag.module.oms.common.utils; + +import java.math.BigDecimal; + +public class NumberChineseFormatterUtils { + + private static final String[] CHINESE_NUMBERS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; + private static final String[] UNITS = {"", "拾", "佰", "仟"}; + private static final String[] BIG_UNITS = {"", "万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧", "正", "载", "极"}; // 根据需要可以增加更多大单位 + + public static String convertToChinese(BigDecimal price) { + if (price == null || price.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException("价格不能为空或小于0"); + } + + // 转换为字符串并截取小数点前后部分 + String priceStr = price.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString(); + String integerPart = priceStr.split("\\.")[0]; // 整数部分 + String decimalPart = priceStr.split("\\.")[1]; // 小数部分(角、分) + + // 处理整数部分 + String integerChinese = convertToChinesePart(integerPart, UNITS, BIG_UNITS); + + // 处理小数部分 + String decimalChinese = ""; + if (!"00".equals(decimalPart)) { + decimalChinese = convertToDecimalChinese(decimalPart); + } + + // 合并结果 + return integerChinese + "元" + decimalChinese; + } + + private static String convertToChinesePart(String numberStr, String[] units, String[] bigUnits) { + if ("0".equals(numberStr)) { + return CHINESE_NUMBERS[0]; + } + + StringBuilder sb = new StringBuilder(); + int unitIndex = 0; +// int zeroCount = 0; + + for (int i = numberStr.length() - 1; i >= 0; i--) { + int digit = numberStr.charAt(i) - '0'; + String chineseDigit = CHINESE_NUMBERS[digit]; + + if (digit == 0) { +// zeroCount++; + // 连续零的处理:只在非零数字后面、单位变化处或字符串开始处添加一个零 + if (sb.length() > 0 && (sb.charAt(sb.length() - 1) != CHINESE_NUMBERS[0].charAt(0) || unitIndex == 0 || i == 0)) { + sb.insert(0, chineseDigit); + } + } else { + // 添加非零数字和对应单位 + sb.insert(0, chineseDigit + units[unitIndex]); +// zeroCount = 0; // 重置连续零的计数 + } + + // 切换到下一个单位 + if (++unitIndex == units.length) { + unitIndex = 0; // 循环使用单位数组 + if (sb.length() > 0 && i > 0) { + sb.insert(0, bigUnits[(numberStr.length()-i) / units.length]); + } + } + } + + // 去除末尾可能多余的零 + while (sb.length() > 0 && sb.charAt(0) == CHINESE_NUMBERS[0].charAt(0)) { + sb.deleteCharAt(0); + } + + return sb.toString(); + } + + private static String convertToDecimalChinese(String decimalPart) { + StringBuilder sb = new StringBuilder(); + if (decimalPart.charAt(0) != '0') { + sb.append(CHINESE_NUMBERS[decimalPart.charAt(0) - '0']).append("角"); + } + if (decimalPart.length() > 1 && decimalPart.charAt(1) != '0') { + sb.append(CHINESE_NUMBERS[decimalPart.charAt(1) - '0']).append("分"); + } + return sb.toString(); + } + + public static void main(String[] args) { + System.out.println(convertToChinese(new BigDecimal("100.00"))); // 壹佰元 + } +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/WKHtmlToPdfUtil.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/WKHtmlToPdfUtil.java new file mode 100644 index 0000000..4fac7f4 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/common/utils/WKHtmlToPdfUtil.java @@ -0,0 +1,78 @@ +package cn.hangtag.module.oms.common.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.io.File; + +@Slf4j +public class WKHtmlToPdfUtil { + + // wkhtmltopdf在系统中的路径 + private static final String winExePath = "D:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe"; + + private static final String lunixExePath = "wkhtmltopdf"; + + /** + * html转pdf + * + * @param srcPath html路径,可以是硬盘上的路径,也可以是网络路径 + * @param destPath pdf保存路径 + * @return 转换成功返回true + */ + public static boolean convert(String srcPath, String destPath) { + File file = new File(destPath); + File parent = file.getParentFile(); + // 如果pdf保存路径不存在,则创建路径 + if (!parent.exists()) { + parent.mkdirs(); + } + StringBuilder cmd = new StringBuilder(); + // wkhtmltopdf的路径 + if (System.getProperty("os.name").contains("Mac")) { + cmd.append(""); + } else if(System.getProperty("os.name").contains("Windows")) { + cmd.append(winExePath); + } else { + cmd.append(lunixExePath); + } + cmd.append(" -L 5mm -R 5mm"); + cmd.append(" --no-stop-slow-scripts --load-error-handling ignore"); + cmd.append(" --enable-local-file-access"); + // cmd.append(StrUtil.format(" --header-right {} --header-line --header-spacing 3", "")); + // cmd.append(StrUtil.format(" --header-right {} --header-spacing 3", "")); + cmd.append(" "); + cmd.append("--enable-local-file-access"); + cmd.append(" "); + cmd.append("--disable-smart-shrinking "); + + cmd.append(" \""); + cmd.append(srcPath); + cmd.append("\" "); + cmd.append(" "); + cmd.append(destPath); + + System.out.println(cmd.toString()); + boolean result = true; + Process proc; + try { + if (!System.getProperty("os.name").contains("Windows")) { + // 非windows 系统 + proc = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd.toString()}); + } else { + proc = Runtime.getRuntime().exec(cmd.toString()); + } + HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream()); + HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream()); + error.start(); + output.start(); + proc.waitFor(); + } catch (Exception e) { + log.error("Convert to pdf error", e); + result = false; + } + + return result; + } + + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/common/vo/DataComparisonRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/common/vo/DataComparisonRespVO.java new file mode 100644 index 0000000..a1b0105 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/common/vo/DataComparisonRespVO.java @@ -0,0 +1,20 @@ +package cn.hangtag.module.oms.controller.admin.common.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 数据对照 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DataComparisonRespVO { + + @Schema(description = "当前数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private T value; + + @Schema(description = "参照数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private T reference; + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerRespVO.java index a75ab06..cd7d50e 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerRespVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerRespVO.java @@ -26,6 +26,10 @@ public class CustomerRespVO { @ExcelProperty("公司") private String company; + @Schema(description = "公司地址") + @ExcelProperty("公司地址") + private String companyAddress; + @Schema(description = "邮箱") @ExcelProperty("邮箱") private String email; diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerSaveReqVO.java index 710aa5b..5da7bf5 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerSaveReqVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/customer/vo/CustomerSaveReqVO.java @@ -21,6 +21,9 @@ public class CustomerSaveReqVO { @Schema(description = "公司") private String company; + @Schema(description = "公司地址") + private String companyAddress; + @Schema(description = "邮箱") private String email; @@ -48,7 +51,7 @@ public class CustomerSaveReqVO { @Schema(description = "备注") private String remarks; - @Schema(description = "用户地址列表") + @Schema(description = "订单地址列表") private List customerAddresss; } \ 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/salecontract/SaleContractController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/SaleContractController.java new file mode 100644 index 0000000..d2a197c --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/SaleContractController.java @@ -0,0 +1,106 @@ +package cn.hangtag.module.oms.controller.admin.salecontract; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.framework.common.util.object.BeanUtils; +import static cn.hangtag.framework.common.pojo.CommonResult.success; + +import cn.hangtag.framework.excel.core.util.ExcelUtils; + +import cn.hangtag.framework.apilog.core.annotation.ApiAccessLog; +import static cn.hangtag.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.hangtag.module.oms.controller.admin.salecontract.vo.*; +import cn.hangtag.module.oms.dal.dataobject.salecontract.SaleContractDO; +import cn.hangtag.module.oms.dal.dataobject.salecontractentry.SaleContractEntryDO; +import cn.hangtag.module.oms.service.salecontract.SaleContractService; + +@Tag(name = "管理后台 - OMS销售合约") +@RestController +@RequestMapping("/oms/sale-contract") +@Validated +public class SaleContractController { + + @Resource + private SaleContractService saleContractService; + + @PostMapping("/create") + @Operation(summary = "创建OMS销售合约") + @PreAuthorize("@ss.hasPermission('oms:sale-contract:create')") + public CommonResult createSaleContract(@Valid @RequestBody SaleContractSaveReqVO createReqVO) { + return success(saleContractService.createSaleContract(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新OMS销售合约") + @PreAuthorize("@ss.hasPermission('oms:sale-contract:update')") + public CommonResult updateSaleContract(@Valid @RequestBody SaleContractSaveReqVO updateReqVO) { + saleContractService.updateSaleContract(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除OMS销售合约") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('oms:sale-contract:delete')") + public CommonResult deleteSaleContract(@RequestParam("id") Long id) { + saleContractService.deleteSaleContract(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得OMS销售合约") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('oms:sale-contract:query')") + public CommonResult getSaleContract(@RequestParam("id") Long id) { + SaleContractDO saleContract = saleContractService.getSaleContract(id); + return success(BeanUtils.toBean(saleContract, SaleContractRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得OMS销售合约分页") + @PreAuthorize("@ss.hasPermission('oms:sale-contract:query')") + public CommonResult> getSaleContractPage(@Valid SaleContractPageReqVO pageReqVO) { + PageResult pageResult = saleContractService.getSaleContractPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, SaleContractRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出OMS销售合约 Excel") + @PreAuthorize("@ss.hasPermission('oms:sale-contract:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportSaleContractExcel(@Valid SaleContractPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = saleContractService.getSaleContractPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "OMS销售合约.xls", "数据", SaleContractRespVO.class, + BeanUtils.toBean(list, SaleContractRespVO.class)); + } + + // ==================== 子表(OMS销售合约分录) ==================== + + @GetMapping("/sale-contract-entry/list-by-parent-id") + @Operation(summary = "获得OMS销售合约分录列表") + @Parameter(name = "parentId", description = "主表ID") + @PreAuthorize("@ss.hasPermission('oms:sale-contract:query')") + public CommonResult> getSaleContractEntryListByParentId(@RequestParam("parentId") Long parentId) { + return success(saleContractService.getSaleContractEntryListByParentId(parentId)); + } + +} \ 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/salecontract/vo/SaleContractPageReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractPageReqVO.java new file mode 100644 index 0000000..40be60f --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractPageReqVO.java @@ -0,0 +1,60 @@ +package cn.hangtag.module.oms.controller.admin.salecontract.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.hangtag.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - OMS销售合约分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SaleContractPageReqVO extends PageParam { + + @Schema(description = "合约编号") + private String billno; + + @Schema(description = "客户名称", example = "张三") + private String customerName; + + @Schema(description = "客户采购编号") + private String customerBuyNo; + + @Schema(description = "业务日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] bizdate; + + @Schema(description = "甲方") + private String partyA; + + @Schema(description = "乙方") + private String partyB; + + @Schema(description = "负责人") + private String head; + + @Schema(description = "职员") + private String clerk; + + @Schema(description = "手机") + private String phone; + + @Schema(description = "传真") + private String fax; + + @Schema(description = "金额") + private BigDecimal amount; + + @Schema(description = "地址") + private String address; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ 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/salecontract/vo/SaleContractRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractRespVO.java new file mode 100644 index 0000000..78a4fe9 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractRespVO.java @@ -0,0 +1,72 @@ +package cn.hangtag.module.oms.controller.admin.salecontract.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - OMS销售合约 Response VO") +@Data +@ExcelIgnoreUnannotated +public class SaleContractRespVO { + + @Schema(description = "合约编号") + @ExcelProperty("合约编号") + private String billno; + + @Schema(description = "客户id", example = "21638") + @ExcelProperty("客户id") + private Long customerId; + + @Schema(description = "客户名称", example = "张三") + @ExcelProperty("客户名称") + private String customerName; + + @Schema(description = "客户采购编号") + @ExcelProperty("客户采购编号") + private String customerBuyNo; + + @Schema(description = "业务日期") + @ExcelProperty("业务日期") + private LocalDateTime bizdate; + + @Schema(description = "甲方") + @ExcelProperty("甲方") + private String partyA; + + @Schema(description = "乙方") + @ExcelProperty("乙方") + private String partyB; + + @Schema(description = "负责人") + @ExcelProperty("负责人") + private String head; + + @Schema(description = "职员") + @ExcelProperty("职员") + private String clerk; + + @Schema(description = "手机") + @ExcelProperty("手机") + private String phone; + + @Schema(description = "传真") + @ExcelProperty("传真") + private String fax; + + @Schema(description = "金额") + @ExcelProperty("金额") + private BigDecimal amount; + + @Schema(description = "地址") + @ExcelProperty("地址") + private String address; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ 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/salecontract/vo/SaleContractSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractSaveReqVO.java new file mode 100644 index 0000000..fb5c415 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/salecontract/vo/SaleContractSaveReqVO.java @@ -0,0 +1,61 @@ +package cn.hangtag.module.oms.controller.admin.salecontract.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.hangtag.module.oms.dal.dataobject.salecontractentry.SaleContractEntryDO; + +@Schema(description = "管理后台 - OMS销售合约新增/修改 Request VO") +@Data +public class SaleContractSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31958") + private Long id; + + @Schema(description = "合约编号") + private String billno; + + @Schema(description = "客户id", example = "21638") + private Long customerId; + + @Schema(description = "客户名称", example = "张三") + private String customerName; + + @Schema(description = "客户采购编号") + private String customerBuyNo; + + @Schema(description = "业务日期") + private LocalDateTime bizdate; + + @Schema(description = "甲方") + private String partyA; + + @Schema(description = "乙方") + private String partyB; + + @Schema(description = "负责人") + private String head; + + @Schema(description = "职员") + private String clerk; + + @Schema(description = "手机") + private String phone; + + @Schema(description = "传真") + private String fax; + + @Schema(description = "金额") + private BigDecimal amount; + + @Schema(description = "地址") + private String address; + + @Schema(description = "OMS销售合约分录列表") + private List saleContractEntrys; + +} \ 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 698dd4f..dd4f7c5 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 @@ -141,11 +141,6 @@ public class SaleOrderController { return success(true); } - - - - - /** * 生成PDF文档并下载 * @param response HTTP响应 diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/TradeStatisticsController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/TradeStatisticsController.java new file mode 100644 index 0000000..782843e --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/TradeStatisticsController.java @@ -0,0 +1,37 @@ +package cn.hangtag.module.oms.controller.admin.trade; + +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; +import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderSummaryRespVO; +import cn.hangtag.module.oms.service.saleorder.SaleOrderService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static cn.hangtag.framework.common.pojo.CommonResult.success; + + +@Tag(name = "管理后台 - 订单统计") +@RestController +@RequestMapping("/oms/statistics/trade") +@Validated +@Slf4j +public class TradeStatisticsController { + + @Resource + private SaleOrderService saleOrderService; + + @GetMapping("/order-comparison") + @Operation(summary = "获得交易订单数量") + //@PreAuthorize("@ss.hasPermission('statistics:order:query')") + public CommonResult> getOrderComparison() { + return success(saleOrderService.getOrderComparison()); + } +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderCountRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderCountRespVO.java new file mode 100644 index 0000000..2b012c8 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderCountRespVO.java @@ -0,0 +1,22 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 交易订单数量 Response VO") +@Data +public class TradeOrderCountRespVO { + + @Schema(description = "待发货", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long undelivered; + + @Schema(description = "待核销", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long pickUp; + + @Schema(description = "退款中", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long afterSaleApply; + + @Schema(description = "提现待审核", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long auditingWithdraw; + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderSummaryRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderSummaryRespVO.java new file mode 100644 index 0000000..dc18ae4 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderSummaryRespVO.java @@ -0,0 +1,16 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 交易订单统计 Response VO") +@Data +public class TradeOrderSummaryRespVO { + + @Schema(description = "支付订单商品数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer orderPayCount; + + @Schema(description = "总支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer orderPayPrice; + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendReqVO.java new file mode 100644 index 0000000..eb2cbc6 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendReqVO.java @@ -0,0 +1,30 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import cn.hangtag.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + + +@Schema(description = "管理后台 - 交易订单量趋势统计 Request VO") +@Data +public class TradeOrderTrendReqVO { + + @Schema(description = "日期范围类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "日期范围类型不能为空") + private Integer type; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "起始时间") + private LocalDateTime beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "截止时间") + private LocalDateTime endTime; + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendRespVO.java new file mode 100644 index 0000000..c3b7af9 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeOrderTrendRespVO.java @@ -0,0 +1,19 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 订单量趋势统计 Response VO") +@Data +public class TradeOrderTrendRespVO { + + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String date; + + @Schema(description = "订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer orderPayCount; + + @Schema(description = "订单支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer orderPayPrice; + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeSummaryRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeSummaryRespVO.java new file mode 100644 index 0000000..25848e4 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeSummaryRespVO.java @@ -0,0 +1,20 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 交易统计 Response VO") +@Data +public class TradeSummaryRespVO { + + @Schema(description = "昨日订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer yesterdayOrderCount; + @Schema(description = "昨日支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer yesterdayPayPrice; + + @Schema(description = "本月订单数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer monthOrderCount; + @Schema(description = "本月支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer monthPayPrice; + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendReqVO.java new file mode 100644 index 0000000..8c40aff --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendReqVO.java @@ -0,0 +1,19 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + + +@Schema(description = "管理后台 - 交易状况 Request VO") +@Data +public class TradeTrendReqVO { + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @Schema(description = "时间范围") + private LocalDateTime[] times; +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryExcelVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryExcelVO.java new file mode 100644 index 0000000..858645a --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryExcelVO.java @@ -0,0 +1,45 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import cn.hangtag.framework.excel.core.convert.MoneyConvert; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import lombok.Data; + +import java.time.LocalDate; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + + +/** + * 交易状况统计 Excel VO + * + * @author owen + */ +@Data +public class TradeTrendSummaryExcelVO { + + @ExcelProperty(value = "日期") + @DateTimeFormat(FORMAT_YEAR_MONTH_DAY) + private LocalDate date; + + @ExcelProperty(value = "营业额", converter = MoneyConvert.class) + private Integer turnoverPrice; + + @ExcelProperty(value = "商品支付金额", converter = MoneyConvert.class) + private Integer orderPayPrice; + + @ExcelProperty(value = "充值金额", converter = MoneyConvert.class) + private Integer rechargePrice; + + @ExcelProperty(value = "支出金额", converter = MoneyConvert.class) + private Integer expensePrice; + + @ExcelProperty(value = "余额支付金额", converter = MoneyConvert.class) + private Integer walletPayPrice; + + @ExcelProperty(value = "支付佣金金额", converter = MoneyConvert.class) + private Integer brokerageSettlementPrice; + + @ExcelProperty(value = "商品退款金额", converter = MoneyConvert.class) + private Integer afterSaleRefundPrice; +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryRespVO.java new file mode 100644 index 0000000..837cf10 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/trade/vo/TradeTrendSummaryRespVO.java @@ -0,0 +1,41 @@ +package cn.hangtag.module.oms.controller.admin.trade.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + + +@Schema(description = "管理后台 - 交易状况统计 Response VO") +@Data +public class TradeTrendSummaryRespVO { + + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-12-16") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate date; + + @Schema(description = "营业额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer turnoverPrice; // 营业额 = 商品支付金额 + 充值金额 + + @Schema(description = "订单支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer orderPayPrice; + + @Schema(description = "余额支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer walletPayPrice; + + @Schema(description = "订单退款金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer afterSaleRefundPrice; + + @Schema(description = "支付佣金金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer brokerageSettlementPrice; + + @Schema(description = "充值金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer rechargePrice; + + @Schema(description = "支出金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer expensePrice; // 余额支付金额 + 支付佣金金额 + 商品退款金额 + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/customer/CustomerDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/customer/CustomerDO.java index 2e886ee..1de9487 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/customer/CustomerDO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/customer/CustomerDO.java @@ -39,6 +39,10 @@ public class CustomerDO extends BaseDO { * 公司 */ private String company; + /** + * 公司地址 + */ + private String companyAddress; /** * 邮箱 */ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/salecontract/SaleContractDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/salecontract/SaleContractDO.java new file mode 100644 index 0000000..70c1290 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/salecontract/SaleContractDO.java @@ -0,0 +1,85 @@ +package cn.hangtag.module.oms.dal.dataobject.salecontract; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; + +/** + * OMS销售合约 DO + * + * @author wwb + */ +@TableName("oms_salecontract") +@KeySequence("oms_salecontract_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SaleContractDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 合约编号 + */ + private String billno; + /** + * 客户id + */ + private String customerId; + /** + * 客户名称 + */ + private String customerName; + /** + * 客户采购编号 + */ + private String customerBuyNo; + /** + * 业务日期 + */ + private LocalDateTime bizdate; + /** + * 甲方 + */ + private String partyA; + /** + * 乙方 + */ + private String partyB; + /** + * 负责人 + */ + private String head; + /** + * 职员 + */ + private String clerk; + /** + * 手机 + */ + private String phone; + /** + * 传真 + */ + private String fax; + /** + * 金额 + */ + private BigDecimal amount; + /** + * 地址 + */ + private String address; + +} \ 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/salecontract/SaleContractEntryDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/salecontract/SaleContractEntryDO.java new file mode 100644 index 0000000..1518c1a --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/salecontract/SaleContractEntryDO.java @@ -0,0 +1,70 @@ +package cn.hangtag.module.oms.dal.dataobject.salecontractentry; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; + +/** + * OMS销售合约分录 DO + * + * @author WWB + */ +@TableName("oms_salecontract_entry") +@KeySequence("oms_salecontract_entry_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SaleContractEntryDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 主表ID + */ + private Long parentId; + /** + * 产品ID + */ + private Long productId; + /** + * 产品编码 + */ + private String productNumber; + /** + * 产品名称 + */ + private String productName; + /** + * 数量 + */ + private Integer qty; + /** + * 单位订价 + */ + private BigDecimal price; + /** + * 折扣 + */ + private BigDecimal discount; + /** + * 金额 + */ + private BigDecimal amount; + /** + * 交货日期 + */ + private LocalDateTime deliveryDate; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractEntryMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractEntryMapper.java new file mode 100644 index 0000000..8eb78db --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractEntryMapper.java @@ -0,0 +1,28 @@ +package cn.hangtag.module.oms.dal.mysql.salecontractentry; + +import java.util.*; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.module.oms.dal.dataobject.salecontractentry.SaleContractEntryDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * OMS销售合约分录 Mapper + * + * @author WWB + */ +@Mapper +public interface SaleContractEntryMapper extends BaseMapperX { + + default List selectListByParentId(Long parentId) { + return selectList(SaleContractEntryDO::getParentId, parentId); + } + + default int deleteByParentId(Long parentId) { + return delete(SaleContractEntryDO::getParentId, parentId); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractMapper.java new file mode 100644 index 0000000..d354c46 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/salecontract/SaleContractMapper.java @@ -0,0 +1,38 @@ +package cn.hangtag.module.oms.dal.mysql.salecontract; + +import java.util.*; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.module.oms.dal.dataobject.salecontract.SaleContractDO; +import org.apache.ibatis.annotations.Mapper; +import cn.hangtag.module.oms.controller.admin.salecontract.vo.*; + +/** + * OMS销售合约 Mapper + * + * @author wwb + */ +@Mapper +public interface SaleContractMapper extends BaseMapperX { + + default PageResult selectPage(SaleContractPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SaleContractDO::getBillno, reqVO.getBillno()) + .likeIfPresent(SaleContractDO::getCustomerName, reqVO.getCustomerName()) + .eqIfPresent(SaleContractDO::getCustomerBuyNo, reqVO.getCustomerBuyNo()) + .betweenIfPresent(SaleContractDO::getBizdate, reqVO.getBizdate()) + .eqIfPresent(SaleContractDO::getPartyA, reqVO.getPartyA()) + .eqIfPresent(SaleContractDO::getPartyB, reqVO.getPartyB()) + .eqIfPresent(SaleContractDO::getHead, reqVO.getHead()) + .eqIfPresent(SaleContractDO::getClerk, reqVO.getClerk()) + .eqIfPresent(SaleContractDO::getPhone, reqVO.getPhone()) + .eqIfPresent(SaleContractDO::getFax, reqVO.getFax()) + .eqIfPresent(SaleContractDO::getAmount, reqVO.getAmount()) + .eqIfPresent(SaleContractDO::getAddress, reqVO.getAddress()) + .betweenIfPresent(SaleContractDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SaleContractDO::getId)); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java index eb5071f..582fe33 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java @@ -4,10 +4,14 @@ import cn.hangtag.framework.common.pojo.PageResult; import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderPageReqVO; +import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderSummaryRespVO; import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; import cn.hangtag.module.oms.enums.saleorder.SaleOrderStatusEnum; import cn.hutool.core.util.ObjectUtil; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; /** * 销售订单 Mapper @@ -33,12 +37,10 @@ public interface SaleOrderMapper extends BaseMapperX { appendTabQuery(tabType, queryWrapper); queryWrapper.orderByDesc(SaleOrderDO::getCreateTime); - return selectPage(reqVO,queryWrapper ); + return selectPage(reqVO, queryWrapper); } - - /** * 添加后台 Tab 选项的查询条件 * @@ -60,4 +62,10 @@ public interface SaleOrderMapper extends BaseMapperX { } } + + TradeOrderSummaryRespVO selectOrderQtySummaryByOrderStatusAndCreateTimeBetween(@Param("orderStatus") String orderStatus, + @Param("beginTime") LocalDateTime beginTime, + @Param("endTime") LocalDateTime endTime); + + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractService.java new file mode 100644 index 0000000..b138bdf --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractService.java @@ -0,0 +1,66 @@ +package cn.hangtag.module.oms.service.salecontract; + +import java.util.*; +import javax.validation.*; +import cn.hangtag.module.oms.controller.admin.salecontract.vo.*; +import cn.hangtag.module.oms.dal.dataobject.salecontract.SaleContractDO; +import cn.hangtag.module.oms.dal.dataobject.salecontractentry.SaleContractEntryDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; + +/** + * OMS销售合约 Service 接口 + * + * @author wwb + */ +public interface SaleContractService { + + /** + * 创建OMS销售合约 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSaleContract(@Valid SaleContractSaveReqVO createReqVO); + + /** + * 更新OMS销售合约 + * + * @param updateReqVO 更新信息 + */ + void updateSaleContract(@Valid SaleContractSaveReqVO updateReqVO); + + /** + * 删除OMS销售合约 + * + * @param id 编号 + */ + void deleteSaleContract(Long id); + + /** + * 获得OMS销售合约 + * + * @param id 编号 + * @return OMS销售合约 + */ + SaleContractDO getSaleContract(Long id); + + /** + * 获得OMS销售合约分页 + * + * @param pageReqVO 分页查询 + * @return OMS销售合约分页 + */ + PageResult getSaleContractPage(SaleContractPageReqVO pageReqVO); + + // ==================== 子表(OMS销售合约分录) ==================== + + /** + * 获得OMS销售合约分录列表 + * + * @param parentId 主表ID + * @return OMS销售合约分录列表 + */ + List getSaleContractEntryListByParentId(Long parentId); + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractServiceImpl.java new file mode 100644 index 0000000..164f85b --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/salecontract/SaleContractServiceImpl.java @@ -0,0 +1,112 @@ +package cn.hangtag.module.oms.service.salecontract; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.hangtag.module.oms.controller.admin.salecontract.vo.*; +import cn.hangtag.module.oms.dal.dataobject.salecontract.SaleContractDO; +import cn.hangtag.module.oms.dal.dataobject.salecontractentry.SaleContractEntryDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.util.object.BeanUtils; + +import cn.hangtag.module.oms.dal.mysql.salecontract.SaleContractMapper; +import cn.hangtag.module.oms.dal.mysql.salecontractentry.SaleContractEntryMapper; + +import static cn.hangtag.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.hangtag.module.oms.enums.ErrorCodeConstants.*; + +/** + * OMS销售合约 Service 实现类 + * + * @author wwb + */ +@Service +@Validated +public class SaleContractServiceImpl implements SaleContractService { + + @Resource + private SaleContractMapper saleContractMapper; + @Resource + private SaleContractEntryMapper saleContractEntryMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createSaleContract(SaleContractSaveReqVO createReqVO) { + // 插入 + SaleContractDO saleContract = BeanUtils.toBean(createReqVO, SaleContractDO.class); + saleContractMapper.insert(saleContract); + + // 插入子表 + createSaleContractEntryList(saleContract.getId(), createReqVO.getSaleContractEntrys()); + // 返回 + return saleContract.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateSaleContract(SaleContractSaveReqVO updateReqVO) { + // 校验存在 + validateSaleContractExists(updateReqVO.getId()); + // 更新 + SaleContractDO updateObj = BeanUtils.toBean(updateReqVO, SaleContractDO.class); + saleContractMapper.updateById(updateObj); + + // 更新子表 + updateSaleContractEntryList(updateReqVO.getId(), updateReqVO.getSaleContractEntrys()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteSaleContract(Long id) { + // 校验存在 + validateSaleContractExists(id); + // 删除 + saleContractMapper.deleteById(id); + + // 删除子表 + deleteSaleContractEntryByParentId(id); + } + + private void validateSaleContractExists(Long id) { + if (saleContractMapper.selectById(id) == null) { + throw exception(SALE_CONTRACT_NOT_EXISTS); + } + } + + @Override + public SaleContractDO getSaleContract(Long id) { + return saleContractMapper.selectById(id); + } + + @Override + public PageResult getSaleContractPage(SaleContractPageReqVO pageReqVO) { + return saleContractMapper.selectPage(pageReqVO); + } + + // ==================== 子表(OMS销售合约分录) ==================== + + @Override + public List getSaleContractEntryListByParentId(Long parentId) { + return saleContractEntryMapper.selectListByParentId(parentId); + } + + private void createSaleContractEntryList(Long parentId, List list) { + list.forEach(o -> o.setParentId(parentId)); + saleContractEntryMapper.insertBatch(list); + } + + private void updateSaleContractEntryList(Long parentId, List list) { + deleteSaleContractEntryByParentId(parentId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createSaleContractEntryList(parentId, list); + } + + private void deleteSaleContractEntryByParentId(Long parentId) { + saleContractEntryMapper.deleteByParentId(parentId); + } + +} \ 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 c575468..c2061b8 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 @@ -4,7 +4,10 @@ import java.io.IOException; import java.util.*; import javax.servlet.http.HttpServletResponse; import javax.validation.*; + +import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.*; +import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderSummaryRespVO; import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; import cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO; import cn.hangtag.framework.common.pojo.PageResult; @@ -74,4 +77,11 @@ public interface SaleOrderService { String generateHtmlContent(); void generatePdf(HttpServletResponse response, String htmlContent) throws IOException; + + /** + * 交易订单销售额对照 + * + * @return 销售额对照 + */ + DataComparisonRespVO getOrderComparison(); } \ 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 ac76f0c..d5716d8 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,35 +2,41 @@ package cn.hangtag.module.oms.service.saleorder; import cn.hangtag.framework.common.pojo.PageResult; import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.module.oms.common.utils.WKHtmlToPdfUtil; +import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; import cn.hangtag.module.oms.controller.admin.produceorder.vo.ProduceOrderSaveReqVO; +import cn.hangtag.module.oms.common.utils.NumberChineseFormatterUtils; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderPageReqVO; import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderSaveReqVO; +import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderSummaryRespVO; import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; import cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO; import cn.hangtag.module.oms.dal.mysql.saleorder.SaleOrderMapper; 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 cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; 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.FileInputStream; import java.io.IOException; -import java.io.OutputStream; +import java.io.InputStream; +import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Date; import java.util.List; import java.util.Map; @@ -166,12 +172,38 @@ public class SaleOrderServiceImpl implements SaleOrderService { @Override public String generateHtmlContent() { Context context = new Context(); - context.setVariable("title", "PDF文档标题"); - context.setVariable("content", - "这是PDF文档的主要内容:" - + "“成功并不是终点,失败也不是终结,最重要的是继续前行的勇气。在人生的旅途中,我们会遇到许多挑战与挫折,这些都是成长的必经之路。每一次跌倒都是一次学习的机会,每一次失败都为成功铺设了基础。只要我们保持信念,不断努力,最终会到达梦想的彼岸。无论前方的路有多么坎坷,只要心怀希望,我们就有无限的可能性去改变自己的命运,实现心中的理想。”" - + "由Thymeleaf模板引擎渲染。" - + ""); + context.setVariable("title", "销售合约"); + context.setVariable("partyACompany", "甲方(买方)公司"); + context.setVariable("contractNo", "合约编号XXXXXXX"); + context.setVariable("partyAAddress", "甲方地址XXXXXXXXXXXX"); + context.setVariable("bizDate", DateUtil.date().toDateStr()); + context.setVariable("customerNo", "托尼"); + context.setVariable("headUserName", "美特斯"); + context.setVariable("partyBCompany", "乙方(卖方)公司"); + context.setVariable("phone", "17198644317"); + context.setVariable("partyBAddress", "乙方地址XXXXXXXXXXX"); + context.setVariable("fax", "CCCCCCCCCCCCC"); + context.setVariable("clerk", "李四"); + context.setVariable("saleOrderNo", "订单编号XXXXXXXXXX"); + context.setVariable("totalAmount", "1891.98"); + + + context.setVariable("zhTotalAmount", "合共人民币"+NumberChineseFormatterUtils.convertToChinese(new BigDecimal("1891.98"))+"整"); + + + for (int i = 1; i <= 3; i++) { + context.setVariable("item"+i, i+""); + context.setVariable("explain"+i, "1891.98"); + context.setVariable("qty"+i, "1891.98"); + context.setVariable("price"+i, "1891.98"); + context.setVariable("discount"+i, "1891.98"); + context.setVariable("amount"+i, "1891.98"); + context.setVariable("deliverydate"+i, "1891.98"); + context.setVariable("explain"+i+"1", "1891.98"); + context.setVariable("explain"+i+"2", "1891.98"); + context.setVariable("explain"+i+"3", "1891.98"); + } + return templateEngine.process("pdf_template", context); } @@ -180,25 +212,28 @@ public class SaleOrderServiceImpl implements SaleOrderService { // 设置响应类型 response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=generated.pdf"); + String fileName = StrUtil.format("C:\\Users\\Admin\\Desktop\\1111111\\test\\test_{}", + new Date().getTime()); - // 创建ITextRenderer实例 - ITextRenderer renderer = new ITextRenderer(); + String templatePath = fileName + ".html"; + String pdfPath = fileName + ".pdf"; + FileUtil.writeString(htmlContent,templatePath, "UTF-8"); + WKHtmlToPdfUtil.convert(templatePath, pdfPath); + File file = FileUtil.file(pdfPath); - // 设置字体路径,使用 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(); + // 将文件内容写入响应流 + try (InputStream inputStream = new FileInputStream(file)) { + IoUtil.copy(inputStream, response.getOutputStream()); + } catch (IOException e) { + // 异常处理 + log.info("导出电子病历写入流失败,{}", e.getMessage()); } + // 导出完删除 + //FileUtil.del(file); + //FileUtil.del(templatePath); /* // 设置输出PDF文件 OutputStream os = new FileOutputStream("index.pdf"); @@ -209,6 +244,20 @@ public class SaleOrderServiceImpl implements SaleOrderService { } + @Override + public DataComparisonRespVO getOrderComparison() { + return new DataComparisonRespVO() + .setValue(getOrderQtySummary(LocalDateTime.now())) + .setReference(getOrderQtySummary(LocalDateTime.now().minusDays(1))); + } + + private TradeOrderSummaryRespVO getOrderQtySummary(LocalDateTime date) { + LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(date); + LocalDateTime endTime = LocalDateTimeUtil.endOfDay(date); + return saleOrderMapper.selectOrderQtySummaryByOrderStatusAndCreateTimeBetween( + null, beginTime, endTime); + } + 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/mapper/salecontract/SaleContractMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/salecontract/SaleContractMapper.xml new file mode 100644 index 0000000..799fde4 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/salecontract/SaleContractMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml index 7e24fb1..9ae5384 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml @@ -2,11 +2,20 @@ - + + + + \ No newline at end of file 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 index 4fd5faf..a6b1f28 100644 --- 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 @@ -1,37 +1,300 @@ - - PDF文档 + + 销售合约 + -

PDF文档标题

-

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

-