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 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, "拒绝理由不能为空");
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -22,4 +22,7 @@ public class GoodsInfoReqVO {
|
||||
@Schema(description = "重量")
|
||||
private Double weight;
|
||||
|
||||
@Schema(description = "单价")
|
||||
private Double price;
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -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.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);
|
||||
}
|
||||
|
@ -52,4 +52,8 @@ public class StoreGoodsInventoryRecordDO extends BaseDO {
|
||||
*/
|
||||
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 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);
|
||||
}
|
@ -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);
|
||||
|
@ -128,4 +128,6 @@ public interface MemberGroupService {
|
||||
* 获取用户所在组
|
||||
*/
|
||||
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));
|
||||
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);
|
||||
|
||||
Map<Integer,StoreGoodsDO> getPrice(List<Integer> goodsIds);
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 的地址
|
||||
security:
|
||||
permit-all_urls:
|
||||
- /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录
|
||||
- /admin-api/mp/open/**
|
||||
- /member/ws # 微信公众号开放平台,微信回调接口,不需要登录
|
||||
websocket:
|
||||
enable: true # websocket的开关
|
||||
path: /infra/ws # 路径
|
||||
|
Reference in New Issue
Block a user