ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/InviteInfoDto.java
New file @@ -0,0 +1,12 @@ package com.ruoyi.account.api.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class InviteInfoDto { @ApiModelProperty("已获得积分") private Integer point; @ApiModelProperty("已邀请人数") private Integer inviteNum; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -1,6 +1,7 @@ package com.ruoyi.account.api.factory; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.PointChangeDto; @@ -37,6 +38,11 @@ } @Override public R<TAppCoupon> couponGetById(Long id) { return R.fail("查询优惠券失败:"+throwable.getMessage()); } @Override public R updateAppUser(TAppUser appUser) { return R.fail("修改用户失败:"+throwable.getMessage()); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -1,5 +1,6 @@ package com.ruoyi.account.api.feignClient; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.account.api.factory.AppUserFallbackFactory; @@ -37,6 +38,10 @@ */ @PostMapping(value = "/t-app-user/user/getUserById/{id}") R<TAppUser> getUserById(@PathVariable("id") Long id); @PostMapping(value = "/t-app-user/user/coupon/getById") R<TAppCoupon> couponGetById(@RequestParam("id")Long id); ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
@@ -3,6 +3,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ExchangeDto; import com.ruoyi.order.api.feignClient.OrderClient; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.order.api.query.TActivityStatisticsQuery; import com.ruoyi.order.api.vo.TActivityVO; import org.slf4j.Logger; @@ -50,7 +51,7 @@ } @Override public R<Long> shopCreate(ExchangeDto exchangeDto) { public R<TShoppingOrder> shopCreate(ExchangeDto exchangeDto) { return R.fail("订单创建" + cause.getMessage()); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ExchangeDto; import com.ruoyi.order.api.factory.OrderFallbackFactory; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.order.api.query.TActivityStatisticsQuery; import com.ruoyi.order.api.vo.TActivityVO; import org.springframework.cloud.openfeign.FeignClient; @@ -35,7 +36,9 @@ @PostMapping("/t-exchange-order/create") public R<Long> exchangeCreate(@RequestBody ExchangeDto exchangeDto); @PostMapping("/t-shopping-order/create") public R<Long> shopCreate(@RequestBody ExchangeDto exchangeDto); public R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto); @PostMapping("/t-shopping-order/callBack") public R callBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo); /** * 管理后台 活动费用统计 ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/PaymentOrder.java
@@ -29,5 +29,5 @@ /** * 回调地址 */ private String notifyUrl; private String notifyUrl ="/"; } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ExchangeDto.java
@@ -3,6 +3,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class ExchangeDto { @ApiModelProperty("商品id") @@ -26,5 +28,14 @@ @ApiModelProperty("1微信2支付宝") Integer payMethod; @ApiModelProperty(hidden =true) BigDecimal orderPrice; @ApiModelProperty(hidden =true) BigDecimal payPrice; @ApiModelProperty(hidden =true) BigDecimal discountPrice; @ApiModelProperty(hidden =true) BigDecimal vipDiscount; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -201,6 +201,8 @@ @PostMapping("/grantCoupon") public R grantCoupon(@RequestBody GrantCouponDto dto){ List<TAppCoupon> res = new ArrayList<>(); TCoupon coupon = otherClient.getCouponById(dto.getCouponId()).getData(); switch (dto.getType()){ case 1: // 根据标签ids 查询用户ids @@ -214,6 +216,7 @@ tAppCoupon.setEndTime(dto.getEndTime()); tAppCoupon.setWaysToObtain(dto.getWaysToObtain()); tAppCoupon.setStatus(1); tAppCoupon.setCouponJson(JSON.toJSONString(coupon)); res.add(tAppCoupon); } tAppCouponService.saveBatch(res); @@ -230,6 +233,7 @@ tAppCoupon.setEndTime(dto.getEndTime()); tAppCoupon.setWaysToObtain(dto.getWaysToObtain()); tAppCoupon.setStatus(1); tAppCoupon.setCouponJson(JSON.toJSONString(coupon)); res.add(tAppCoupon); } tAppCouponService.saveBatch(res); @@ -242,6 +246,7 @@ tAppCoupon.setEndTime(dto.getEndTime()); tAppCoupon.setWaysToObtain(dto.getWaysToObtain()); tAppCoupon.setStatus(1); tAppCoupon.setCouponJson(JSON.toJSONString(coupon)); res.add(tAppCoupon); } tAppCouponService.saveBatch(res); ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -13,6 +13,7 @@ import com.ruoyi.account.service.*; import com.ruoyi.account.util.PointDetailUtil; import com.ruoyi.account.util.SignDayUtil; import com.ruoyi.account.util.carBrand.CarBrandUtil; import com.ruoyi.account.wx.model.WeixinProperties; import com.ruoyi.account.util.GiveVipUtil; import com.ruoyi.common.core.constant.Constants; @@ -24,6 +25,7 @@ import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.BasePojo; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.auth.AuthUtil; import com.ruoyi.common.security.service.TokenService; @@ -110,6 +112,8 @@ @Resource private VipClient vipClient; @Resource private TInviteUserService inviteUserService; @@ -518,6 +522,13 @@ } @ApiOperation(value = "优惠卷列表不分页(1可使用2不可用)", tags = {"小程序-个人中心"}) @PostMapping(value = "/user/coupon/getById") public R<TAppCoupon> couponGetById(@RequestParam("id")Long id) { TAppCoupon appCoupon = appCouponService.getById(id); return R.ok(appCoupon); } @ApiOperation(value = "赠送会员", tags = {"用户管理-用户列表"}) @@ -539,13 +550,38 @@ } //增加vipDetail giveVipUtil.sendVip(nowUser, giveVipDto.getVipId(),plusDay); appUserService.updateById(nowUser); //执行一次赠送优惠卷的定时任务 } return R.ok(); } @ApiOperation(value = "已赠送列表", tags = {"小程序-个人中心-邀请好友"}) @PostMapping(value = "/user/invite/page") public R<Page<TInviteUser>> invitePage(@RequestBody BasePage basePage) { Long userId = tokenService.getLoginUserApplet().getUserId(); Page<TInviteUser> page = inviteUserService.lambdaQuery().eq(TInviteUser::getAppUserId, userId).isNotNull(TInviteUser::getAward).orderByDesc(TInviteUser::getCreateTime).page(Page.of(basePage.getPageCurr(), basePage.getPageSize())); return R.ok(page); } @ApiOperation(value = "已赠送列表", tags = {"小程序-个人中心-邀请好友"}) @PostMapping(value = "/user/invite/info") public R<InviteInfoDto> inviteInfo() { Long userId = tokenService.getLoginUserApplet().getUserId(); Integer point = 0; List<TInviteUser> list = inviteUserService.lambdaQuery().eq(TInviteUser::getAppUserId, userId).isNotNull(TInviteUser::getAward).orderByDesc(TInviteUser::getCreateTime).list(); for (TInviteUser tInviteUser : list) { point = point +tInviteUser.getAward(); } InviteInfoDto inviteInfoDto = new InviteInfoDto(); inviteInfoDto.setPoint(point); inviteInfoDto.setInviteNum(list.size()); return R.ok(inviteInfoDto); } @ApiOperation(value = "更换手机号", tags = {"小程序-用户管理-更换手机号"}) @PostMapping(value = "/user/updatePhone") @@ -766,5 +802,12 @@ return R.ok(); } @ApiOperation(value = "获取车辆品牌", tags = {"小程序-个人中心-车辆"}) @GetMapping(value = "/user/car/getBrands") public R getBrands() throws Exception { String brand = CarBrandUtil.getBrand(); return R.ok(brand); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java
@@ -78,7 +78,7 @@ }else { nowUser.setVipEndTime(nowUser.getVipEndTime().plusDays(plusDay)); nowUser.setVipEndTime(nowUser.getVipEndTime().plusDays(plusDay).minusDays(1)); //获取detail里结束时间大于当前时间的数据,并将enttime延长 TAppUserVipDetail tAppUserVipDetail = tAppUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, nowUser.getId()).orderByDesc(TAppUserVipDetail::getEndTime).last("limit 1").one(); ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/carBrand/CarBrandUtil.java
New file @@ -0,0 +1,65 @@ package com.ruoyi.account.util.carBrand; import com.cloud.apigateway.sdk.utils.Client; import com.cloud.apigateway.sdk.utils.Request; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CarBrandUtil { private static final Logger LOGGER = LoggerFactory.getLogger(CarBrandUtil.class); public static String getBrand() throws Exception { // Create a new request. Request httpClientRequest = new Request(); try { // Set the request parameters. // AppKey, AppSecrect, Method and Url are required parameters. // Directly writing AK/SK in code is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables. // In this example, the AK/SK are stored in environment variables for identity authentication. // Before running this example, set environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK. httpClientRequest.setKey("9a4a2b69afe141718f6843c5d39961ec"); httpClientRequest.setSecret("541845f206324bbc933065b44fc98c47"); httpClientRequest.setMethod("POST"); // Set a request URL in the format of https://{Endpoint}/{URI}. httpClientRequest.setUrl("https://vehiclequery.apistore.huaweicloud.com/vehicle/query/brand"); httpClientRequest.addHeader("Content-Type", "text/plain"); // Set a body for http request. // httpClientRequest.setBody("put your request body here"); } catch (Exception e) { // LOGGER.error(e.getMessage()); return ""; } CloseableHttpClient client = null; try { // Sign the request. HttpRequestBase signedRequest = Client.sign(httpClientRequest, Constant.SIGNATURE_ALGORITHM_SDK_HMAC_SHA256); if (Constant.DO_VERIFY) { // creat httpClient and verify ssl certificate HostName.setUrlHostName(httpClientRequest.getHost()); client = (CloseableHttpClient) SSLCipherSuiteUtil.createHttpClientWithVerify(Constant.INTERNATIONAL_PROTOCOL); } else { // creat httpClient and do not verify ssl certificate client = (CloseableHttpClient) SSLCipherSuiteUtil.createHttpClient(Constant.INTERNATIONAL_PROTOCOL); } HttpResponse response = client.execute(signedRequest); // Print the body of the response. HttpEntity resEntity = response.getEntity(); if (resEntity != null) { LOGGER.info("Processing Body with name: {} and value: {}", System.getProperty("line.separator"), EntityUtils.toString(resEntity, "UTF-8")); String string = EntityUtils.toString(resEntity, "UTF-8"); } } catch (Exception e) { LOGGER.error(e.getMessage()); } finally { if (client != null) { client.close(); } } return ""; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/carBrand/Constant.java
New file @@ -0,0 +1,24 @@ /* * Copyright (c) Huawei Technologies Co., Ltd. 2022-2023. All rights reserved. */ package com.ruoyi.account.util.carBrand; public final class Constant { // verify ssl certificate (true) or do not verify (false) public static final boolean DO_VERIFY = false; public static final String HTTPS = "HTTPS"; public static final String TRUST_MANAGER_FACTORY = "SunX509"; public static final String GM_PROTOCOL = "GMTLS"; public static final String INTERNATIONAL_PROTOCOL = "TLSv1.2"; public static final String SIGNATURE_ALGORITHM_SDK_HMAC_SHA256 = "SDK-HMAC-SHA256"; public static final String SIGNATURE_ALGORITHM_SDK_HMAC_SM3 = "SDK-HMAC-SM3"; public static final String[] SUPPORTED_CIPHER_SUITES = {"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"}; public static final String SECURE_RANDOM_ALGORITHM_NATIVE_PRNG_NON_BLOCKING = "NativePRNGNonBlocking"; private Constant() { } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/carBrand/HostName.java
New file @@ -0,0 +1,17 @@ /* * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. */ package com.ruoyi.account.util.carBrand; public class HostName { private static String urlHostName; public static void setUrlHostName(String hostName) { urlHostName = hostName; } public static boolean checkHostName(String SSLHostName) { return urlHostName.equals(SSLHostName); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/carBrand/SSLCipherSuiteUtil.java
New file @@ -0,0 +1,209 @@ /* * Copyright (c) Huawei Technologies Co., Ltd. 2022-2023. All rights reserved. */ package com.ruoyi.account.util.carBrand; import okhttp3.OkHttpClient; import org.apache.http.client.HttpClient; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.bouncycastle.crypto.BlockCipher; import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.crypto.prng.SP800SecureRandomBuilder; import org.openeuler.BGMProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.*; import java.net.HttpURLConnection; import java.net.URL; import java.security.*; import java.security.cert.X509Certificate; import java.util.Locale; import java.util.concurrent.TimeUnit; public class SSLCipherSuiteUtil { private static final Logger LOGGER = LoggerFactory.getLogger(SSLCipherSuiteUtil.class); private static CloseableHttpClient httpClient; private static OkHttpClient okHttpClient; private static final int CIPHER_LEN = 256; private static final int ENTROPY_BITS_REQUIRED = 384; public static HttpClient createHttpClient(String protocol) throws Exception { SSLContext sslContext = getSslContext(protocol); // create factory SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new String[]{protocol}, Constant.SUPPORTED_CIPHER_SUITES, new TrustAllHostnameVerifier()); httpClient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build(); return httpClient; } public static HttpClient createHttpClientWithVerify(String protocol) throws Exception { SSLContext sslContext = getSslContextWithVerify(protocol); // create factory SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new String[] {protocol}, Constant.SUPPORTED_CIPHER_SUITES, new TheRealHostnameVerifier()); httpClient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build(); return httpClient; } public static OkHttpClient createOkHttpClient(String protocol) throws Exception { SSLContext sslContext = getSslContext(protocol); // Create an ssl socket factory with our all-trusting manager SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); OkHttpClient.Builder builder = new OkHttpClient.Builder() .sslSocketFactory(sslSocketFactory, new TrustAllManager()) .hostnameVerifier(new TrustAllHostnameVerifier()); okHttpClient = builder.connectTimeout(10, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build(); return okHttpClient; } public static OkHttpClient createOkHttpClientWithVerify(String protocol) throws Exception { SSLContext sslContext = getSslContextWithVerify(protocol); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(Constant.TRUST_MANAGER_FACTORY); tmf.init((KeyStore) null); TrustManager[] verify = tmf.getTrustManagers(); OkHttpClient.Builder builder = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, (X509TrustManager) verify[0]).hostnameVerifier(new TheRealHostnameVerifier()); okHttpClient = builder.connectTimeout(10, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build(); return okHttpClient; } public static HttpURLConnection createHttpsOrHttpURLConnection(URL uUrl, String protocol) throws Exception { // initial connection if (uUrl.getProtocol().toUpperCase(Locale.getDefault()).equals(Constant.HTTPS)) { SSLContext sslContext = getSslContext(protocol); HttpsURLConnection.setDefaultHostnameVerifier(new TrustAllHostnameVerifier()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); return (HttpsURLConnection) uUrl.openConnection(); } return (HttpURLConnection) uUrl.openConnection(); } public static HttpURLConnection createHttpsOrHttpURLConnectionWithVerify(URL uUrl, String protocol) throws Exception { // initial connection if (uUrl.getProtocol().toUpperCase(Locale.getDefault()).equals(Constant.HTTPS)) { SSLContext sslContext = getSslContextWithVerify(protocol); HttpsURLConnection.setDefaultHostnameVerifier(new TheRealHostnameVerifier()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); return (HttpsURLConnection) uUrl.openConnection(); } return (HttpURLConnection) uUrl.openConnection(); } private static SSLContext getSslContext(String protocol) throws UnsupportProtocolException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { if (!Constant.GM_PROTOCOL.equals(protocol) && !Constant.INTERNATIONAL_PROTOCOL.equals(protocol)) { LOGGER.info("Unsupport protocol: {}, Only support GMTLS TLSv1.2", protocol); throw new UnsupportProtocolException("Unsupport protocol, Only support GMTLS TLSv1.2"); } // Create a trust manager that does not validate certificate chains TrustAllManager[] trust = {new TrustAllManager()}; KeyManager[] kms = null; SSLContext sslContext; sslContext = SSLContext.getInstance(Constant.INTERNATIONAL_PROTOCOL, "SunJSSE"); if (Constant.GM_PROTOCOL.equals(protocol)) { Security.insertProviderAt(new BGMProvider(), 1); sslContext = SSLContext.getInstance(Constant.GM_PROTOCOL, "BGMProvider"); } SecureRandom secureRandom = getSecureRandom(); sslContext.init(kms, trust, secureRandom); sslContext.getServerSessionContext().setSessionCacheSize(8192); sslContext.getServerSessionContext().setSessionTimeout(3600); return sslContext; } private static SSLContext getSslContextWithVerify(String protocol) throws UnsupportProtocolException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException, KeyStoreException { if (!Constant.GM_PROTOCOL.equals(protocol) && !Constant.INTERNATIONAL_PROTOCOL.equals(protocol)) { LOGGER.info("Unsupport protocol: {}, Only support GMTLS TLSv1.2", protocol); throw new UnsupportProtocolException("Unsupport protocol, Only support GMTLS TLSv1.2"); } KeyManager[] kms = null; SSLContext sslContext = SSLContext.getInstance(Constant.INTERNATIONAL_PROTOCOL, "SunJSSE"); SecureRandom secureRandom = getSecureRandom(); if (Constant.GM_PROTOCOL.equals(protocol)) { Security.insertProviderAt(new BGMProvider(), 1); sslContext = SSLContext.getInstance(Constant.GM_PROTOCOL, "BGMProvider"); } TrustManagerFactory tmf = TrustManagerFactory.getInstance(Constant.TRUST_MANAGER_FACTORY); tmf.init((KeyStore) null); TrustManager[] verify = tmf.getTrustManagers(); sslContext.init(kms, verify, secureRandom); sslContext.getServerSessionContext().setSessionCacheSize(8192); sslContext.getServerSessionContext().setSessionTimeout(3600); return sslContext; } // 不校验域名 private static class TrustAllHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } } // 校验域名 private static class TheRealHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { if (HostName.checkHostName(hostname)) { return true; } else { HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier(); return hv.verify(hostname, session); } } } // 不校验服务端证书 private static class TrustAllManager implements X509TrustManager { private X509Certificate[] issuers; public TrustAllManager() { this.issuers = new X509Certificate[0]; } public X509Certificate[] getAcceptedIssuers() { return issuers; } public void checkClientTrusted(X509Certificate[] chain, String authType) { } public void checkServerTrusted(X509Certificate[] chain, String authType) { } } private static SecureRandom getSecureRandom() { SecureRandom source; try { source = SecureRandom.getInstance(Constant.SECURE_RANDOM_ALGORITHM_NATIVE_PRNG_NON_BLOCKING); } catch (NoSuchAlgorithmException e) { try { source = SecureRandom.getInstanceStrong(); } catch (NoSuchAlgorithmException ex) { LOGGER.error("get SecureRandom failed", e); throw new RuntimeException("get SecureRandom failed"); } } boolean predictionResistant = true; BlockCipher cipher = new AESEngine(); boolean reSeed = false; return new SP800SecureRandomBuilder(source, predictionResistant).setEntropyBitsRequired( ENTROPY_BITS_REQUIRED).buildCTR(cipher, CIPHER_LEN, null, reSeed); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/carBrand/UnsupportProtocolException.java
New file @@ -0,0 +1,15 @@ /* * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. */ package com.ruoyi.account.util.carBrand; public class UnsupportProtocolException extends Exception { private static final long serialVersionUID = 4312820110480855928L; private String msgDes; // 异常对应的描述信息 public UnsupportProtocolException(String message) { super(message); msgDes = message; } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.query.TChargingGunQuery; import com.ruoyi.chargingPile.api.vo.TChargingGunVO; @@ -51,16 +52,19 @@ public class TChargingPileController { private final TChargingPileService chargingPileService; private final TChargingGunService chargingGunService; @Autowired public TChargingPileController(TChargingPileService chargingPileService) { public TChargingPileController(TChargingPileService chargingPileService, TChargingGunService chargingGunService) { this.chargingPileService = chargingPileService; this.chargingGunService = chargingGunService; } /** * 查询充电桩列表 */ @ApiOperation(tags = {"小程序-充电桩"},value = "查询充电桩列表") @ApiOperation(tags = {"小程序-充电桩"},value = "通过站点id查询充电桩列表") @PostMapping(value = "/list") @ApiImplicitParams({ @ApiImplicitParam(name = "siteId", value = "站点id") @@ -70,6 +74,18 @@ .eq(TChargingPile::getSiteId,siteId))); } /** * 查询充电桩列表 */ @ApiOperation(tags = {"通过充电桩id 查询充电枪列表"},value = "通过充电桩id 查询充电枪列表") @PostMapping(value = "/pileList") @ApiImplicitParams({ @ApiImplicitParam(name = "pileId", value = "充电桩id") }) public AjaxResult<List<TChargingGun>> pileList(@RequestParam("pileId") Integer pileId) { return AjaxResult.ok(chargingGunService.list(Wrappers.lambdaQuery(TChargingGun.class) .eq(TChargingGun::getChargingPileId,pileId))); } /** * 管理后台-通过站点id获取充电桩列表 不分页 */ @ApiOperation(value = "管理后台-通过站点id获取充电桩列表 不分页") ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.chargingPile.api.vo.SiteVO; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.redis.service.RedisService; @@ -64,6 +65,8 @@ @Resource private RedisService redisService; @Autowired private AppUserClient appUserClient; @@ -72,6 +75,8 @@ @PostMapping(value = "/chargingOrder") @ApiOperation(value = "充电桩订单列表", tags = {"管理后台-订单管理"}) public AjaxResult<TCharingOrderVO> chargingOrder(@RequestBody ChargingOrderQuery dto){ List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData(); dto.setUserIds(data); TCharingOrderVO res = chargingOrderService.chargingOrder(dto); return AjaxResult.success(res); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -88,47 +88,44 @@ return AjaxResult.success(list); } // @PostMapping("/create") // public R<Long> shopCreate(@RequestBody ExchangeDto exchangeDto){ // TShoppingOrder shoppingOrder = new TShoppingOrder(); // shoppingOrder.setCode(OrderCodeUtil.getOrderCode("GW")); // shoppingOrder.setAppUserId(exchangeDto.getUserId()); // shoppingOrder.setOrderType(exchangeDto.getGoodType()); // if (exchangeDto.getGoodType()==1) { // shoppingOrder.setGoodsId(exchangeDto.getGoodId()); // }else { // shoppingOrder.setCouponId(exchangeDto.getGoodId()); // } // shoppingOrder.setPurchaseQuantity(exchangeDto.getNum()); // shoppingOrder.setAppUserAddressId(Long.valueOf(exchangeDto.getAddressId())); // shoppingOrder.setOrderAmount(new BigDecimal("0")); // shoppingOrder.setAppCouponId(0L); // shoppingOrder.setCouponDiscountAmount(new BigDecimal("0")); // shoppingOrder.setVipDiscount(new BigDecimal("0")); // shoppingOrder.setVipDiscountAmount(new BigDecimal("0")); // shoppingOrder.setPaymentAmount(new BigDecimal("0")); // shoppingOrder.setPaymentStatus(0); // shoppingOrder.setPaymentType(0); // shoppingOrder.setSerialNumber(""); // shoppingOrder.setRemark(""); // shoppingOrder.setStatus(0); // shoppingOrder.setExpressCompany(""); // shoppingOrder.setExpressNumber(""); // shoppingOrder.setConsignerId(0); // shoppingOrder.setConsignerTime(LocalDateTime.now()); // shoppingOrder.setReceivingTime(LocalDateTime.now()); // shoppingOrder.setCancellationTime(LocalDateTime.now()); // shoppingOrder.setCancellationId(0); // shoppingOrder.setRefundCode(""); // shoppingOrder.setRefundAmount(new BigDecimal("0")); // shoppingOrder.setRefundStatus(0); // shoppingOrder.setRefundSerialNumber(""); // shoppingOrder.setRefundTime(LocalDateTime.now()); // shoppingOrder.setCreateTime(LocalDateTime.now()); // shoppingOrder.setDelFlag(false); // // // // } @PostMapping("/create") public R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto){ TShoppingOrder shoppingOrder = new TShoppingOrder(); shoppingOrder.setCode(OrderCodeUtil.getOrderCode("GW")); shoppingOrder.setAppUserId(exchangeDto.getUserId()); shoppingOrder.setOrderType(exchangeDto.getGoodType()); if (exchangeDto.getGoodType()==1) { shoppingOrder.setGoodsId(exchangeDto.getGoodId()); }else { shoppingOrder.setCouponId(exchangeDto.getGoodId()); } shoppingOrder.setPurchaseQuantity(exchangeDto.getNum()); shoppingOrder.setAppUserAddressId(Long.valueOf(exchangeDto.getAddressId())); shoppingOrder.setOrderAmount(exchangeDto.getOrderPrice()); if (exchangeDto.getCouponId()!=null) { shoppingOrder.setAppCouponId(exchangeDto.getCouponId()); } shoppingOrder.setCouponDiscountAmount(exchangeDto.getDiscountPrice()); shoppingOrder.setVipDiscount(new BigDecimal("0")); shoppingOrder.setVipDiscountAmount(exchangeDto.getVipDiscount()); shoppingOrder.setPaymentAmount(exchangeDto.getPayPrice()); shoppingOrder.setPaymentStatus(1); shoppingOrder.setPaymentType(exchangeDto.getPayMethod()); shoppingOrder.setRemark(exchangeDto.getRemark()); shoppingOrder.setStatus(1); shoppingOrder.setCreateTime(LocalDateTime.now()); shoppingOrder.setDelFlag(false); shoppingOrderService.save(shoppingOrder); return R.ok(shoppingOrder); } @PostMapping("/callBack") public R callBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo){ shoppingOrderService.callBack(code,outTradeNo); return R.ok(); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
@@ -59,4 +59,6 @@ * @return */ List<MyShoppingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query); void callBack(String code,String outTradeNo); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -1,7 +1,10 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.dto.GrantCouponDto; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserAddressClient; import com.ruoyi.account.api.model.TAppUserAddress; import com.ruoyi.common.core.web.domain.AjaxResult; @@ -24,6 +27,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -50,6 +54,8 @@ @Resource private AppUserAddressClient appUserAddressClient; @Resource private AppCouponClient appCouponClient; @@ -309,4 +315,23 @@ } return pageList; } @Override public void callBack(String code,String outTradeNo) { //改变订单状态 TShoppingOrder shoppingOrder = this.baseMapper.selectOne(Wrappers.lambdaQuery(TShoppingOrder.class).eq(TShoppingOrder::getCode, code)); shoppingOrder.setPaymentStatus(2); shoppingOrder.setSerialNumber(outTradeNo); this.updateById(shoppingOrder); //如果是优惠券,赠送优惠券 if (shoppingOrder.getOrderType()==2){ GrantCouponDto grantCouponDto = new GrantCouponDto(); grantCouponDto.setType(3); grantCouponDto.setUserIds(String.valueOf(shoppingOrder.getAppUserId())); grantCouponDto.setCouponId(shoppingOrder.getCouponId()); grantCouponDto.setWaysToObtain(2); grantCouponDto.setEndTime(LocalDateTime.now()); appCouponClient.grantCoupon(grantCouponDto); } } } ruoyi-service/ruoyi-other/pom.xml
@@ -131,6 +131,10 @@ <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-payment</artifactId> </dependency> </dependencies> <build> ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
@@ -1,10 +1,13 @@ package com.ruoyi.other.controller; import java.math.BigDecimal; import java.time.LocalDateTime; import com.alibaba.fastjson.JSON; import com.ruoyi.account.api.dto.GrantCouponDto; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.AppGoodQuery; @@ -14,6 +17,7 @@ import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.feignClient.OrderClient; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.common.core.dto.ExchangeDto; @@ -22,12 +26,16 @@ import com.ruoyi.other.service.TActivityService; import com.ruoyi.other.service.TCouponService; import com.ruoyi.other.service.TGoodsService; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import com.ruoyi.payment.api.vo.PaymentOrder; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.swing.*; import java.util.Arrays; import java.util.Map; /** * <p> @@ -44,6 +52,7 @@ private TGoodsService goodsService; @Autowired private TActivityService activityService; @Resource private TokenService tokenService; @Resource @@ -54,6 +63,9 @@ private AppCouponClient appCouponClient; @Resource private TCouponService couponService; @Resource private WxPaymentClient wxPaymentClient; @@ -159,19 +171,78 @@ } // @ApiOperation(tags = {"小程序-兑换商城"},value = "支付商品") // @PostMapping(value = "/app/pay") // public AjaxResult<PageInfo<TGoods>> pay(@RequestBody ExchangeDto exchangeDto) { // // //创建订单 // // //计算价格 // // //调起支付 // // // // } @ApiOperation(tags = {"小程序-现金商城"},value = "支付商品") @PostMapping(value = "/app/pay") public R<Map<String, Object>> pay(@RequestBody ExchangeDto exchangeDto) { Long userId = tokenService.getLoginUserApplet().getUserId(); TAppUser user = appUserClient.getUserById(userId).getData(); boolean isVip = false; if (user.getVipEndTime().isAfter(LocalDateTime.now())){ isVip = true; } //计算价格 BigDecimal orderPrice = new BigDecimal(0); BigDecimal payPrice = new BigDecimal(0); BigDecimal discountPrice = new BigDecimal(0); BigDecimal vipDiscount = new BigDecimal(0); if (exchangeDto.getGoodType()==1){ TGoods good = goodsService.getById(exchangeDto.getGoodId()); BigDecimal originalPrice = good.getPreferentialPrice(); if (isVip){ if (good.getVipPrice()!=null){ vipDiscount = originalPrice.subtract(good.getVipPrice()).multiply(BigDecimal.valueOf(exchangeDto.getNum())); originalPrice = good.getVipPrice(); } } orderPrice.add(originalPrice.multiply(BigDecimal.valueOf(exchangeDto.getNum()))); }else { TCoupon coupon = couponService.getById(exchangeDto.getGoodId()); BigDecimal originalPrice = coupon.getPaymentAmount(); if (isVip){ if (coupon.getVipPaymentAmount()!=null) { vipDiscount = originalPrice.subtract(coupon.getVipPaymentAmount()).multiply(BigDecimal.valueOf(exchangeDto.getNum())); originalPrice = coupon.getVipPaymentAmount(); } } orderPrice.add(originalPrice); } exchangeDto.setOrderPrice(orderPrice); //查看是否使用优惠券 if(exchangeDto.getCouponId()!=null) { TAppCoupon appCoupon = appUserClient.couponGetById(exchangeDto.getCouponId()).getData(); TCoupon coupon = JSON.toJavaObject(JSON.parseObject(appCoupon.getCouponJson()), TCoupon.class); if (coupon.getValidityPeriodMode()==1){ if (orderPrice.compareTo(coupon.getMeetTheConditions())<0){ return R.fail("不满足使用优惠券条件"); } } payPrice = orderPrice.subtract(coupon.getDiscountAmount()); discountPrice = coupon.getDiscountAmount(); } exchangeDto.setPayPrice(payPrice); exchangeDto.setDiscountPrice(discountPrice); exchangeDto.setVipDiscount(vipDiscount); //创建订单 TShoppingOrder shopOrder = orderClient.shopCreate(exchangeDto).getData(); if (exchangeDto.getPayMethod()==1) { //调起支付 PaymentOrder paymentOrder = new PaymentOrder(); paymentOrder.setCode(shopOrder.getCode()); paymentOrder.setAmount(shopOrder.getPaymentAmount()); paymentOrder.setOpenId(user.getWxOpenid()); paymentOrder.setDescription("购买商品"); return wxPaymentClient.orderPay(paymentOrder); }else { //todo 罗 支付宝支付 return R.ok(); } } /** ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -144,7 +144,7 @@ @ApiOperation(value = "会员信息", tags = {"小程序-个人中心"}) @PostMapping("/vipInfo") public AjaxResult vipInfo() { public AjaxResult<VipInfoDto> vipInfo() { List<VipInfoDto> vipInfoDtos = new ArrayList<>(); List<TVip> vips = vipService.lambdaQuery().eq(TVip::getReveal, 1).list(); for (TVip vip : vips) { ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TGoodsMapper.xml
@@ -52,13 +52,13 @@ <select id="pageList1" resultType="com.ruoyi.other.api.domain.TGoods"> SELECT id,name,redeem_points,inventory id,name,redeem_points,inventory,original_price,preferential_price,vip_price FROM t_goods WHERE `status` = 1 and del_flag = 0 and type = #{appGoodQuery.type} UNION ALL SELECT id,name,redeem_points,inventory_quantity as inventory id,name,redeem_points,inventory_quantity as inventory,payment_amount as preferential_price,vip_payment_amount as vip_price FROM t_coupon WHERE `status`= 1 and del_flag = 0 and type = #{appGoodQuery.type} ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/controller/WxPayController.java
@@ -87,17 +87,17 @@ public R<Map<String, Object>> payNotify(HttpServletRequest request) throws Exception { try { Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() {}); log.info("支付回调:{}", params); String outRefundNo = (String) params.get("out_refund_no"); String out_trade_no = params.get("out_trade_no").toString(); String substring = outRefundNo.substring(0, 2); switch (substring){ //购物订单 case "GW": //更改订单状态 //如果是优惠卷赠送优惠卷 break; } log.info("支付回调:{}", params); return R.ok(params); } catch (Exception e) { log.error("支付回调异常:{}", e, e); ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/model/WeixinProperties.java
@@ -1,5 +1,6 @@ package com.ruoyi.payment.wx.model; import lombok.Data; import lombok.ToString; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; @@ -13,6 +14,7 @@ @ToString @Component @ConfigurationProperties(prefix = "wx.conf") @Data public class WeixinProperties { /** * 默认开启 @@ -37,6 +39,10 @@ * @return secret ID */ private String secretId; /** * 回调地址 */ private String callBackUrl; public String getSecretId() { return secretId;