master:系统商品定价调整,涉及到的客户销售管理,客户定价等一系列优化;

pull/1121/head
liujiang 2025-09-15 17:19:36 +08:00
parent 5d7cebeb0b
commit 27c00b9cc4
33 changed files with 419 additions and 645 deletions

View File

@ -8,7 +8,7 @@ import com.ruoyi.web.controller.xkt.vo.storeProdColorPrice.StoreProdColorPricePa
import com.ruoyi.web.controller.xkt.vo.storeProdColorPrice.StoreProdColorPriceVO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPricePageDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO;
import com.ruoyi.xkt.service.IStoreProductColorPriceService;
import com.ruoyi.xkt.service.IStoreProductColorService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@ -30,19 +30,19 @@ import java.util.List;
@RequestMapping("/rest/v1/prod-color-prices")
public class StoreProductColorPriceController extends XktBaseController {
final IStoreProductColorPriceService prodColorPriceService;
final IStoreProductColorService prodColorService;
@ApiOperation(value = "根据storeProdId获取所有颜色分类及定价", httpMethod = "GET", response = R.class)
@GetMapping(value = "/{storeId}/{storeProdId}")
public R<List<StoreProdColorPriceVO>> getColorPriceByStoreProdId(@PathVariable(value = "storeProdId") Long storeProdId, @PathVariable("storeId") Long storeId) {
return R.ok(BeanUtil.copyToList(prodColorPriceService.getColorPriceByStoreProdId(storeId, storeProdId), StoreProdColorPriceVO.class));
return R.ok(BeanUtil.copyToList(prodColorService.getColorPriceByStoreProdId(storeId, storeProdId), StoreProdColorPriceVO.class));
}
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()")
@ApiOperation(value = "获取商品颜色价格列表", httpMethod = "POST", response = R.class)
@PostMapping("/page")
public R<Page<StoreProdColorPriceResDTO>> page(@Validated @RequestBody StoreProdColorPricePageVO pageVO) {
return R.ok(prodColorPriceService.page(BeanUtil.toBean(pageVO, StoreProdColorPricePageDTO.class)));
return R.ok(prodColorService.page(BeanUtil.toBean(pageVO, StoreProdColorPricePageDTO.class)));
}
}

View File

@ -120,13 +120,6 @@ public class StoreProductController extends XktBaseController {
return R.ok(storeProdService.updateStoreProductStatus(BeanUtil.toBean(prodStatusVO, StoreProdStatusDTO.class)));
}
@PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()")
@ApiOperation(value = "获取档口图片空间", httpMethod = "POST", response = R.class)
@PostMapping(value = "/pic-space")
public R<StoreProdPicSpaceResVO> getStoreProductPicSpace(@Validated @RequestBody StoreProdPicSpaceVO picSpaceVO) {
return R.ok(BeanUtil.toBean(storeProdService.getStoreProductPicSpace(BeanUtil.toBean(picSpaceVO, StoreProdPicSpaceDTO.class)), StoreProdPicSpaceResVO.class));
}
@ApiOperation(value = "获取商品各个状态数量", httpMethod = "GET", response = R.class)
@GetMapping(value = "/status/num/{storeId}")
public R<StoreProdStatusCountResVO> getStatusNum(@PathVariable Long storeId) {

View File

@ -188,12 +188,22 @@ public class StoreProdCreateVO {
@Valid
@ApiModel
public static class SPCSizeVO {
@ApiModelProperty(value = "档口商品颜色ID")
private Long storeColorId;
@NotBlank(message = "颜色名称不能为空!")
@ApiModelProperty(value = "颜色名称", required = true)
private String colorName;
@ApiModelProperty(value = "商品尺码", required = true)
@NotNull(message = "档口商品定价不能为空!")
private Integer size;
@NotNull(message = "档口商品定价不能为空!")
@ApiModelProperty(value = "档口商品定价", required = true)
private BigDecimal price;
@NotNull(message = "是否是标准尺码不能为空!")
@ApiModelProperty(value = "是否是标准尺码", required = true)
private Integer standard;
}
@Data

View File

@ -9,7 +9,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -58,8 +57,6 @@ public class StoreProdResVO {
private List<StoreColorVO> allColorList;
@ApiModelProperty(value = "商品颜色列表")
private List<StoreColorVO> colorList;
@ApiModelProperty(value = "档口颜色价格列表")
private List<StoreProdColorPriceVO> priceList;
@ApiModelProperty(value = "档口商品尺码列表")
private List<StoreProdSizeVO> sizeList;
@ApiModelProperty(value = "档口服务承诺")
@ -74,12 +71,16 @@ public class StoreProdResVO {
@NoArgsConstructor
@Valid
public static class StoreProdSizeVO {
@ApiModelProperty(value = "商品尺码", required = true)
@NotNull(message = "档口商品定价不能为空!")
@ApiModelProperty(value = "档口商品颜色ID")
private Long storeColorId;
@ApiModelProperty(value = "颜色名称")
private String colorName;
@ApiModelProperty(value = "商品尺码")
private Integer size;
@NotNull(message = "是否是标准尺码不能为空!")
@ApiModelProperty(value = "是否是标准尺码", required = true)
@ApiModelProperty(value = "是否是标准尺码")
private Integer standard;
@ApiModelProperty(value = "尺码价格")
private BigDecimal price;
}
@Data
@ -98,11 +99,11 @@ public class StoreProdResVO {
@Data
public static class StoreProdCateAttrVO {
@ApiModelProperty(value = "帮面材质", required = true)
@ApiModelProperty(value = "帮面材质")
private String upperMaterial;
@ApiModelProperty(value = "内里材质", required = true)
@ApiModelProperty(value = "内里材质")
private String liningMaterial;
@ApiModelProperty(value = "鞋垫材质", required = true)
@ApiModelProperty(value = "鞋垫材质")
private String insoleMaterial;
@ApiModelProperty(value = "上市季节年份")
private String releaseYearSeason;
@ -142,14 +143,6 @@ public class StoreProdResVO {
private String suitablePerson;
}
@Data
public static class StoreProdColorPriceVO {
@ApiModelProperty(value = "档口商品颜色ID")
private Long storeColorId;
@ApiModelProperty(value = "档口商品定价")
private BigDecimal price;
}
@Data
public static class StoreProdSvcVO {
@ApiModelProperty(value = "大小码及定制款可退")

View File

@ -81,10 +81,6 @@ public class StoreProdVO {
@Valid
@ApiModelProperty(value = "档口尺码列表", required = true)
private List<StoreProdCreateVO.SPCSizeVO> sizeList;
@Valid
@NotNull(message = "商品颜色价格列表不能为空!")
@ApiModelProperty(value = "档口颜色价格列表", required = true)
private List<StoreProdCreateVO.SPCColorPriceVO> colorPriceList;
@ApiModelProperty(value = "档口服务承诺")
private StoreProdCreateVO.StoreProdSvcVO svc;
@NotBlank(message = "详情内容不能为空!")
@ -94,24 +90,6 @@ public class StoreProdVO {
private StoreProdCreateVO.StoreProdProcessVO process;
@Data
@Valid
@ApiModel
public static class SPCColorPriceVO {
@ApiModelProperty(value = "档口商品颜色ID")
private Long storeColorId;
@NotBlank(message = "颜色名称不能为空!")
@ApiModelProperty(value = "颜色名称", required = true)
private String colorName;
@NotNull(message = "档口商品定价不能为空!")
@ApiModelProperty(value = "档口商品定价", required = true)
private BigDecimal price;
@NotNull(message = "排序不能为空!")
@ApiModelProperty(value = "排序", required = true)
private Integer orderNum;
}
@Data
@Valid
@ApiModel

View File

@ -28,8 +28,6 @@ public class StoreProdStockAndDiscountResVO {
private BigDecimal price;
@ApiModelProperty(value = "优惠金额")
private Integer discount;
@ApiModelProperty(value = "大小码加价")
private Integer overPrice;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "档口商品ID")

View File

@ -55,8 +55,6 @@ public class ShopCartEditDetailResVO {
private String colorName;
@ApiModelProperty(value = "排序")
private Integer orderNum;
@ApiModelProperty(value = "档口商品定价")
private BigDecimal price;
@ApiModelProperty(value = "商品尺码及库存")
List<StoreProdSizeStockVO> sizeStockList;
}
@ -65,6 +63,8 @@ public class ShopCartEditDetailResVO {
@ApiModel
@Accessors(chain = true)
public static class StoreProdSizeStockVO {
@ApiModelProperty(value = "档口商品定价")
private BigDecimal price;
@ApiModelProperty(value = "商品尺码")
private Integer size;
@ApiModelProperty(value = "尺码库存")

View File

@ -114,7 +114,6 @@ public class XktTask {
final StoreProductFileMapper storeProdFileMapper;
final UserSearchHistoryMapper userSearchHisMapper;
final UserBrowsingHistoryMapper userBrowHisMapper;
final StoreProductColorPriceMapper prodColorPriceMapper;
final IPictureService pictureService;
final NoticeMapper noticeMapper;
final UserNoticeMapper userNoticeMapper;
@ -123,6 +122,7 @@ public class XktTask {
final IExpressService expressService;
final ZtoExpressManagerImpl ztoExpressManager;
final SysDictDataMapper dictDataMapper;
final StoreProductColorSizeMapper prodColorSizeMapper;
public void test() throws IOException {
System.err.println("aaa");
@ -845,12 +845,8 @@ public class XktTask {
List<SysProductCategory> prodCateList = this.prodCateMapper.selectList(new LambdaQueryWrapper<SysProductCategory>()
.eq(SysProductCategory::getDelFlag, Constants.UNDELETED));
Map<Long, SysProductCategory> prodCateMap = prodCateList.stream().collect(Collectors.toMap(SysProductCategory::getId, x -> x));
// 父级分类
Map<Long, Long> parProdCateMap = prodCateList.stream().collect(Collectors.toMap(SysProductCategory::getParentId, SysProductCategory::getParentId, (s1, s2) -> s2));
// 子分类
Map<Long, Long> childProdCateMap = prodCateList.stream().collect(Collectors.toMap(SysProductCategory::getId, SysProductCategory::getId));
// 获取当前商品最低价格
Map<Long, BigDecimal> prodMinPriceMap = this.prodColorPriceMapper.selectStoreProdMinPriceList(storeProdIdList).stream().collect(Collectors
Map<Long, BigDecimal> prodMinPriceMap = this.prodColorSizeMapper.selectStoreProdMinPriceList(storeProdIdList).stream().collect(Collectors
.toMap(StoreProdMinPriceDTO::getStoreProdId, StoreProdMinPriceDTO::getPrice));
// 档口商品的属性map
Map<Long, StoreProductCategoryAttribute> cateAttrMap = this.cateAttrMapper.selectList(new LambdaQueryWrapper<StoreProductCategoryAttribute>()

View File

@ -17,33 +17,42 @@ import java.math.BigDecimal;
* @author ruoyi
* @date 2025-03-26
*/
/*
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class StoreProductColorPrice extends XktBaseEntity {
private static final long serialVersionUID = 1L;
/**
*/
/**
* ID
*/
*//*
@TableId
private Long id;
/**
*/
/**
* ID
*/
*//*
@Excel(name = "档口颜色ID")
private Long storeColorId;
/**
*/
/**
* ID
*/
*//*
@Excel(name = "档口商品ID")
private Long storeProdId;
/**
*/
/**
*
*/
*//*
@Excel(name = "档口商品定价")
private BigDecimal price;
@ -63,3 +72,4 @@ public class StoreProductColorPrice extends XktBaseEntity {
.toString();
}
}
*/

View File

@ -29,7 +29,7 @@ public class StoreProdColorPriceResDTO {
private String prodArtNum;
@ApiModelProperty(value = "颜色名称")
private String colorName;
@ApiModelProperty(value = "档口商品颜色价")
@ApiModelProperty(value = "档口商品颜色最低售价")
private BigDecimal price;
@ApiModelProperty(value = "大小码加价")
private Integer overPrice;

View File

@ -3,6 +3,8 @@ package com.ruoyi.xkt.dto.storeProdColorSize;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author liujiang
* @version v1.0
@ -11,9 +13,15 @@ import lombok.Data;
@Data
public class StoreProdSizeDTO {
@ApiModelProperty(value = "档口商品颜色ID")
private Long storeColorId;
@ApiModelProperty(value = "颜色名称")
private String colorName;
@ApiModelProperty(value = "商品尺码")
private Integer size;
@ApiModelProperty(value = "是否是标准尺码")
private Integer standard;
@ApiModelProperty(value = "尺码价格")
private BigDecimal price;
}

View File

@ -1,6 +1,5 @@
package com.ruoyi.xkt.dto.storeProduct;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.xkt.dto.storeColor.StoreColorDTO;
import com.ruoyi.xkt.dto.storeProdCateAttr.StoreProdCateAttrDTO;
import com.ruoyi.xkt.dto.storeProdProcess.StoreProdProcessDTO;
@ -14,9 +13,6 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -33,25 +29,17 @@ public class StoreProdDTO {
@ApiModelProperty(value = "档口商品名称")
private String prodName;
@ApiModelProperty(value = "档口ID", required = true)
@NotNull(message = "档口ID不能为空!")
@ApiModelProperty(value = "档口ID")
private Long storeId;
@ApiModelProperty(value = "商品分类ID", required = true)
@NotNull(message = "商品分类ID不能为空!")
@ApiModelProperty(value = "商品分类ID")
private Long prodCateId;
@ApiModelProperty(value = "商品分类名称", required = true)
@NotBlank(message = "商品分类名称不能为空!")
@ApiModelProperty(value = "商品分类名称")
private String prodCateName;
@ApiModelProperty(value = "工厂货号")
@Size(min = 0, max = 15, message = "工厂货号不能超过60个字!")
private String factoryArtNum;
@ApiModelProperty(value = "商品货号", required = true)
@Size(min = 0, max = 15, message = "商品货号不能超过60个字!")
@NotBlank(message = "商品货号不能为空!")
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "商品标题", required = true)
@Size(min = 0, max = 60, message = "商品标题不能超过60个字!")
@NotBlank(message = "商品标题不能为空!")
@ApiModelProperty(value = "商品标题")
private String prodTitle;
@ApiModelProperty(value = "商品重量")
private BigDecimal prodWeight;
@ -61,72 +49,41 @@ public class StoreProdDTO {
private Integer overPrice;
@ApiModelProperty(value = "发货时效")
private Integer deliveryTime;
@ApiModelProperty(value = "上架方式:1 立即上架 2 定时上架", required = true)
@NotNull(message = "上架方式不能为空!")
@ApiModelProperty(value = "上架方式:1 立即上架 2 定时上架")
private Integer listingWay;
@ApiModelProperty(value = "商品状态1.未发布 2. 在售 3. 尾货 4.已下架 5. 已删除", required = true)
@NotNull(message = "商品状态不能为空!")
@ApiModelProperty(value = "商品状态1.未发布 2. 在售 3. 尾货 4.已下架 5. 已删除")
private Integer prodStatus;
@ApiModelProperty(value = "定时发货时间(精确到小时)")
@JsonFormat(pattern = "yyyy-MM-dd HH")
private Date listingWaySchedule;
@ApiModelProperty(value = "档口文件列表", required = true)
@NotNull(message = "档口文件不能为空!")
@Valid
@ApiModelProperty(value = "档口文件列表")
private List<StoreProdFileDTO> fileList;
@NotNull(message = "档口类目属性不能为空!")
@Valid
@ApiModelProperty(value = "档口类目属性", required = true)
@ApiModelProperty(value = "档口类目属性")
private StoreProdCateAttrDTO cateAttr;
@NotNull(message = "档口所有颜色列表不能为空!")
@ApiModelProperty(value = "档口所有颜色列表", required = true)
@Valid
@ApiModelProperty(value = "档口所有颜色列表")
private List<StoreColorDTO> allColorList;
@NotNull(message = "档口尺码列表不能为空!")
@Valid
@ApiModelProperty(value = "档口尺码列表", required = true)
@ApiModelProperty(value = "档口尺码列表")
private List<SPCSizeDTO> sizeList;
@Valid
@NotNull(message = "商品颜色价格列表不能为空!")
@ApiModelProperty(value = "档口颜色价格列表", required = true)
private List<SPCColorPriceDTO> colorPriceList;
@ApiModelProperty(value = "档口服务承诺")
private StoreProdSvcDTO svc;
@NotBlank(message = "详情内容不能为空!")
@ApiModelProperty(value = "详情内容", required = true)
// @Xss
@ApiModelProperty(value = "详情内容")
private String detail;
@ApiModelProperty(value = "档口生产工艺")
private StoreProdProcessDTO process;
@Data
@Valid
public static class SPCColorPriceDTO {
@ApiModelProperty(value = "档口商品颜色ID")
private Long storeColorId;
@NotBlank(message = "颜色名称不能为空!")
@ApiModelProperty(value = "颜色名称", required = true)
private String colorName;
@NotNull(message = "档口商品定价不能为空!")
@ApiModelProperty(value = "档口商品定价", required = true)
private BigDecimal price;
@NotNull(message = "排序不能为空!")
@ApiModelProperty(value = "排序", required = true)
private Integer orderNum;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Valid
public static class SPCSizeDTO {
@ApiModelProperty(value = "商品尺码", required = true)
@NotNull(message = "档口商品定价不能为空!")
@ApiModelProperty(value = "档口商品颜色ID")
private Long storeColorId;
@ApiModelProperty(value = "颜色名称")
private String colorName;
@ApiModelProperty(value = "商品尺码")
private Integer size;
@NotNull(message = "是否是标准尺码不能为空!")
@ApiModelProperty(value = "是否是标准尺码", required = true)
@ApiModelProperty(value = "档口商品定价")
private BigDecimal price;
@ApiModelProperty(value = "是否是标准尺码")
private Integer standard;
}

View File

@ -65,8 +65,6 @@ public class StoreProdResDTO {
private List<StoreProdColorDTO> colorList;
@ApiModelProperty(value = "档口商品尺码列表")
private List<StoreProdSizeDTO> sizeList;
@ApiModelProperty(value = "档口颜色价格列表")
private List<StoreProdColorPriceSimpleDTO> priceList;
@ApiModelProperty(value = "档口服务承诺")
private StoreProdSvcDTO svc;
@ApiModelProperty(value = "详情内容")

View File

@ -24,12 +24,8 @@ public class StoreProdStockAndDiscountResDTO {
private Long storeCusId;
@ApiModelProperty(value = "档口客户名称")
private String storeCusName;
@ApiModelProperty(value = "销售金额")
private BigDecimal price;
@ApiModelProperty(value = "优惠金额")
private Integer discount;
@ApiModelProperty(value = "大小码加价")
private Integer overPrice;
@ApiModelProperty(value = "商品货号")
private String prodArtNum;
@ApiModelProperty(value = "档口商品ID")
@ -45,6 +41,8 @@ public class StoreProdStockAndDiscountResDTO {
@Data
public static class SPSADSizeDTO {
@ApiModelProperty(value = "销售金额")
private BigDecimal price;
@ApiModelProperty(value = "尺码")
private Integer size;
@ApiModelProperty(value = "是否是标准尺码")

View File

@ -43,7 +43,7 @@ public class ShopCartDetailResDTO {
}
@Data
@ApiModel(value = "档口商品基本信息")
@ApiModel
@Accessors(chain = true)
public static class SCDStoreProdColorDTO {
@ApiModelProperty(value = "档口商品颜色ID")
@ -54,16 +54,16 @@ public class ShopCartDetailResDTO {
private String colorName;
@ApiModelProperty(value = "排序")
private Integer orderNum;
@ApiModelProperty(value = "档口商品定价")
private BigDecimal price;
@ApiModelProperty(value = "商品尺码及库存")
List<SCDStoreProdSizeStockDTO> sizeStockList;
}
@Data
@ApiModel(value = "档口商品尺码及库存")
@ApiModel
@Accessors(chain = true)
public static class SCDStoreProdSizeStockDTO {
@ApiModelProperty(value = "档口商品定价")
private BigDecimal price;
@ApiModelProperty(value = "商品尺码")
private Integer size;
@ApiModelProperty(value = "尺码库存")

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.StoreProductColor;
import com.ruoyi.xkt.dto.storeProdColor.StoreProdColorDTO;
import com.ruoyi.xkt.dto.storeProdColor.StoreProdColorResDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPricePageDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO;
import com.ruoyi.xkt.dto.storeProduct.StoreProdPageDTO;
import com.ruoyi.xkt.dto.storeProduct.StoreProdPageResDTO;
import org.apache.ibatis.annotations.Param;
@ -22,6 +24,7 @@ public interface StoreProductColorMapper extends BaseMapper<StoreProductColor> {
/**
*
*
* @param storeProdId ID
*/
void updateDelFlagByStoreProdId(Long storeProdId);
@ -51,4 +54,20 @@ public interface StoreProductColorMapper extends BaseMapper<StoreProductColor> {
*/
List<StoreProdColorResDTO> fuzzyQueryColorList(@Param("storeId") Long storeId, @Param("prodArtNum") String prodArtNum);
/**
*
*
* @param storeProdId ID
* @param storeId ID
* @return List<StoreProdColorPriceResDTO>
*/
List<StoreProdColorPriceResDTO> selectListByStoreProdIdAndStoreId(@Param("storeProdId") Long storeProdId, @Param("storeId") Long storeId);
/**
*
*
* @param pageDTO
* @return List<StoreProdColorPriceResDTO>
*/
List<StoreProdColorPriceResDTO> selectColorPricePage(StoreProdColorPricePageDTO pageDTO);
}

View File

@ -1,63 +1,15 @@
package com.ruoyi.xkt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.StoreProductColorPrice;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPricePageDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceSimpleDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdMinPriceDTO;
import com.ruoyi.xkt.dto.storeProductStock.StoreProdStockAndDiscountDTO;
import com.ruoyi.xkt.dto.storeProductStock.StoreProdStockAndDiscountResDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Mapper
*
* @author ruoyi
* @date 2025-03-26
*/
@Repository
public interface StoreProductColorPriceMapper extends BaseMapper<StoreProductColorPrice> {
/**
*
* @param storeProdId ID
* @return List<StoreProdColorPriceSimpleDTO>
*/
List<StoreProdColorPriceSimpleDTO> selectListByStoreProdId(Long storeProdId);
/**
* IDID
*
* @param storeProdId ID
* @param storeId ID
* @return List<StoreProdColorPriceResDTO>
*/
List<StoreProdColorPriceResDTO> selectListByStoreProdIdAndStoreId(@Param("storeProdId") Long storeProdId, @Param("storeId") Long storeId);
/**
*
*
* @param storeProdIdList ID
* @return List<StoreProdMinPriceDTO>
*/
List<StoreProdMinPriceDTO> selectStoreProdMinPriceList(@Param("storeProdIdList") List<String> storeProdIdList);
/**
*
* @param pageDTO
* @return List<StoreProdColorPriceResDTO>
*/
List<StoreProdColorPriceResDTO> selectPricePage(StoreProdColorPricePageDTO pageDTO);
/**
*
* @param dto
* @return StoreProdStockAndDiscountResDTO
*/
StoreProdStockAndDiscountResDTO selectStockAndCusDiscount(StoreProdStockAndDiscountDTO dto);
}
//@Repository
//public interface StoreProductColorPriceMapper extends BaseMapper<StoreProductColorPrice> {
//
//
//}

View File

@ -2,7 +2,10 @@ package com.ruoyi.xkt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.xkt.domain.StoreProductColorSize;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdMinPriceDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.*;
import com.ruoyi.xkt.dto.storeProductStock.StoreProdStockAndDiscountDTO;
import com.ruoyi.xkt.dto.storeProductStock.StoreProdStockAndDiscountResDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@ -97,5 +100,21 @@ public interface StoreProductColorSizeMapper extends BaseMapper<StoreProductColo
*/
List<StoreUnsetSnTempDTO> selectUnsetProdList(@Param("storeId") Long storeId);
/**
*
*
* @param storeProdIdList ID
* @return List<StoreProdMinPriceDTO>
*/
List<StoreProdMinPriceDTO> selectStoreProdMinPriceList(@Param("storeProdIdList") List<String> storeProdIdList);
/**
*
*
* @param dto
* @return StoreProdStockAndDiscountResDTO
*/
StoreProdStockAndDiscountResDTO selectStockAndCusDiscount(StoreProdStockAndDiscountDTO dto);
}

View File

@ -43,16 +43,6 @@ public interface StoreProductFileMapper extends BaseMapper<StoreProductFile> {
@Param("fileType") Integer fileType,
@Param("orderNum") Integer orderNum);
/**
*
*
* @param storeId ID
* @param fileType
* @return List<StoreProdFilePicSpaceResDTO>
*/
List<StoreProdFilePicSpaceResDTO> selectPicSpaceList(@Param("storeId") Long storeId, @Param("fileType") Integer fileType,
@Param("storeProdIdList") List<Long> storeProdIdList);
/**
* storeProdIdList
*

View File

@ -1,27 +0,0 @@
package com.ruoyi.xkt.service;
import com.ruoyi.common.core.page.Page;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPricePageDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO;
import java.util.List;
/**
* Service
*
* @author ruoyi
* @date 2025-03-26
*/
public interface IStoreProductColorPriceService {
List<StoreProdColorPriceResDTO> getColorPriceByStoreProdId(Long storeId, Long storeProdId);
/**
*
*
* @param pageDTO
* @return Page<StoreProdColorPriceResDTO>
*/
Page<StoreProdColorPriceResDTO> page(StoreProdColorPricePageDTO pageDTO);
}

View File

@ -1,6 +1,9 @@
package com.ruoyi.xkt.service;
import com.ruoyi.common.core.page.Page;
import com.ruoyi.xkt.dto.storeProdColor.StoreProdColorResDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPricePageDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO;
import java.util.List;
@ -19,4 +22,22 @@ public interface IStoreProductColorService {
* @return
*/
List<StoreProdColorResDTO> fuzzyQueryColorList(Long storeId, String prodArtNum);
/**
*
*
* @param storeId ID
* @param storeProdId ID
* @return
*/
List<StoreProdColorPriceResDTO> getColorPriceByStoreProdId(Long storeId, Long storeProdId);
/**
*
*
* @param pageDTO
* @return Page<StoreProdColorPriceResDTO>
*/
Page<StoreProdColorPriceResDTO> page(StoreProdColorPricePageDTO pageDTO);
}

View File

@ -23,14 +23,6 @@ public interface IStoreProductService {
*/
StoreProdResDTO selectStoreProductByStoreProdId(Long storeProdId);
/**
*
*
* @param spaceDTO
* @return StoreProdPicSpaceResDTO
*/
StoreProdPicSpaceResDTO getStoreProductPicSpace(StoreProdPicSpaceDTO spaceDTO);
/**
*
*

View File

@ -47,7 +47,6 @@ public class ShoppingCartServiceImpl implements IShoppingCartService {
final StoreProductColorSizeMapper prodColorSizeMapper;
final StoreProductColorMapper prodColorMapper;
final StoreProductStockMapper prodStockMapper;
final StoreProductColorPriceMapper prodColorPriceMapper;
final StoreProductFileMapper prodFileMapper;
final StoreProductCategoryAttributeMapper prodCateAttrMapper;
final StoreMapper storeMapper;
@ -175,34 +174,27 @@ public class ShoppingCartServiceImpl implements IShoppingCartService {
.eq(StoreProductColorSize::getStandard, ProductSizeStatus.STANDARD.getValue()));
// 标准尺码
List<Integer> standardList = standardSizeList.stream().map(StoreProductColorSize::getSize).distinct().sorted(Comparator.comparing(x -> x)).collect(Collectors.toList());
Map<String, List<StoreProductColorSize>> colorSizeMap = standardSizeList.stream().collect(Collectors
.groupingBy(x -> x.getStoreProdId().toString() + x.getStoreColorId().toString()));
// key storeColorId:size value price
Map<String, BigDecimal> standardSizePriceMap = standardSizeList.stream().collect(Collectors.toMap(x -> x.getStoreColorId() + ":" + x.getSize(), StoreProductColorSize::getPrice));
// 获取商品颜色列表
List<StoreProductColor> colorList = this.prodColorMapper.selectList(new LambdaQueryWrapper<StoreProductColor>()
.eq(StoreProductColor::getStoreProdId, shoppingCart.getStoreProdId()).eq(StoreProductColor::getDelFlag, Constants.UNDELETED)
.in(StoreProductColor::getProdStatus, Arrays.asList(EProductStatus.ON_SALE.getValue(), EProductStatus.TAIL_GOODS.getValue())));
// 档口商品颜色价格列表
List<StoreProductColorPrice> colorPriceList = this.prodColorPriceMapper.selectList(new LambdaQueryWrapper<StoreProductColorPrice>()
.eq(StoreProductColorPrice::getStoreProdId, shoppingCart.getStoreProdId()).eq(StoreProductColorPrice::getDelFlag, Constants.UNDELETED));
Map<String, StoreProductColorPrice> colorPriceMap = colorPriceList.stream().collect(Collectors
.toMap(x -> x.getStoreProdId().toString() + x.getStoreColorId().toString(), Function.identity()));
// 根据标准尺码去找对应尺码的库存数量
List<StoreProductStock> prodStockList = this.prodStockMapper.selectList(new LambdaQueryWrapper<StoreProductStock>()
.eq(StoreProductStock::getStoreProdId, shoppingCart.getStoreProdId())
.in(StoreProductStock::getStoreProdColorId, colorList.stream().map(StoreProductColor::getId).distinct().collect(Collectors.toList()))
.eq(StoreProductStock::getDelFlag, Constants.UNDELETED));
// 获取档口颜色尺码的库存数量
Map<String, List<ShopCartDetailResDTO.SCDStoreProdSizeStockDTO>> colorSizeStockMap = this.convertSizeStock(prodStockList, standardList);
Map<String, List<ShopCartDetailResDTO.SCDStoreProdSizeStockDTO>> colorSizeStockMap = this.convertSizeStock(prodStockList, standardList, standardSizePriceMap);
// 库存数量为0默认值
List<ShopCartDetailResDTO.SCDStoreProdSizeStockDTO> defaultZeroStockList = standardList.stream().map(size ->
new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(size).setStock(0)).collect(Collectors.toList());
List<ShopCartDetailResDTO.SCDStoreProdColorDTO> colorSizeStockList = colorList.stream()
.map(color -> BeanUtil.toBean(color, ShopCartDetailResDTO.SCDStoreProdColorDTO.class).setStoreProdColorId(color.getId())
// 获取颜色设定的价格
.setPrice(colorPriceMap.containsKey(color.getStoreProdId().toString() + color.getStoreColorId().toString())
? colorPriceMap.get(color.getStoreProdId().toString() + color.getStoreColorId().toString()).getPrice() : null)
// 设定库存
.setSizeStockList(colorSizeStockMap.getOrDefault(color.getStoreProdId().toString() + color.getStoreColorId().toString(), defaultZeroStockList)))
// 设定尺码对应的库存及价格
.setSizeStockList(colorSizeStockMap
.getOrDefault(color.getStoreProdId().toString() + ":" + color.getStoreColorId().toString(), defaultZeroStockList)))
.collect(Collectors.toList());
return new ShopCartDetailResDTO() {{
setProdArtNum(shoppingCart.getProdArtNum()).setStoreProdId(shoppingCart.getStoreProdId())
@ -288,14 +280,6 @@ public class ShoppingCartServiceImpl implements IShoppingCartService {
List<StoreProdMainPicDTO> mainPicList = this.prodFileMapper.selectMainPicByStoreProdIdList(listDTO.getStoreProdIdList(), FileType.MAIN_PIC.getValue(), ORDER_NUM_1);
Map<Long, String> mainPicMap = CollectionUtils.isEmpty(mainPicList) ? new HashMap<>() : mainPicList.stream()
.collect(Collectors.toMap(StoreProdMainPicDTO::getStoreProdId, StoreProdMainPicDTO::getFileUrl));
// 获取明细商品的价格
List<StoreProductColorPrice> priceList = this.prodColorPriceMapper.selectList(new LambdaQueryWrapper<StoreProductColorPrice>()
.in(StoreProductColorPrice::getStoreProdId, shoppingCartList.stream().map(ShoppingCart::getStoreProdId).collect(Collectors.toList()))
.in(StoreProductColorPrice::getStoreColorId, detailList.stream().map(ShoppingCartDetail::getStoreColorId).collect(Collectors.toList()))
.eq(StoreProductColorPrice::getDelFlag, Constants.UNDELETED));
// 商品价格map
Map<String, BigDecimal> priceMap = priceList.stream().collect(Collectors
.toMap(x -> x.getStoreProdId().toString() + x.getStoreColorId().toString(), x -> ObjectUtils.defaultIfNull(x.getPrice(), BigDecimal.ZERO)));
// 获取商品价格尺码
List<StoreProductColorSize> priceSizeList = this.prodColorSizeMapper.selectList(new LambdaQueryWrapper<StoreProductColorSize>()
.in(StoreProductColorSize::getStoreProdId, shoppingCartList.stream().map(ShoppingCart::getStoreProdId).collect(Collectors.toList()))
@ -306,18 +290,18 @@ public class ShoppingCartServiceImpl implements IShoppingCartService {
.eq(StoreProduct::getDelFlag, Constants.UNDELETED));
Map<Long, StoreProduct> storeProdMap = storeProdList.stream().collect(Collectors.toMap(StoreProduct::getId, Function.identity()));
// 商品价格尺码map
Map<String, Long> priceSizeMap = priceSizeList.stream().collect(Collectors
.toMap(x -> x.getStoreProdId().toString() + x.getStoreColorId().toString() + x.getSize(), StoreProductColorSize::getId));
Map<String, StoreProductColorSize> priceSizeMap = priceSizeList.stream().collect(Collectors
.toMap(x -> x.getStoreProdId().toString() + x.getStoreColorId().toString() + x.getSize(), x -> x));
return shoppingCartList.stream().map(x -> {
ShoppingCartDTO shopCartDTO = BeanUtil.toBean(x, ShoppingCartDTO.class).setMainPicUrl(mainPicMap.get(x.getStoreProdId()))
.setProdTitle(ObjectUtils.isNotEmpty(storeProdMap.get(x.getStoreProdId())) ? storeProdMap.get(x.getStoreProdId()).getProdTitle() : "")
.setStoreName(ObjectUtils.isNotEmpty(storeMap.get(x.getStoreId())) ? storeMap.get(x.getStoreId()).getStoreName() : "");
List<ShoppingCartDTO.SCDetailDTO> shopCartDetailList = detailMap.get(x.getId()).stream().map(detail -> {
final BigDecimal price = ObjectUtils.defaultIfNull(priceMap.get(x.getStoreProdId().toString() + detail.getStoreColorId().toString()), BigDecimal.ZERO);
return BeanUtil.toBean(detail, ShoppingCartDTO.SCDetailDTO.class).setPrice(price)
.setStoreProdColorSizeId(priceSizeMap.get(x.getStoreProdId().toString() + detail.getStoreColorId().toString() + detail.getSize()))
.setAmount(price.multiply(BigDecimal.valueOf(detail.getQuantity())));
}).collect(Collectors.toList());
final StoreProductColorSize prodColorSize = priceSizeMap.get(x.getStoreProdId().toString() + detail.getStoreColorId().toString() + detail.getSize());
return ObjectUtils.isEmpty(prodColorSize) ? null : BeanUtil.toBean(detail, ShoppingCartDTO.SCDetailDTO.class)
.setPrice(prodColorSize.getPrice()).setStoreProdColorSizeId(prodColorSize.getId())
.setAmount(prodColorSize.getPrice().multiply(BigDecimal.valueOf(detail.getQuantity())));
}).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
return shopCartDTO.setDetailList(shopCartDetailList);
}).collect(Collectors.toList());
}
@ -340,116 +324,91 @@ public class ShoppingCartServiceImpl implements IShoppingCartService {
*
* @param stockList
* @param standardSizeList
* @param standardSizePriceMap
* @return Map<Long, Map < Integer, Integer>>
*/
private Map<String, List<ShopCartDetailResDTO.SCDStoreProdSizeStockDTO>> convertSizeStock(List<StoreProductStock> stockList, List<Integer> standardSizeList) {
private Map<String, List<ShopCartDetailResDTO.SCDStoreProdSizeStockDTO>> convertSizeStock(List<StoreProductStock> stockList, List<Integer> standardSizeList,
Map<String, BigDecimal> standardSizePriceMap) {
Map<String, List<ShopCartDetailResDTO.SCDStoreProdSizeStockDTO>> colorSizeStockMap = new HashMap<>();
if (CollectionUtils.isEmpty(stockList)) {
return colorSizeStockMap;
}
// 标准尺码map
Map<Integer, Integer> standardSizeMap = standardSizeList.stream().collect(Collectors.toMap(x -> x, x -> x));
Map<String, List<StoreProductStock>> map = stockList.stream().collect(Collectors.groupingBy(x -> x.getStoreProdId().toString() + x.getStoreColorId().toString()));
map.forEach((unionId, tempStockList) -> {
Map<String, StoreProductStock> colorStockMap = stockList.stream().collect(Collectors.toMap(x -> x.getStoreProdId().toString() + ":" + x.getStoreColorId().toString(), x -> x));
colorStockMap.forEach((unionId, colorStock) -> {
List<ShopCartDetailResDTO.SCDStoreProdSizeStockDTO> sizeStockList = new ArrayList<>();
Integer size30Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize30(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_30)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_30);
setStock(size30Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_30)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize30(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_30)));
}
Integer size31Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize31(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_31)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_31);
setStock(size31Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_31)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize31(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_31)));
}
Integer size32Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize32(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_32)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_32);
setStock(size32Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_32)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize32(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_32)));
}
Integer size33Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize33(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_33)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_33);
setStock(size33Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_33)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize33(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_33)));
}
Integer size34Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize34(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_34)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_34);
setStock(size34Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_34)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize34(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_34)));
}
Integer size35Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize35(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_35)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_35);
setStock(size35Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_35)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize35(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_35)));
}
Integer size36Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize36(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_36)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_36);
setStock(size36Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_36)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize36(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_36)));
}
Integer size37Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize37(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_37)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_37);
setStock(size37Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_37)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize37(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_37)));
}
Integer size38Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize38(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_38)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_38);
setStock(size38Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_38)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize38(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_38)));
}
Integer size39Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize39(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_39)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_39);
setStock(size39Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_39)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize39(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_39)));
}
Integer size40Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize40(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_40)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_40);
setStock(size40Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_40)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize40(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_40)));
}
Integer size41Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize41(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_41)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_41);
setStock(size41Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_41)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize41(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_41)));
}
Integer size42Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize42(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_42)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_42);
setStock(size42Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_42)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize42(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_42)));
}
Integer size43Stock = tempStockList.stream().map(x -> ObjectUtils.defaultIfNull(x.getSize43(), 0)).reduce(0, Integer::sum);
if (standardSizeMap.containsKey(SIZE_43)) {
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO() {{
setSize(SIZE_43);
setStock(size43Stock);
}});
sizeStockList.add(new ShopCartDetailResDTO.SCDStoreProdSizeStockDTO().setSize(SIZE_43)
.setStock(ObjectUtils.defaultIfNull(colorStock.getSize43(), 0))
.setPrice(standardSizePriceMap.get(colorStock.getStoreColorId().toString() + ":" + SIZE_43)));
}
colorSizeStockMap.put(unionId, sizeStockList);
});
return colorSizeStockMap;

View File

@ -46,7 +46,6 @@ public class StoreHomepageServiceImpl implements IStoreHomepageService {
final StoreProductDetailMapper prodDetailMapper;
final StoreProductColorSizeMapper prodColorSizeMapper;
final StoreProductStockMapper prodStockMapper;
final StoreProductColorPriceMapper prodColorPriceMapper;
final StoreProductFileMapper prodFileMapper;
final StoreProductCategoryAttributeMapper prodCateAttrMapper;
final StoreCertificateMapper storeCertMapper;

View File

@ -1,57 +0,0 @@
package com.ruoyi.xkt.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.page.Page;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPricePageDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO;
import com.ruoyi.xkt.mapper.StoreProductColorPriceMapper;
import com.ruoyi.xkt.service.IStoreProductColorPriceService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* Service
*
* @author ruoyi
* @date 2025-03-26
*/
@Service
@RequiredArgsConstructor
public class StoreProductColorPriceServiceImpl implements IStoreProductColorPriceService {
final StoreProductColorPriceMapper prodColorPriceMapper;
/**
* ID ID
*
* @param storeId ID
* @param storeProdId ID
* @return
*/
@Override
@Transactional(readOnly = true)
public List<StoreProdColorPriceResDTO> getColorPriceByStoreProdId(Long storeId, Long storeProdId) {
return this.prodColorPriceMapper.selectListByStoreProdIdAndStoreId(storeProdId, storeId);
}
/**
*
*
* @param pageDTO
* @return Page<StoreProdColorPriceResDTO>
*/
@Override
@Transactional(readOnly = true)
public Page<StoreProdColorPriceResDTO> page(StoreProdColorPricePageDTO pageDTO) {
PageHelper.startPage(pageDTO.getPageNum(), pageDTO.getPageSize());
List<StoreProdColorPriceResDTO> list = this.prodColorPriceMapper.selectPricePage(pageDTO);
return CollectionUtils.isEmpty(list) ? Page.empty(pageDTO.getPageSize(), pageDTO.getPageNum())
: Page.convert(new PageInfo<>(list));
}
}

View File

@ -1,9 +1,15 @@
package com.ruoyi.xkt.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.page.Page;
import com.ruoyi.xkt.dto.storeProdColor.StoreProdColorResDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPricePageDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO;
import com.ruoyi.xkt.mapper.StoreProductColorMapper;
import com.ruoyi.xkt.service.IStoreProductColorService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -33,4 +39,27 @@ public class StoreProductColorServiceImpl implements IStoreProductColorService {
public List<StoreProdColorResDTO> fuzzyQueryColorList(Long storeId, String prodArtNum) {
return storeProdColorMapper.fuzzyQueryColorList(storeId, prodArtNum);
}
/**
*
*
* @param storeId ID
* @param storeProdId ID
* @return
*/
@Override
@Transactional(readOnly = true)
public List<StoreProdColorPriceResDTO> getColorPriceByStoreProdId(Long storeId, Long storeProdId) {
return this.storeProdColorMapper.selectListByStoreProdIdAndStoreId(storeProdId, storeId);
}
@Override
@Transactional(readOnly = true)
public Page<StoreProdColorPriceResDTO> page(StoreProdColorPricePageDTO pageDTO) {
PageHelper.startPage(pageDTO.getPageNum(), pageDTO.getPageSize());
List<StoreProdColorPriceResDTO> list = this.storeProdColorMapper.selectColorPricePage(pageDTO);
return CollectionUtils.isEmpty(list) ? Page.empty(pageDTO.getPageSize(), pageDTO.getPageNum()) : Page.convert(new PageInfo<>(list));
}
}

View File

@ -39,7 +39,6 @@ import com.ruoyi.xkt.dto.picture.ProductPicSyncResultDTO;
import com.ruoyi.xkt.dto.storeColor.StoreColorDTO;
import com.ruoyi.xkt.dto.storeProdCateAttr.StoreProdCateAttrDTO;
import com.ruoyi.xkt.dto.storeProdColor.StoreProdColorDTO;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceSimpleDTO;
import com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSizeDTO;
import com.ruoyi.xkt.dto.storeProdProcess.StoreProdProcessDTO;
import com.ruoyi.xkt.dto.storeProdSvc.StoreProdSvcDTO;
@ -91,7 +90,6 @@ public class StoreProductServiceImpl implements IStoreProductService {
final StoreProductColorMapper storeProdColorMapper;
final StoreProductServiceMapper storeProdSvcMapper;
final StoreProductDetailMapper storeProdDetailMapper;
final StoreProductColorPriceMapper storeProdColorPriceMapper;
final StoreColorMapper storeColorMapper;
final SysFileMapper fileMapper;
final StoreProductColorSizeMapper storeProdColorSizeMapper;
@ -135,10 +133,8 @@ public class StoreProductServiceImpl implements IStoreProductService {
List<StoreColorDTO> allColorList = this.storeColorMapper.selectListByStoreProdId(storeProd.getStoreId());
// 档口当前商品颜色列表
List<StoreProdColorDTO> colorList = this.storeProdColorMapper.selectListByStoreProdId(storeProdId);
// 档口商品颜色尺码列表
// 档口商品颜色尺码价格列表
List<StoreProdSizeDTO> sizeList = this.storeProdColorSizeMapper.selectListByStoreProdId(storeProdId);
// 档口颜色价格列表
List<StoreProdColorPriceSimpleDTO> priceList = this.storeProdColorPriceMapper.selectListByStoreProdId(storeProdId);
// 档口商品详情
StoreProductDetail prodDetail = this.storeProdDetailMapper.selectByStoreProdId(storeProdId);
// 档口服务承诺
@ -146,31 +142,8 @@ public class StoreProductServiceImpl implements IStoreProductService {
// 档口生产工艺信息
StoreProductProcess prodProcess = this.storeProdProcMapper.selectByStoreProdId(storeProdId);
return storeProdResDTO.setFileList(fileResList).setAllColorList(allColorList).setDetail(prodDetail.getDetail())
.setColorList(colorList).setPriceList(priceList).setSizeList(sizeList)
.setCateAttr(BeanUtil.toBean(cateAttr, StoreProdCateAttrDTO.class))
.setSvc(BeanUtil.toBean(storeProductSvc, StoreProdSvcDTO.class))
.setProcess(BeanUtil.toBean(prodProcess, StoreProdProcessDTO.class));
}
@Override
@Transactional(readOnly = true)
public StoreProdPicSpaceResDTO getStoreProductPicSpace(StoreProdPicSpaceDTO spaceDTO) {
// 用户是否为档口管理者或子账户
if (!SecurityUtils.isAdmin() && !SecurityUtils.isStoreManagerOrSub(spaceDTO.getStoreId())) {
throw new ServiceException("当前用户非档口管理者或子账号,无权限操作!", HttpStatus.ERROR);
}
LambdaQueryWrapper<StoreProduct> queryWrapper = new LambdaQueryWrapper<StoreProduct>().eq(StoreProduct::getId, spaceDTO.getStoreId())
.eq(StoreProduct::getDelFlag, Constants.UNDELETED);
if (StringUtils.isNotBlank(spaceDTO.getProdArtNum())) {
queryWrapper.like(StoreProduct::getProdArtNum, spaceDTO.getProdArtNum());
}
List<StoreProduct> storeProdList = this.storeProdMapper.selectList(queryWrapper);
List<Long> storeProdIdList = storeProdList.stream().map(StoreProduct::getId).collect(Collectors.toList());
Store store = Optional.ofNullable(this.storeMapper.selectOne(new LambdaQueryWrapper<Store>()
.eq(Store::getId, spaceDTO.getStoreId()).eq(Store::getDelFlag, Constants.UNDELETED)))
.orElseThrow(() -> new ServiceException("档口不存在!", HttpStatus.ERROR));
return StoreProdPicSpaceResDTO.builder().storeId(store.getId()).storeName(store.getStoreName())
.fileList(this.storeProdFileMapper.selectPicSpaceList(store.getId(), FileType.DOWNLOAD.getValue(), storeProdIdList)).build();
.setColorList(colorList).setSizeList(sizeList).setCateAttr(BeanUtil.toBean(cateAttr, StoreProdCateAttrDTO.class))
.setSvc(BeanUtil.toBean(storeProductSvc, StoreProdSvcDTO.class)).setProcess(BeanUtil.toBean(prodProcess, StoreProdProcessDTO.class));
}
/**
@ -359,66 +332,68 @@ public class StoreProductServiceImpl implements IStoreProductService {
storeColorMap.putAll(newColorList.stream().collect(Collectors.toMap(StoreColor::getColorName, StoreColor::getId)));
}
// 所有颜色列表
List<StoreProductColor> prodColorList = this.storeProdColorMapper.selectList(new LambdaQueryWrapper<StoreProductColor>()
List<StoreProductColor> dbProdColorList = this.storeProdColorMapper.selectList(new LambdaQueryWrapper<StoreProductColor>()
.eq(StoreProductColor::getStoreProdId, storeProdId).eq(StoreProductColor::getDelFlag, Constants.UNDELETED));
List<Long> existColorIdList = prodColorList.stream().map(StoreProductColor::getStoreColorId).collect(Collectors.toList());
prodColorList.forEach(color -> {
// 判断有哪些是删除的颜色
if (!storeColorMap.containsValue(color.getStoreColorId())) {
color.setDelFlag(Constants.DELETED);
// 当前商品已存在的storeColorId列表
List<Long> exitProdColorIdList = dbProdColorList.stream().map(StoreProductColor::getStoreColorId).collect(Collectors.toList());
// 当前商品待更新的storeColorId列表
List<Long> updateProdColorIdList = updateDTO.getSizeList().stream().map(StoreProdDTO.SPCSizeDTO::getColorName).map(storeColorMap::get).collect(Collectors.toList());
dbProdColorList.stream()
// 判断有哪些是删除的颜色
.filter(color -> !updateProdColorIdList.contains(color.getStoreColorId()))
.forEach(color -> color.setDelFlag(Constants.DELETED));
// 新增的颜色。分为两种情况:1. 完全新增的颜色 2. 已存在,新加到商品中
final List<String> updateProdColorNameList = updateDTO.getSizeList().stream().map(StoreProdDTO.SPCSizeDTO::getColorName).distinct().collect(Collectors.toList());
for (int i = 1; i <= updateProdColorNameList.size(); i++) {
final Long updateProdColorId = storeColorMap.get(updateProdColorNameList.get(i));
// 已存在的颜色则不新增
if (exitProdColorIdList.contains(updateProdColorId)) {
continue;
}
});
this.storeProdColorMapper.updateById(prodColorList);
// 非新增颜色价格map
Map<Long, BigDecimal> existColorPriceMap = updateDTO.getColorPriceList().stream().filter(x -> ObjectUtils.isNotEmpty(x.getStoreColorId()))
.collect(Collectors.toMap(StoreProdDTO.SPCColorPriceDTO::getStoreColorId, StoreProdDTO.SPCColorPriceDTO::getPrice));
// 所有已存在的颜色价格列表
List<StoreProductColorPrice> storeColorPriceList = this.storeProdColorPriceMapper.selectList(new LambdaQueryWrapper<StoreProductColorPrice>()
.eq(StoreProductColorPrice::getStoreProdId, storeProdId).eq(StoreProductColorPrice::getDelFlag, Constants.UNDELETED));
storeColorPriceList.forEach(x -> {
// 判断有哪些是删除的颜色
if (!storeColorMap.containsValue(x.getStoreColorId())) {
x.setDelFlag(Constants.DELETED);
} else {
// 更新颜色价格
x.setPrice(existColorPriceMap.get(x.getStoreColorId()));
}
});
// 标准尺码map
Map<Integer, Integer> standardSizeMap = updateDTO.getSizeList().stream().collect(Collectors
.toMap(StoreProdDTO.SPCSizeDTO::getSize, StoreProdDTO.SPCSizeDTO::getStandard));
// 所有已存在的颜色价格尺码列表
List<StoreProductColorSize> storeColorSizeList = this.storeProdColorSizeMapper.selectList(new LambdaQueryWrapper<StoreProductColorSize>()
.eq(StoreProductColorSize::getStoreProdId, storeProdId).eq(StoreProductColorSize::getDelFlag, Constants.UNDELETED));
storeColorSizeList.forEach(x -> {
// 哪些是删除颜色
if (!storeColorMap.containsValue(x.getStoreColorId())) {
x.setDelFlag(Constants.DELETED);
} else {
// 更新标准尺码
x.setStandard(standardSizeMap.get(x.getSize()));
}
});
// 新增的颜色价格等
List<StoreProdDTO.SPCColorPriceDTO> newColorPriceList = updateDTO.getColorPriceList().stream()
.filter(x -> !existColorIdList.contains(x.getStoreColorId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(newColorPriceList)) {
// 新增的档口商品颜色
List<StoreProductColor> tempColorList = new ArrayList<>();
newColorPriceList.forEach(newColorPrice -> {
Long storeColorId = storeColorMap.get(newColorPrice.getColorName());
tempColorList.add(new StoreProductColor().setStoreProdId(storeProdId).setStoreColorId(storeColorMap.get(newColorPrice.getColorName()))
.setColorName(newColorPrice.getColorName()).setOrderNum(newColorPrice.getOrderNum()).setStoreId(storeId).setProdStatus(EProductStatus.ON_SALE.getValue()));
storeColorPriceList.add(new StoreProductColorPrice().setStoreColorId(storeColorId).setPrice(newColorPrice.getPrice()).setStoreProdId(storeProdId));
updateDTO.getSizeList().forEach(size -> storeColorSizeList.add(new StoreProductColorSize().setStoreColorId(storeColorId).setSize(size.getSize())
.setStoreProdId(storeProdId).setStandard(size.getStandard()).setNextSn(0)));
});
this.storeProdColorMapper.insert(tempColorList);
// 设置了档口商品全部优惠的客户,新增商品优惠
this.createStoreCusDiscount(tempColorList, storeProdId);
// 新增的商品颜色
dbProdColorList.add(new StoreProductColor().setStoreColorId(updateProdColorId).setStoreProdId(storeProdId).setStoreId(storeId)
.setColorName(updateProdColorNameList.get(i)).setOrderNum(i).setProdStatus(EProductStatus.ON_SALE.getValue()));
}
// 更新商品颜色或新增商品颜色
this.storeProdColorMapper.insertOrUpdate(dbProdColorList);
// 待更新的商品颜色尺码map 按照颜色尺码 升序排列
Map<String, StoreProdDTO.SPCSizeDTO> updateColorSizeMap = updateDTO.getSizeList().stream()
.sorted(Comparator.comparing(StoreProdDTO.SPCSizeDTO::getStoreColorId, Comparator.nullsLast(Comparator.naturalOrder()))
.thenComparing(StoreProdDTO.SPCSizeDTO::getSize))
.collect(Collectors.toMap(x -> ObjectUtils.defaultIfNull(x.getStoreColorId(), "") + ":" + x.getSize(),
Function.identity(), (existing, replacement) -> existing, LinkedHashMap::new));
// 处理商品颜色和尺码对应的价格
List<StoreProductColorSize> dbProdColorSizeList = this.storeProdColorSizeMapper.selectList(new LambdaQueryWrapper<StoreProductColorSize>()
.eq(StoreProductColorSize::getStoreProdId, storeProdId).eq(StoreProductColorSize::getDelFlag, Constants.UNDELETED));
Map<String, StoreProductColorSize> dbProdColorSizeMap = dbProdColorSizeList.stream().collect(Collectors.toMap(x -> x.getStoreColorId() + ":" + x.getSize(), x -> x));
dbProdColorSizeList.forEach(dbColorSize -> {
final String dbKey = dbColorSize.getStoreColorId() + ":" + dbColorSize.getSize();
// 判断哪些颜色是删除的颜色
if (!updateColorSizeMap.containsKey(dbKey)) {
dbColorSize.setDelFlag(Constants.DELETED);
}
});
// 判断哪些颜色是新增 或 更新的颜色
updateColorSizeMap.forEach((updateKey, updateColorSize) -> {
StoreProductColorSize dbColorSize = dbProdColorSizeMap.get(updateKey);
// 已存在则更新
if (ObjectUtils.isNotEmpty(dbColorSize)) {
dbProdColorSizeList.add(dbColorSize.setPrice(updateColorSize.getPrice()).setStandard(updateColorSize.getStandard()));
} else {
// 不存在则新增
dbProdColorSizeList.add(new StoreProductColorSize().setSize(updateColorSize.getSize()).setStoreProdId(storeProdId)
.setStandard(updateColorSize.getStandard()).setStoreColorId(storeColorMap.get(updateColorSize.getColorName()))
.setPrice(updateColorSize.getPrice()).setNextSn(0));
}
});
this.storeProdColorSizeMapper.insertOrUpdate(dbProdColorSizeList);
// 设置档口商品价格尺码的barcode_prefix
List<StoreProductColorSize> nullSnPrefixList = dbProdColorSizeList.stream().filter(x -> StringUtils.isEmpty(x.getSnPrefix()))
.peek(x -> x.setSnPrefix(storeId + String.format("%08d", x.getId()))).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(nullSnPrefixList)) {
this.storeProdColorSizeMapper.updateById(nullSnPrefixList);
}
this.storeProdColorPriceMapper.insertOrUpdate(storeColorPriceList);
this.storeProdColorSizeMapper.insertOrUpdate(storeColorSizeList);
}
/**
@ -469,28 +444,26 @@ public class StoreProductServiceImpl implements IStoreProductService {
// 处理档口所有颜色
Map<String, Long> storeColorMap = createDTO.getAllColorList().stream().filter(x -> ObjectUtils.isNotEmpty(x.getStoreColorId()))
.collect(Collectors.toMap(StoreColorDTO::getColorName, StoreColorDTO::getStoreColorId));
// 新增的颜色
List<StoreColor> newColorList = createDTO.getAllColorList().stream().filter(x -> ObjectUtils.isEmpty(x.getStoreColorId()))
.map(x -> BeanUtil.toBean(x, StoreColor.class).setStoreId(createDTO.getStoreId())).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(newColorList)) {
this.storeColorMapper.insert(newColorList);
storeColorMap.putAll(newColorList.stream().collect(Collectors.toMap(StoreColor::getColorName, StoreColor::getId)));
}
// 新增 档口颜色与尺码
List<StoreProductColorPrice> prodColorPriceList = new ArrayList<>();
List<StoreProductColorSize> prodColorSizeList = new ArrayList<>();
// 新增档口颜色尺码与价格
List<StoreProductColor> prodColorList = new ArrayList<>();
createDTO.getColorPriceList().forEach(colorPrice -> {
prodColorList.add(new StoreProductColor().setStoreProdId(storeProdId).setStoreColorId(storeColorMap.get(colorPrice.getColorName()))
.setColorName(colorPrice.getColorName()).setOrderNum(colorPrice.getOrderNum()).setStoreId(storeId).setProdStatus(EProductStatus.ON_SALE.getValue()));
prodColorPriceList.add(new StoreProductColorPrice().setStoreProdId(storeProdId).setPrice(colorPrice.getPrice())
.setStoreColorId(storeColorMap.get(colorPrice.getColorName())));
prodColorSizeList.addAll(createDTO.getSizeList().stream().map(x -> new StoreProductColorSize().setSize(x.getSize()).setStoreProdId(storeProdId)
.setStandard(x.getStandard()).setStoreColorId(storeColorMap.get(colorPrice.getColorName())).setNextSn(0))
.collect(Collectors.toList()));
});
this.storeProdColorPriceMapper.insert(prodColorPriceList);
this.storeProdColorSizeMapper.insert(prodColorSizeList);
final List<String> prodColorNameList = createDTO.getSizeList().stream().map(StoreProdDTO.SPCSizeDTO::getColorName).distinct().collect(Collectors.toList());
for (int i = 1; i <= prodColorNameList.size(); i++) {
prodColorList.add(new StoreProductColor().setStoreColorId(storeColorMap.get(prodColorNameList.get(i))).setStoreProdId(storeProdId)
.setStoreId(storeId).setColorName(prodColorNameList.get(i)).setOrderNum(i).setProdStatus(EProductStatus.ON_SALE.getValue()));
}
this.storeProdColorMapper.insert(prodColorList);
// 新增档口颜色尺码对应价格
List<StoreProductColorSize> prodColorSizeList = createDTO.getSizeList().stream().map(x -> new StoreProductColorSize().setSize(x.getSize()).setStoreProdId(storeProdId)
.setStandard(x.getStandard()).setStoreColorId(storeColorMap.get(x.getColorName())).setPrice(x.getPrice()).setNextSn(0))
.collect(Collectors.toList());
this.storeProdColorSizeMapper.insert(prodColorSizeList);
// 设置档口商品价格尺码的barcode_prefix
prodColorSizeList.forEach(x -> x.setSnPrefix(storeId + String.format("%08d", x.getId())));
this.storeProdColorSizeMapper.updateById(prodColorSizeList);
@ -1098,8 +1071,8 @@ public class StoreProductServiceImpl implements IStoreProductService {
// 获取上一级分类的分类ID 及 分类名称
ProdCateDTO parCate = this.prodCateMapper.getParentCate(updateDTO.getProdCateId());
// 获取当前商品的最低价格
BigDecimal minPrice = updateDTO.getColorPriceList().stream().min(Comparator.comparing(StoreProdDTO.SPCColorPriceDTO::getPrice))
.map(StoreProdDTO.SPCColorPriceDTO::getPrice).orElseThrow(() -> new ServiceException("商品价格不存在!", HttpStatus.ERROR));
BigDecimal minPrice = updateDTO.getSizeList().stream().min(Comparator.comparing(StoreProdDTO.SPCSizeDTO::getPrice))
.map(StoreProdDTO.SPCSizeDTO::getPrice).orElseThrow(() -> new ServiceException("商品价格不存在!", HttpStatus.ERROR));
// 获取使用季节
String season = updateDTO.getCateAttr().getSuitableSeason();
// 获取风格

View File

@ -43,7 +43,6 @@ public class StoreProductStockServiceImpl implements IStoreProductStockService {
final StoreProductStockMapper storeProdStockMapper;
final StoreProductFileMapper storeProdFileMapper;
final SysFileMapper fileMapper;
final StoreProductColorPriceMapper prodColorPriceMapper;
final StoreCustomerProductDiscountMapper storeCusProdDiscMapper;
final StoreProductMapper storeProdMapper;
final StoreProductColorSizeMapper prodColorSizeMapper;
@ -127,8 +126,8 @@ public class StoreProductStockServiceImpl implements IStoreProductStockService {
if (!SecurityUtils.isAdmin() && !SecurityUtils.isStoreManagerOrSub(dto.getStoreId())) {
throw new ServiceException("当前用户非档口管理者或子账号,无权限操作!", HttpStatus.ERROR);
}
// 商品颜色等基本信息
StoreProdStockAndDiscountResDTO basicInfoDTO = ObjectUtils.defaultIfNull(this.prodColorPriceMapper.selectStockAndCusDiscount(dto),
// 获取商品的基本属性
StoreProdStockAndDiscountResDTO basicInfoDTO = ObjectUtils.defaultIfNull(this.prodColorSizeMapper.selectStockAndCusDiscount(dto),
new StoreProdStockAndDiscountResDTO());
// 档口商品颜色 的 库存
StoreProductStock stock = this.storeProdStockMapper.selectOne(new LambdaQueryWrapper<StoreProductStock>()
@ -139,7 +138,8 @@ public class StoreProductStockServiceImpl implements IStoreProductStockService {
.eq(StoreProductColorSize::getStoreProdId, basicInfoDTO.getStoreProdId()).eq(StoreProductColorSize::getStoreColorId, basicInfoDTO.getStoreColorId())
.eq(StoreProductColorSize::getDelFlag, Constants.UNDELETED));
List<StoreProdStockAndDiscountResDTO.SPSADSizeDTO> sizeStockList = prodColorSizeList.stream().map(size -> new StoreProdStockAndDiscountResDTO.SPSADSizeDTO()
.setSize(size.getSize()).setStandard(size.getStandard()).setStock(this.getSizeStock(size.getSize(), stock))).collect(Collectors.toList());
.setSize(size.getSize()).setStandard(size.getStandard()).setPrice(size.getPrice()).setStock(this.getSizeStock(size.getSize(), stock)))
.collect(Collectors.toList());
return basicInfoDTO.setStoreCusId(dto.getStoreCusId()).setStoreId(dto.getStoreId()).setSizeStockList(sizeStockList);
}

View File

@ -11,6 +11,7 @@ import com.ruoyi.common.core.page.Page;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.xkt.domain.*;
import com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdMinPriceDTO;
import com.ruoyi.xkt.dto.storeProductFile.StoreProdMainPicDTO;
import com.ruoyi.xkt.dto.userFavorite.*;
import com.ruoyi.xkt.enums.*;
@ -46,7 +47,6 @@ public class UserFavoritesServiceImpl implements IUserFavoritesService {
final StoreProductFileMapper prodFileMapper;
final StoreProductColorSizeMapper prodColorSizeMapper;
final ShoppingCartMapper shopCartMapper;
final StoreProductColorPriceMapper prodColorPriceMapper;
final StoreProductColorMapper prodColorMapper;
final ShoppingCartDetailMapper shopCartDetailMapper;
final StoreMapper storeMapper;
@ -117,14 +117,11 @@ public class UserFavoritesServiceImpl implements IUserFavoritesService {
if (CollectionUtils.isEmpty(favoriteList)) {
return Page.empty(pageDTO.getPageNum(), pageDTO.getPageSize());
}
// 找到商品的定价
List<StoreProductColorPrice> priceList = this.prodColorPriceMapper.selectList(new LambdaQueryWrapper<StoreProductColorPrice>()
.in(StoreProductColorPrice::getStoreProdId, favoriteList.stream().map(UserFavoritePageResDTO::getStoreProdId).collect(Collectors.toList()))
.eq(StoreProductColorPrice::getDelFlag, Constants.UNDELETED));
// 按照storeProdId分组并取价格最低的价格
Map<Long, BigDecimal> minPriceMap = priceList.stream().collect(Collectors.groupingBy(StoreProductColorPrice::getStoreProdId,
Collectors.collectingAndThen(Collectors.toList(), list -> list.stream().map(StoreProductColorPrice::getPrice)
.min(Comparator.comparing(Function.identity())).orElseThrow(() -> new ServiceException("商品价格不存在", HttpStatus.ERROR)))));
// 档口商品最低价格
List<StoreProdMinPriceDTO> prodMinPriceList = this.prodColorSizeMapper.selectStoreProdMinPriceList(favoriteList.stream()
.map(UserFavoritePageResDTO::getStoreProdId).map(String::valueOf).collect(Collectors.toList()));
Map<Long, BigDecimal> prodMinPriceMap = CollectionUtils.isEmpty(prodMinPriceList) ? new HashMap<>()
: prodMinPriceList.stream().collect(Collectors.toMap(StoreProdMinPriceDTO::getStoreProdId, StoreProdMinPriceDTO::getPrice));
// 找到第一张商品主图
List<StoreProdMainPicDTO> mainPicList = this.prodFileMapper.selectMainPicByStoreProdIdList(favoriteList.stream()
.map(UserFavoritePageResDTO::getStoreProdId).collect(Collectors.toList()), FileType.MAIN_PIC.getValue(), ORDER_NUM_1);
@ -150,7 +147,7 @@ public class UserFavoritesServiceImpl implements IUserFavoritesService {
})));
favoriteList.forEach(x -> x.setStandardSize(minAndMaxSizeMap.getOrDefault(x.getStoreProdId(), ""))
.setMainPicUrl(mainPicMap.getOrDefault(x.getStoreProdId(), null))
.setPrice(minPriceMap.getOrDefault(x.getStoreProdId(), null)));
.setPrice(prodMinPriceMap.getOrDefault(x.getStoreProdId(), null)));
return Page.convert(new PageInfo<>(favoriteList));
}

View File

@ -80,4 +80,56 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectListByStoreProdIdAndStoreId" resultType="com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO">
SELECT
spc.id AS storeProdColorId,
spc.store_id,
spc.store_color_id,
sp.prod_art_num,
spc.color_name,
(SELECT MIN(spcs.price) FROM store_product_color_size spcs
WHERE spcs.store_prod_id = spc.store_prod_id AND spcs.store_color_id = spc.store_color_id AND spcs.del_flag = 0) AS price,
sp.over_price,
spc.order_num
FROM
store_product_color spc
JOIN store_product sp ON spc.store_prod_id = sp.id
WHERE
spc.del_flag = 0
AND spc.prod_status IN ( 2, 3 )
AND spc.store_prod_id = #{storeProdId}
AND spc.store_id = #{storeId}
ORDER BY
spc.order_num
</select>
<select id="selectColorPricePage" resultType="com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO">
SELECT
spc.id AS storeProdColorId,
sp.store_id,
spc.store_prod_id,
spc.store_color_id,
sp.prod_art_num,
spc.color_name,
MIN( spcs.price ) AS price
FROM
store_product_color spc
JOIN store_product sp ON spc.store_prod_id = sp.id
JOIN store_product_color_size spcs ON spc.store_prod_id = spcs.store_prod_id AND spcs.del_flag = 0
WHERE
spc.del_flag = 0 AND sp.store_id = #{storeId}
<if test="prodArtNum != null and prodArtNum != ''">
AND sp.prod_art_num like concat('%', #{prodArtNum}, '%')
</if>
<if test="prodStatusList != null and prodStatusList.size() > 0">
AND spc.prod_status IN
<foreach item="item" collection="prodStatusList" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
GROUP BY
spc.id
</select>
</mapper>

View File

@ -3,106 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.xkt.mapper.StoreProductColorPriceMapper">
<select id="selectListByStoreProdId" parameterType="Long" resultType="com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceSimpleDTO">
SELECT
store_color_id AS storeColorId,
price
FROM
store_product_color_price
WHERE
del_flag = 0 AND store_prod_id = #{storeProdId}
</select>
<select id="selectListByStoreProdIdAndStoreId" resultType="com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO">
SELECT
spc.id AS storeProdColorId,
spc.store_id,
spc.store_color_id,
sp.prod_art_num,
spc.color_name,
spcp.price,
sp.over_price,
spc.order_num
FROM
store_product_color spc
JOIN store_product sp ON spc.store_prod_id = sp.id
JOIN store_product_color_price spcp ON spc.store_prod_id = spcp.store_prod_id AND spc.store_color_id = spcp.store_color_id
WHERE
spc.prod_status IN ( 2, 3 )
AND spc.store_prod_id = #{storeProdId}
AND spc.store_id = #{storeId}
</select>
<select id="selectStoreProdMinPriceList" resultType="com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdMinPriceDTO">
SELECT
spcp.store_prod_id,
MIN( spcp.price )
FROM
store_product_color_price spcp
JOIN store_product_color spc ON spcp.store_prod_id = spc.store_prod_id
AND spcp.store_color_id = spc.store_color_id AND spc.prod_status IN ( 2, 3 )
WHERE
spcp.del_flag = 0
<if test="storeProdIdList != null and storeProdIdList.size() > 0">
AND spcp.store_prod_id IN
<foreach item="item" collection="storeProdIdList" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
GROUP BY
spcp.store_prod_id
</select>
<select id="selectPricePage" resultType="com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdColorPriceResDTO">
SELECT DISTINCT
spc.id AS storeProdColorId,
sp.store_id,
spcp.store_prod_id,
spcp.store_color_id,
sp.prod_art_num,
spc.color_name,
spcp.price,
sp.over_price
FROM
store_product_color_price spcp
JOIN store_product sp ON spcp.store_prod_id = sp.id
JOIN store_product_color spc ON spcp.store_prod_id = spc.store_prod_id AND spcp.store_color_id = spc.store_color_id
WHERE
spcp.del_flag = 0 AND sp.store_id = #{storeId}
<if test="prodArtNum != null and prodArtNum != ''">
AND sp.prod_art_num like concat('%', #{prodArtNum}, '%')
</if>
<if test="prodStatusList != null and prodStatusList.size() > 0">
AND spc.prod_status IN
<foreach item="item" collection="prodStatusList" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
ORDER BY
spcp.store_prod_id,
spcp.store_color_id
</select>
<select id="selectStockAndCusDiscount" resultType="com.ruoyi.xkt.dto.storeProductStock.StoreProdStockAndDiscountResDTO">
SELECT DISTINCT
spcp.store_color_id,
spcp.price,
spc.color_name,
spc.id AS storeProdColorId,
spcp.store_prod_id,
sp.prod_art_num,
sp.over_price,
scpd.discount,
( SELECT sc.cus_name FROM store_customer sc WHERE sc.id = #{storeCusId} ) AS storeCusName
FROM
store_product_color_price spcp
JOIN store_product sp ON spcp.store_prod_id = sp.id
JOIN store_product_color spc ON spcp.store_prod_id = spc.store_prod_id AND spc.store_color_id = spcp.store_color_id AND spc.del_flag = 0
LEFT JOIN store_customer_product_discount scpd ON scpd.store_prod_color_id = spc.id AND scpd.del_flag = 0
WHERE
spcp.del_flag = 0
AND spc.id = #{storeProdColorId}
</select>
</mapper>

View File

@ -9,15 +9,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</update>
<select id="selectListByStoreProdId" parameterType="Long" resultType="com.ruoyi.xkt.dto.storeProdColorSize.StoreProdSizeDTO">
SELECT DISTINCT
SELECT
spcs.store_color_id,
sc.color_name,
spcs.size,
spcs.standard
spcs.standard,
spcs.price
FROM
store_product_color_size spcs
JOIN store_color sc ON spcs.store_color_id = sc.id
WHERE
spcs.del_flag = 0
AND spcs.store_prod_id = #{storeProdId}
AND spcs.store_prod_id = #{storeProdId}
ORDER BY
spcs.store_color_id,
spcs.size
</select>
@ -170,4 +175,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND spcs.other_sn_prefix IS NULL;
</select>
<select id="selectStoreProdMinPriceList" resultType="com.ruoyi.xkt.dto.storeProdColorPrice.StoreProdMinPriceDTO">
SELECT
spcs.store_prod_id,
MIN( spcs.price ) AS price
FROM
store_product_color_size spcs
WHERE
spcs.del_flag = 0
<if test="storeProdIdList != null and storeProdIdList.size() > 0">
AND spcs.store_prod_id IN
<foreach item="item" collection="storeProdIdList" separator="," open="(" close=")" index="">
#{item}
</foreach>
</if>
GROUP BY
spcs.store_prod_id
</select>
<select id="selectStockAndCusDiscount" resultType="com.ruoyi.xkt.dto.storeProductStock.StoreProdStockAndDiscountResDTO">
SELECT
spc.id AS storeProdColorId,
spc.store_color_id,
spc.color_name,
spc.store_prod_id,
sp.prod_art_num,
scpd.discount,
( SELECT sc.cus_name FROM store_customer sc WHERE sc.id = #{storeCusId} ) AS storeCusName
FROM
store_product_color spc
JOIN store_product sp ON spc.store_prod_id = sp.id
LEFT JOIN store_customer_product_discount scpd ON scpd.store_prod_color_id = spc.id AND scpd.del_flag = 0
WHERE
spc.del_flag = 0
AND spc.id = #{storeProdColorId}
</select>
</mapper>

View File

@ -47,31 +47,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</if>
</select>
<select id="selectPicSpaceList" >
SELECT
sp.prod_art_num AS prodArtNum,
sp.id AS storeProdId,
sf.file_url AS fileUrl
FROM
store_product_file spf
JOIN sys_file sf ON spf.file_id = sf.id
JOIN store_product sp ON spf.store_prod_id = sp.id
WHERE
spf.del_flag = 0
AND spf.file_type = #{fileType}
AND spf.store_id = #{storeId}
<if test="storeProdIdList != null and storeProdIdList.size() > 0">
AND spf.store_prod_id in
<foreach item="storeProdId" collection="storeProdIdList" open="(" separator="," close=")">
#{storeProdId}
</foreach>
</if>
ORDER BY
spf.store_prod_id DESC,
spf.order_num
</select>
<select id="selectTotalMainPicList" resultType="com.ruoyi.xkt.dto.storeProductFile.StoreProdFileResDTO">
SELECT
spf.store_prod_id AS storeProdId,