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 2eb9dfe9..e989b2b1 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 @@ -120,5 +120,7 @@ public interface ErrorCodeConstants { ErrorCode COMBO_NOT_EXISTS = new ErrorCode(1_004_015_001, "套餐不存在"); //========== 用户余额明细 1-004-016-000 ============= ErrorCode ORDER_SPACE_CAPSULE_NOT_EXISTS = new ErrorCode(1_004_016_001, "太空舱订单不存在"); + + ErrorCode STORE_BUSINESS_NOT_EXISTS = new ErrorCode(1_004_017_001, "超市营业统计不存在"); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/StoreBusinessController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/StoreBusinessController.java new file mode 100644 index 00000000..e0d969be --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/StoreBusinessController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.member.controller.admin.storebusiness; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.*; +import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO; +import cn.iocoder.yudao.module.member.service.storebusiness.StoreBusinessService; + +@Tag(name = "管理后台 - 超市营业统计") +@RestController +@RequestMapping("/member/store-business") +@Validated +public class StoreBusinessController { + + @Resource + private StoreBusinessService storeBusinessService; + + @PostMapping("/create") + @Operation(summary = "创建超市营业统计") + @PreAuthorize("@ss.hasPermission('member:store-business:create')") + public CommonResult createStoreBusiness(@Valid @RequestBody StoreBusinessSaveReqVO createReqVO) { + return success(storeBusinessService.createStoreBusiness(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新超市营业统计") + @PreAuthorize("@ss.hasPermission('member:store-business:update')") + public CommonResult updateStoreBusiness(@Valid @RequestBody StoreBusinessSaveReqVO updateReqVO) { + storeBusinessService.updateStoreBusiness(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除超市营业统计") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('member:store-business:delete')") + public CommonResult deleteStoreBusiness(@RequestParam("id") Long id) { + storeBusinessService.deleteStoreBusiness(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得超市营业统计") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('member:store-business:query')") + public CommonResult getStoreBusiness(@RequestParam("id") Long id) { + StoreBusinessDO storeBusiness = storeBusinessService.getStoreBusiness(id); + return success(BeanUtils.toBean(storeBusiness, StoreBusinessRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得超市营业统计分页") + @PreAuthorize("@ss.hasPermission('member:store-business:query')") + public CommonResult> getStoreBusinessPage(@Valid StoreBusinessPageReqVO pageReqVO) { + PageResult pageResult = storeBusinessService.getStoreBusinessPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, StoreBusinessRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出超市营业统计 Excel") + @PreAuthorize("@ss.hasPermission('member:store-business:export')") + @OperateLog(type = EXPORT) + public void exportStoreBusinessExcel(@Valid StoreBusinessPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = storeBusinessService.getStoreBusinessPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "超市营业统计.xls", "数据", StoreBusinessRespVO.class, + BeanUtils.toBean(list, StoreBusinessRespVO.class)); + } + +} \ 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/storebusiness/vo/StoreBusinessPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/vo/StoreBusinessPageReqVO.java new file mode 100644 index 00000000..e39f0958 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/vo/StoreBusinessPageReqVO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +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 StoreBusinessPageReqVO extends PageParam { + + @Schema(description = "营业额") + private BigDecimal turnover; + + @Schema(description = "订单数") + private Integer orderSum; + + @Schema(description = "顾客数") + private Integer customerSum; + + @Schema(description = "均单价") + private BigDecimal priceAvg; + + @Schema(description = "减免金额") + private BigDecimal reduce; + + @Schema(description = "补贴钱包") + private BigDecimal subsidyPurse; + + @Schema(description = "VIP免单") + private Integer gratis; + + @Schema(description = "早餐") + private BigDecimal breakfast; + + @Schema(description = "早餐订单") + private Integer breakfastNum; + + @Schema(description = "午餐") + private BigDecimal lunch; + + @Schema(description = "午餐订单") + private Integer lunchNum; + + @Schema(description = "晚餐") + private BigDecimal dinner; + + @Schema(description = "晚餐订单") + private Integer dinnerNum; + + @Schema(description = "智能称重") + private BigDecimal weigh; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "门店编号", example = "5950") + 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/storebusiness/vo/StoreBusinessRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/vo/StoreBusinessRespVO.java new file mode 100644 index 00000000..bc9e513b --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/vo/StoreBusinessRespVO.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 超市营业统计 Response VO") +@Data +@ExcelIgnoreUnannotated +public class StoreBusinessRespVO { + + @Schema(description = "营业统计编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27161") + @ExcelProperty("营业统计编号") + private Long id; + + @Schema(description = "营业额") + @ExcelProperty("营业额") + private BigDecimal turnover; + + @Schema(description = "订单数") + @ExcelProperty("订单数") + private Integer orderSum; + + @Schema(description = "顾客数") + @ExcelProperty("顾客数") + private Integer customerSum; + + @Schema(description = "均单价") + @ExcelProperty("均单价") + private BigDecimal priceAvg; + + @Schema(description = "减免金额") + @ExcelProperty("减免金额") + private BigDecimal reduce; + + @Schema(description = "补贴钱包") + @ExcelProperty("补贴钱包") + private BigDecimal subsidyPurse; + + @Schema(description = "VIP免单") + @ExcelProperty("VIP免单") + private Integer gratis; + + @Schema(description = "早餐") + @ExcelProperty("早餐") + private BigDecimal breakfast; + + @Schema(description = "早餐订单") + @ExcelProperty("早餐订单") + private Integer breakfastNum; + + @Schema(description = "午餐") + @ExcelProperty("午餐") + private BigDecimal lunch; + + @Schema(description = "午餐订单") + @ExcelProperty("午餐订单") + private Integer lunchNum; + + @Schema(description = "晚餐") + @ExcelProperty("晚餐") + private BigDecimal dinner; + + @Schema(description = "晚餐订单") + @ExcelProperty("晚餐订单") + private Integer dinnerNum; + + @Schema(description = "智能称重") + @ExcelProperty("智能称重") + private BigDecimal weigh; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "门店编号", example = "5950") + @ExcelProperty("门店编号") + 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/storebusiness/vo/StoreBusinessSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/vo/StoreBusinessSaveReqVO.java new file mode 100644 index 00000000..9444750f --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/storebusiness/vo/StoreBusinessSaveReqVO.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 超市营业统计新增/修改 Request VO") +@Data +public class StoreBusinessSaveReqVO { + + @Schema(description = "营业统计编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27161") + private Long id; + + @Schema(description = "营业额") + private BigDecimal turnover; + + @Schema(description = "订单数") + private Integer orderSum; + + @Schema(description = "顾客数") + private Integer customerSum; + + @Schema(description = "均单价") + private BigDecimal priceAvg; + + @Schema(description = "减免金额") + private BigDecimal reduce; + + @Schema(description = "补贴钱包") + private BigDecimal subsidyPurse; + + @Schema(description = "VIP免单") + private Integer gratis; + + @Schema(description = "早餐") + private BigDecimal breakfast; + + @Schema(description = "早餐订单") + private Integer breakfastNum; + + @Schema(description = "午餐") + private BigDecimal lunch; + + @Schema(description = "午餐订单") + private Integer lunchNum; + + @Schema(description = "晚餐") + private BigDecimal dinner; + + @Schema(description = "晚餐订单") + private Integer dinnerNum; + + @Schema(description = "智能称重") + private BigDecimal weigh; + + @Schema(description = "门店编号", example = "5950") + 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/dal/dataobject/storebusiness/StoreBusinessDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/storebusiness/StoreBusinessDO.java new file mode 100644 index 00000000..0d7a73bf --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/storebusiness/StoreBusinessDO.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.module.member.dal.dataobject.storebusiness; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 超市营业统计 DO + * + * @author 管理员 + */ +@TableName("member_store_business") +@KeySequence("member_store_business_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StoreBusinessDO extends BaseDO { + + /** + * 营业统计编号 + */ + @TableId + private Long id; + /** + * 营业额 + */ + private BigDecimal turnover; + /** + * 订单数 + */ + private Integer orderSum; + /** + * 顾客数 + */ + private Integer customerSum; + /** + * 均单价 + */ + private BigDecimal priceAvg; + /** + * 减免金额 + */ + private BigDecimal reduce; + /** + * 补贴钱包 + */ + private BigDecimal subsidyPurse; + /** + * VIP免单 + */ + private Integer gratis; + /** + * 早餐 + */ + private BigDecimal breakfast; + /** + * 早餐订单 + */ + private Integer breakfastNum; + /** + * 午餐 + */ + private BigDecimal lunch; + /** + * 午餐订单 + */ + private Integer lunchNum; + /** + * 晚餐 + */ + private BigDecimal dinner; + /** + * 晚餐订单 + */ + private Integer dinnerNum; + /** + * 智能称重 + */ + private BigDecimal weigh; + /** + * 门店编号 + */ + 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/dal/mysql/storebusiness/StoreBusinessMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storebusiness/StoreBusinessMapper.java new file mode 100644 index 00000000..e4f577fa --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/storebusiness/StoreBusinessMapper.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.member.dal.mysql.storebusiness; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.*; + +/** + * 超市营业统计 Mapper + * + * @author 管理员 + */ +@Mapper +public interface StoreBusinessMapper extends BaseMapperX { + + default PageResult selectPage(StoreBusinessPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(StoreBusinessDO::getTurnover, reqVO.getTurnover()) + .eqIfPresent(StoreBusinessDO::getOrderSum, reqVO.getOrderSum()) + .eqIfPresent(StoreBusinessDO::getCustomerSum, reqVO.getCustomerSum()) + .eqIfPresent(StoreBusinessDO::getPriceAvg, reqVO.getPriceAvg()) + .eqIfPresent(StoreBusinessDO::getReduce, reqVO.getReduce()) + .eqIfPresent(StoreBusinessDO::getSubsidyPurse, reqVO.getSubsidyPurse()) + .eqIfPresent(StoreBusinessDO::getGratis, reqVO.getGratis()) + .eqIfPresent(StoreBusinessDO::getBreakfast, reqVO.getBreakfast()) + .eqIfPresent(StoreBusinessDO::getBreakfastNum, reqVO.getBreakfastNum()) + .eqIfPresent(StoreBusinessDO::getLunch, reqVO.getLunch()) + .eqIfPresent(StoreBusinessDO::getLunchNum, reqVO.getLunchNum()) + .eqIfPresent(StoreBusinessDO::getDinner, reqVO.getDinner()) + .eqIfPresent(StoreBusinessDO::getDinnerNum, reqVO.getDinnerNum()) + .eqIfPresent(StoreBusinessDO::getWeigh, reqVO.getWeigh()) + .betweenIfPresent(StoreBusinessDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(StoreBusinessDO::getCarteenId, reqVO.getCarteenId()) + .orderByDesc(StoreBusinessDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BusinessNewJob.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BusinessNewJob.java index 6cd8951f..c996ca0d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BusinessNewJob.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BusinessNewJob.java @@ -8,10 +8,12 @@ import cn.iocoder.yudao.module.member.dal.dataobject.business.BusinessDO; import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO; import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO; +import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO; import cn.iocoder.yudao.module.member.dal.mysql.business.BusinessMapper; import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper; import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper; import cn.iocoder.yudao.module.member.dal.mysql.orderdetail.OrderDetailMapper; +import cn.iocoder.yudao.module.member.dal.mysql.storebusiness.StoreBusinessMapper; import cn.iocoder.yudao.module.member.enums.CostTypeEnum; import cn.iocoder.yudao.module.member.enums.TimePeriodEnum; import lombok.extern.slf4j.Slf4j; @@ -38,6 +40,9 @@ public class BusinessNewJob implements JobHandler { @Resource private BusinessMapper businessMapper; + @Resource + private StoreBusinessMapper storeBusinessMapper; + /** * 执行任务 * @@ -53,6 +58,10 @@ public class BusinessNewJob implements JobHandler { BusinessDO businessDO = new BusinessDO(); businessDO.setCarteenId(storeId); businessMapper.insert(businessDO); + + StoreBusinessDO storeBusinessDO = new StoreBusinessDO(); + storeBusinessDO.setCarteenId(storeId); + storeBusinessMapper.insert(storeBusinessDO); } log.info("[execute][生成当天统计营业数据 {}条]", allStoreId.size()); return String.format("生成当天统计营业数据 %s 条 ", allStoreId.size()); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessService.java new file mode 100644 index 00000000..68a59f88 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessService.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.member.service.storebusiness; + +import java.util.*; +import javax.validation.*; + +import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo; +import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.*; +import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +/** + * 超市营业统计 Service 接口 + * + * @author 管理员 + */ +public interface StoreBusinessService { + + /** + * 创建超市营业统计 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createStoreBusiness(@Valid StoreBusinessSaveReqVO createReqVO); + + /** + * 更新超市营业统计 + * + * @param updateReqVO 更新信息 + */ + void updateStoreBusiness(@Valid StoreBusinessSaveReqVO updateReqVO); + + /** + * 删除超市营业统计 + * + * @param id 编号 + */ + void deleteStoreBusiness(Long id); + + /** + * 获得超市营业统计 + * + * @param id 编号 + * @return 超市营业统计 + */ + StoreBusinessDO getStoreBusiness(Long id); + + /** + * 获得超市营业统计分页 + * + * @param pageReqVO 分页查询 + * @return 超市营业统计分页 + */ + PageResult getStoreBusinessPage(StoreBusinessPageReqVO pageReqVO); + + + void updateStatistics(StatisticsVo vo); +} \ 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/storebusiness/StoreBusinessServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessServiceImpl.java new file mode 100644 index 00000000..6c24faee --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storebusiness/StoreBusinessServiceImpl.java @@ -0,0 +1,154 @@ +package cn.iocoder.yudao.module.member.service.storebusiness; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo; +import cn.iocoder.yudao.module.member.dal.dataobject.business.BusinessDO; +import cn.iocoder.yudao.module.member.dal.dataobject.orderdetail.OrderDetailDO; +import cn.iocoder.yudao.module.member.enums.CostTypeEnum; +import cn.iocoder.yudao.module.member.enums.TimePeriodEnum; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.*; +import cn.iocoder.yudao.module.member.controller.admin.storebusiness.vo.*; +import cn.iocoder.yudao.module.member.dal.dataobject.storebusiness.StoreBusinessDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.member.dal.mysql.storebusiness.StoreBusinessMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.member.service.amount.LockManager.getStoreLock; +import static cn.iocoder.yudao.module.member.service.amount.LockManager.getSupermarketLock; + +/** + * 超市营业统计 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class StoreBusinessServiceImpl implements StoreBusinessService { + + @Resource + private StoreBusinessMapper storeBusinessMapper; + + @Override + public Long createStoreBusiness(StoreBusinessSaveReqVO createReqVO) { + // 插入 + StoreBusinessDO storeBusiness = BeanUtils.toBean(createReqVO, StoreBusinessDO.class); + storeBusinessMapper.insert(storeBusiness); + // 返回 + return storeBusiness.getId(); + } + + @Override + public void updateStoreBusiness(StoreBusinessSaveReqVO updateReqVO) { + // 校验存在 + validateStoreBusinessExists(updateReqVO.getId()); + // 更新 + StoreBusinessDO updateObj = BeanUtils.toBean(updateReqVO, StoreBusinessDO.class); + storeBusinessMapper.updateById(updateObj); + } + + @Override + public void deleteStoreBusiness(Long id) { + // 校验存在 + validateStoreBusinessExists(id); + // 删除 + storeBusinessMapper.deleteById(id); + } + + private void validateStoreBusinessExists(Long id) { + if (storeBusinessMapper.selectById(id) == null) { + throw exception(STORE_BUSINESS_NOT_EXISTS); + } + } + + @Override + public StoreBusinessDO getStoreBusiness(Long id) { + return storeBusinessMapper.selectById(id); + } + + @Override + public PageResult getStoreBusinessPage(StoreBusinessPageReqVO pageReqVO) { + return storeBusinessMapper.selectPage(pageReqVO); + } + + + @Override + public void updateStatistics(StatisticsVo vo) { + synchronized(getSupermarketLock(vo.getCarteenId())){ + LocalDate now = LocalDate.now(); + if(vo.getTime()!=null){ + now = vo.getTime().toLocalDate(); + } + // 获取今天的开始时间 + LocalDateTime startOfDay =now.atStartOfDay(); + // 获取今天的结束时间 (23:59:59.999) + LocalDateTime endOfDay = LocalDateTime.of(now, LocalTime.MAX); + + List storeBusinessDOS = storeBusinessMapper.selectList(Wrappers.lambdaQuery() + .between(StoreBusinessDO::getCreateTime, startOfDay, endOfDay) + .eq(StoreBusinessDO::getCarteenId, vo.getCarteenId())); + if (CollectionUtil.isNotEmpty(storeBusinessDOS)) { + StoreBusinessDO storeBusinessDO = storeBusinessDOS.get(0); + + //重量 +// if(ObjectUtil.isNotEmpty(vo.getOrderId())){ +// List orderDetailDOS = orderDetailMapper.selectList(Wrappers.lambdaQuery().eq(OrderDetailDO::getOrderId, vo.getOrderId())); +// if (CollectionUtil.isNotEmpty(orderDetailDOS)) { +// BigDecimal reduce = orderDetailDOS.stream().map(OrderDetailDO::getWeight).reduce(BigDecimal.ZERO, BigDecimal::add); +// businessDO.setWeigh(businessDO.getWeigh().add(reduce)); +// } +// } + //订单数 + storeBusinessDO.setOrderSum(storeBusinessDO.getOrderSum() + vo.getOrderSum()); + + //营业额 + if(ObjectUtil.isNotEmpty(vo.getTotalMoney())){ + storeBusinessDO.setTurnover(storeBusinessDO.getTurnover().add(vo.getTotalMoney())); + } + + //客单价 + if(storeBusinessDO.getOrderSum() != 0){ + storeBusinessDO.setPriceAvg(storeBusinessDO.getTurnover().divide(new BigDecimal(storeBusinessDO.getOrderSum()), 2, RoundingMode.HALF_UP)); + } + + //减免金额 + if(ObjectUtil.isNotEmpty(vo.getReduceMoney())){ + storeBusinessDO.setReduce(storeBusinessDO.getReduce().add(vo.getReduceMoney())); + } + + //早中晚金额 + if(ObjectUtil.isNotEmpty(vo.getTime())){ + String timePeriod = TimePeriodEnum.getTimePeriod(vo.getTime()); + + if(timePeriod.equals(CostTypeEnum.MORNING.getCode())){ + storeBusinessDO.setBreakfast(storeBusinessDO.getBreakfast().add(vo.getTotalMoney())); + storeBusinessDO.setBreakfastNum(storeBusinessDO.getBreakfastNum() + vo.getOrderSum()); + }else if (timePeriod.equals(CostTypeEnum.NOON.getCode())){ + storeBusinessDO.setLunch(storeBusinessDO.getLunch().add(vo.getTotalMoney())); + storeBusinessDO.setLunchNum(storeBusinessDO.getLunchNum() + vo.getOrderSum()); + }else if (timePeriod.equals(CostTypeEnum.NIGHT.getCode())){ + storeBusinessDO.setDinner(storeBusinessDO.getDinner().add(vo.getTotalMoney())); + storeBusinessDO.setDinnerNum(storeBusinessDO.getDinnerNum() + vo.getOrderSum()); + } + } + + storeBusinessMapper.updateById(storeBusinessDO); + } + } + } +} \ 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/storeorder/StoreOrderServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java index 8fd750a3..f9fcaed3 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/storeorder/StoreOrderServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; 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.business.vo.StatisticsVo; import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderPageVO; import cn.iocoder.yudao.module.member.controller.admin.storeorder.vo.StoreOrderSaveReqVO; @@ -23,6 +24,7 @@ import cn.iocoder.yudao.module.member.enums.CostTypeEnum; import cn.iocoder.yudao.module.member.enums.TimePeriodEnum; import cn.iocoder.yudao.module.member.service.amount.DeductionService; import cn.iocoder.yudao.module.member.service.card.CardService; +import cn.iocoder.yudao.module.member.service.storebusiness.StoreBusinessService; import cn.iocoder.yudao.module.member.service.storeorderdetail.StoreOrderDetailService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.system.api.cashregisterinfo.CashregisterinfoApi; @@ -71,6 +73,8 @@ public class StoreOrderServiceImpl implements StoreOrderService { @Resource private CashregisterinfoApi cashregisterinfoApi; + @Resource + private StoreBusinessService storeBusinessService; @Resource @@ -188,13 +192,23 @@ public class StoreOrderServiceImpl implements StoreOrderService { } MemberUserDO user = userService.getUser(Long.valueOf(s)); dto.setUserId(user.getId()); - Double totalPrice = createOrder(dto).getTotalPrice(); + StoreOrderDO order = createOrder(dto); + Double totalPrice = order.getTotalPrice(); BigDecimal total = BigDecimal.valueOf(totalPrice).setScale(2, RoundingMode.HALF_UP); BigDecimal compute = compute(total, user.getId()); if (compute.compareTo(BigDecimal.ZERO) < 0) { return "金额不足"; } + //营业数据 + StatisticsVo statisticsVo = new StatisticsVo(); + statisticsVo.setCarteenId(order.getCarteenId()); + statisticsVo.setTotalMoney(total); + statisticsVo.setOrderSum(1); + statisticsVo.setTime(order.getCreateTime()); + statisticsVo.setOrderId(order.getOrderId().longValue()); + storeBusinessService.updateStatistics(statisticsVo); + return null; } @@ -247,6 +261,14 @@ public class StoreOrderServiceImpl implements StoreOrderService { storeOrderDO.setTotalPrice(total.subtract(money).doubleValue()); storeOrderMapper.updateById(storeOrderDO); deductionService.reduction(storeOrderDO.getUserId(), money, BigDecimal.ZERO,money, BigDecimal.ZERO); + //营业数据 + StatisticsVo statisticsVo = new StatisticsVo(); + statisticsVo.setCarteenId(storeOrderDO.getCarteenId()); + statisticsVo.setTotalMoney(money.negate()); + statisticsVo.setOrderSum(0); + statisticsVo.setReduceMoney(money); + statisticsVo.setTime(storeOrderDO.getCreateTime()); + storeBusinessService.updateStatistics(statisticsVo); } public void test() {