Merge remote-tracking branch 'origin/支付优化测试' into 支付优化测试
This commit is contained in:
@ -149,6 +149,7 @@ public interface ErrorCodeConstants {
|
|||||||
|
|
||||||
ErrorCode INVOICE_INFORMATION_NOT_EXISTS = new ErrorCode(1_004_022_001, "用户发票信息不存在");
|
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_EXISTS = new ErrorCode(1_004_023_00, "开票记录不存在");
|
||||||
ErrorCode BILLING_NOT_ORDER_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, "拒绝理由不能为空");
|
ErrorCode BILLING_NOT_ORDER_REFUSE= new ErrorCode(1_004_024_00, "拒绝理由不能为空");
|
||||||
|
@ -136,5 +136,10 @@ public class MemberGroupController {
|
|||||||
return success(groupService.getUserList(vo));
|
return success(groupService.getUserList(vo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PutMapping("/updateAdmin")
|
||||||
|
@Operation(summary = "更新用户分组管理员")
|
||||||
|
public CommonResult<Boolean> updateAdmin(@RequestBody MemberGroupUpdateReqVO updateReqVO) {
|
||||||
|
groupService.updateAdmin(updateReqVO);
|
||||||
|
return success(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,4 +22,7 @@ public class GoodsInfoReqVO {
|
|||||||
@Schema(description = "重量")
|
@Schema(description = "重量")
|
||||||
private Double weight;
|
private Double weight;
|
||||||
|
|
||||||
|
@Schema(description = "单价")
|
||||||
|
private Double price;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -79,6 +79,15 @@ public class StoreGoodsInventoryRecordController {
|
|||||||
return success(BeanUtils.toBean(pageResult, StoreGoodsInventoryRecordRespVO.class));
|
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")
|
@GetMapping("/export-excel")
|
||||||
@Operation(summary = "导出商品出入库记录 Excel")
|
@Operation(summary = "导出商品出入库记录 Excel")
|
||||||
@PreAuthorize("@ss.hasPermission('member:store-goods-inventory-record:export')")
|
@PreAuthorize("@ss.hasPermission('member:store-goods-inventory-record:export')")
|
||||||
@ -92,4 +101,14 @@ public class StoreGoodsInventoryRecordController {
|
|||||||
BeanUtils.toBean(list, StoreGoodsInventoryRecordRespVO.class));
|
BeanUtils.toBean(list, StoreGoodsInventoryRecordRespVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/recordCount")
|
||||||
|
@Operation(summary = "获得商品出入库记录分页")
|
||||||
|
public CommonResult<InventoryStatisticsVO> getRecordCount(@Valid InventoryRecordPageReqVO pageReqVO) {
|
||||||
|
InventoryStatisticsVO recordCount = storeGoodsInventoryRecordService.getRecordCount(pageReqVO);
|
||||||
|
return success(recordCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
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.CardRespVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.card.vo.RechargeVO;
|
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.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.AppCardMonthVO;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardPageReqVO;
|
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.dal.dataobject.card.CardDO;
|
||||||
|
import cn.iocoder.yudao.module.member.service.billing.BillingService;
|
||||||
import cn.iocoder.yudao.module.member.service.card.CardService;
|
import cn.iocoder.yudao.module.member.service.card.CardService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
@ -27,7 +30,9 @@ import javax.annotation.Resource;
|
|||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.math.BigDecimal;
|
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.framework.common.pojo.CommonResult.success;
|
||||||
|
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
|
||||||
|
|
||||||
@Tag(name = "用户 APP - 余额变动明细")
|
@Tag(name = "用户 APP - 余额变动明细")
|
||||||
@RestController
|
@RestController
|
||||||
@ -37,6 +42,8 @@ public class AppCardController {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CardService cardService;
|
private CardService cardService;
|
||||||
|
@Resource
|
||||||
|
private BillingService billingService;
|
||||||
|
|
||||||
// 写一个示例,将一条数据插入redis
|
// 写一个示例,将一条数据插入redis
|
||||||
@Resource
|
@Resource
|
||||||
@ -153,6 +160,10 @@ public class AppCardController {
|
|||||||
@PutMapping("/rechargeByAdmin")
|
@PutMapping("/rechargeByAdmin")
|
||||||
@Operation(summary = "管理充值")
|
@Operation(summary = "管理充值")
|
||||||
public CommonResult<Boolean> rechargeByAdmin(@RequestBody RechargeVO vo) {
|
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);
|
cardService.rechargeByAdmin(vo);
|
||||||
return success(true);
|
return success(true);
|
||||||
}
|
}
|
||||||
|
@ -52,4 +52,8 @@ public class StoreGoodsInventoryRecordDO extends BaseDO {
|
|||||||
*/
|
*/
|
||||||
private Integer outType;
|
private Integer outType;
|
||||||
|
|
||||||
|
private Double price;
|
||||||
|
|
||||||
|
private String goodsName;
|
||||||
|
|
||||||
}
|
}
|
@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|||||||
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.*;
|
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.*;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品出入库记录 Mapper
|
* 商品出入库记录 Mapper
|
||||||
@ -29,4 +31,17 @@ public interface StoreGoodsInventoryRecordMapper extends BaseMapperX<StoreGoodsI
|
|||||||
.orderByDesc(StoreGoodsInventoryRecordDO::getId));
|
.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);
|
||||||
}
|
}
|
@ -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.controller.app.orderdetail.vo.OtherVO;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.diningplates.DiningPlatesDO;
|
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.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.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
|
||||||
import cn.iocoder.yudao.module.member.dal.mysql.diningplates.DiningPlatesMapper;
|
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.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.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.DishesNutritionApi;
|
||||||
import cn.iocoder.yudao.module.system.api.dishesnutrition.dto.DishesNutritionRespDTO;
|
import cn.iocoder.yudao.module.system.api.dishesnutrition.dto.DishesNutritionRespDTO;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -25,6 +28,8 @@ import java.math.RoundingMode;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author zt
|
* @author zt
|
||||||
@ -44,6 +49,9 @@ public class MemberAsyncServiceImpl implements MemberAsyncService{
|
|||||||
@Resource
|
@Resource
|
||||||
private OrderDetailMapper orderDetailMapper;
|
private OrderDetailMapper orderDetailMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StoreGoodsService storeGoodsService;
|
||||||
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private StoreGoodsInventoryRecordMapper storeGoodsInventoryRecordMapper;
|
private StoreGoodsInventoryRecordMapper storeGoodsInventoryRecordMapper;
|
||||||
@ -84,11 +92,16 @@ public class MemberAsyncServiceImpl implements MemberAsyncService{
|
|||||||
@Override
|
@Override
|
||||||
public void batchRecord(AddReqVO addReqVO) {
|
public void batchRecord(AddReqVO addReqVO) {
|
||||||
List<StoreGoodsInventoryRecordDO> addList = new ArrayList<>();
|
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();
|
StoreGoodsInventoryRecordDO add = new StoreGoodsInventoryRecordDO();
|
||||||
BeanUtil.copyProperties(vo,add);
|
BeanUtil.copyProperties(vo,add);
|
||||||
add.setType(addReqVO.getType());
|
add.setType(addReqVO.getType());
|
||||||
add.setOutType(addReqVO.getOutType());
|
add.setOutType(addReqVO.getOutType());
|
||||||
|
add.setPrice(map.get(vo.getGoodsId()).getPrice());
|
||||||
|
add.setGoodsName(map.get(vo.getGoodsId()).getGoodsName());
|
||||||
addList.add(add);
|
addList.add(add);
|
||||||
}
|
}
|
||||||
storeGoodsInventoryRecordMapper.insertBatch(addList);
|
storeGoodsInventoryRecordMapper.insertBatch(addList);
|
||||||
|
@ -128,4 +128,6 @@ public interface MemberGroupService {
|
|||||||
* 获取用户所在组
|
* 获取用户所在组
|
||||||
*/
|
*/
|
||||||
Map<Long,String> getGroupNameByUserIds(List<Long> userIds);
|
Map<Long,String> getGroupNameByUserIds(List<Long> userIds);
|
||||||
|
|
||||||
|
void updateAdmin(MemberGroupUpdateReqVO updateReqVO);
|
||||||
}
|
}
|
||||||
|
@ -177,4 +177,13 @@ public class MemberGroupServiceImpl implements MemberGroupService {
|
|||||||
Map<Long, String> map = groupList.stream().collect(Collectors.toMap(MemberGroupUserVo::getMemberId, MemberGroupUserVo::getName));
|
Map<Long, String> map = groupList.stream().collect(Collectors.toMap(MemberGroupUserVo::getMemberId, MemberGroupUserVo::getName));
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateAdmin(MemberGroupUpdateReqVO updateReqVO) {
|
||||||
|
// 校验存在
|
||||||
|
validateGroupExists(updateReqVO.getId());
|
||||||
|
// 更新
|
||||||
|
MemberGroupDO updateObj = MemberGroupConvert.INSTANCE.convert(updateReqVO);
|
||||||
|
memberGroupMapper.updateById(updateObj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,4 +57,5 @@ public interface StoreGoodsService {
|
|||||||
|
|
||||||
PageResult<StoreSaleGoodsPageVO> getSaleGoodsPage(StoreSaleGoodsPageVO pageReqVO);
|
PageResult<StoreSaleGoodsPageVO> getSaleGoodsPage(StoreSaleGoodsPageVO pageReqVO);
|
||||||
|
|
||||||
|
Map<Integer,StoreGoodsDO> getPrice(List<Integer> goodsIds);
|
||||||
}
|
}
|
@ -27,7 +27,10 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
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.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_IS_SALE;
|
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());
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,8 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.member.service.storegoodsinventoryrecord;
|
package cn.iocoder.yudao.module.member.service.storegoodsinventoryrecord;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.*;
|
||||||
import cn.iocoder.yudao.module.member.controller.admin.storegoodsinventoryrecord.vo.StoreGoodsInventoryRecordSaveReqVO;
|
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.StoreGoodsInventoryRecordDO;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
@ -52,6 +51,13 @@ public interface StoreGoodsInventoryRecordService {
|
|||||||
*/
|
*/
|
||||||
PageResult<StoreGoodsInventoryRecordDO> getStoreGoodsInventoryRecordPage(StoreGoodsInventoryRecordPageReqVO pageReqVO);
|
PageResult<StoreGoodsInventoryRecordDO> getStoreGoodsInventoryRecordPage(StoreGoodsInventoryRecordPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得商品出入库明细
|
||||||
|
*/
|
||||||
|
PageResult<InventoryRecordPageVO> getRecordPage(InventoryRecordPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 统计商品出入库金额
|
||||||
|
*/
|
||||||
|
InventoryStatisticsVO getRecordCount(InventoryRecordPageReqVO pageReqVO);
|
||||||
}
|
}
|
@ -1,16 +1,28 @@
|
|||||||
package cn.iocoder.yudao.module.member.service.storegoodsinventoryrecord;
|
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.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
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.storegoods.vo.StoreSaleGoodsPageVO;
|
||||||
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 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.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.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
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.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.STORE_GOODS_INVENTORY_RECORD_NOT_EXISTS;
|
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);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,6 +1,10 @@
|
|||||||
package cn.iocoder.yudao.module.member.util;
|
package cn.iocoder.yudao.module.member.util;
|
||||||
|
|
||||||
|
import org.aspectj.apache.bcel.generic.RET;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.LocalTime;
|
||||||
import java.time.YearMonth;
|
import java.time.YearMonth;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.temporal.WeekFields;
|
import java.time.temporal.WeekFields;
|
||||||
@ -63,4 +67,26 @@ public class MemberTimeUtils {
|
|||||||
return date.getDayOfMonth();
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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";
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -147,7 +147,8 @@ yudao:
|
|||||||
url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址
|
url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址
|
||||||
security:
|
security:
|
||||||
permit-all_urls:
|
permit-all_urls:
|
||||||
- /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录
|
- /admin-api/mp/open/**
|
||||||
|
- /member/ws # 微信公众号开放平台,微信回调接口,不需要登录
|
||||||
websocket:
|
websocket:
|
||||||
enable: true # websocket的开关
|
enable: true # websocket的开关
|
||||||
path: /infra/ws # 路径
|
path: /infra/ws # 路径
|
||||||
|
Reference in New Issue
Block a user