diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java index 769ed16e..e70e8bc1 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java @@ -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, "拒绝理由不能为空"); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/MemberGroupController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/MemberGroupController.java index 32c2cf3b..4fa4103b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/MemberGroupController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/MemberGroupController.java @@ -136,5 +136,10 @@ public class MemberGroupController { return success(groupService.getUserList(vo)); } - + @PutMapping("/updateAdmin") + @Operation(summary = "更新用户分组管理员") + public CommonResult updateAdmin(@RequestBody MemberGroupUpdateReqVO updateReqVO) { + groupService.updateAdmin(updateReqVO); + return success(true); + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventory/vo/GoodsInfoReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventory/vo/GoodsInfoReqVO.java index 92030c5c..9287558d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventory/vo/GoodsInfoReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventory/vo/GoodsInfoReqVO.java @@ -22,4 +22,7 @@ public class GoodsInfoReqVO { @Schema(description = "重量") private Double weight; + @Schema(description = "单价") + private Double price; + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/StoreGoodsInventoryRecordController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/StoreGoodsInventoryRecordController.java index fa501060..4ead9431 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/StoreGoodsInventoryRecordController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/StoreGoodsInventoryRecordController.java @@ -79,6 +79,15 @@ public class StoreGoodsInventoryRecordController { return success(BeanUtils.toBean(pageResult, StoreGoodsInventoryRecordRespVO.class)); } + + @GetMapping("/pageRecord") + @Operation(summary = "获得商品出入库记录分页") + public CommonResult> getStoreGoodsInventoryRecordPage(@Valid InventoryRecordPageReqVO pageReqVO) { + PageResult 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 getRecordCount(@Valid InventoryRecordPageReqVO pageReqVO) { + InventoryStatisticsVO recordCount = storeGoodsInventoryRecordService.getRecordCount(pageReqVO); + return success(recordCount); + } + + + + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryRecordPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryRecordPageReqVO.java new file mode 100644 index 00000000..09fd4898 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryRecordPageReqVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryRecordPageVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryRecordPageVO.java new file mode 100644 index 00000000..5fceb8fb --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryRecordPageVO.java @@ -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; + +} \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryStatisticsVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryStatisticsVO.java new file mode 100644 index 00000000..5353741b --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storegoodsinventoryrecord/vo/InventoryStatisticsVO.java @@ -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; + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/card/AppCardController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/card/AppCardController.java index 6671c916..07a8a6c7 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/card/AppCardController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/card/AppCardController.java @@ -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 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); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/storegoodsinventoryrecord/StoreGoodsInventoryRecordDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/storegoodsinventoryrecord/StoreGoodsInventoryRecordDO.java index 95940c5f..769f5fb1 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/storegoodsinventoryrecord/StoreGoodsInventoryRecordDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/storegoodsinventoryrecord/StoreGoodsInventoryRecordDO.java @@ -52,4 +52,8 @@ public class StoreGoodsInventoryRecordDO extends BaseDO { */ private Integer outType; + private Double price; + + private String goodsName; + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storegoodsinventoryrecord/StoreGoodsInventoryRecordMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storegoodsinventoryrecord/StoreGoodsInventoryRecordMapper.java index baa6ef6e..0d98da58 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storegoodsinventoryrecord/StoreGoodsInventoryRecordMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storegoodsinventoryrecord/StoreGoodsInventoryRecordMapper.java @@ -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", + "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}", + "", + "and carteen_id = #{vo.carteenId}", + "", + "", + "and goods_name LIKE concat('%',#{vo.goodsName},'%')", + "", + ""}) + Double count(@Param("type") Integer type,@Param("vo") InventoryRecordPageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/async/MemberAsyncServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/async/MemberAsyncServiceImpl.java index 07e501ea..057ed963 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/async/MemberAsyncServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/async/MemberAsyncServiceImpl.java @@ -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 addList = new ArrayList<>(); - for (GoodsInfoReqVO vo :addReqVO.getList()){ + List list = addReqVO.getList(); + List goodsIds = list.stream().map(GoodsInfoReqVO::getGoodsId).collect(Collectors.toList()); + Map 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); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java index 15a897c3..70b3b4f9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java @@ -128,4 +128,6 @@ public interface MemberGroupService { * 获取用户所在组 */ Map getGroupNameByUserIds(List userIds); + + void updateAdmin(MemberGroupUpdateReqVO updateReqVO); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java index 60acfee4..48c03afc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java @@ -177,4 +177,13 @@ public class MemberGroupServiceImpl implements MemberGroupService { Map 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); + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsService.java index e7508f37..de1e56de 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsService.java @@ -57,4 +57,5 @@ public interface StoreGoodsService { PageResult getSaleGoodsPage(StoreSaleGoodsPageVO pageReqVO); + Map getPrice(List goodsIds); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsServiceImpl.java index 47ea6baf..e8c02c08 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoods/StoreGoodsServiceImpl.java @@ -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 getPrice(List goodsIds) { + List goodsDOS = storeGoodsMapper.selectList(new LambdaQueryWrapper().in(StoreGoodsDO::getGoodsId, goodsIds)); + Map map = goodsDOS.stream().collect(Collectors.toMap(StoreGoodsDO::getGoodsId, vo->vo)); + return map; + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordService.java index 88f877b8..ff198b1e 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordService.java @@ -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 getStoreGoodsInventoryRecordPage(StoreGoodsInventoryRecordPageReqVO pageReqVO); + /** + * 获得商品出入库明细 + */ + PageResult getRecordPage(InventoryRecordPageReqVO pageReqVO); - + /** + * 统计商品出入库金额 + */ + InventoryStatisticsVO getRecordCount(InventoryRecordPageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordServiceImpl.java index 6561d2da..20bde799 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storegoodsinventoryrecord/StoreGoodsInventoryRecordServiceImpl.java @@ -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 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 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 list = storeGoodsInventoryRecordMapper.selectList(wrapper); + // 分组并合并 + List 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>> 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 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 sortedSummaries = summaries.stream() + .sorted(Comparator + .comparing(InventoryRecordPageVO::getCarteenId) // 先按门店升序排序 + .thenComparing(InventoryRecordPageVO::getCreateTime,Comparator.reverseOrder()) // 先按时间降序排序 + .thenComparing(InventoryRecordPageVO::getGoodsId) // 再按商品Id升序排序 + ) + .collect(Collectors.toList()); + + // 分页 + List paginatedSummaries = paginate(sortedSummaries, pageReqVO.getPageNo(), pageReqVO.getPageSize()); + + return new PageResult<>(paginatedSummaries, (long) summaries.size()); + } + + + public static List paginate(List 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); + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java index 5c502e10..7351a205 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/util/MemberTimeUtils.java @@ -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); + } + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/DefaultWebSocketHandler.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/DefaultWebSocketHandler.java new file mode 100644 index 00000000..50aec4a6 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/DefaultWebSocketHandler.java @@ -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); + } +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/TestController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/TestController.java new file mode 100644 index 00000000..b81d545b --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/TestController.java @@ -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"; + } +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/WebSocketConfiguration.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/WebSocketConfiguration.java new file mode 100644 index 00000000..a8e6b16b --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/WebSocketConfiguration.java @@ -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(); + } +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/WebSocketInterceptor.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/WebSocketInterceptor.java new file mode 100644 index 00000000..cf197f07 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/websocket/WebSocketInterceptor.java @@ -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 attributes) throws Exception { + + return true; + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { + + } +} diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 009291b1..bd204142 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -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 # 路径