From 9e6e3009721001b5eebdddd4ef7b0a6048456996 Mon Sep 17 00:00:00 2001 From: Tankaikai Date: Mon, 24 Feb 2025 17:32:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E6=A8=A1=E5=9D=97=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ConsInfoController.java | 2 +- .../controller/admin/ProductController.java | 16 ++++ .../java/com/czg/product/dto/ConsInfoDTO.java | 6 +- .../java/com/czg/product/dto/ProductDTO.java | 8 ++ .../czg/product/service/ProductService.java | 2 + .../mapper/ProdConsRelationMapper.java | 6 ++ .../service/product/mapper/ProductMapper.java | 9 ++ .../service/impl/ConsInfoServiceImpl.java | 22 ++++- .../service/impl/ProductServiceImpl.java | 90 ++++++++++--------- .../mapper/ProdConsRelationMapper.xml | 8 ++ .../main/resources/mapper/ProductMapper.xml | 80 +++++++++++++++++ 11 files changed, 203 insertions(+), 46 deletions(-) diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java index c6743c62..7065c86b 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ConsInfoController.java @@ -55,7 +55,7 @@ public class ConsInfoController { /** * 详情 - * param id 耗材信息id + * @param id 耗材信息id */ @GetMapping("{id}") @OperationLog("耗材信息-详情") diff --git a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java index 4354d3de..d1d435c9 100644 --- a/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java +++ b/cash-api/product-server/src/main/java/com/czg/controller/admin/ProductController.java @@ -1,5 +1,6 @@ package com.czg.controller.admin; +import com.czg.exception.CzgException; import com.czg.log.annotation.OperationLog; import com.czg.product.dto.ProdConsBindDTO; import com.czg.product.dto.ProdSkuDTO; @@ -135,4 +136,19 @@ public class ProductController { return CzgResult.success(); } + /** + * 商品-库存预警设置 + */ + @PostMapping("stock-warning") + @OperationLog("商品-库存预警设置") + //@SaAdminCheckPermission("product:stockWarning") + public CzgResult stockWarning(@RequestParam Integer warnLine) { + AssertUtil.isNull(warnLine, "{}不能为空", "warnLine"); + if (warnLine < 0) { + throw new CzgException("预警值不能小于0"); + } + productService.stockWarning(warnLine); + return CzgResult.success(); + } + } \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java index 59354aa8..64619c58 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ConsInfoDTO.java @@ -13,6 +13,7 @@ import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; /** * 耗材信息 @@ -102,5 +103,8 @@ public class ConsInfoDTO implements Serializable { * 结束时间 yyyy-MM-dd HH:mm:ss */ private String endTime; - + /** + * 耗材绑定商品信息 + */ + List productList; } \ No newline at end of file diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java index 7535b4c8..2574037f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/dto/ProductDTO.java @@ -219,6 +219,14 @@ public class ProductDTO implements Serializable { * 会员最低售价 */ private BigDecimal lowMemberPrice; + /** + * 商品关联耗材列表 + */ + private List consList; + /** + * 耗材信息 + */ + private String consName; public Object getImages() { return JSON.parseArray(Convert.toStr(images, "[]")); diff --git a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java index db144b76..ac95faa2 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/product/service/ProductService.java @@ -34,4 +34,6 @@ public interface ProductService extends IService { boolean markProductIsSoldOut(ProductIsSoldOutParam param); void refundToStock(ProdRefundToStockParam param); + + void stockWarning(Integer warnLine); } \ No newline at end of file diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java index 1e2ec700..3a9bcb8b 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProdConsRelationMapper.java @@ -1,8 +1,12 @@ package com.czg.service.product.mapper; +import com.czg.product.dto.ProductBriefDTO; import com.czg.product.entity.ProdConsRelation; import com.mybatisflex.core.BaseMapper; 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 public interface ProdConsRelationMapper extends BaseMapper { + List getProductListByConId(@Param("conId") Long conId); + } \ No newline at end of file diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java index ecf1c910..fd02f72d 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/mapper/ProductMapper.java @@ -1,9 +1,12 @@ package com.czg.service.product.mapper; +import com.czg.product.dto.ProductDTO; import com.czg.product.entity.Product; import com.czg.product.vo.ShopProductInfoVo; import com.czg.product.vo.ShopProductVo; import com.mybatisflex.core.BaseMapper; +import com.mybatisflex.core.paginate.Page; +import com.mybatisflex.core.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,6 +21,12 @@ import java.util.List; @Mapper public interface ProductMapper extends BaseMapper { + Page selectProductPage(); + + long selectProductPage_COUNT(); + + List selectProductList(QueryWrapper qw); + List selectHotsProductList(@Param("shopId") Long shopId); List selectGroupProductList(@Param("shopId") Long shopId); diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java index 2dd92c51..04ec1aea 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.czg.enums.StatusEnum; import com.czg.enums.YesNoEnum; import com.czg.exception.CzgException; import com.czg.product.dto.ConsInfoDTO; +import com.czg.product.dto.ProductBriefDTO; import com.czg.product.entity.ConsGroupRelation; import com.czg.product.entity.ConsInfo; import com.czg.product.param.ConsSubUnitParam; @@ -15,6 +16,7 @@ import com.czg.product.service.ConsInfoService; import com.czg.sa.StpKit; import com.czg.service.product.mapper.ConsGroupRelationMapper; import com.czg.service.product.mapper.ConsInfoMapper; +import com.czg.service.product.mapper.ProdConsRelationMapper; import com.czg.utils.PageUtil; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; @@ -38,6 +40,7 @@ import java.util.List; public class ConsInfoServiceImpl extends ServiceImpl implements ConsInfoService { private final ConsGroupRelationMapper consGroupRelationMapper; + private final ProdConsRelationMapper prodConsRelationMapper; private QueryWrapper buildQueryWrapper(ConsInfoDTO param) { QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); @@ -62,20 +65,33 @@ public class ConsInfoServiceImpl extends ServiceImpl i @Override public Page getConsInfoPage(ConsInfoDTO param) { QueryWrapper queryWrapper = buildQueryWrapper(param); - return super.pageAs(PageUtil.buildPage(), queryWrapper, ConsInfoDTO.class); + Page page = super.pageAs(PageUtil.buildPage(), queryWrapper, ConsInfoDTO.class); + page.getRecords().parallelStream().forEach(item -> { + List productList = prodConsRelationMapper.getProductListByConId(item.getId()); + item.setProductList(productList); + }); + return page; } @Override public List getConsInfoList(ConsInfoDTO param) { QueryWrapper queryWrapper = buildQueryWrapper(param); queryWrapper.eq(ConsInfo::getStatus, StatusEnum.ENABLED.value()); - return super.listAs(queryWrapper, ConsInfoDTO.class); + List list = super.listAs(queryWrapper, ConsInfoDTO.class); + list.parallelStream().forEach(item -> { + List productList = prodConsRelationMapper.getProductListByConId(item.getId()); + item.setProductList(productList); + }); + return list; } @Override public ConsInfoDTO getConsInfoById(Long id) { Long shopId = StpKit.USER.getShopId(0L); - return super.getOneAs(query().eq(ConsInfo::getId, id).eq(ConsInfo::getShopId, shopId), ConsInfoDTO.class); + ConsInfoDTO data = super.getOneAs(query().eq(ConsInfo::getId, id).eq(ConsInfo::getShopId, shopId), ConsInfoDTO.class); + List productList = prodConsRelationMapper.getProductListByConId(data.getId()); + data.setProductList(productList); + return data; } @Override diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java index 7ee521c9..ccbbe84d 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductServiceImpl.java @@ -10,8 +10,11 @@ import com.alibaba.fastjson2.JSONWriter; import com.czg.enums.DeleteEnum; import com.czg.enums.YesNoEnum; import com.czg.exception.CzgException; +import com.czg.product.dto.ProdConsRelationDTO; import com.czg.product.dto.ProdSkuDTO; import com.czg.product.dto.ProductDTO; +import com.czg.product.entity.ConsInfo; +import com.czg.product.entity.ProdConsRelation; import com.czg.product.entity.ProdSku; import com.czg.product.entity.Product; import com.czg.product.enums.ProductIsSaleTypeEnum; @@ -21,6 +24,8 @@ import com.czg.product.param.ProductIsSaleParam; import com.czg.product.param.ProductIsSoldOutParam; import com.czg.product.service.ProductService; import com.czg.sa.StpKit; +import com.czg.service.product.mapper.ConsInfoMapper; +import com.czg.service.product.mapper.ProdConsRelationMapper; import com.czg.service.product.mapper.ProdSkuMapper; import com.czg.service.product.mapper.ProductMapper; import com.czg.utils.PageUtil; @@ -34,8 +39,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import static com.czg.product.entity.table.ProductTableDef.PRODUCT; import static com.czg.product.entity.table.ShopProdCategoryTableDef.SHOP_PROD_CATEGORY; @@ -54,11 +61,13 @@ import static com.czg.product.entity.table.ShopProdUnitTableDef.SHOP_PROD_UNIT; public class ProductServiceImpl extends ServiceImpl implements ProductService { private final ProdSkuMapper prodSkuMapper; + private final ProdConsRelationMapper prodConsRelationMapper; + private final ConsInfoMapper consInfoMapper; private QueryWrapper buildQueryWrapper(ProductDTO param) { QueryWrapper queryWrapper = PageUtil.buildSortQueryWrapper(); if (ObjUtil.isNotNull(param.getId())) { - queryWrapper.like(Product::getId, param.getId()); + queryWrapper.eq(Product::getId, param.getId()); } if (StrUtil.isNotEmpty(param.getName())) { queryWrapper.like(Product::getName, param.getName()); @@ -67,12 +76,12 @@ public class ProductServiceImpl extends ServiceImpl impl queryWrapper.eq(Product::getCategoryId, param.getCategoryId()); } if (ObjUtil.isNotNull(param.getSpecId())) { - queryWrapper.like(Product::getSpecId, param.getSpecId()); + queryWrapper.eq(Product::getSpecId, param.getSpecId()); } - if (ObjUtil.isNotNull(param.getCreateBeginTime())) { + if (StrUtil.isNotEmpty(param.getCreateBeginTime())) { queryWrapper.ge(Product::getCreateTime, param.getCreateBeginTime()); } - if (ObjUtil.isNotNull(param.getCreateEndTime())) { + if (StrUtil.isNotEmpty(param.getCreateEndTime())) { queryWrapper.le(Product::getCreateTime, param.getCreateEndTime()); } Long shopId = StpKit.USER.getShopId(0L); @@ -96,30 +105,33 @@ public class ProductServiceImpl extends ServiceImpl impl return queryWrapper; } + private void buildProductExtInfo(List records) { + records.parallelStream().forEach(record -> { + List skuList = prodSkuMapper.selectListByQueryAs(query().eq(ProdSku::getProductId, record.getId()).eq(ProdSku::getIsDel, DeleteEnum.NORMAL.value()), ProdSkuDTO.class); + if (CollUtil.isNotEmpty(skuList)) { + Optional lowPriceIsPresent = skuList.stream().map(obj -> NumberUtil.nullToZero(obj.getSalePrice())).min(BigDecimal::compareTo); + lowPriceIsPresent.ifPresent(record::setLowPrice); + + Optional lowMemberPriceIsPresent = skuList.stream().map(obj -> NumberUtil.nullToZero(obj.getMemberPrice())).min(BigDecimal::compareTo); + lowMemberPriceIsPresent.ifPresent(record::setLowMemberPrice); + } + record.setSkuList(skuList); + List consList = prodConsRelationMapper.selectListByQueryAs(query().eq(ProdConsRelation::getProductId, record.getId()), ProdConsRelationDTO.class); + record.setConsList(consList); + if (CollUtil.isNotEmpty(consList)) { + List consIds = consList.stream().map(ProdConsRelationDTO::getConsInfoId).distinct().toList(); + String consName = consInfoMapper.selectOneByQueryAs(query().select("GROUP_CONCAT(con_name SEPARATOR '、')").eq(ConsInfo::getId, consIds), String.class); + record.setConsName(consName); + } + }); + } + @Override public Page getProductPage(ProductDTO param) { QueryWrapper queryWrapper = buildFullQueryWrapper(param); Page page = super.pageAs(PageUtil.buildPage(), queryWrapper, ProductDTO.class); List records = page.getRecords(); - List prodIdList = records.stream().map(ProductDTO::getId).distinct().toList(); - if (CollUtil.isEmpty(prodIdList)) { - return page; - } - List skuList = prodSkuMapper.selectListByQueryAs(query().in(ProdSku::getProductId, prodIdList).eq(ProdSku::getIsDel, DeleteEnum.NORMAL.value()), ProdSkuDTO.class); - Map> collect = skuList.stream().collect(Collectors.groupingBy(ProdSkuDTO::getProductId)); - for (ProductDTO record : records) { - List list = collect.getOrDefault(record.getId(), Collections.emptyList()); - if (CollUtil.isEmpty(list)) { - continue; - } - Optional lowPriceIsPresent = list.stream().map(obj -> NumberUtil.nullToZero(obj.getSalePrice())).min(BigDecimal::compareTo); - lowPriceIsPresent.ifPresent(record::setLowPrice); - - Optional lowMemberPriceIsPresent = list.stream().map(obj -> NumberUtil.nullToZero(obj.getMemberPrice())).min(BigDecimal::compareTo); - lowMemberPriceIsPresent.ifPresent(record::setLowMemberPrice); - - record.setSkuList(list); - } + buildProductExtInfo(records); return page; } @@ -127,22 +139,7 @@ public class ProductServiceImpl extends ServiceImpl impl public List getProductList(ProductDTO param) { QueryWrapper queryWrapper = buildFullQueryWrapper(param); List records = super.listAs(queryWrapper, ProductDTO.class); - if (CollUtil.isEmpty(records)) { - return records; - } - List prodIdList = records.stream().map(ProductDTO::getId).distinct().toList(); - List skuList = prodSkuMapper.selectListByQueryAs(query().in(ProdSku::getProductId, prodIdList).eq(ProdSku::getIsDel, DeleteEnum.NORMAL.value()), ProdSkuDTO.class); - Map> collect = skuList.stream().collect(Collectors.groupingBy(ProdSkuDTO::getProductId)); - for (ProductDTO record : records) { - List list = collect.getOrDefault(record.getId(), Collections.emptyList()); - Optional lowPriceIsPresent = list.stream().map(ProdSkuDTO::getSalePrice).min(BigDecimal::compareTo); - lowPriceIsPresent.ifPresent(record::setLowPrice); - - Optional lowMemberPriceIsPresent = list.stream().map(ProdSkuDTO::getMemberPrice).min(BigDecimal::compareTo); - lowMemberPriceIsPresent.ifPresent(record::setLowMemberPrice); - - record.setSkuList(list); - } + buildProductExtInfo(records); return records; } @@ -154,6 +151,8 @@ public class ProductServiceImpl extends ServiceImpl impl ProductDTO dto = super.getOneAs(queryWrapper, ProductDTO.class); List skuList = prodSkuMapper.selectListByQueryAs(query().eq(ProdSku::getProductId, id).eq(ProdSku::getIsDel, DeleteEnum.NORMAL.value()), ProdSkuDTO.class); dto.setSkuList(skuList); + List consList = prodConsRelationMapper.selectListByQueryAs(query().eq(ProdConsRelation::getProductId, dto.getId()), ProdConsRelationDTO.class); + dto.setConsList(consList); return dto; } @@ -315,4 +314,13 @@ public class ProductServiceImpl extends ServiceImpl impl entity.setIsRefundStock(param.getIsReturn()); super.updateById(entity); } + + @Override + public void stockWarning(Integer warnLine) { + Long shopId = StpKit.USER.getShopId(0L); + UpdateChain.of(Product.class) + .set(Product::getWarnLine, warnLine) + .eq(Product::getShopId, shopId) + .update(); + } } \ No newline at end of file diff --git a/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml b/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml index cde3b96a..7ea43063 100644 --- a/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ProdConsRelationMapper.xml @@ -3,4 +3,12 @@ + \ No newline at end of file diff --git a/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml b/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml index f3e3416e..43a7ae09 100644 --- a/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml +++ b/cash-service/product-service/src/main/resources/mapper/ProductMapper.xml @@ -2,6 +2,73 @@ + + SELECT t1.id, + t1.days, + t1.name, + t1.sort, + t1.type, + t1.is_del, + t1.is_hot, + t1.images, + t1.is_sale, + t1.shop_id, + t1.spec_id, + t1.unit_id, + t1.weight, + t1.end_time, + t1.is_stock, + t1.pack_fee, + t1.cover_img, + t1.warn_line, + t1.group_snap, + t1.group_type, + t1.start_time, + t1.category_id, + t1.create_time, + t1.short_title, + t1.update_time, + t1.is_sold_stock, + t1.stock_number, + t1.is_refund_stock, + t1.select_spec_info, + t1.group_category_id, + t1.is_allow_temp_modify_price, + t2.name AS unit_name, + t3.name AS category_name, + t4.name AS spec_name, + t4.full_name AS spec_full_name + FROM tb_product t1 + LEFT JOIN tb_shop_prod_unit t2 ON t2.id = t1.unit_id + LEFT JOIN tb_shop_prod_category t3 ON t3.id = t1.category_id + LEFT JOIN tb_shop_prod_spec t4 ON t4.id = t1.spec_id + + + + and t1.shop_id = #{shopId} + and t1.is_del = 0 + + and t1.id = #{id} + + + and t1.name like concat('%', #{name}, '%') + + + and t1.category_id = #{categoryId} + + + and t1.spec_id = #{specId} + + + and t1.name >= #{createBeginTime} + + + + + + select t1.id, t1.name, @@ -37,6 +104,19 @@ 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 + + +