Merge remote-tracking branch 'origin/支付优化测试' into 支付优化测试

This commit is contained in:
qjq
2024-11-20 09:38:01 +08:00
23 changed files with 492 additions and 8 deletions

View File

@ -149,6 +149,7 @@ public interface ErrorCodeConstants {
ErrorCode INVOICE_INFORMATION_NOT_EXISTS = new ErrorCode(1_004_022_001, "用户发票信息不存在");
ErrorCode BILLING_NOT_COMPLETE = new ErrorCode(1_004_023_00, "还有金额未开票");
ErrorCode BILLING_NOT_EXISTS = new ErrorCode(1_004_023_00, "开票记录不存在");
ErrorCode BILLING_NOT_ORDER_EXISTS= new ErrorCode(1_004_023_00, "该时间段没有订单可开票");
ErrorCode BILLING_NOT_ORDER_REFUSE= new ErrorCode(1_004_024_00, "拒绝理由不能为空");

View File

@ -136,5 +136,10 @@ public class MemberGroupController {
return success(groupService.getUserList(vo));
}
@PutMapping("/updateAdmin")
@Operation(summary = "更新用户分组管理员")
public CommonResult<Boolean> updateAdmin(@RequestBody MemberGroupUpdateReqVO updateReqVO) {
groupService.updateAdmin(updateReqVO);
return success(true);
}
}

View File

@ -22,4 +22,7 @@ public class GoodsInfoReqVO {
@Schema(description = "重量")
private Double weight;
@Schema(description = "单价")
private Double price;
}

View File

@ -79,6 +79,15 @@ public class StoreGoodsInventoryRecordController {
return success(BeanUtils.toBean(pageResult, StoreGoodsInventoryRecordRespVO.class));
}
@GetMapping("/pageRecord")
@Operation(summary = "获得商品出入库记录分页")
public CommonResult<PageResult<InventoryRecordPageVO>> getStoreGoodsInventoryRecordPage(@Valid InventoryRecordPageReqVO pageReqVO) {
PageResult<InventoryRecordPageVO> pageResult = storeGoodsInventoryRecordService.getRecordPage(pageReqVO);
return success(pageResult);
}
@GetMapping("/export-excel")
@Operation(summary = "导出商品出入库记录 Excel")
@PreAuthorize("@ss.hasPermission('member:store-goods-inventory-record:export')")
@ -92,4 +101,14 @@ public class StoreGoodsInventoryRecordController {
BeanUtils.toBean(list, StoreGoodsInventoryRecordRespVO.class));
}
@GetMapping("/recordCount")
@Operation(summary = "获得商品出入库记录分页")
public CommonResult<InventoryStatisticsVO> getRecordCount(@Valid InventoryRecordPageReqVO pageReqVO) {
InventoryStatisticsVO recordCount = storeGoodsInventoryRecordService.getRecordCount(pageReqVO);
return success(recordCount);
}
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 商品出入库记录分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InventoryRecordPageReqVO extends PageParam {
@Schema(description = "商品名", example = "24781")
private String goodsName;
@Schema(description = "开始时间", example = "2024-11-15")
private String startTime;
@Schema(description = "结束时间", example = "2024-11-15")
private String endTime;
@Schema(description = "门店ID", example = "24781")
private Long carteenId;
}

View File

@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 商品出入库记录分页 VO")
@Data
@ToString(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class InventoryRecordPageVO {
@Schema(description = "商品ID", example = "24781")
private Integer goodsId;
@Schema(description = "商品ID", example = "24781")
private String goodsName;
@Schema(description = "门店ID", example = "6917")
private Long carteenId;
@Schema(description = "入库数量")
private Integer inNumber;
@Schema(description = "入库金额")
private Double inPrice;
@Schema(description = "出库数量")
private Integer outNumber;
@Schema(description = "出库金额")
private Double outPrice;
@Schema(description = "单价")
private Double price;
@Schema(description = "创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class InventoryStatisticsVO {
@Schema(description = "累计入库金额", example = "24781")
private Double totalInMoney;
@Schema(description = "累计出库金额", example = "24781")
private Double totalOutMoney;
@Schema(description = "今日入库金额", example = "24781")
private Double todayInMoney;
@Schema(description = "今日出库金额", example = "24781")
private Double todayOutMoney;
}

View File

@ -3,12 +3,15 @@ package cn.iocoder.yudao.module.member.controller.app.card;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.member.controller.admin.billing.vo.BillingRespMoneyVO;
import cn.iocoder.yudao.module.member.controller.admin.card.vo.CardRespVO;
import cn.iocoder.yudao.module.member.controller.admin.card.vo.RechargeVO;
import cn.iocoder.yudao.module.member.controller.admin.card.vo.RobotReqVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardMonthVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardPageReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import cn.iocoder.yudao.module.member.service.billing.BillingService;
import cn.iocoder.yudao.module.member.service.card.CardService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@ -27,7 +30,9 @@ import javax.annotation.Resource;
import javax.validation.Valid;
import java.math.BigDecimal;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
@Tag(name = "用户 APP - 余额变动明细")
@RestController
@ -37,6 +42,8 @@ public class AppCardController {
@Resource
private CardService cardService;
@Resource
private BillingService billingService;
// 写一个示例将一条数据插入redis
@Resource
@ -153,6 +160,10 @@ public class AppCardController {
@PutMapping("/rechargeByAdmin")
@Operation(summary = "管理充值")
public CommonResult<Boolean> rechargeByAdmin(@RequestBody RechargeVO vo) {
BillingRespMoneyVO haveWithoutMoney = billingService.getHaveWithoutMoney(SecurityFrameworkUtils.getLoginUserId());
if (haveWithoutMoney.getWithoutMoney().compareTo(BigDecimal.ZERO)!=0){
throw exception(BILLING_NOT_COMPLETE);
}
cardService.rechargeByAdmin(vo);
return success(true);
}

View File

@ -52,4 +52,8 @@ public class StoreGoodsInventoryRecordDO extends BaseDO {
*/
private Integer outType;
private Double price;
private String goodsName;
}

View File

@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* 商品出入库记录 Mapper
@ -29,4 +31,17 @@ public interface StoreGoodsInventoryRecordMapper extends BaseMapperX<StoreGoodsI
.orderByDesc(StoreGoodsInventoryRecordDO::getId));
}
@Select({"<script>",
"select sum(price*number) from member_store_goods_inventory_record",
"where type = #{type} ",
"and DATE_FORMAT(create_time, '%Y-%m-%d') between #{vo.startTime} and #{vo.endTime}",
"<if test='vo.carteenId != null '>",
"and carteen_id = #{vo.carteenId}",
"</if>",
"<if test='vo.goodsName != null and vo.goodsName != \"\"'>",
"and goods_name LIKE concat('%',#{vo.goodsName},'%')",
"</if>",
"</script>"})
Double count(@Param("type") Integer type,@Param("vo") InventoryRecordPageReqVO pageReqVO);
}

View File

@ -9,10 +9,13 @@ import cn.iocoder.yudao.module.member.controller.app.orderdetail.vo.AppOrderDeta
import cn.iocoder.yudao.module.member.controller.app.orderdetail.vo.OtherVO;
import cn.iocoder.yudao.module.member.dal.dataobject.diningplates.DiningPlatesDO;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO;
import cn.iocoder.yudao.module.member.dal.dataobject.storegoods.StoreGoodsDO;
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
import cn.iocoder.yudao.module.member.dal.mysql.diningplates.DiningPlatesMapper;
import cn.iocoder.yudao.module.member.dal.mysql.orderdetail.OrderDetailMapper;
import cn.iocoder.yudao.module.member.dal.mysql.storegoodsinventory.StoreGoodsInventoryMapper;
import cn.iocoder.yudao.module.member.dal.mysql.storegoodsinventoryrecord.StoreGoodsInventoryRecordMapper;
import cn.iocoder.yudao.module.member.service.storegoods.StoreGoodsService;
import cn.iocoder.yudao.module.system.api.dishesnutrition.DishesNutritionApi;
import cn.iocoder.yudao.module.system.api.dishesnutrition.dto.DishesNutritionRespDTO;
import lombok.extern.slf4j.Slf4j;
@ -25,6 +28,8 @@ import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author zt
@ -44,6 +49,9 @@ public class MemberAsyncServiceImpl implements MemberAsyncService{
@Resource
private OrderDetailMapper orderDetailMapper;
@Resource
private StoreGoodsService storeGoodsService;
@Resource
private StoreGoodsInventoryRecordMapper storeGoodsInventoryRecordMapper;
@ -84,11 +92,16 @@ public class MemberAsyncServiceImpl implements MemberAsyncService{
@Override
public void batchRecord(AddReqVO addReqVO) {
List<StoreGoodsInventoryRecordDO> addList = new ArrayList<>();
for (GoodsInfoReqVO vo :addReqVO.getList()){
List<GoodsInfoReqVO> list = addReqVO.getList();
List<Integer> goodsIds = list.stream().map(GoodsInfoReqVO::getGoodsId).collect(Collectors.toList());
Map<Integer, StoreGoodsDO> map = storeGoodsService.getPrice(goodsIds);
for (GoodsInfoReqVO vo :list){
StoreGoodsInventoryRecordDO add = new StoreGoodsInventoryRecordDO();
BeanUtil.copyProperties(vo,add);
add.setType(addReqVO.getType());
add.setOutType(addReqVO.getOutType());
add.setPrice(map.get(vo.getGoodsId()).getPrice());
add.setGoodsName(map.get(vo.getGoodsId()).getGoodsName());
addList.add(add);
}
storeGoodsInventoryRecordMapper.insertBatch(addList);

View File

@ -128,4 +128,6 @@ public interface MemberGroupService {
* 获取用户所在组
*/
Map<Long,String> getGroupNameByUserIds(List<Long> userIds);
void updateAdmin(MemberGroupUpdateReqVO updateReqVO);
}

View File

@ -177,4 +177,13 @@ public class MemberGroupServiceImpl implements MemberGroupService {
Map<Long, String> map = groupList.stream().collect(Collectors.toMap(MemberGroupUserVo::getMemberId, MemberGroupUserVo::getName));
return map;
}
@Override
public void updateAdmin(MemberGroupUpdateReqVO updateReqVO) {
// 校验存在
validateGroupExists(updateReqVO.getId());
// 更新
MemberGroupDO updateObj = MemberGroupConvert.INSTANCE.convert(updateReqVO);
memberGroupMapper.updateById(updateObj);
}
}

View File

@ -57,4 +57,5 @@ public interface StoreGoodsService {
PageResult<StoreSaleGoodsPageVO> getSaleGoodsPage(StoreSaleGoodsPageVO pageReqVO);
Map<Integer,StoreGoodsDO> getPrice(List<Integer> goodsIds);
}

View File

@ -27,7 +27,10 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_IS_SALE;
@ -136,4 +139,11 @@ public class StoreGoodsServiceImpl implements StoreGoodsService {
return new PageResult<>(saleGoodsPage.getRecords(), saleGoodsPage.getTotal());
}
@Override
public Map<Integer, StoreGoodsDO> getPrice(List<Integer> goodsIds) {
List<StoreGoodsDO> goodsDOS = storeGoodsMapper.selectList(new LambdaQueryWrapper<StoreGoodsDO>().in(StoreGoodsDO::getGoodsId, goodsIds));
Map<Integer, StoreGoodsDO> map = goodsDOS.stream().collect(Collectors.toMap(StoreGoodsDO::getGoodsId, vo->vo));
return map;
}
}

View File

@ -1,8 +1,7 @@
package cn.iocoder.yudao.module.member.service.storegoodsinventoryrecord;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.StoreGoodsInventoryRecordPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.StoreGoodsInventoryRecordSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
import javax.validation.Valid;
@ -52,6 +51,13 @@ public interface StoreGoodsInventoryRecordService {
*/
PageResult<StoreGoodsInventoryRecordDO> getStoreGoodsInventoryRecordPage(StoreGoodsInventoryRecordPageReqVO pageReqVO);
/**
* 获得商品出入库明细
*/
PageResult<InventoryRecordPageVO> getRecordPage(InventoryRecordPageReqVO pageReqVO);
/**
* 统计商品出入库金额
*/
InventoryStatisticsVO getRecordCount(InventoryRecordPageReqVO pageReqVO);
}

View File

@ -1,16 +1,28 @@
package cn.iocoder.yudao.module.member.service.storegoodsinventoryrecord;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.StoreGoodsInventoryRecordPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.StoreGoodsInventoryRecordSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.storegoods.vo.StoreSaleGoodsPageVO;
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
import cn.iocoder.yudao.module.member.dal.mysql.storegoodsinventoryrecord.StoreGoodsInventoryRecordMapper;
import cn.iocoder.yudao.module.member.enums.InventoryTypeEnum;
import cn.iocoder.yudao.module.member.util.MemberTimeUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_INVENTORY_RECORD_NOT_EXISTS;
@ -68,5 +80,104 @@ public class StoreGoodsInventoryRecordServiceImpl implements StoreGoodsInventory
return storeGoodsInventoryRecordMapper.selectPage(pageReqVO);
}
@Override
public PageResult<InventoryRecordPageVO> getRecordPage(InventoryRecordPageReqVO pageReqVO) {
LocalDate now = LocalDate.now();
LocalDateTime dayStart = now.atStartOfDay();
LocalDateTime dayEnd = now.atTime(LocalTime.MAX);
if (StrUtil.isNotBlank(pageReqVO.getStartTime())) {
dayStart =MemberTimeUtils.getDayStart(pageReqVO.getStartTime());
dayEnd = MemberTimeUtils.getDayEnd(pageReqVO.getEndTime());
}
LambdaQueryWrapper<StoreGoodsInventoryRecordDO> wrapper = new LambdaQueryWrapper<>();
wrapper.like(StrUtil.isNotBlank(pageReqVO.getGoodsName()),StoreGoodsInventoryRecordDO::getGoodsName, pageReqVO.getGoodsName());
wrapper.between(StoreGoodsInventoryRecordDO::getCreateTime, dayStart, dayEnd);
wrapper.eq(pageReqVO.getCarteenId()!=null,StoreGoodsInventoryRecordDO::getCarteenId, pageReqVO.getCarteenId());
wrapper.orderByDesc(StoreGoodsInventoryRecordDO::getGoodsId);
List<StoreGoodsInventoryRecordDO> list = storeGoodsInventoryRecordMapper.selectList(wrapper);
// 分组并合并
List<InventoryRecordPageVO> summaries = list.stream()
.collect(Collectors.groupingBy(
record -> Arrays.asList(record.getCarteenId(),record.getCreateTime().toLocalDate(),record.getGoodsName(), record.getPrice()), // 按商品名称、价格和日期分组
Collectors.toList()
))
.entrySet()
.stream()
.map(entry -> {
// 获取分组的键和值
List<? extends Comparable<? extends Comparable<?>>> key = entry.getKey();
Long carteenId = (Long) key.get(0);
LocalDate date = (LocalDate) key.get(1);
String productName = (String) key.get(2);
double price = (Double) key.get(3);
List<StoreGoodsInventoryRecordDO> productRecords = entry.getValue();
// 计算入库和出库总数
int totalInbound = productRecords.stream()
.filter(vo->vo.getType().equals(InventoryTypeEnum.IN.getCode()))
.mapToInt(StoreGoodsInventoryRecordDO::getNumber)
.sum();
int totalOutbound = productRecords.stream()
.filter(vo->vo.getType().equals(InventoryTypeEnum.OUT.getCode()))
.mapToInt(StoreGoodsInventoryRecordDO::getNumber)
.sum();
InventoryRecordPageVO recordPageVO = new InventoryRecordPageVO();
recordPageVO.setGoodsId(productRecords.get(0).getGoodsId());
recordPageVO.setGoodsName(productName);
recordPageVO.setCarteenId(carteenId);
recordPageVO.setPrice(price);
recordPageVO.setInNumber(totalInbound);
recordPageVO.setInPrice(NumberUtil.round(totalInbound * price,2).doubleValue());
recordPageVO.setOutNumber(totalOutbound);
recordPageVO.setOutPrice(NumberUtil.round(totalOutbound * price,2).doubleValue());
recordPageVO.setCreateTime(date.atStartOfDay());
return recordPageVO;
})
.collect(Collectors.toList());
// 按时间和商品名称排序
List<InventoryRecordPageVO> sortedSummaries = summaries.stream()
.sorted(Comparator
.comparing(InventoryRecordPageVO::getCarteenId) // 先按门店升序排序
.thenComparing(InventoryRecordPageVO::getCreateTime,Comparator.reverseOrder()) // 先按时间降序排序
.thenComparing(InventoryRecordPageVO::getGoodsId) // 再按商品Id升序排序
)
.collect(Collectors.toList());
// 分页
List<InventoryRecordPageVO> paginatedSummaries = paginate(sortedSummaries, pageReqVO.getPageNo(), pageReqVO.getPageSize());
return new PageResult<>(paginatedSummaries, (long) summaries.size());
}
public static List<InventoryRecordPageVO> paginate(List<InventoryRecordPageVO> summaries, int pageNumber, int pageSize) {
// 计算起始位置
int skip = (pageNumber - 1) * pageSize;
// 如果超出范围,返回空列表
if (skip >= summaries.size()) {
return Collections.emptyList();
}
// 执行分页
return summaries.stream()
.skip(skip) // 跳过前面 (pageNumber - 1) * pageSize 条记录
.limit(pageSize) // 限制返回 pageSize 条记录
.collect(Collectors.toList());
}
@Override
public InventoryStatisticsVO getRecordCount(InventoryRecordPageReqVO pageReqVO) {
Double totalInMoney = storeGoodsInventoryRecordMapper.count(InventoryTypeEnum.IN.getCode(), pageReqVO);
Double totalOutMoney = storeGoodsInventoryRecordMapper.count(InventoryTypeEnum.OUT.getCode(), pageReqVO);
String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
pageReqVO.setStartTime(today);
pageReqVO.setEndTime(today);
Double todayInMoney = storeGoodsInventoryRecordMapper.count(InventoryTypeEnum.IN.getCode(), pageReqVO);
Double todayOutMoney = storeGoodsInventoryRecordMapper.count(InventoryTypeEnum.OUT.getCode(), pageReqVO);
return new InventoryStatisticsVO(totalInMoney, totalOutMoney, todayInMoney, todayOutMoney);
}
}

View File

@ -1,6 +1,10 @@
package cn.iocoder.yudao.module.member.util;
import org.aspectj.apache.bcel.generic.RET;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
@ -63,4 +67,26 @@ public class MemberTimeUtils {
return date.getDayOfMonth();
}
public static LocalDateTime getDayStart(String time) {
// 定义日期字符串格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 将字符串解析为LocalDate对象
LocalDate date = LocalDate.parse(time, formatter);
// 获取当天的开始时间即00:00:00
return date.atStartOfDay();
}
public static LocalDateTime getDayEnd(String time) {
// 定义日期字符串格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 将字符串解析为LocalDate对象
LocalDate date = LocalDate.parse(time, formatter);
// 获取当天的结束时间即23:59:59
return date.atTime(LocalTime.MAX);
}
}

View File

@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.member.websocket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;
public class DefaultWebSocketHandler extends AbstractWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message;
System.out.println("收到消息:" + textMessage.getPayload());
}
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
}
@Override
public boolean supportsPartialMessages() {
return false;
}
/**
* @param session 处理二进制消息
* @param message
* @throws Exception
*/
@Override
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
super.handleBinaryMessage(session, message);
}
/**
* @param session 处理文本消息
* @param message
* @throws Exception
*/
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
}
/**
* @param session 处理 PONG 消息
* @param message
* @throws Exception
*/
@Override
protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
super.handlePongMessage(session, message);
}
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.member.websocket;
import io.swagger.v3.oas.annotations.tags.Tag;
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.security.PermitAll;
@Tag(name = "管理后台 - 管理员卡")
@RestController
@RequestMapping("/member/test")
@PermitAll
public class TestController {
@GetMapping("/test")
@PermitAll
public String test(){
return "test";
}
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.member.websocket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
/**
* @Author:qjq
* @Date:2024/6/13 上午11:24
*/
@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(defaultWebSocketHandler(), "member/ws")
.addInterceptors(webSocketInterceptor())
.setAllowedOrigins("*");
}
@Bean
public WebSocketInterceptor webSocketInterceptor() {
return new WebSocketInterceptor();
}
@Bean
public DefaultWebSocketHandler defaultWebSocketHandler(){
return new DefaultWebSocketHandler();
}
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.member.websocket;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* @Author:qjq 握手拦截器
* @Date:2024/6/13 上午11:21
*/
public class WebSocketInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
}
}

View File

@ -147,7 +147,8 @@ yudao:
url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址
security:
permit-all_urls:
- /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录
- /admin-api/mp/open/**
- /member/ws # 微信公众号开放平台,微信回调接口,不需要登录
websocket:
enable: true # websocket的开关
path: /infra/ws # 路径