商品模块代码提交
This commit is contained in:
parent
a3e1e45a4e
commit
166250c654
|
|
@ -1,11 +1,13 @@
|
||||||
package com.czg.controller.admin;
|
package com.czg.controller.admin;
|
||||||
|
|
||||||
import com.czg.log.annotation.OperationLog;
|
import com.czg.log.annotation.OperationLog;
|
||||||
|
import com.czg.product.dto.ProdSkuDTO;
|
||||||
import com.czg.product.dto.ProductDTO;
|
import com.czg.product.dto.ProductDTO;
|
||||||
import com.czg.product.param.ProductIsSaleParam;
|
import com.czg.product.param.ProductIsSaleParam;
|
||||||
import com.czg.product.service.ProductService;
|
import com.czg.product.service.ProductService;
|
||||||
import com.czg.resp.CzgResult;
|
import com.czg.resp.CzgResult;
|
||||||
import com.czg.utils.AssertUtil;
|
import com.czg.utils.AssertUtil;
|
||||||
|
import com.czg.validator.ValidatorUtil;
|
||||||
import com.czg.validator.group.DefaultGroup;
|
import com.czg.validator.group.DefaultGroup;
|
||||||
import com.czg.validator.group.InsertGroup;
|
import com.czg.validator.group.InsertGroup;
|
||||||
import com.czg.validator.group.UpdateGroup;
|
import com.czg.validator.group.UpdateGroup;
|
||||||
|
|
@ -59,6 +61,9 @@ public class ProductController {
|
||||||
//@SaAdminCheckPermission("product:add")
|
//@SaAdminCheckPermission("product:add")
|
||||||
public CzgResult<Void> addProduct(@RequestBody @Validated({InsertGroup.class, DefaultGroup.class}) ProductDTO dto) {
|
public CzgResult<Void> addProduct(@RequestBody @Validated({InsertGroup.class, DefaultGroup.class}) ProductDTO dto) {
|
||||||
AssertUtil.isListEmpty(dto.getSkuList(), "商品SKU不能为空");
|
AssertUtil.isListEmpty(dto.getSkuList(), "商品SKU不能为空");
|
||||||
|
for (ProdSkuDTO prodSkuDTO : dto.getSkuList()) {
|
||||||
|
ValidatorUtil.validateEntity(prodSkuDTO, DefaultGroup.class);
|
||||||
|
}
|
||||||
productService.addProduct(dto);
|
productService.addProduct(dto);
|
||||||
return CzgResult.success();
|
return CzgResult.success();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package com.czg.controller.user;
|
||||||
import com.czg.log.annotation.OperationLog;
|
import com.czg.log.annotation.OperationLog;
|
||||||
import com.czg.product.param.MiniHomeProductParam;
|
import com.czg.product.param.MiniHomeProductParam;
|
||||||
import com.czg.product.service.UProductService;
|
import com.czg.product.service.UProductService;
|
||||||
|
import com.czg.product.vo.HotsProductVo;
|
||||||
import com.czg.product.vo.MiniAppHomeProductVo;
|
import com.czg.product.vo.MiniAppHomeProductVo;
|
||||||
import com.czg.resp.CzgResult;
|
import com.czg.resp.CzgResult;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
|
@ -10,9 +11,11 @@ import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户端商品相关接口
|
* 店铺商品
|
||||||
*
|
*
|
||||||
* @author Tankaikai tankaikai@aliyun.com
|
* @author Tankaikai tankaikai@aliyun.com
|
||||||
* @since 1.0 2025-02-16
|
* @since 1.0 2025-02-16
|
||||||
|
|
@ -27,11 +30,21 @@ public class UProductController {
|
||||||
/**
|
/**
|
||||||
* 小程序点餐-首页-商品列表
|
* 小程序点餐-首页-商品列表
|
||||||
*/
|
*/
|
||||||
@GetMapping("/miniApp/home/queryProduct")
|
//@GetMapping("/miniApp/home/queryProduct")
|
||||||
@OperationLog("小程序点餐-首页-商品列表")
|
//@OperationLog("小程序点餐-首页-商品列表")
|
||||||
public CzgResult<MiniAppHomeProductVo> queryProductForMiniAppHome(MiniHomeProductParam param) {
|
public CzgResult<MiniAppHomeProductVo> queryProductForMiniAppHome(MiniHomeProductParam param) {
|
||||||
MiniAppHomeProductVo data = uProductService.queryProductForMiniAppHome(param);
|
MiniAppHomeProductVo data = uProductService.queryProductForMiniAppHome(param);
|
||||||
return CzgResult.success(data);
|
return CzgResult.success(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序点餐-热销商品查询
|
||||||
|
*/
|
||||||
|
@GetMapping("/miniApp/hots/query")
|
||||||
|
@OperationLog("小程序点餐-热销商品列表")
|
||||||
|
public CzgResult<List<HotsProductVo>> queryProductForMiniAppHome() {
|
||||||
|
List<HotsProductVo> list = uProductService.queryHotsProductList();
|
||||||
|
return CzgResult.success(list);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -9,3 +9,11 @@ spring:
|
||||||
|
|
||||||
logging:
|
logging:
|
||||||
config: classpath:logback.xml
|
config: classpath:logback.xml
|
||||||
|
|
||||||
|
# MyBatis-Flex
|
||||||
|
mybatis-flex:
|
||||||
|
configuration:
|
||||||
|
map-underscore-to-camel-case: true
|
||||||
|
cache-enabled: false
|
||||||
|
call-setters-on-nulls: true
|
||||||
|
jdbc-type-for-null: 'null'
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package com.czg.product.dto;
|
package com.czg.product.dto;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.annotation.JSONField;
|
import com.alibaba.fastjson2.annotation.JSONField;
|
||||||
|
import com.czg.validator.group.DefaultGroup;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
|
|
@ -9,11 +11,11 @@ import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品SKU
|
* 商品SKU
|
||||||
*
|
*
|
||||||
* @author Tankaikai tankaikai@aliyun.com
|
* @author Tankaikai tankaikai@aliyun.com
|
||||||
* @since 1.0 2025-02-16
|
* @since 1.0 2025-02-16
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ProdSkuDTO implements Serializable {
|
public class ProdSkuDTO implements Serializable {
|
||||||
|
|
||||||
|
|
@ -39,22 +41,27 @@ public class ProdSkuDTO implements Serializable {
|
||||||
/**
|
/**
|
||||||
* 原价
|
* 原价
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "原价不能为空", groups = DefaultGroup.class)
|
||||||
private BigDecimal originPrice;
|
private BigDecimal originPrice;
|
||||||
/**
|
/**
|
||||||
* 成本价
|
* 成本价
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "成本价不能为空", groups = DefaultGroup.class)
|
||||||
private BigDecimal costPrice;
|
private BigDecimal costPrice;
|
||||||
/**
|
/**
|
||||||
* 会员价
|
* 会员价
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "会员价不能为空", groups = DefaultGroup.class)
|
||||||
private BigDecimal memberPrice;
|
private BigDecimal memberPrice;
|
||||||
/**
|
/**
|
||||||
* 售价
|
* 售价
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "售价不能为空", groups = DefaultGroup.class)
|
||||||
private BigDecimal salePrice;
|
private BigDecimal salePrice;
|
||||||
/**
|
/**
|
||||||
* 起售数量
|
* 起售数量
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "起售数量不能为空", groups = DefaultGroup.class)
|
||||||
private Integer suitNum;
|
private Integer suitNum;
|
||||||
/**
|
/**
|
||||||
* 规格详情
|
* 规格详情
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,12 @@ package com.czg.product.service;
|
||||||
|
|
||||||
import com.czg.product.entity.Product;
|
import com.czg.product.entity.Product;
|
||||||
import com.czg.product.param.MiniHomeProductParam;
|
import com.czg.product.param.MiniHomeProductParam;
|
||||||
|
import com.czg.product.vo.HotsProductVo;
|
||||||
import com.czg.product.vo.MiniAppHomeProductVo;
|
import com.czg.product.vo.MiniAppHomeProductVo;
|
||||||
import com.mybatisflex.core.service.IService;
|
import com.mybatisflex.core.service.IService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户端商品Service
|
* 用户端商品Service
|
||||||
* @author tankaikai
|
* @author tankaikai
|
||||||
|
|
@ -13,4 +16,6 @@ import com.mybatisflex.core.service.IService;
|
||||||
public interface UProductService extends IService<Product> {
|
public interface UProductService extends IService<Product> {
|
||||||
|
|
||||||
MiniAppHomeProductVo queryProductForMiniAppHome(MiniHomeProductParam param);
|
MiniAppHomeProductVo queryProductForMiniAppHome(MiniHomeProductParam param);
|
||||||
|
|
||||||
|
List<HotsProductVo> queryHotsProductList();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
package com.czg.product.vo;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.annotation.JSONField;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 热销商品
|
||||||
|
*
|
||||||
|
* @author tankaikai
|
||||||
|
* @since 2025-02-19 09:23
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class HotsProductVo implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品id
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 商品名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
/**
|
||||||
|
* 原价
|
||||||
|
*/
|
||||||
|
private BigDecimal originPrice;
|
||||||
|
/**
|
||||||
|
* 销售价
|
||||||
|
*/
|
||||||
|
private BigDecimal salePrice;
|
||||||
|
/**
|
||||||
|
* 会员价
|
||||||
|
*/
|
||||||
|
private BigDecimal memberPrice;
|
||||||
|
/**
|
||||||
|
* 封面图url
|
||||||
|
*/
|
||||||
|
private String coverImg;
|
||||||
|
/**
|
||||||
|
* 单位名称
|
||||||
|
*/
|
||||||
|
private String unitName;
|
||||||
|
/**
|
||||||
|
* 是否售罄 1-是 0-否
|
||||||
|
*/
|
||||||
|
private Integer isSoldStock;
|
||||||
|
/**
|
||||||
|
* 库存数量
|
||||||
|
*/
|
||||||
|
private Integer stockNumber;
|
||||||
|
/**
|
||||||
|
* 商品类型 single-单规格商品 sku-多规格商品 package-套餐商品 weight-称重商品 coupon-团购券
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
/**
|
||||||
|
* 套餐类型 0-固定套餐 1-可选套餐
|
||||||
|
*/
|
||||||
|
private String groupType;
|
||||||
|
/**
|
||||||
|
* 是否可售时间 1-是 0-否
|
||||||
|
*/
|
||||||
|
private Integer isSaleTime;
|
||||||
|
/**
|
||||||
|
* 商品每周销售日 如:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
|
||||||
|
*/
|
||||||
|
@JSONField(serialize = false)
|
||||||
|
private String days;
|
||||||
|
/**
|
||||||
|
* 可售卖起始时间
|
||||||
|
*/
|
||||||
|
@JSONField(serialize = false)
|
||||||
|
private LocalTime startTime;
|
||||||
|
/**
|
||||||
|
* 可售卖截止时间
|
||||||
|
*/
|
||||||
|
@JSONField(serialize = false)
|
||||||
|
private LocalTime endTime;
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,12 @@
|
||||||
package com.czg.service.product.mapper;
|
package com.czg.service.product.mapper;
|
||||||
|
|
||||||
import com.czg.product.entity.Product;
|
import com.czg.product.entity.Product;
|
||||||
|
import com.czg.product.vo.HotsProductVo;
|
||||||
import com.mybatisflex.core.BaseMapper;
|
import com.mybatisflex.core.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品
|
* 商品
|
||||||
|
|
@ -13,4 +17,6 @@ import org.apache.ibatis.annotations.Mapper;
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface ProductMapper extends BaseMapper<Product> {
|
public interface ProductMapper extends BaseMapper<Product> {
|
||||||
|
|
||||||
|
List<HotsProductVo> queryHotsProductList(@Param("shopId") Long shopId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
package com.czg.service.product.service.impl;
|
package com.czg.service.product.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.ObjUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.czg.enums.DeleteEnum;
|
import com.czg.enums.DeleteEnum;
|
||||||
import com.czg.enums.StatusEnum;
|
import com.czg.enums.StatusEnum;
|
||||||
import com.czg.enums.YesNoEnum;
|
import com.czg.enums.YesNoEnum;
|
||||||
|
|
@ -12,6 +14,7 @@ import com.czg.product.entity.ProdSku;
|
||||||
import com.czg.product.entity.Product;
|
import com.czg.product.entity.Product;
|
||||||
import com.czg.product.param.MiniHomeProductParam;
|
import com.czg.product.param.MiniHomeProductParam;
|
||||||
import com.czg.product.service.UProductService;
|
import com.czg.product.service.UProductService;
|
||||||
|
import com.czg.product.vo.HotsProductVo;
|
||||||
import com.czg.product.vo.MiniAppHomeProdGroupVo;
|
import com.czg.product.vo.MiniAppHomeProdGroupVo;
|
||||||
import com.czg.product.vo.MiniAppHomeProductInfoVo;
|
import com.czg.product.vo.MiniAppHomeProductInfoVo;
|
||||||
import com.czg.product.vo.MiniAppHomeProductVo;
|
import com.czg.product.vo.MiniAppHomeProductVo;
|
||||||
|
|
@ -160,6 +163,37 @@ public class UProductServiceImpl extends ServiceImpl<ProductMapper, Product> imp
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<HotsProductVo> queryHotsProductList() {
|
||||||
|
Long shopId = StpKit.USER.getShopId(0L);
|
||||||
|
List<HotsProductVo> list = productMapper.queryHotsProductList(shopId);
|
||||||
|
list.forEach(item -> {
|
||||||
|
item.setIsSaleTime(calcIsSaleTime(item.getDays(), item.getStartTime(), item.getEndTime()));
|
||||||
|
});
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算是否在可售时间内
|
||||||
|
*
|
||||||
|
* @param days 星期几,例如 "Monday,Tuesday"
|
||||||
|
* @param startTime 起售时间
|
||||||
|
* @param endTime 停售时间
|
||||||
|
* @return 是否可售时间 1-是,0-否
|
||||||
|
*/
|
||||||
|
private Integer calcIsSaleTime(String days, LocalTime startTime, LocalTime endTime) {
|
||||||
|
if (StrUtil.isBlank(days) || ObjUtil.isNull(startTime) || ObjUtil.isNull(endTime)) {
|
||||||
|
return YesNoEnum.NO.value();
|
||||||
|
}
|
||||||
|
String today = getWeekDayEnName();
|
||||||
|
List<String> dayList = StrUtil.split(days, ",");
|
||||||
|
LocalTime now = LocalTime.now().withNano(0);
|
||||||
|
if (CollUtil.contains(dayList, today) && now.isAfter(startTime) && now.isBefore(endTime)) {
|
||||||
|
return YesNoEnum.YES.value();
|
||||||
|
}
|
||||||
|
return YesNoEnum.NO.value();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前日期是星期几的英文名称
|
* 获取当前日期是星期几的英文名称
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -3,4 +3,33 @@
|
||||||
|
|
||||||
<mapper namespace="com.czg.service.product.mapper.ProductMapper">
|
<mapper namespace="com.czg.service.product.mapper.ProductMapper">
|
||||||
|
|
||||||
|
<select id="queryHotsProductList" resultType="com.czg.product.vo.HotsProductVo">
|
||||||
|
select
|
||||||
|
t1.id,
|
||||||
|
t1.name,
|
||||||
|
t2.origin_price,
|
||||||
|
t2.sale_price,
|
||||||
|
t2.member_price,
|
||||||
|
t1.cover_img,
|
||||||
|
t3.name as unit_name,
|
||||||
|
t1.is_sold_stock,
|
||||||
|
t1.stock_number,
|
||||||
|
t1.type,
|
||||||
|
t1.group_type,
|
||||||
|
t1.days,
|
||||||
|
t1.start_time,
|
||||||
|
t1.end_time
|
||||||
|
from tb_product t1
|
||||||
|
left join (select x.product_id,MIN(x.sale_price) as sale_price,x.origin_price,x.member_price from tb_prod_sku x
|
||||||
|
where x.is_del=0 and x.is_grounding = 1 and x.shop_id = #{shopId} group by x.product_id) t2 on t1.id =
|
||||||
|
t2.product_id
|
||||||
|
left join tb_shop_prod_unit t3 on t1.unit_id = t3.id
|
||||||
|
<where>
|
||||||
|
and t1.is_del = 0
|
||||||
|
and t1.is_sale = 1
|
||||||
|
and t1.is_hot = 1
|
||||||
|
and t1.shop_id = #{shopId}
|
||||||
|
</where>
|
||||||
|
order by t1.sort desc,t1.id desc
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
Loading…
Reference in New Issue