diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/QuickFunctionController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/QuickFunctionController.java index 6d509527c..af18a12fc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/QuickFunctionController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/QuickFunctionController.java @@ -8,12 +8,12 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.vo.menu.SysMenuDTO; import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.web.controller.xkt.vo.quickFunction.QuickFuncVO; +import com.ruoyi.web.controller.xkt.vo.quickFunction.StoreQuickFuncVO; import com.ruoyi.xkt.dto.quickFunction.QuickFuncDTO; import com.ruoyi.xkt.service.IQuickFunctionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -36,11 +36,15 @@ public class QuickFunctionController extends XktBaseController { private static final String MENU_TYPE_C = "C"; - /** - * 查看已绑定的所有快捷菜单 - */ - // @PreAuthorize("@ss.hasPermi('system:function:list')") - @ApiOperation(value = "查看已绑定的所有快捷菜单", httpMethod = "GET", response = R.class) + @ApiOperation(value = "档口首页 档口选择的快捷功能", httpMethod = "GET", response = R.class) + @GetMapping("/selected/{roleId}/{bizId}") + public R> getSelectedList(@PathVariable("roleId") Long roleId, @PathVariable("bizId") Long bizId) { + // 找到当前所有的快捷菜单 + List checkedList = quickFuncService.getCheckedMenuList(roleId, bizId); + return R.ok(BeanUtil.copyToList(checkedList, StoreQuickFuncVO.class)); + } + + @ApiOperation(value = "档口常用功能 点击 设置", httpMethod = "GET", response = R.class) @GetMapping("/menus/{roleId}/{bizId}") public R getMenuList(@PathVariable("roleId") Long roleId, @PathVariable("bizId") Long bizId) { // 找到当前所有的快捷菜单 @@ -53,10 +57,6 @@ public class QuickFunctionController extends XktBaseController { .build()); } - /** - * 修改快捷功能 - */ - // @PreAuthorize("@ss.hasPermi('system:function:edit')") @ApiOperation(value = "修改快捷功能", httpMethod = "PUT", response = R.class) @Log(title = "修改快捷功能", businessType = BusinessType.UPDATE) @PutMapping("/checked") @@ -65,5 +65,4 @@ public class QuickFunctionController extends XktBaseController { return success(); } - } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreController.java index 9394883d8..240d0acf2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreController.java @@ -1,25 +1,21 @@ package com.ruoyi.web.controller.xkt; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.IdUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.XktBaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.page.Page; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.framework.oss.OSSClientWrapper; import com.ruoyi.web.controller.xkt.vo.store.*; import com.ruoyi.xkt.dto.store.*; import com.ruoyi.xkt.service.IStoreService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; +import java.util.List; /** * 档口Controller @@ -35,20 +31,12 @@ public class StoreController extends XktBaseController { final IStoreService storeService; - /** - * 新增档口 - */ -// // @PreAuthorize("@ss.hasPermi('system:store:edit')") @Log(title = "新增档口", businessType = BusinessType.UPDATE) @PostMapping public R create(@Validated @RequestBody StoreCreateVO createVO) { return R.ok(storeService.create(BeanUtil.toBean(createVO, StoreCreateDTO.class))); } - /** - * 修改档口基本信息 - */ -// // @PreAuthorize("@ss.hasPermi('system:store:edit')") @ApiOperation(value = "修改档口基本信息", httpMethod = "PUT", response = R.class) @Log(title = "修改档口基本信息", businessType = BusinessType.UPDATE) @PutMapping @@ -56,20 +44,12 @@ public class StoreController extends XktBaseController { return R.ok(storeService.updateStore(BeanUtil.toBean(storeUpdateVO, StoreUpdateDTO.class))); } - /** - * 查询档口列表 - */ -// // @PreAuthorize("@ss.hasPermi('system:store:list')") @ApiOperation(value = "查询档口列表 ", httpMethod = "POST", response = R.class) @PostMapping("/page") public R> page(@Validated @RequestBody StorePageVO pageVO) { return R.ok(storeService.page(BeanUtil.toBean(pageVO, StorePageDTO.class))); } - /** - * 档口启用/停用 - */ -// // @PreAuthorize("@ss.hasPermi('system:store:edit')") @ApiOperation(value = "档口启用/停用", httpMethod = "PUT", response = R.class) @Log(title = "档口启用/停用", businessType = BusinessType.UPDATE) @PutMapping("/del-flag") @@ -77,10 +57,6 @@ public class StoreController extends XktBaseController { return R.ok(storeService.updateDelFlag(BeanUtil.toBean(updateDelFlagVO, StoreUpdateDelFlagDTO.class))); } - /** - * 档口审核 - */ -// // @PreAuthorize("@ss.hasPermi('system:store:edit')") @ApiOperation(value = "档口审核", httpMethod = "PUT", response = R.class) @Log(title = "档口审核", businessType = BusinessType.UPDATE) @PutMapping("/approve") @@ -88,44 +64,58 @@ public class StoreController extends XktBaseController { return R.ok(storeService.approve(BeanUtil.toBean(auditVO, StoreAuditDTO.class))); } - /** - * 获取档口详细信息 - */ -// // @PreAuthorize("@ss.hasPermi('system:product:query')") @ApiOperation(value = "获取档口详细信息", httpMethod = "GET", response = R.class) @GetMapping(value = "/{storeId}") public R getInfo(@PathVariable("storeId") Long storeId) { return R.ok(BeanUtil.toBean(storeService.getInfo(storeId), StoreBasicResVO.class)); } - /** - * 档口审核是获取档口基本信息 - */ -// // @PreAuthorize("@ss.hasPermi('system:product:query')") @ApiOperation(value = "档口审核是获取档口基本信息", httpMethod = "GET", response = R.class) @GetMapping(value = "/approve/{storeId}") public R getApproveInfo(@PathVariable("storeId") Long storeId) { return R.ok(BeanUtil.toBean(storeService.getApproveInfo(storeId), StoreApproveResVO.class)); } - /** - * APP获取档口基本信息 - */ @ApiOperation(value = "档口审核是获取档口基本信息", httpMethod = "GET", response = R.class) @GetMapping(value = "/app/{storeId}") public R getAppInfo(@PathVariable("storeId") Long storeId) { return R.ok(BeanUtil.toBean(storeService.getAppInfo(storeId), StoreAppResVO.class)); } - - /** - * 管理员审核推广图获取档口联系信息 - */ @ApiOperation(value = "管理员审核推广图获取档口联系信息", httpMethod = "GET", response = R.class) @GetMapping(value = "/advert/{storeId}") public R getAdvertStoreInfo(@PathVariable("storeId") Long storeId) { return R.ok(BeanUtil.toBean(storeService.getAdvertStoreInfo(storeId), StoreAdvertResVO.class)); } + @ApiOperation(value = "获取档口首页 数据概览 ", httpMethod = "POST", response = R.class) + @PostMapping(value = "/index/overview") + public R indexOverview(@Validated @RequestBody StoreOverviewVO overviewVO) { + return R.ok(BeanUtil.toBean(storeService.indexOverview(BeanUtil.toBean(overviewVO, StoreOverviewDTO.class)), StoreIndexOverviewResVO.class)); + } + + @ApiOperation(value = "获取档口首页 销售额 ", httpMethod = "POST", response = R.class) + @PostMapping(value = "/index/sale-revenue") + public R> indexSaleRevenue(@Validated @RequestBody StoreSaleRevenueVO revenueVO) { + return R.ok(BeanUtil.copyToList(storeService.indexSaleRevenue(BeanUtil.toBean(revenueVO, StoreSaleRevenueDTO.class)), StoreIndexSaleRevenueResVO.class)); + } + + @ApiOperation(value = "获取档口首页 今日销售额 ", httpMethod = "GET", response = R.class) + @GetMapping(value = "/index/today/sale-revenue/{storeId}") + public R indexTodaySaleRevenue(@PathVariable Long storeId) { + return R.ok(BeanUtil.toBean(storeService.indexTodaySaleRevenue(storeId), StoreIndexTodaySaleResVO.class)); + } + + @ApiOperation(value = "获取档口首页 商品销售额前10 ", httpMethod = "GET", response = R.class) + @GetMapping(value = "/index/sale/top10") + public R> indexTop10Sale(@Validated @RequestBody StoreSaleTop10VO saleTop10VO) { + return R.ok(BeanUtil.copyToList(storeService.indexTop10Sale(BeanUtil.toBean(saleTop10VO, StoreSaleTop10DTO.class)), StoreIndexSaleTop10ResVO.class)); + } + + @ApiOperation(value = "获取档口首页 客户销售榜前10 ", httpMethod = "GET", response = R.class) + @GetMapping(value = "/index/sale-customer/top10") + public R> indexTop10SaleCustomer(@Validated @RequestBody StoreSaleCustomerTop10VO saleCusTop10VO) { + return R.ok(BeanUtil.copyToList(storeService.indexTop10SaleCustomer(BeanUtil.toBean(saleCusTop10VO, StoreSaleCustomerTop10DTO.class)), StoreIndexCusSaleTop10ResVO.class)); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/quickFunction/StoreQuickFuncVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/quickFunction/StoreQuickFuncVO.java new file mode 100644 index 000000000..75e4972d9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/quickFunction/StoreQuickFuncVO.java @@ -0,0 +1,35 @@ +package com.ruoyi.web.controller.xkt.vo.quickFunction; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口快捷功能") +@Data +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +@NoArgsConstructor +@AllArgsConstructor +public class StoreQuickFuncVO { + + @ApiModelProperty(value = "菜单名称") + private String menuName; + @ApiModelProperty(value = "显示顺序") + private Integer orderNum; + @ApiModelProperty(value = "路由地址") + private String path; + @ApiModelProperty(value = "组件路径") + private String component; + @ApiModelProperty(value = "菜单图标") + private String icon; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexCusSaleTop10ResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexCusSaleTop10ResVO.java new file mode 100644 index 000000000..177838206 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexCusSaleTop10ResVO.java @@ -0,0 +1,29 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页商品销量前10") +@Data +public class StoreIndexCusSaleTop10ResVO { + + @ApiModelProperty(value = "档口客户名称") + private String storeCusName; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @ApiModelProperty(value = "销售退货金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "累计销量") + private Integer saleNum; + @ApiModelProperty(value = "累计退货量") + private Integer refundNum; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexOverviewResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexOverviewResVO.java new file mode 100644 index 000000000..1109f85f4 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexOverviewResVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页数据概览") +@Data +public class StoreIndexOverviewResVO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @ApiModelProperty(value = "销售退货金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "累计销量") + private Integer saleNum; + @ApiModelProperty(value = "累计退货量") + private Integer refundNum; + @ApiModelProperty(value = "累计入库数量") + private Integer storageNum; + @ApiModelProperty(value = "累计客户数") + private Integer customerNum; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexSaleRevenueResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexSaleRevenueResVO.java new file mode 100644 index 000000000..4c6f6ffe9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexSaleRevenueResVO.java @@ -0,0 +1,28 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页销售额") +@Data +public class StoreIndexSaleRevenueResVO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @ApiModelProperty(value = "单据日期") + private Date voucherDate; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexSaleTop10ResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexSaleTop10ResVO.java new file mode 100644 index 000000000..6758c7f92 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexSaleTop10ResVO.java @@ -0,0 +1,33 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页商品销量前10") +@Data +public class StoreIndexSaleTop10ResVO { + + @ApiModelProperty(value = "主图") + private String mainPic; + @ApiModelProperty(value = "货号") + private String prodArtNum; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @ApiModelProperty(value = "销售退货金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "累计销量") + private Integer saleNum; + @ApiModelProperty(value = "累计退货量") + private Integer refundNum; + @ApiModelProperty(value = "退货率") + private BigDecimal refundRate; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexTodaySaleResVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexTodaySaleResVO.java new file mode 100644 index 000000000..29e0a2930 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreIndexTodaySaleResVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页今日销售额") +@Data +public class StoreIndexTodaySaleResVO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "档口商品销售额列表") + List saleList; + + @Data + public static class SITSProdSaleVO { + @ApiModelProperty(value = "货号") + private String prodArtNum; + @ApiModelProperty(value = "销售额") + private Long saleAmount; + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreOverviewVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreOverviewVO.java new file mode 100644 index 000000000..47cb9e4b9 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreOverviewVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口数据概览") +@Data +@Accessors(chain = true) +public class StoreOverviewVO { + + @ApiModelProperty(value = "档口ID", required = true) + @NotNull(message = "档口ID不能为空") + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + @NotNull(message = "查询开始时间不能为空") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + @NotNull(message = "查询结束时间不能为空") + private Date voucherDateEnd; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleCustomerTop10VO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleCustomerTop10VO.java new file mode 100644 index 000000000..a9a7947ee --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleCustomerTop10VO.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口前10销售额") +@Data +@Accessors(chain = true) +public class StoreSaleCustomerTop10VO { + + @ApiModelProperty(value = "档口ID", required = true) + @NotNull(message = "档口ID不能为空") + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + @NotNull(message = "查询开始时间不能为空") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + @NotNull(message = "查询结束时间不能为空") + private Date voucherDateEnd; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleRevenueVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleRevenueVO.java new file mode 100644 index 000000000..54bcb0779 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleRevenueVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口销售额") +@Data +@Accessors(chain = true) +public class StoreSaleRevenueVO { + + @ApiModelProperty(value = "档口ID", required = true) + @NotNull(message = "档口ID不能为空") + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + @NotNull(message = "查询开始时间不能为空") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + @NotNull(message = "查询结束时间不能为空") + private Date voucherDateEnd; + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleTop10VO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleTop10VO.java new file mode 100644 index 000000000..a3c03b39f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/store/StoreSaleTop10VO.java @@ -0,0 +1,31 @@ +package com.ruoyi.web.controller.xkt.vo.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口前10销售额") +@Data +@Accessors(chain = true) +public class StoreSaleTop10VO { + + @ApiModelProperty(value = "档口ID", required = true) + @NotNull(message = "档口ID不能为空") + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + @NotNull(message = "查询开始时间不能为空") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + @NotNull(message = "查询结束时间不能为空") + private Date voucherDateEnd; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java index 05f3d171d..eba53eeda 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AdType.java @@ -71,7 +71,6 @@ public enum AdType { PC_STORE_MID_BANNER(202, "档口馆横幅", "/url"), - // 首页以图搜款框商品、以图搜款结果商品、点击以图搜款界面 PIC_SEARCH_PRODUCT(300, "以图搜款商品", "/url"), @@ -84,7 +83,6 @@ public enum AdType { PC_DOWNLOAD(403, "电脑端下载页", "/url"), - // APP首页顶部轮播图 APP_HOME_TOP_BANNER(501, "APP首页顶部轮播图", "/url"), // APP首页品牌好货 @@ -107,10 +105,6 @@ public enum AdType { APP_USER_CENTER_GUESS_YOU_LIKE(602, "APP我的猜你喜欢", "/url"), - // 以图搜款结果推广商品 -// PIC_SEARCH_RESULT_PRODUCT(701, "以图搜款结果推广商品", "/url"), - - ; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index 18139b70c..51ea8035d 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -65,7 +65,7 @@ public class SysLoginService { // 验证码校验 - validateCaptcha(username, code, uuid); +// validateCaptcha(username, code, uuid); // 登录前置校验 loginPreCheck(username, password); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java index c0974a3a5..eb9216f1e 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/DailyTaskController.java @@ -84,6 +84,12 @@ public class DailyTaskController extends BaseController { return R.ok(); } + @PostMapping("/symbol-redis") + public R saveSymbolToRedis(SysJob sysJob) throws ParseException { + task.saveSymbolToRedis(); + return R.ok(); + } + } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java index 067a63ef9..14f6108b8 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/XktTask.java @@ -478,10 +478,17 @@ public class XktTask { return; } storeList.forEach(store -> { - redisCache.setCacheObject(CacheConstants.STORE_KEY + store.getId(), store.getId(), 1, TimeUnit.DAYS); + redisCache.setCacheObject(CacheConstants.STORE_KEY + store.getId(), store, 1, TimeUnit.DAYS); }); } + /** + * 通过定时任务将symbol存放到redis中 + */ + public void saveSymbolToRedis() { + advertRoundService.initAdvertLockMap(); + } + /** * 自动关闭超时订单 */ diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleCustomerMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleCustomerMapper.xml index 426a26ff2..6f0c18678 100644 --- a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleCustomerMapper.xml +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleCustomerMapper.xml @@ -23,4 +23,27 @@ ss.store_cus_id + + \ No newline at end of file diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleMapper.xml index c61475954..61fec30ae 100644 --- a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleMapper.xml +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleMapper.xml @@ -8,9 +8,9 @@ SELECT ss.store_id, COALESCE(SUM(CASE WHEN ssd.sale_type = 1 THEN ssd.amount ELSE 0 END), 0) AS saleAmount, - COALESCE(SUM(CASE WHEN ssd.sale_type = 2 THEN ssd.amount ELSE 0 END), 0) AS returnAmount, + COALESCE(SUM(CASE WHEN ssd.sale_type = 2 THEN ssd.amount ELSE 0 END), 0) AS refundAmount, COALESCE(SUM(CASE WHEN ssd.sale_type = 1 THEN ssd.quantity ELSE 0 END), 0) AS saleNum, - COALESCE(SUM(CASE WHEN ssd.sale_type = 2 THEN ssd.quantity ELSE 0 END), 0) AS returnNum, + COALESCE(SUM(CASE WHEN ssd.sale_type = 2 THEN ssd.quantity ELSE 0 END), 0) AS refundNum, COALESCE(COUNT(ss.store_cus_id), 0) AS customerNum, COALESCE(SUM(sps.quantity), 0) AS storageNum FROM diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml index d7e723bfd..a53a85d09 100644 --- a/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/DailySaleProductMapper.xml @@ -51,6 +51,39 @@ + + \ No newline at end of file diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/DailySale.java b/xkt/src/main/java/com/ruoyi/xkt/domain/DailySale.java index 9cced4479..f6bec0751 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/DailySale.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/DailySale.java @@ -41,7 +41,7 @@ public class DailySale extends XktBaseEntity { /** * 退货金额 */ - private BigDecimal returnAmount; + private BigDecimal refundAmount; /** * 销售数量 */ @@ -49,7 +49,7 @@ public class DailySale extends XktBaseEntity { /** * 退货数量 */ - private Integer returnNum; + private Integer refundNum; /** * 拿货客户数量(人次) */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleCustomer.java b/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleCustomer.java index ab725cf1b..99b3e37b8 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleCustomer.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleCustomer.java @@ -43,7 +43,7 @@ public class DailySaleCustomer extends XktBaseEntity { /** * 退货金额 */ - private BigDecimal returnAmount; + private BigDecimal refundAmount; /** * 销售数量 */ @@ -51,7 +51,7 @@ public class DailySaleCustomer extends XktBaseEntity { /** * 退货数量 */ - private Integer returnNum; + private Integer refundNum; /** * 统计时间 */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleProduct.java b/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleProduct.java index be4919a59..727d7fa36 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleProduct.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/DailySaleProduct.java @@ -48,7 +48,7 @@ public class DailySaleProduct extends XktBaseEntity { /** * 退货金额 */ - private BigDecimal returnAmount; + private BigDecimal refundAmount; /** * 销售数量 */ @@ -56,7 +56,7 @@ public class DailySaleProduct extends XktBaseEntity { /** * 退货数量 */ - private Integer returnNum; + private Integer refundNum; /** * 统计时间 */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/index/PCIndexRecommendDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/index/PCIndexRecommendDTO.java index a2e13cf3e..425914d29 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/index/PCIndexRecommendDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/index/PCIndexRecommendDTO.java @@ -19,6 +19,10 @@ import java.util.List; @JsonInclude(JsonInclude.Include.NON_NULL) public class PCIndexRecommendDTO { + @ApiModelProperty(value = "父级分类ID") + private Long parCateId; + @ApiModelProperty(value = "商品分类ID") + private Long prodCateId; @ApiModelProperty(value = "档口ID") private String storeId; @ApiModelProperty(value = "档口名称") diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/newProd/PCNewRecommendDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/newProd/PCNewRecommendDTO.java index c0ef1a941..393666c32 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/newProd/PCNewRecommendDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/advertRound/pc/newProd/PCNewRecommendDTO.java @@ -19,6 +19,10 @@ import java.util.List; @JsonInclude(JsonInclude.Include.NON_NULL) public class PCNewRecommendDTO { + @ApiModelProperty(value = "父级分类ID") + private Long parCateId; + @ApiModelProperty(value = "商品分类ID") + private Long prodCateId; @ApiModelProperty(value = "档口ID") private String storeId; @ApiModelProperty(value = "档口名称") diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/dailySale/DailySaleDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/dailySale/DailySaleDTO.java index 7035de9dc..c94a5078c 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/dailySale/DailySaleDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/dailySale/DailySaleDTO.java @@ -24,7 +24,7 @@ public class DailySaleDTO { /** * 退货金额 */ - private BigDecimal returnAmount; + private BigDecimal refundAmount; /** * 销售数量 */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexCusSaleTop10ResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexCusSaleTop10ResDTO.java new file mode 100644 index 000000000..93ddae3ef --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexCusSaleTop10ResDTO.java @@ -0,0 +1,29 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页商品销量前10") +@Data +public class StoreIndexCusSaleTop10ResDTO { + + @ApiModelProperty(value = "档口客户名称") + private String storeCusName; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @ApiModelProperty(value = "销售退货金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "累计销量") + private Integer saleNum; + @ApiModelProperty(value = "累计退货量") + private Integer refundNum; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexOverviewResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexOverviewResDTO.java new file mode 100644 index 000000000..5f8c4588a --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexOverviewResDTO.java @@ -0,0 +1,35 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页数据概览") +@Data +@Accessors(chain = true) +public class StoreIndexOverviewResDTO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @ApiModelProperty(value = "销售退货金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "累计销量") + private Integer saleNum; + @ApiModelProperty(value = "累计退货量") + private Integer refundNum; + @ApiModelProperty(value = "累计入库数量") + private Integer storageNum; + @ApiModelProperty(value = "累计客户数") + private Integer customerNum; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexSaleRevenueResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexSaleRevenueResDTO.java new file mode 100644 index 000000000..126811b06 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexSaleRevenueResDTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.xkt.dto.store; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页销售额") +@Data +public class StoreIndexSaleRevenueResDTO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @ApiModelProperty(value = "单据日期") + private Date voucherDate; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexSaleTop10ResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexSaleTop10ResDTO.java new file mode 100644 index 000000000..1e200e1bd --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexSaleTop10ResDTO.java @@ -0,0 +1,35 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页商品销量前10") +@Data +public class StoreIndexSaleTop10ResDTO { + + @ApiModelProperty(value = "商品ID") + private Long storeProdId; + @ApiModelProperty(value = "主图") + private String mainPic; + @ApiModelProperty(value = "货号") + private String prodArtNum; + @ApiModelProperty(value = "销售出库金额") + private BigDecimal saleAmount; + @ApiModelProperty(value = "销售退货金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "累计销量") + private Integer saleNum; + @ApiModelProperty(value = "累计退货量") + private Integer refundNum; + @ApiModelProperty(value = "退货率") + private BigDecimal refundRate; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexTodaySaleResDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexTodaySaleResDTO.java new file mode 100644 index 000000000..8625b4e02 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreIndexTodaySaleResDTO.java @@ -0,0 +1,37 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口首页今日销售额") +@Data +@Accessors(chain = true) +public class StoreIndexTodaySaleResDTO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "其它销售额") + private BigDecimal otherAmount; + @ApiModelProperty(value = "档口商品销售额列表") + List saleList; + + @Data + @Accessors(chain = true) + public static class SITSProdSaleDTO { + @ApiModelProperty(value = "货号") + private String prodArtNum; + @ApiModelProperty(value = "销售额") + private BigDecimal saleAmount; + } + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreOverviewDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreOverviewDTO.java new file mode 100644 index 000000000..29e104943 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreOverviewDTO.java @@ -0,0 +1,28 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("更改档口基本信息") +@Data +@Accessors(chain = true) +public class StoreOverviewDTO { + + @ApiModelProperty(value = "档口ID", required = true) + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + private Date voucherDateEnd; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleCustomerTop10DTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleCustomerTop10DTO.java new file mode 100644 index 000000000..1094a64b5 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleCustomerTop10DTO.java @@ -0,0 +1,28 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口前10销售额") +@Data +@Accessors(chain = true) +public class StoreSaleCustomerTop10DTO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + private Date voucherDateEnd; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleRevenueDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleRevenueDTO.java new file mode 100644 index 000000000..262bc13e8 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleRevenueDTO.java @@ -0,0 +1,28 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口销售额") +@Data +@Accessors(chain = true) +public class StoreSaleRevenueDTO { + + @ApiModelProperty(value = "档口ID", required = true) + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + private Date voucherDateEnd; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleTop10DTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleTop10DTO.java new file mode 100644 index 000000000..055a4b2fe --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/store/StoreSaleTop10DTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.xkt.dto.store; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口前10销售额") +@Data +@Accessors(chain = true) +public class StoreSaleTop10DTO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "查询开始时间") + private Date voucherDateStart; + @ApiModelProperty(value = "查询结束时间") + private Date voucherDateEnd; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdPriceAndMainPicAndTagDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdPriceAndMainPicAndTagDTO.java index 426b9d46f..794b4414d 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdPriceAndMainPicAndTagDTO.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeProduct/StoreProdPriceAndMainPicAndTagDTO.java @@ -16,6 +16,10 @@ import java.util.List; @Data public class StoreProdPriceAndMainPicAndTagDTO { + @ApiModelProperty(value = "父级分类ID") + private Long parCateId; + @ApiModelProperty(value = "商品分类ID") + private Long prodCateId; @ApiModelProperty(value = "档口商品ID") private Long storeProdId; @ApiModelProperty(value = "档口ID") diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleCustomerMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleCustomerMapper.java index ae32a86c6..218dcfb18 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleCustomerMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleCustomerMapper.java @@ -3,6 +3,8 @@ package com.ruoyi.xkt.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.DailySaleCustomer; import com.ruoyi.xkt.dto.dailySale.DailySaleCusDTO; +import com.ruoyi.xkt.dto.store.StoreIndexCusSaleTop10ResDTO; +import com.ruoyi.xkt.dto.store.StoreSaleCustomerTop10DTO; import java.util.Date; import java.util.List; @@ -16,4 +18,12 @@ public interface DailySaleCustomerMapper extends BaseMapper { List selectDailySale(Date voucherDate); + /** + * 档口客户销售榜前10 + * + * @param saleCusTop10DTO 查询入参 + * @return List + */ + List selectTop10SaleCustomerList(StoreSaleCustomerTop10DTO saleCusTop10DTO); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java b/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java index b2461cd57..24d9e5017 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java +++ b/xkt/src/main/java/com/ruoyi/xkt/mapper/DailySaleProductMapper.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.xkt.domain.DailySaleProduct; import com.ruoyi.xkt.dto.dailySale.CateSaleRankDTO; import com.ruoyi.xkt.dto.dailySale.DailySaleProdDTO; +import com.ruoyi.xkt.dto.store.StoreIndexSaleTop10ResDTO; +import com.ruoyi.xkt.dto.store.StoreSaleTop10DTO; import org.apache.ibatis.annotations.Param; import java.util.Date; @@ -27,4 +29,11 @@ public interface DailySaleProductMapper extends BaseMapper { */ List selectSaleRankList(@Param("oneMonthAgo") Date oneMonthAgo, @Param("now") Date now); + /** + * 获取档口首页商品销量前10 + * @param saleTop10DTO 查询入参 + * @return List + */ + List selectTop10SaleList(StoreSaleTop10DTO saleTop10DTO); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreService.java index fc40a022f..78a9d73a9 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreService.java @@ -3,6 +3,8 @@ package com.ruoyi.xkt.service; import com.ruoyi.common.core.page.Page; import com.ruoyi.xkt.dto.store.*; +import java.util.List; + /** * 档口Service接口 * @@ -83,4 +85,44 @@ public interface IStoreService { */ StoreAdvertResDTO getAdvertStoreInfo(Long storeId); + /** + * 档口首页数据概览 + * + * @param overviewDTO 查询入参 + * @return StoreIndexOverviewResDTO + */ + StoreIndexOverviewResDTO indexOverview(StoreOverviewDTO overviewDTO); + + /** + * 档口首页销售额 + * + * @param revenueDTO 查询入参 + * @return StoreIndexSaleRevenueResDTO + */ + List indexSaleRevenue(StoreSaleRevenueDTO revenueDTO); + + /** + * 档口首页今日销售额 + * + * @param storeId 档口ID + * @return StoreIndexTodaySaleResDTO + */ + StoreIndexTodaySaleResDTO indexTodaySaleRevenue(Long storeId); + + /** + * 档口商品销售额前10 + * + * @param saleTop10DTO 销售额前10入参 + * @return List + */ + List indexTop10Sale(StoreSaleTop10DTO saleTop10DTO); + + /** + * 档口客户销售额前10 + * + * @param saleCusTop10DTO 销售额前10入参 + * @return List + */ + List indexTop10SaleCus(StoreSaleCustomerTop10DTO saleCusTop10DTO); + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java index 37aab34bf..1e97b87bb 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java @@ -605,18 +605,12 @@ public class AdvertRoundServiceImpl implements IAdvertRoundService { if (CollectionUtils.isEmpty(advertRoundList)) { return; } - // 服务器当前时间 yyyy-MM-dd - final Date now = DateUtils.parseDate(DateUtils.getDate(), DateUtils.YYYY_MM_DD); // 当天截止的时间 yyyy-MM-dd 22:00:00 final String todayFilterTime = DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS).format(LocalDateTime.now().withHour(22).withMinute(0).withSecond(0)); advertRoundList.stream().collect(Collectors.groupingBy(AdvertRound::getAdvertId)) .forEach((advertId, roundList) -> { // 判断当前推广类型是否为 时间范围 final boolean isTimeRange = roundList.stream().anyMatch(x -> Objects.equals(x.getShowType(), AdShowType.TIME_RANGE.getValue())); - // 判断当前时间所处的阶段 小于第一轮播放时间(有可能新广告还未开播)、处于第一轮中间、处于第一轮最后一天 - final Date firstRoundEndTime = roundList.stream().filter(x -> x.getRoundId().equals(AdRoundType.PLAY_ROUND.getValue())) - .max(Comparator.comparing(AdvertRound::getEndTime)) - .orElseThrow(() -> new ServiceException("获取推广结束时间失败,请联系客服!", HttpStatus.ERROR)).getEndTime(); // 时间范围处理逻辑 if (isTimeRange) { this.setTimeRangePatternDeadline(todayFilterTime, roundList); @@ -652,11 +646,9 @@ public class AdvertRoundServiceImpl implements IAdvertRoundService { * @param roundList 播放轮次 */ private void setTimeRangePatternDeadline(String todayFilterTime, List roundList) { - // 第一轮过期时间为当天 - AdvertRound firstRound = roundList.stream().filter(x -> Objects.equals(x.getRoundId(), AdRoundType.PLAY_ROUND.getValue())) - .max(Comparator.comparing(AdvertRound::getEndTime)) - .orElseThrow(() -> new ServiceException("获取推广结束时间失败,请联系客服!", HttpStatus.ERROR)); - redisCache.setCacheObject(ADVERT_DEADLINE_KEY + firstRound.getSymbol(), todayFilterTime, 1, TimeUnit.DAYS); + // 第一轮(有可能为 位置枚举[多个] 或 时间范围[单个]) + roundList.stream().filter(x -> Objects.equals(x.getRoundId(), AdRoundType.PLAY_ROUND.getValue())).distinct().forEach(x -> + redisCache.setCacheObject(ADVERT_DEADLINE_KEY + x.getSymbol(), todayFilterTime, 1, TimeUnit.DAYS)); // 第二轮之后的轮次过期时间都为开始时间前一天 Map roundSymbolMap = roundList.stream().filter(x -> !Objects.equals(x.getRoundId(), AdRoundType.PLAY_ROUND.getValue())) .collect(Collectors.toMap(AdvertRound::getSymbol, AdvertRound::getStartTime, (s1, s2) -> s2)); diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java index 591f5bd6b..7c0a59716 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreServiceImpl.java @@ -11,29 +11,25 @@ import com.ruoyi.common.core.page.Page; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.bigDecimal.CollectorsUtil; import com.ruoyi.system.mapper.SysUserMapper; -import com.ruoyi.xkt.domain.DailyStoreTag; -import com.ruoyi.xkt.domain.Store; -import com.ruoyi.xkt.domain.UserSubscriptions; +import com.ruoyi.xkt.domain.*; import com.ruoyi.xkt.dto.store.*; import com.ruoyi.xkt.enums.StoreStatus; -import com.ruoyi.xkt.mapper.DailyStoreTagMapper; -import com.ruoyi.xkt.mapper.StoreMapper; -import com.ruoyi.xkt.mapper.UserSubscriptionsMapper; +import com.ruoyi.xkt.mapper.*; import com.ruoyi.xkt.service.IAssetService; import com.ruoyi.xkt.service.IStoreCertificateService; import com.ruoyi.xkt.service.IStoreService; import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.ZoneId; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; /** @@ -53,6 +49,11 @@ public class StoreServiceImpl implements IStoreService { final UserSubscriptionsMapper userSubMapper; final RedisCache redisCache; final IAssetService assetService; + final DailySaleMapper dailySaleMapper; + final DailySaleCustomerMapper dailySaleCusMapper; + final StoreSaleDetailMapper saleDetailMapper; + final StoreProductMapper storeProdMapper; + final DailySaleProductMapper dailySaleProdMapper; /** @@ -237,4 +238,111 @@ public class StoreServiceImpl implements IStoreService { return storeMapper.updateById(store); } + /** + * 档口首页数据概览 + * + * @param overviewDTO 查询入参 + * @return StoreIndexOverviewResDTO + */ + @Override + @Transactional(readOnly = true) + public StoreIndexOverviewResDTO indexOverview(StoreOverviewDTO overviewDTO) { + List saleList = this.dailySaleMapper.selectList(new LambdaQueryWrapper() + .eq(DailySale::getStoreId, overviewDTO.getStoreId()).eq(DailySale::getDelFlag, Constants.UNDELETED) + .between(DailySale::getVoucherDate, overviewDTO.getVoucherDateStart(), overviewDTO.getVoucherDateEnd())); + if (CollectionUtils.isEmpty(saleList)) { + return new StoreIndexOverviewResDTO(); + } + // 总的销售出库金额 + BigDecimal saleAmount = saleList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSaleAmount(), BigDecimal.ZERO)).reduce(BigDecimal.ZERO, BigDecimal::add); + // 总的销售退货金额 + BigDecimal refundAmount = saleList.stream().map(x -> ObjectUtils.defaultIfNull(x.getRefundAmount(), BigDecimal.ZERO)).reduce(BigDecimal.ZERO, BigDecimal::add); + // 总的累计销量 + Integer saleNum = saleList.stream().map(DailySale::getSaleNum).reduce(0, Integer::sum); + // 总的累计退货量 + Integer refundNum = saleList.stream().map(DailySale::getRefundNum).reduce(0, Integer::sum); + // 总的累计入库数量 + Integer storageNum = saleList.stream().map(DailySale::getStorageNum).reduce(0, Integer::sum); + // 总的累计客户数 + Integer customerNum = saleList.stream().map(DailySale::getCustomerNum).reduce(0, Integer::sum); + return new StoreIndexOverviewResDTO().setSaleAmount(saleAmount).setRefundAmount(refundAmount).setSaleNum(saleNum).setRefundNum(refundNum) + .setStorageNum(storageNum).setCustomerNum(customerNum); + } + + /** + * 档口首页销售额 + * + * @param revenueDTO 查询入参 + * @return StoreIndexSaleRevenueResDTO + */ + @Override + @Transactional(readOnly = true) + public List indexSaleRevenue(StoreSaleRevenueDTO revenueDTO) { + List saleList = this.dailySaleMapper.selectList(new LambdaQueryWrapper() + .eq(DailySale::getStoreId, revenueDTO.getStoreId()).eq(DailySale::getDelFlag, Constants.UNDELETED) + .between(DailySale::getVoucherDate, revenueDTO.getVoucherDateStart(), revenueDTO.getVoucherDateEnd())); + return BeanUtil.copyToList(saleList, StoreIndexSaleRevenueResDTO.class); + } + + /** + * 档口首页今日销售额 + * + * @param storeId 档口ID + * @return StoreIndexTodaySaleResDTO + */ + @Override + @Transactional(readOnly = true) + public StoreIndexTodaySaleResDTO indexTodaySaleRevenue(Long storeId) { + List detailList = this.saleDetailMapper.selectList(new LambdaQueryWrapper() + .eq(StoreSaleDetail::getStoreId, storeId).eq(StoreSaleDetail::getDelFlag, Constants.UNDELETED) + .eq(StoreSaleDetail::getVoucherDate, java.sql.Date.valueOf(LocalDate.now()))); + if (CollectionUtils.isEmpty(detailList)) { + return new StoreIndexTodaySaleResDTO(); + } + List storeProdList = storeProdMapper.selectList(new LambdaQueryWrapper() + .in(StoreProduct::getId, detailList.stream().map(StoreSaleDetail::getStoreProdId).collect(Collectors.toList())) + .eq(StoreProduct::getDelFlag, Constants.UNDELETED)); + Map storeProdMap = storeProdList.stream().collect(Collectors.toMap(StoreProduct::getId, x -> x)); + Map saleMap = detailList.stream().collect(Collectors + .groupingBy(StoreSaleDetail::getStoreProdId, CollectorsUtil.summingBigDecimal(StoreSaleDetail::getAmount))); + List saleList = new ArrayList<>(); + saleMap.forEach((storeProdId, amount) -> { + StoreIndexTodaySaleResDTO.SITSProdSaleDTO saleDTO = new StoreIndexTodaySaleResDTO.SITSProdSaleDTO(); + saleDTO.setProdArtNum(ObjectUtils.isNotEmpty(storeProdMap.get(storeProdId)) ? storeProdMap.get(storeProdId).getProdArtNum() : "") + .setSaleAmount(amount); + saleList.add(saleDTO); + }); + // 总的金额 + final BigDecimal totalAmount = detailList.stream().map(StoreSaleDetail::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + // 销售额排名前5的列表 + List top5List = saleList.stream().sorted(Comparator.comparing(StoreIndexTodaySaleResDTO.SITSProdSaleDTO::getSaleAmount).reversed()).limit(5).collect(Collectors.toList()); + // 其它款式的销售额 + final BigDecimal otherAmount = totalAmount.subtract(top5List.stream().map(StoreIndexTodaySaleResDTO.SITSProdSaleDTO::getSaleAmount).reduce(BigDecimal.ZERO, BigDecimal::add)); + return new StoreIndexTodaySaleResDTO().setStoreId(storeId).setOtherAmount(otherAmount).setSaleList(top5List); + } + + /** + * 档口商品销售额前10 + * + * @param saleTop10DTO 销售额前10入参 + * @return List + */ + @Override + @Transactional(readOnly = true) + public List indexTop10Sale(StoreSaleTop10DTO saleTop10DTO) { + return this.dailySaleProdMapper.selectTop10SaleList(saleTop10DTO); + } + + /** + * 档口客户销售额前10 + * + * @param saleCusTop10DTO 销售额前10入参 + * @return List + */ + @Override + @Transactional(readOnly = true) + public List indexTop10SaleCus(StoreSaleCustomerTop10DTO saleCusTop10DTO) { + return this.dailySaleCusMapper.selectTop10SaleCustomerList(saleCusTop10DTO); + } + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsitePCServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsitePCServiceImpl.java index cf1033c43..cb31ca4c6 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsitePCServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/WebsitePCServiceImpl.java @@ -91,6 +91,10 @@ public class WebsitePCServiceImpl implements IWebsitePCService { // 从redis中获取数据 List redisList = this.redisCache.getCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_INDEX_RECOMMEND); if (CollectionUtils.isNotEmpty(redisList)) { + redisList = redisList.stream() + .filter(x -> CollectionUtils.isEmpty(searchDTO.getParCateIdList()) || searchDTO.getParCateIdList().contains(x.getParCateId().toString())) + .filter(x -> CollectionUtils.isEmpty(searchDTO.getProdCateIdList()) || searchDTO.getProdCateIdList().contains(x.getProdCateId().toString())) + .collect(Collectors.toList()); // 推广数据排在最前面,其次才是真实的数据 CollectionUtils.addAll(redisList, realDataList); // 添加广告的数据(PC的规则是将所有的广告数据全部放到最前面展示,不用给广告打标) @@ -107,12 +111,13 @@ public class WebsitePCServiceImpl implements IWebsitePCService { attrList = attrList.stream().peek(x -> x.setTags(StringUtils.isNotBlank(x.getTagStr()) ? Arrays.asList(x.getTagStr().split(",")) : null)).collect(Collectors.toList()); Map attrMap = attrList.stream().collect(Collectors.toMap(StoreProdPriceAndMainPicAndTagDTO::getStoreProdId, x -> x)); List indexRecommendList = new ArrayList<>(); - advertRoundList.stream().forEach(x -> { + advertRoundList.forEach(x -> { // 这里是一个档口上传多个档口商品,所以需要对prodIdStr的逗号进行分割 - List prodIdList = Arrays.asList(x.getProdIdStr().split(",")).stream().map(Long::parseLong).collect(Collectors.toList()); + List prodIdList = Arrays.stream(x.getProdIdStr().split(",")).map(Long::parseLong).collect(Collectors.toList()); prodIdList.forEach(storeProdId -> { StoreProdPriceAndMainPicAndTagDTO attrDto = attrMap.get(storeProdId); indexRecommendList.add(new PCIndexRecommendDTO().setAdvert(Boolean.TRUE).setStoreId(x.getStoreId().toString()) + .setParCateId(attrDto.getParCateId()).setProdCateId(attrDto.getProdCateId()) .setStoreProdId(storeProdId.toString()).setTags(ObjectUtils.isNotEmpty(attrDto) ? attrDto.getTags() : null) .setStoreName(ObjectUtils.isNotEmpty(attrDto) ? attrDto.getStoreName() : "") .setProdPrice(ObjectUtils.isNotEmpty(attrDto) ? attrDto.getMinPrice().toString() : null) @@ -124,7 +129,11 @@ public class WebsitePCServiceImpl implements IWebsitePCService { Collections.shuffle(indexRecommendList); // 放到redis中 有效期1天 this.redisCache.setCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_INDEX_RECOMMEND, indexRecommendList, 1, TimeUnit.DAYS); - CollectionUtils.addAll(indexRecommendList, realDataList); + List tempList = indexRecommendList.stream() + .filter(x -> CollectionUtils.isEmpty(searchDTO.getParCateIdList()) || searchDTO.getParCateIdList().contains(x.getParCateId().toString())) + .filter(x -> CollectionUtils.isEmpty(searchDTO.getProdCateIdList()) || searchDTO.getProdCateIdList().contains(x.getProdCateId().toString())) + .collect(Collectors.toList()); + CollectionUtils.addAll(tempList, realDataList); // 添加了广告的数据 return new Page<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), indexRecommendList); } @@ -151,6 +160,10 @@ public class WebsitePCServiceImpl implements IWebsitePCService { // 从redis中获取数据 List redisList = this.redisCache.getCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_NEW_RECOMMEND); if (CollectionUtils.isNotEmpty(redisList)) { + redisList = redisList.stream() + .filter(x -> CollectionUtils.isEmpty(searchDTO.getParCateIdList()) || searchDTO.getParCateIdList().contains(x.getParCateId().toString())) + .filter(x -> CollectionUtils.isEmpty(searchDTO.getProdCateIdList()) || searchDTO.getProdCateIdList().contains(x.getProdCateId().toString())) + .collect(Collectors.toList()); // 推广数据排在最前面,其次才是真实的数据 CollectionUtils.addAll(redisList, realDataList); // 添加广告的数据(PC的规则是将所有的广告数据全部放到最前面展示,不用给广告打标) @@ -167,12 +180,13 @@ public class WebsitePCServiceImpl implements IWebsitePCService { attrList = attrList.stream().peek(x -> x.setTags(StringUtils.isNotBlank(x.getTagStr()) ? Arrays.asList(x.getTagStr().split(",")) : null)).collect(Collectors.toList()); Map attrMap = attrList.stream().collect(Collectors.toMap(StoreProdPriceAndMainPicAndTagDTO::getStoreProdId, x -> x)); List newRecommendList = new ArrayList<>(); - advertRoundList.stream().forEach(x -> { + advertRoundList.forEach(x -> { // 这里是一个档口上传多个档口商品,所以需要对prodIdStr的逗号进行分割 - List prodIdList = Arrays.asList(x.getProdIdStr().split(",")).stream().map(Long::parseLong).collect(Collectors.toList()); + List prodIdList = Arrays.stream(x.getProdIdStr().split(",")).map(Long::parseLong).collect(Collectors.toList()); prodIdList.forEach(storeProdId -> { StoreProdPriceAndMainPicAndTagDTO attrDto = attrMap.get(storeProdId); newRecommendList.add(new PCNewRecommendDTO().setAdvert(Boolean.TRUE).setStoreId(x.getStoreId().toString()) + .setParCateId(attrDto.getParCateId()).setProdCateId(attrDto.getProdCateId()) .setStoreProdId(storeProdId.toString()).setTags(ObjectUtils.isNotEmpty(attrDto) ? attrDto.getTags() : null) .setStoreName(ObjectUtils.isNotEmpty(attrDto) ? attrDto.getStoreName() : "") .setProdPrice(ObjectUtils.isNotEmpty(attrDto) ? attrDto.getMinPrice().toString() : null) @@ -184,7 +198,11 @@ public class WebsitePCServiceImpl implements IWebsitePCService { Collections.shuffle(newRecommendList); // 放到redis中 有效期1天 this.redisCache.setCacheObject(CacheConstants.PC_ADVERT + CacheConstants.PC_NEW_RECOMMEND, newRecommendList, 1, TimeUnit.DAYS); - CollectionUtils.addAll(newRecommendList, realDataList); + List tempList = newRecommendList.stream() + .filter(x -> CollectionUtils.isEmpty(searchDTO.getParCateIdList()) || searchDTO.getParCateIdList().contains(x.getParCateId().toString())) + .filter(x -> CollectionUtils.isEmpty(searchDTO.getProdCateIdList()) || searchDTO.getProdCateIdList().contains(x.getProdCateId().toString())) + .collect(Collectors.toList()); + CollectionUtils.addAll(tempList, realDataList); // 添加了广告的数据 return new Page<>(page.getPageNum(), page.getPageSize(), page.getPages(), page.getTotal(), newRecommendList); } diff --git a/xkt/src/main/resources/mapper/StoreProductMapper.xml b/xkt/src/main/resources/mapper/StoreProductMapper.xml index 3fd5ad3e4..3f1fbf313 100644 --- a/xkt/src/main/resources/mapper/StoreProductMapper.xml +++ b/xkt/src/main/resources/mapper/StoreProductMapper.xml @@ -130,29 +130,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"