From b4d97d6333a58c03047cac7eb9e234428960bda5 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Tue, 8 Sep 2026 16:48:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E5=8E=86=E5=8F=B2=E8=AF=95?= =?UTF-8?q?=E7=AE=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/price/BillingController.java | 27 ++++ .../main/resources/i18n/messages.properties | 4 + .../ruoyi/price/mapper/PrcQuoteMapper.java | 5 +- .../price/service/ITmsPriceQuoteService.java | 6 + .../impl/TmsPriceQuoteServiceImpl.java | 29 +++- .../resources/mapper/price/PrcQuoteMapper.xml | 34 +++++ bms-back/sql/price/billing_menu.sql | 6 +- bms-front/src/api/price/billing.js | 17 +++ bms-front/src/views/price/billing/quote.vue | 126 +++++++++++++++++- 9 files changed, 247 insertions(+), 7 deletions(-) diff --git a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/BillingController.java b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/BillingController.java index f62c99ef..a382d026 100644 --- a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/BillingController.java +++ b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/BillingController.java @@ -1,14 +1,19 @@ package com.ruoyi.web.controller.price; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; 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.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.price.domain.PrcQuote; import com.ruoyi.price.domain.vo.TmsPriceQuoteRequest; import com.ruoyi.price.domain.vo.TmsPriceQuoteResult; import com.ruoyi.price.service.ITmsPriceQuoteService; @@ -25,6 +30,28 @@ public class BillingController extends BaseController @Autowired private ITmsPriceQuoteService tmsPriceQuoteService; + /** + * Historical quote list. + */ + @PreAuthorize("@ss.hasPermi('price:billing:quote')") + @GetMapping("/quote/list") + public TableDataInfo list(PrcQuote query) + { + startPage(); + List list = tmsPriceQuoteService.selectQuoteList(query); + return getDataTable(list); + } + + /** + * Historical quote detail with fee lines. + */ + @PreAuthorize("@ss.hasPermi('price:billing:quote')") + @GetMapping("/quote/{quoteId}") + public AjaxResult getInfo(@PathVariable Long quoteId) + { + return success(tmsPriceQuoteService.getQuote(quoteId)); + } + /** * Same matching logic as TMS open API, for BMS console trial. */ diff --git a/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties b/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties index 7091d4b6..5524bef7 100644 --- a/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/bms-back/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -107,3 +107,7 @@ price.quote.productCodeRequired=productCode is required price.quote.countryRequired=countryCode or countryName is required price.quote.weightInvalid=weight must be > 0 price.quote.bizDateInvalid=bizDate format must be yyyy-MM-dd +price.quote.fixedPackageNoDetails=套餐固定价格没有明细,使用产品默认价格 +price.quote.noCustomerPackageOverride=没有客户套餐覆盖,使用产品默认运费/挂号费 +price.quote.quoteIdRequired=quoteId is required +price.quote.hitCustomerFixedPackageDetail=命中客户套餐固定价格明细 \ No newline at end of file diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcQuoteMapper.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcQuoteMapper.java index 770573b5..20e43beb 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcQuoteMapper.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcQuoteMapper.java @@ -1,8 +1,9 @@ package com.ruoyi.price.mapper; -import com.ruoyi.price.domain.PrcQuote; import java.math.BigDecimal; +import java.util.List; import org.apache.ibatis.annotations.Param; +import com.ruoyi.price.domain.PrcQuote; /** billing quote header mapper */ public interface PrcQuoteMapper @@ -11,6 +12,8 @@ public interface PrcQuoteMapper public PrcQuote selectPrcQuoteById(Long quoteId); + public List selectPrcQuoteList(PrcQuote quote); + public int insertPrcQuote(PrcQuote quote); public int updateQuoteAmounts(@Param("quoteId") Long quoteId, diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/ITmsPriceQuoteService.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/ITmsPriceQuoteService.java index 153c5716..4a118d79 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/ITmsPriceQuoteService.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/ITmsPriceQuoteService.java @@ -1,7 +1,9 @@ package com.ruoyi.price.service; +import com.ruoyi.price.domain.PrcQuote; import com.ruoyi.price.domain.vo.TmsPriceQuoteRequest; import com.ruoyi.price.domain.vo.TmsPriceQuoteResult; +import java.util.List; /** * TMS freight quote service. @@ -15,4 +17,8 @@ import com.ruoyi.price.domain.vo.TmsPriceQuoteResult; public interface ITmsPriceQuoteService { TmsPriceQuoteResult quote(TmsPriceQuoteRequest request); + + List selectQuoteList(PrcQuote query); + + TmsPriceQuoteResult getQuote(Long quoteId); } diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java index c2147661..b22f5143 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java @@ -112,6 +112,27 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService return result; } + @Override + public List selectQuoteList(PrcQuote query) + { + return quoteMapper.selectPrcQuoteList(query); + } + + @Override + public TmsPriceQuoteResult getQuote(Long quoteId) + { + if (quoteId == null) + { + throw new ServiceException(MessageUtils.message("price.quote.quoteIdRequired")); + } + PrcQuote quote = quoteMapper.selectPrcQuoteById(quoteId); + if (quote == null) + { + throw new ServiceException("QUOTE_NOT_FOUND: quoteId=" + quoteId); + } + return toResult(quote, quoteFeeMapper.selectByQuoteId(quoteId), true); + } + private TmsPriceQuoteResult doQuote(TmsPriceQuoteRequest request, Date bizDate) { String productCode = request.getProductCode().trim(); @@ -164,7 +185,7 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService } return buildDefault(request.getCustomerId(), base, productCode, productName, weight, - "no customer package override; use product default freight/registration"); + MessageUtils.message("price.quote.noCustomerPackageOverride")); } private TmsPriceQuoteResult tryFixed(PrcCustomerPriceSet bind, PrcPriceSet set, @@ -176,7 +197,8 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService TmsPriceQuoteResult r = buildFromRates(SRC_DEFAULT, base.getFreightPrice(), null, null, base.getRegistrationFee(), base, productCode, productName, weight, null); fillPackage(r, bind, set); - r.setMatchMessage("FIXED package has no details; use bms_product_country default"); + // 套餐固定价格没有明细,使用产品默认价格 + r.setMatchMessage(MessageUtils.message("price.quote.fixedPackageNoDetails")); r.setCustomerId(bind.getCustomerId()); return r; } @@ -208,7 +230,8 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService { r.setProductCountryId(detail.getProductCountryId()); } - r.setMatchMessage("hit customer FIXED package detail"); + // 命中客户套餐固定价格明细 + r.setMatchMessage(MessageUtils.message("price.quote.hitCustomerFixedPackageDetail")); r.setCustomerId(bind.getCustomerId()); return r; } diff --git a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcQuoteMapper.xml b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcQuoteMapper.xml index 419220dc..9d7d3122 100644 --- a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcQuoteMapper.xml +++ b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcQuoteMapper.xml @@ -66,6 +66,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where quote_id = #{quoteId} + + insert into prc_quote ( quote_key, customer_id, product_code, product_name, diff --git a/bms-back/sql/price/billing_menu.sql b/bms-back/sql/price/billing_menu.sql index 1c9035e6..445b30f9 100644 --- a/bms-back/sql/price/billing_menu.sql +++ b/bms-back/sql/price/billing_menu.sql @@ -13,6 +13,10 @@ INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, SELECT 2302, N'试算执行', 2301, 1, '', NULL, 1, 0, 'F', '0', '0', 'price:billing:quote', '#', 'admin', sysdate() FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2302); +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) +SELECT 2303, N'试算查询', 2301, 2, '', NULL, 1, 0, 'F', '0', '0', 'price:billing:quote', '#', 'admin', sysdate() +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2303); + INSERT INTO sys_role_menu (role_id, menu_id) -SELECT 1, m.menu_id FROM (SELECT 2300 AS menu_id UNION SELECT 2301 UNION SELECT 2302) m +SELECT 1, m.menu_id FROM (SELECT 2300 AS menu_id UNION SELECT 2301 UNION SELECT 2302 UNION SELECT 2303) m WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 1 AND rm.menu_id = m.menu_id); diff --git a/bms-front/src/api/price/billing.js b/bms-front/src/api/price/billing.js index 98f34218..5cfca5b1 100644 --- a/bms-front/src/api/price/billing.js +++ b/bms-front/src/api/price/billing.js @@ -8,3 +8,20 @@ export function quoteBilling(data) { data }) } + +/** Historical quote list */ +export function listQuote(query) { + return request({ + url: '/price/billing/quote/list', + method: 'get', + params: query + }) +} + +/** Historical quote detail */ +export function getQuote(quoteId) { + return request({ + url: '/price/billing/quote/' + quoteId, + method: 'get' + }) +} diff --git a/bms-front/src/views/price/billing/quote.vue b/bms-front/src/views/price/billing/quote.vue index a0b866d0..4f37345f 100644 --- a/bms-front/src/views/price/billing/quote.vue +++ b/bms-front/src/views/price/billing/quote.vue @@ -127,7 +127,7 @@ @@ -143,21 +143,138 @@ + + + + + + + + + + + + + +
+ +
+ + {{ viewResult.quoteId }} + {{ viewResult.customerId }} + {{ viewResult.productName || '-' }} ({{ viewResult.productCode }}) + {{ viewResult.countryName || '-' }} ({{ viewResult.countryCode }}) + {{ viewResult.chargeWeight ?? viewResult.weight }} + {{ viewResult.weightLabel || '-' }} + + {{ sourceLabel(viewResult.matchSource) }} + + {{ viewResult.priceSetName || '-' }} {{ viewResult.priceSetCode ? '(' + viewResult.priceSetCode + ')' : '' }} + {{ formatMoney(viewResult.freightAmount) }} + {{ formatMoney(viewResult.registrationFee) }} + {{ formatMoney(viewResult.surchargeAmount) }} + + {{ formatMoney(viewResult.payableTotal) }} + + {{ viewResult.matchMessage || '-' }} + + + + + + + + + + + + + + + + +
+
+