增加试算功能

This commit is contained in:
wuweihua
2026-09-07 14:42:27 +08:00
parent a083a0dece
commit ea2bc6f33e
17 changed files with 1060 additions and 0 deletions
@@ -0,0 +1,76 @@
package com.ruoyi.web.controller.api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.config.properties.TmsApiProperties;
import com.ruoyi.price.domain.vo.TmsPriceQuoteRequest;
import com.ruoyi.price.domain.vo.TmsPriceQuoteResult;
import com.ruoyi.price.service.ITmsPriceQuoteService;
/**
* TMS open API: freight quote.
*
* POST /api/tms/price/quote
* Header X-Api-Code must equal bms.tms.api-code
*
* @author ruoyi
*/
@Anonymous
@RestController
@RequestMapping("/api/tms/price")
public class TmsPriceController extends BaseController
{
public static final String HEADER_API_CODE = "X-Api-Code";
@Autowired
private ITmsPriceQuoteService tmsPriceQuoteService;
@Autowired
private TmsApiProperties tmsApiProperties;
/**
* Quote by customerId + productCode + country + weight.
* Match: customer package FIXED > DISCOUNT > product default.
*/
@PostMapping("/quote")
public AjaxResult quote(
@RequestHeader(value = HEADER_API_CODE, required = false) String headerApiCode,
@Validated @RequestBody TmsPriceQuoteRequest request)
{
assertApiCode(headerApiCode, request == null ? null : request.getApiCode());
TmsPriceQuoteResult result = tmsPriceQuoteService.quote(request);
return success(result);
}
private void assertApiCode(String headerApiCode, String bodyApiCode)
{
String expected = tmsApiProperties.getApiCode();
if (StringUtils.isEmpty(expected))
{
throw new ServiceException("API_CODE_NOT_CONFIGURED: bms.tms.api-code is empty");
}
String actual = StringUtils.isNotEmpty(headerApiCode) ? headerApiCode.trim() : null;
if (StringUtils.isEmpty(actual) && StringUtils.isNotEmpty(bodyApiCode))
{
actual = bodyApiCode.trim();
}
if (StringUtils.isEmpty(actual))
{
throw new ServiceException("API_CODE_REQUIRED: missing header X-Api-Code (or body apiCode)");
}
if (!expected.equals(actual))
{
throw new ServiceException("API_CODE_INVALID: api identification code mismatch");
}
}
}
@@ -0,0 +1,38 @@
package com.ruoyi.web.controller.price;
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.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.price.domain.vo.TmsPriceQuoteRequest;
import com.ruoyi.price.domain.vo.TmsPriceQuoteResult;
import com.ruoyi.price.service.ITmsPriceQuoteService;
/**
* Billing center: order quote trial (authenticated).
*
* @author ruoyi
*/
@RestController
@RequestMapping("/price/billing")
public class BillingController extends BaseController
{
@Autowired
private ITmsPriceQuoteService tmsPriceQuoteService;
/**
* Same matching logic as TMS open API, for BMS console trial.
*/
@PreAuthorize("@ss.hasPermi('price:billing:quote')")
@PostMapping("/quote")
public AjaxResult quote(@Validated @RequestBody TmsPriceQuoteRequest request)
{
TmsPriceQuoteResult result = tmsPriceQuoteService.quote(request);
return success(result);
}
}
@@ -145,3 +145,9 @@ xss:
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
# BMS TMS open API
bms:
tms:
# Agreed API identification code for TMS callers
api-code: BMS.TMS._Q2WnPXiXwGW2Dl-iSGNzLfrhUgQogNo