master:档口首页功能完善;

pull/1121/head
liujiang 2025-05-24 21:17:42 +08:00
parent 180b7a2e5c
commit 5fcd0d7236
42 changed files with 939 additions and 106 deletions

View File

@ -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<List<StoreQuickFuncVO>> getSelectedList(@PathVariable("roleId") Long roleId, @PathVariable("bizId") Long bizId) {
// 找到当前所有的快捷菜单
List<QuickFuncDTO.DetailDTO> 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<QuickFuncVO> 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();
}
}

View File

@ -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<Integer> 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<StorePageResDTO>> 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<StoreBasicResVO> 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<StoreApproveResVO> 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<StoreAppResVO> 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<StoreAdvertResVO> 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<StoreIndexOverviewResVO> 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<List<StoreIndexSaleRevenueResVO>> 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<StoreIndexTodaySaleResVO> 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<List<StoreIndexSaleTop10ResVO>> 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<List<StoreIndexCusSaleTop10ResVO>> indexTop10SaleCustomer(@Validated @RequestBody StoreSaleCustomerTop10VO saleCusTop10VO) {
return R.ok(BeanUtil.copyToList(storeService.indexTop10SaleCustomer(BeanUtil.toBean(saleCusTop10VO, StoreSaleCustomerTop10DTO.class)), StoreIndexCusSaleTop10ResVO.class));
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<SITSProdSaleVO> saleList;
@Data
public static class SITSProdSaleVO {
@ApiModelProperty(value = "货号")
private String prodArtNum;
@ApiModelProperty(value = "销售额")
private Long saleAmount;
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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"),
;

View File

@ -65,7 +65,7 @@ public class SysLoginService
{
// 验证码校验
validateCaptcha(username, code, uuid);
// validateCaptcha(username, code, uuid);
// 登录前置校验
loginPreCheck(username, password);

View File

@ -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();
}
}

View File

@ -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);
});
}
/**
* symbolredis
*/
public void saveSymbolToRedis() {
advertRoundService.initAdvertLockMap();
}
/**
*
*/

View File

@ -23,4 +23,27 @@
ss.store_cus_id
</select>
<select id="selectTop10SaleCustomerList" resultType="com.ruoyi.xkt.dto.store.StoreIndexCusSaleTop10ResDTO">
SELECT
dsc.store_cus_id,
sc.cus_name AS storeCusName,
SUM(IFNULL( dsc.sale_amount, 0 )) AS saleAmount,
SUM(IFNULL( dsc.refund_amount, 0 )) AS refundAmount,
SUM(IFNULL( dsc.sale_num, 0 )) AS saleNum,
SUM(IFNULL( dsc.refund_num, 0 )) AS refundNum
FROM
daily_sale_customer dsc
JOIN store_customer sc ON dsc.store_cus_id = sc.id
WHERE
dsc.store_id = #{storeId}
AND dsc.del_flag = 0
AND dsc.voucher_date BETWEEN #{voucherDateStart} AND #{voucherDateEnd}
GROUP BY
dsc.store_cus_id,
sc.cus_name
ORDER BY
saleAmount DESC
LIMIT 10
</select>
</mapper>

View File

@ -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

View File

@ -51,6 +51,39 @@
</select>
<select id="voucherDateEnd" resultType="com.ruoyi.xkt.dto.store.StoreIndexSaleTop10ResDTO">
SELECT
dsp.store_prod_id,
dsp.prod_art_num,
sf.file_url AS mainPic,
SUM(IFNULL( dsp.sale_amount, 0 )) AS saleAmount,
SUM(IFNULL( dsp.refund_amount, 0 )) AS refundAmount,
SUM(IFNULL( dsp.sale_num, 0 )) AS saleNum,
SUM(IFNULL( dsp.refund_num, 0 )) AS refundNum,
CASE
WHEN SUM(IFNULL( dsp.sale_num, 0 )) = 0 THEN
0 ELSE ROUND(
SUM(IFNULL( dsp.refund_num, 0 )) * 1.0 / SUM(IFNULL( dsp.sale_num, 0 )) * 100, 2)
END AS refundRate
FROM
daily_sale_product dsp
LEFT JOIN store_product_file spf ON dsp.store_prod_id = spf.store_prod_id
AND spf.file_type = 1
AND spf.order_num = 1
LEFT JOIN sys_file sf ON spf.file_id = sf.id
WHERE
dsp.store_id = #{storeId}
AND dsp.del_flag = 0
AND dsp.voucher_date BETWEEN #{voucherDateStart} AND #{voucherDateEnd}
GROUP BY
dsp.store_prod_id,
dsp.prod_art_num,
sf.file_url
ORDER BY
saleAmount DESC
LIMIT 10
</select>
</mapper>

View File

@ -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;
/**
*
*/

View File

@ -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;
/**
*
*/

View File

@ -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;
/**
*
*/

View File

@ -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 = "档口名称")

View File

@ -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 = "档口名称")

View File

@ -24,7 +24,7 @@ public class DailySaleDTO {
/**
* 退
*/
private BigDecimal returnAmount;
private BigDecimal refundAmount;
/**
*
*/

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<SITSProdSaleDTO> saleList;
@Data
@Accessors(chain = true)
public static class SITSProdSaleDTO {
@ApiModelProperty(value = "货号")
private String prodArtNum;
@ApiModelProperty(value = "销售额")
private BigDecimal saleAmount;
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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")

View File

@ -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<DailySaleCustomer> {
List<DailySaleCusDTO> selectDailySale(Date voucherDate);
/**
* 10
*
* @param saleCusTop10DTO
* @return List<StoreIndexCustomerSaleTop10ResDTO>
*/
List<StoreIndexCusSaleTop10ResDTO> selectTop10SaleCustomerList(StoreSaleCustomerTop10DTO saleCusTop10DTO);
}

View File

@ -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<DailySaleProduct> {
*/
List<CateSaleRankDTO> selectSaleRankList(@Param("oneMonthAgo") Date oneMonthAgo, @Param("now") Date now);
/**
* 10
* @param saleTop10DTO
* @return List<StoreIndexSaleTop10ResDTO>
*/
List<StoreIndexSaleTop10ResDTO> selectTop10SaleList(StoreSaleTop10DTO saleTop10DTO);
}

View File

@ -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<StoreIndexSaleRevenueResDTO> indexSaleRevenue(StoreSaleRevenueDTO revenueDTO);
/**
*
*
* @param storeId ID
* @return StoreIndexTodaySaleResDTO
*/
StoreIndexTodaySaleResDTO indexTodaySaleRevenue(Long storeId);
/**
* 10
*
* @param saleTop10DTO 10
* @return List<StoreIndexSaleTop10ResDTO>
*/
List<StoreIndexSaleTop10ResDTO> indexTop10Sale(StoreSaleTop10DTO saleTop10DTO);
/**
* 10
*
* @param saleCusTop10DTO 10
* @return List<StoreIndexCustomerSaleTop10ResDTO>
*/
List<StoreIndexCusSaleTop10ResDTO> indexTop10SaleCus(StoreSaleCustomerTop10DTO saleCusTop10DTO);
}

View File

@ -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<AdvertRound> 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<String, Date> roundSymbolMap = roundList.stream().filter(x -> !Objects.equals(x.getRoundId(), AdRoundType.PLAY_ROUND.getValue()))
.collect(Collectors.toMap(AdvertRound::getSymbol, AdvertRound::getStartTime, (s1, s2) -> s2));

View File

@ -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<DailySale> saleList = this.dailySaleMapper.selectList(new LambdaQueryWrapper<DailySale>()
.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<StoreIndexSaleRevenueResDTO> indexSaleRevenue(StoreSaleRevenueDTO revenueDTO) {
List<DailySale> saleList = this.dailySaleMapper.selectList(new LambdaQueryWrapper<DailySale>()
.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<StoreSaleDetail> detailList = this.saleDetailMapper.selectList(new LambdaQueryWrapper<StoreSaleDetail>()
.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<StoreProduct> storeProdList = storeProdMapper.selectList(new LambdaQueryWrapper<StoreProduct>()
.in(StoreProduct::getId, detailList.stream().map(StoreSaleDetail::getStoreProdId).collect(Collectors.toList()))
.eq(StoreProduct::getDelFlag, Constants.UNDELETED));
Map<Long, StoreProduct> storeProdMap = storeProdList.stream().collect(Collectors.toMap(StoreProduct::getId, x -> x));
Map<Long, BigDecimal> saleMap = detailList.stream().collect(Collectors
.groupingBy(StoreSaleDetail::getStoreProdId, CollectorsUtil.summingBigDecimal(StoreSaleDetail::getAmount)));
List<StoreIndexTodaySaleResDTO.SITSProdSaleDTO> 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<StoreIndexTodaySaleResDTO.SITSProdSaleDTO> 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<StoreIndexSaleTop10ResDTO>
*/
@Override
@Transactional(readOnly = true)
public List<StoreIndexSaleTop10ResDTO> indexTop10Sale(StoreSaleTop10DTO saleTop10DTO) {
return this.dailySaleProdMapper.selectTop10SaleList(saleTop10DTO);
}
/**
* 10
*
* @param saleCusTop10DTO 10
* @return List<StoreIndexCustomerSaleTop10ResDTO>
*/
@Override
@Transactional(readOnly = true)
public List<StoreIndexCusSaleTop10ResDTO> indexTop10SaleCus(StoreSaleCustomerTop10DTO saleCusTop10DTO) {
return this.dailySaleCusMapper.selectTop10SaleCustomerList(saleCusTop10DTO);
}
}

View File

@ -91,6 +91,10 @@ public class WebsitePCServiceImpl implements IWebsitePCService {
// 从redis中获取数据
List<PCIndexRecommendDTO> 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<Long, StoreProdPriceAndMainPicAndTagDTO> attrMap = attrList.stream().collect(Collectors.toMap(StoreProdPriceAndMainPicAndTagDTO::getStoreProdId, x -> x));
List<PCIndexRecommendDTO> indexRecommendList = new ArrayList<>();
advertRoundList.stream().forEach(x -> {
advertRoundList.forEach(x -> {
// 这里是一个档口上传多个档口商品所以需要对prodIdStr的逗号进行分割
List<Long> prodIdList = Arrays.asList(x.getProdIdStr().split(",")).stream().map(Long::parseLong).collect(Collectors.toList());
List<Long> 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<PCIndexRecommendDTO> 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<PCNewRecommendDTO> 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<Long, StoreProdPriceAndMainPicAndTagDTO> attrMap = attrList.stream().collect(Collectors.toMap(StoreProdPriceAndMainPicAndTagDTO::getStoreProdId, x -> x));
List<PCNewRecommendDTO> newRecommendList = new ArrayList<>();
advertRoundList.stream().forEach(x -> {
advertRoundList.forEach(x -> {
// 这里是一个档口上传多个档口商品所以需要对prodIdStr的逗号进行分割
List<Long> prodIdList = Arrays.asList(x.getProdIdStr().split(",")).stream().map(Long::parseLong).collect(Collectors.toList());
List<Long> 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<PCNewRecommendDTO> 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);
}

View File

@ -130,29 +130,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectPriceAndMainPicAndTagList" resultType="com.ruoyi.xkt.dto.storeProduct.StoreProdPriceAndMainPicAndTagDTO">
SELECT
sp.id AS storeProdId,
sp.prod_cate_id,
spc.parent_id AS parCateId,
sp.prod_art_num AS prodArtNum,
sf.file_url AS mainPicUrl,
sp.prod_title,
MIN( spcp.price ) AS minPrice,
sp.store_id,
s.store_name,
GROUP_CONCAT(DISTINCT dpt.tag ORDER BY dpt.type ASC) AS tagStr
GROUP_CONCAT( DISTINCT dpt.tag ORDER BY dpt.type ASC ) AS tags
FROM
store_product sp
JOIN store_product_color_price spcp ON sp.id = spcp.store_prod_id
JOIN store_product_file spf ON sp.id = spf.store_prod_id
LEFT JOIN sys_file sf ON spf.file_id = sf.id
JOIN store s ON sp.store_id = s.id
LEFT JOIN daily_prod_tag dpt ON sp.id = dpt.store_prod_id
AND dpt.del_flag = 0
AND sp.id IN
<foreach item="id" collection="storeProdIdList" open="(" separator="," close=")">
#{id}
</foreach>
JOIN store_product_color_price spcp ON sp.id = spcp.store_prod_id
JOIN store_product_file spf ON sp.id = spf.store_prod_id
LEFT JOIN sys_file sf ON spf.file_id = sf.id
JOIN store s ON sp.store_id = s.id
LEFT JOIN daily_prod_tag dpt ON sp.id = dpt.store_prod_id
AND dpt.del_flag = 0
LEFT JOIN sys_product_category spc ON sp.prod_cate_id = spc.id
WHERE
sp.del_flag = 0
AND spf.file_type = 1
AND spf.order_num = 1
AND sp.id IN
<foreach item="id" collection="storeProdIdList" open="(" separator="," close=")">
#{id}
</foreach>
GROUP BY
sp.id,
sf.file_url