订单/退款查询条件修订;修改logback日志;修订配置文件;隐藏普通管理员查询系统品牌管理

This commit is contained in:
DB 2023-11-01 12:47:12 +08:00
parent 0376bf1453
commit 2ef8150f19
14 changed files with 139 additions and 76 deletions

View File

@ -187,7 +187,7 @@ public interface Constants {
/**
* 隐藏菜单
*/
String HIDE_MENU = "Menu";
String HIDE_MENU = "Menu,Brand";
/**
* 用户类型

View File

@ -2,6 +2,7 @@ package com.cpop.core.handler;
import com.cpop.core.base.exception.UtilException;
import com.cpop.core.config.TencentCosProperties;
import com.qcloud.cos.COS;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
@ -20,6 +21,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
@ -40,13 +42,16 @@ public class TencentCosHandler {
@Autowired
private TencentCosProperties properties;
private TransferManager transferManager;
/**
* @descriptions 创建 TransferManager 实例这个实例用来后续调用高级接口
* @descriptions 初始化创建TransferManager 实例这个实例用来后续调用高级接口
* @author DB
* @date 2023/10/31 16:48
* @return: com.qcloud.cos.transfer.TransferManager
* @date 2023/11/01 10:34
* @return: void
*/
private TransferManager createTransferManager() {
@PostConstruct
public void createTransferManager(){
// 创建一个 COSClient 实例这是访问 COS 服务的基础实例
// 详细代码参见本页: 简单操作 -> 创建 COSClient
COSClient cosClient = createCosClient();
@ -54,14 +59,13 @@ public class TencentCosHandler {
// 对于使用公网传输且网络带宽质量不高的情况建议减小该值避免因网速过慢造成请求超时
ExecutorService threadPool = Executors.newFixedThreadPool(32);
// 传入一个 threadPool, 若不传入线程池默认 TransferManager 中会生成一个单线程的线程池
TransferManager transferManager = new TransferManager(cosClient, threadPool);
transferManager = new TransferManager(cosClient, threadPool);
// 设置高级接口的配置项
// 分块上传阈值和分块大小分别为 5MB 1MB
TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
transferManagerConfiguration.setMultipartUploadThreshold(5 * 1024 * 1024);
transferManagerConfiguration.setMinimumUploadPartSize(1 * 1024 * 1024);
transferManager.setConfiguration(transferManagerConfiguration);
return transferManager;
}
/**
@ -106,7 +110,7 @@ public class TencentCosHandler {
* @param transferManager 管理器
* @return: void
*/
private void shutdownTransferManager(TransferManager transferManager) {
public void shutdownTransferManager(TransferManager transferManager) {
// 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例
// 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例
transferManager.shutdownNow(true);
@ -120,7 +124,6 @@ public class TencentCosHandler {
* @return: com.qcloud.cos.model.UploadResult
*/
public UploadResult cdnUpload(MultipartFile file) {
TransferManager transferManager = createTransferManager();
try {
ObjectMetadata objectMetadata = new ObjectMetadata();
// 上传的流如果能够获取准确的流长度则推荐一定填写 content-length
@ -133,12 +136,11 @@ public class TencentCosHandler {
// 更多存储类型请参见 https://cloud.tencent.com/document/product/436/33417
putObjectRequest.setStorageClass(StorageClass.Standard_IA);
Upload upload = transferManager.upload(putObjectRequest);
UploadResult uploadResult = upload.waitForUploadResult();
inputStream.close();
return upload.waitForUploadResult();
return uploadResult;
} catch (IOException | InterruptedException e) {
throw new UtilException(e);
} finally {
shutdownTransferManager(transferManager);
}
}

View File

@ -104,7 +104,13 @@ logging:
#微信支付
wx:
pay:
#通知地址
# p12证书的位置可以指定绝对路径也可以指定类路径以classpath:开头)
keyPath: E:/Cpop/Cpop-Union/Cpop-Mall/Cpop-Mall-Web/src/main/resources/static/keyPair/wxPay_cert.p12
# 私钥证书
privateKeyPath: E:/Cpop/Cpop-Union/Cpop-Mall/Cpop-Mall-Web/src/main/resources/static/keyPair/wxPay_key.pem
# 私钥文件
privateCertPath: E:/Cpop/Cpop-Union/Cpop-Mall/Cpop-Mall-Web/src/main/resources/static/keyPair/wxPay_cert.pem
#支付通知地址
notifyUrl: https://frp-oak.top:11899/Cpop-Mall/wxPay/callback/notify/order
#支付成功
#退款通知地址
notifyRefund: https://frp-oak.top:11899/Cpop-Mall/wxPay/callback/notify/refund

View File

@ -75,7 +75,13 @@ logging:
#微信支付
wx:
pay:
#通知地址
# p12证书的位置可以指定绝对路径也可以指定类路径以classpath:开头)
keyPath: /root/cpop-union/cpop-mall/script/secretKey/wxPay_cert.p12
# 私钥证书
privateKeyPath: /root/cpop-union/cpop-mall/script/secretKey/wxPay_key.pem
# 私钥文件
privateCertPath: /root/cpop-union/cpop-mall/script/secretKey/wxPay_cert.pem
#支付通知地址
notifyUrl: https://test.cpopsz.com/onlineShop/Cpop-Mall/wxPay/callback/notify/order
#支付成功
#退款通知地址
notifyRefund: https://test.cpopsz.com/onlineShop/Cpop-Mall/wxPay/callback/notify/refund

View File

@ -105,7 +105,13 @@ logging:
#微信支付
wx:
pay:
#通知地址
# p12证书的位置可以指定绝对路径也可以指定类路径以classpath:开头)
keyPath: /root/cpop-union/cpop-mall/script/secretKey/wxPay_cert.p12
# 私钥证书
privateKeyPath: /root/cpop-union/cpop-mall/script/secretKey/wxPay_key.pem
# 私钥文件
privateCertPath: /root/cpop-union/cpop-mall/script/secretKey/wxPay_cert.pem
#支付通知地址
notifyUrl: https://test.cpopsz.com/onlineShop/Cpop-Mall/wxPay/callback/notify/order
#支付成功
#退款通知地址
notifyRefund: https://test.cpopsz.com/onlineShop/Cpop-Mall/wxPay/callback/notify/refund

View File

@ -137,5 +137,3 @@ wx:
#微信支付商户密钥
mchKey: JamBox20230919174000000000000002
apiV3Key: JamBox20230919174000000000000002
# p12证书的位置可以指定绝对路径也可以指定类路径以classpath:开头)
keyPath:

View File

@ -4,7 +4,7 @@
<configuration scan="true" scanPeriod="10 seconds">
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<!--定义日志文件的存储地址和前缀名-->
<property name="LOG_HOME" value="."/>
<property name="LOG_HOME" value="./logs"/>
<property name="LOG_PREFIX" value="Cpop-Mall"/>
<!--控制台输出 -->
@ -16,49 +16,55 @@
</encoder>
</appender>
<appender name="SYS_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/${LOG_PREFIX}-info.log</File>
<append>true</append>
<!--过滤器,只打INFO级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_PREFIX}-info-%d{yyyyMMdd}.log.%d</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<springProfile name="test,prod">
<appender name="SYS_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/${LOG_PREFIX}-info.log</File>
<append>true</append>
<!--过滤器,只打INFO级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_PREFIX}-info-%d{yyyyMMdd}.log.%d</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="SYS_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/${LOG_PREFIX}-error.log</File>
<append>true</append>
<!--过滤器,只打ERROR级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_PREFIX}-error-%d{yyyyMMdd}.log.%d</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="SYS_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/${LOG_PREFIX}-error.log</File>
<append>true</append>
<!--过滤器,只打ERROR级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_PREFIX}-error-%d{yyyyMMdd}.log.%d</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
</springProfile>
<!--info和error分开打印-->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="SYS_INFO"/>
<appender-ref ref="SYS_ERROR"/>
<springProfile name="dev">
<appender-ref ref="CONSOLE"/>
</springProfile>
<springProfile name="test,prod">
<appender-ref ref="SYS_INFO"/>
<appender-ref ref="SYS_ERROR"/>
</springProfile>
</root>
<logger name="com.cpop.mall" level="DEBUG"/>
</configuration>

View File

@ -0,0 +1,41 @@
package com.cpop.mall.web;
import com.cpop.mall.business.service.ProductRecordService;
import org.checkerframework.checker.units.qual.A;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author DB
* @createTime 2023/11/01 12:25
* @description 订单测试
*/
@SpringBootTest
public class OrderTests {
@Autowired
private ProductRecordService productRecordService;
/**
* @descriptions 并发更新库存
* @author DB
* @date 2023/11/01 12:26
* @return: void
*/
@Test
public void concurrencyUpdateStock(){
ExecutorService threadPool = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
threadPool.submit(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "正在执行任务");
}
});
}
}
}

View File

@ -30,10 +30,10 @@ public class OrderPageBo implements Serializable {
private String payUserName;
/**
* 支付用户手机号
* 接收人手机号
*/
@ApiModelProperty("支付用户手机号")
private String payUserPhone;
@ApiModelProperty("接收人手机号")
private String receivePhone;
/**
* 订单状态(0:待付款;1:待发货;2:待确认;3:已完成;4:退款/售后中)

View File

@ -30,10 +30,10 @@ public class OrderRefundPageBo implements Serializable {
private String payUserName;
/**
* 支付用户手机号
* 接收人手机号
*/
@ApiModelProperty("支付用户手机号")
private String payUserPhone;
@ApiModelProperty("接收人手机号")
private String receivePhone;
/**
* 退款状态(0:申请中;1:通过;2:驳回)

View File

@ -130,7 +130,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
return this.mapper.paginateAs(pageDomain.getPageNum(),pageDomain.getPageSize(),
queryWrapper.select(ORDER_REFUND.REFUND_STATUS,ORDER_REFUND.REFUND_REASON,ORDER_REFUND.ID,ORDER_REFUND.ORDER_ID,ORDER_REFUND.CREATE_TIME)
//订单相关参数
.select(ORDER.ORDER_STATUS,ORDER.OUT_ORDER_NO,ORDER.PRODUCT_NAMES,ORDER.TOTAL_AMOUNT,ORDER.PAY_USER_NAME,ORDER.BRAND_ID,ORDER.RECEIVE_NAME,
.select(ORDER.ORDER_STATUS,ORDER.OUT_ORDER_NO,ORDER.PAY_USER_ID,ORDER.PRODUCT_NAMES,ORDER.TOTAL_AMOUNT,ORDER.PAY_USER_NAME,ORDER.BRAND_ID,ORDER.RECEIVE_NAME,
ORDER.RECEIVE_PHONE,ORDER.RECEIVE_ADDRESS,ORDER.LOGISTICS_ORDER,ORDER.REMARKS)
//品牌/店铺或校区
.select(BRAND.BRAND_NAME)
@ -140,7 +140,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
.leftJoin(BRAND).on(BRAND.ID.eq(ORDER.BRAND_ID))
.and(ORDER.PRODUCT_NAMES.like(bo.getProductName()))
.and(ORDER.PAY_USER_NAME.like(bo.getPayUserName()))
.and(SYS_USER.PHONE_NUMBER.eq(bo.getPayUserPhone())),
.and(ORDER.RECEIVE_PHONE.like(bo.getReceivePhone())),
OrderRefundPageVo.class);
}

View File

@ -93,7 +93,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
.from(ORDER)
.leftJoin(SYS_USER).on(SYS_USER.ID.eq(ORDER.PAY_USER_ID))
.and(ORDER.PAY_USER_NAME.like(bo.getPayUserName()))
.and(SYS_USER.PHONE_NUMBER.eq(bo.getPayUserPhone()))
.and(ORDER.RECEIVE_PHONE.like(bo.getReceivePhone()))
.and(ORDER.PRODUCT_NAMES.like(bo.getProductName()))
//订单状态
.and(ORDER.ORDER_STATUS.eq(bo.getOrderStatus()))
@ -303,8 +303,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
String orderId = notifyResult.getOutTradeNo();
//修改订单状态
this.updateChain()
.set(ORDER.OUT_ORDER_NO, notifyResult.getTransactionId())
this.updateChain().set(ORDER.OUT_ORDER_NO, notifyResult.getTransactionId())
.set(ORDER.ORDER_STATUS, 1).where(ORDER.ID.eq(orderId)).update();
//支付成功减库存
List<OrderDetail> orderDetails = SpringUtils.getBean(OrderDetailService.class).queryChain()
@ -316,7 +315,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
productRecords.forEach(item -> {
item.setRecordNum(item.getRecordNum() - orderNumMap.get(item.getId()));
});
asyncUpdateRecords(productRecords,0);
productRecordService.updateBatch(productRecords);
//TODO:分账先注释
/*ProfitSharing profitSharing = new ProfitSharing();
profitSharing.setOrderId(orderId)
@ -350,7 +349,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
* @Description: 异步更新数据库
* @param productRecords 产品记录
* @param flag 成功标志
* @return
* @Author DB
* @Date: 2023/11/1 0:09
*/
@ -362,7 +360,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
throw new ServiceException("更新订单失败");
} else {
boolean tx = Db.tx(() -> productRecordService.updateBatch(productRecords));
if (!tx){
if (!tx) {
//更新失败
flag++;
asyncUpdateRecords(productRecords, flag);

View File

@ -225,7 +225,7 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements Me
.leftJoin(ROLE).on(ROLE.ID.eq(ROLE_MENU.ROLE_ID))
.where(MENU.STATUS.eq(1))
.and(MENU.TYPE.in(0, 1))
.and(MENU.NAME.ne(Constants.HIDE_MENU))
.and(MENU.NAME.notIn(Constants.HIDE_MENU.split(",")))
.and(ROLE_MENU.ROLE_ID.eq(staffInfo.getRoleId()))
.orderBy(MENU.ORDER_NO.asc()),
MenuRouteVo.class));

View File

@ -63,7 +63,7 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements Me
.leftJoin(ROLE).on(ROLE.ID.eq(ROLE_MENU.ROLE_ID))
.where(MENU.STATUS.eq(1))
.and(MENU.TYPE.in(0, 1))
.and(MENU.NAME.ne(Constants.HIDE_MENU))
.and(MENU.NAME.notIn(Constants.HIDE_MENU.split(",")))
.and(ROLE_MENU.ROLE_ID.eq(loginStaffInfo.getString("roleId")))
//构建公共菜单与特有菜单
.and(MENU.USER_TYPE.in("COMMON", user.getUserType()))