| | |
| | | } |
| | | goodsIndex.setAuthFlag(goods.getAuthFlag()); |
| | | goodsIndex.setMarketEnable(goods.getMarketEnable()); |
| | | goodsIndex.setPreSaleBeginDate(goods.getPreSaleBeginDate()); |
| | | goodsIndex.setPreSaleEndDate(goods.getPreSaleEndDate()); |
| | | this.settingUpGoodsIndexOtherParam(goodsIndex); |
| | | return goodsIndex; |
| | | } |
| | |
| | | " \"type\": \"date\",\n" + |
| | | " \"format\": \"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"\n" + |
| | | " },\n" + |
| | | " \"preSaleEndDate\": {\n" + |
| | | " \"type\": \"date\",\n" + |
| | | " \"format\": \"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"\n" + |
| | | " },\n" + |
| | | " \"preSaleBeginDate\": {\n" + |
| | | " \"type\": \"date\",\n" + |
| | | " \"format\": \"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"\n" + |
| | | " },\n" + |
| | | " \"categoryPath\": {\n" + |
| | | " \"type\": \"text\",\n" + |
| | | " \"fielddata\": true,\n" + |
| | |
| | | import com.baomidou.mybatisplus.annotation.FieldStrategy; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.xkcoding.http.util.StringUtil; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.hibernate.validator.constraints.Length; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import javax.validation.constraints.Max; |
| | | import javax.validation.constraints.Min; |
| | | import javax.validation.constraints.NotEmpty; |
| | | import javax.validation.constraints.NotNull; |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | |
| | | @ApiModelProperty(value = "商品参数json", hidden = true) |
| | | private String params; |
| | | |
| | | @ApiModelProperty(value = "预售结束时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private Date preSaleEndDate; |
| | | |
| | | @ApiModelProperty(value = "预售开始时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private Date preSaleBeginDate; |
| | | @ApiModelProperty(value = "抽成比例") |
| | | private BigDecimal commission; |
| | | public Goods() { |
| | | } |
| | | |
| | |
| | | this.mobileIntro = goodsOperationDTO.getMobileIntro(); |
| | | this.goodsVideo = goodsOperationDTO.getGoodsVideo(); |
| | | this.price = goodsOperationDTO.getPrice(); |
| | | this.preSaleEndDate = goodsOperationDTO.getPreSaleEndDate(); |
| | | this.preSaleBeginDate = goodsOperationDTO.getPreSaleBeginDate(); |
| | | this.commission = goodsOperationDTO.getCommission(); |
| | | if (goodsOperationDTO.getGoodsParamsDTOList() != null && goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) { |
| | | this.params = JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList()); |
| | | } |
| | |
| | | import cn.lili.common.validation.EnumValue; |
| | | import cn.lili.modules.goods.entity.enums.GoodsSalesModeEnum; |
| | | import cn.lili.modules.goods.entity.enums.GoodsTypeEnum; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.*; |
| | | import org.hibernate.validator.constraints.Length; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import javax.validation.Valid; |
| | | import javax.validation.constraints.*; |
| | | import java.io.Serializable; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * 商品操作DTO |
| | |
| | | @ApiModelProperty(value = "浏览权限") |
| | | private String browsePermissions; |
| | | |
| | | |
| | | @ApiModelProperty(value = "预售结束时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private Date preSaleEndDate; |
| | | |
| | | @ApiModelProperty(value = "预售开始时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private Date preSaleBeginDate; |
| | | |
| | | @ApiModelProperty(value = "抽成比例") |
| | | @DecimalMax(value = "100",message = "抽成比例必须小于100") |
| | | @DecimalMin(value = "0",message = "抽成比例必须大于0") |
| | | private BigDecimal commission; |
| | | |
| | | public String getGoodsName() { |
| | | //对商品对名称做一个极限处理。这里没有用xss过滤是因为xss过滤为全局过滤,影响很大。 |
| | | // 业务中,全局代码中只有商品名称不能拥有英文逗号,是由于商品名称存在一个数据库联合查询,结果要根据逗号分组 |
| | |
| | | package cn.lili.modules.goods.entity.dto; |
| | | |
| | | import cn.lili.modules.goods.entity.dos.GoodsSku; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.NoArgsConstructor; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * @author paulG |
| | |
| | | @ApiModelProperty(value = "商品参数json") |
| | | private String params; |
| | | |
| | | |
| | | @ApiModelProperty(value = "预售结束时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private Date preSaleEndDate; |
| | | |
| | | @ApiModelProperty(value = "预售开始时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | private Date preSaleBeginDate; |
| | | |
| | | |
| | | } |
| | |
| | | public enum GoodsSalesModeEnum { |
| | | |
| | | RETAIL("零售"), |
| | | PRESALE("预售"), |
| | | WHOLESALE("批发"); |
| | | |
| | | private final String description; |
| | |
| | | * @param queryWrapper 查询条件 |
| | | * @return 售后VO分页 |
| | | */ |
| | | @Select("SELECT *,g.params as params FROM li_goods_sku gs inner join li_goods g on gs.goods_id = g.id ${ew.customSqlSegment}") |
| | | @Select("SELECT *,g.params as params,g.pre_sale_end_date,g.pre_sale_begin_date FROM li_goods_sku gs inner join li_goods g on gs.goods_id = g.id ${ew.customSqlSegment}") |
| | | IPage<GoodsSkuDTO> queryByParams(IPage<GoodsSkuDTO> page, @Param(Constants.WRAPPER) Wrapper<GoodsSkuDTO> queryWrapper); |
| | | |
| | | @Select("SELECT id as sku_id, quantity, goods_id,simple_specs,sn,goods_name FROM li_goods_sku ${ew.customSqlSegment}") |
| | |
| | | import cn.lili.modules.goods.entity.dos.GoodsSku; |
| | | import cn.lili.modules.goods.entity.dto.GoodsParamsDTO; |
| | | import cn.lili.modules.promotion.tools.PromotionTools; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | |
| | | import org.springframework.data.elasticsearch.annotations.Document; |
| | | import org.springframework.data.elasticsearch.annotations.Field; |
| | | import org.springframework.data.elasticsearch.annotations.FieldType; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.ArrayList; |
| | |
| | | @Field(type = FieldType.Nested) |
| | | private List<EsGoodsAttribute> attrList; |
| | | |
| | | |
| | | @ApiModelProperty(value = "预售结束时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @Field(type = FieldType.Date) |
| | | private Date preSaleEndDate; |
| | | |
| | | @ApiModelProperty(value = "预售开始时间") |
| | | @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @Field(type = FieldType.Date) |
| | | private Date preSaleBeginDate; |
| | | /** |
| | | * 商品促销活动集合 |
| | | * key 为 促销活动类型 |
| | |
| | | @ApiModelProperty("是否开启商品过滤") |
| | | private Boolean canFilter; |
| | | |
| | | @ApiModelProperty("是否需要开启过滤预售商品") |
| | | private Boolean needFilterPre; |
| | | |
| | | |
| | | |
| | | //过滤搜索关键字 |
| | |
| | | import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.ZoneId; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword()); |
| | | } |
| | | NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo); |
| | | if (Objects.nonNull(searchDTO.getCanFilter())&&searchDTO.getCanFilter()){ |
| | | if (Objects.nonNull(searchDTO.getCanFilter()) && searchDTO.getCanFilter()) { |
| | | searchQueryBuilder.withCollapseField("goodsId.keyword"); |
| | | } |
| | | NativeSearchQuery searchQuery = searchQueryBuilder.build(); |
| | |
| | | if (CharSequenceUtil.isNotEmpty(searchDTO.getPromotionsId()) && CharSequenceUtil.isNotEmpty(searchDTO.getPromotionType())) { |
| | | filterBuilder.must(QueryBuilders.wildcardQuery("promotionMapJson", "*" + searchDTO.getPromotionType() + "-" + searchDTO.getPromotionsId() + "*")); |
| | | } |
| | | |
| | | if (Objects.nonNull(searchDTO.getNeedFilterPre()) && searchDTO.getNeedFilterPre()) { |
| | | // 转换为当天 00:00:00 的时间戳(毫秒) |
| | | long time = LocalDate.now().atStartOfDay(ZoneId.systemDefault()) |
| | | .toInstant() |
| | | .toEpochMilli(); |
| | | // 条件2:预售结束时间 >= 当前时间 OR 结束时间为空 |
| | | filterBuilder.must(QueryBuilders.boolQuery() |
| | | .should(QueryBuilders.rangeQuery("preSaleEndDate").gte(time)) |
| | | .should(QueryBuilders.boolQuery() |
| | | .mustNot(QueryBuilders.existsQuery("preSaleEndDate")))); |
| | | // 条件1:预售开始时间 <= 当前时间 OR 开始时间为空 |
| | | filterBuilder.must(QueryBuilders.boolQuery() |
| | | .should(QueryBuilders.rangeQuery("preSaleBeginDate").lte(time)) |
| | | .should(QueryBuilders.boolQuery() |
| | | .mustNot(QueryBuilders.existsQuery("preSaleBeginDate")))); |
| | | } |
| | | //价格区间判定 |
| | | if (CharSequenceUtil.isNotEmpty(searchDTO.getPrice())) { |
| | | String[] prices = searchDTO.getPrice().split("_"); |
| | |
| | | import cn.lili.modules.store.entity.dos.StoreDetail; |
| | | import cn.lili.modules.store.service.StoreDetailService; |
| | | import cn.lili.utils.COSUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | |
| | | @ApiOperation(value = "新增商品") |
| | | @PostMapping(value = "/create", consumes = "application/json", produces = "application/json") |
| | | public ResultMessage<GoodsOperationDTO> save(@Valid @RequestBody GoodsOperationDTO goodsOperationDTO) { |
| | | System.err.println(JSONObject.toJSONString(goodsOperationDTO)); |
| | | goodsService.addGoods(goodsOperationDTO); |
| | | return ResultUtil.success(); |
| | | } |
| | |
| | | @ApiOperation(value = "修改商品") |
| | | @PutMapping(value = "/update/{goodsId}", consumes = "application/json", produces = "application/json") |
| | | public ResultMessage<GoodsOperationDTO> update(@Valid @RequestBody GoodsOperationDTO goodsOperationDTO, @PathVariable String goodsId) { |
| | | System.err.println(JSONObject.toJSONString(goodsOperationDTO)); |
| | | goodsService.editGoods(goodsOperationDTO, goodsId); |
| | | return ResultUtil.success(); |
| | | } |