From 80d88f15a2222ec2dbe33f5d1d2b2296a890f41b Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期二, 03 三月 2026 16:22:04 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java |  208 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 135 insertions(+), 73 deletions(-)

diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
index ec2bf51..aa3cbef 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -60,6 +60,9 @@
     @Autowired
     private ShopGoodsRelationMapper shopGoodsRelationMapper;
 
+    @Autowired
+    private SearchHistoryMapper searchHistoryMapper;
+
 
 
     @Autowired
@@ -129,7 +132,7 @@
         dealBatchMultiFiles(goods, goods.getFileList(), user,false);
         return goods.getId();
     }
-    private void dealDefaultGoodsSku(Goods goods) {
+    private Integer dealDefaultGoodsSku(Goods goods) {
         Date date = goods.getEditDate();
         Integer userId = goods.getEditor();
         Sku sku = new Sku();
@@ -183,6 +186,8 @@
         goodsSkuAttr.setGoodsSkuId(goodsSku.getId());
         goodsSkuAttr.setSkuAttrId(skuAttr.getId());
         goodsSkuAttrMapper.insert(goodsSkuAttr);
+
+        return goodsSku.getId();
     }
 
     public void dealBatchMultiFiles(Goods goods, List<Multifile> fileList, LoginUserInfo user,boolean update) {
@@ -349,7 +354,23 @@
                     .set(Goods::getEditor,user.getId())
                     .set(Goods::getStatus,Constants.ONE )
                     .in(Goods::getId,idList));
+
+            //鎵归噺涓嬫灦 sku鏁版嵁
+            goodsSkuMapper.update(null,new UpdateWrapper<GoodsSku>().lambda()
+                    .set(GoodsSku::getEditDate,new Date() )
+                    .set(GoodsSku::getEditor,user.getId())
+                    .set(GoodsSku::getStatus,Constants.ONE )
+                    .eq(GoodsSku::getIsdeleted,Constants.ZERO)
+                    .in(GoodsSku::getGoodsId,idList));
             return;
+        }else{
+            //鎵归噺涓婃灦 sku鏁版嵁
+            goodsSkuMapper.update(null,new UpdateWrapper<GoodsSku>().lambda()
+                    .set(GoodsSku::getEditDate,new Date() )
+                    .set(GoodsSku::getEditor,user.getId())
+                    .set(GoodsSku::getStatus,Constants.ZERO )
+                    .eq(GoodsSku::getIsdeleted,Constants.ZERO)
+                    .in(GoodsSku::getGoodsId,idList));
         }
         long shopNum   = shopMapper.selectCount(new QueryWrapper<Shop>().lambda()
                 .eq(Shop::getIsdeleted,Constants.ZERO)
@@ -448,6 +469,16 @@
             goods.setLabels(  StringUtils.removeEnd( goods.getLabels().replace("锛�",","),","));
         }
         goodsMapper.updateById(goods);
+        boolean needUpdatesku = true;
+        if(goods.getSkuPrice()!=null){
+            GoodsSku queryGoodsSku=new GoodsSku();
+            queryGoodsSku.setGoodsId(goods.getId());
+            queryGoodsSku.setIsdeleted(Constants.ZERO);
+            GoodsSku goodsSku=goodsSkuMapper.selectOne(new QueryWrapper<>(queryGoodsSku).last("limit 1"));
+            if(goodsSku !=null && Constants.formatBigdecimal(goodsSku.getPrice()).compareTo(goods.getSkuPrice()) ==0){
+                needUpdatesku = false;//浠锋牸鏈彉鍖栨棤闇�閲嶆柊鐢熸垚渚涜揣浠�
+            }
+        }
         //娓呯┖鍘熸湁鐨剆ku鏁版嵁
         skuMapper.update(null,new UpdateWrapper<Sku>().lambda()
                 .set(Sku::getIsdeleted,Constants.ONE)
@@ -457,7 +488,21 @@
                 .set(GoodsSku::getIsdeleted,Constants.ONE)
                 .eq(GoodsSku::getIsdeleted,Constants.ZERO)
                 .eq(GoodsSku::getGoodsId,goods.getId()));
-        dealDefaultGoodsSku(goods);//鏂板缓sku淇℃伅
+       Integer skuId = dealDefaultGoodsSku(goods);//鏂板缓sku淇℃伅
+        if(needUpdatesku){ //鍏堝垹闄ゅ師鏉ョ殑鏁版嵁
+            shopGoodsRelationMapper.delete(new QueryWrapper<ShopGoodsRelation>().lambda()
+                    .eq(ShopGoodsRelation::getGoodsId,goods.getId())
+            );
+        }else{
+            //鍚﹀垯鏇存柊鎵�鏈変緵璐т环鍏宠仈鍏崇郴涓殑skuID
+            shopGoodsRelationMapper.update(null,new UpdateWrapper<ShopGoodsRelation>().lambda()
+                    .eq(ShopGoodsRelation::getGoodsId,goods.getId())
+                    .set(ShopGoodsRelation::getGoodsSkuId,skuId)
+            );
+        }
+
+
+
         dealBatchMultiFiles(goods, goods.getFileList(), user,true);
     }
 
@@ -629,6 +674,7 @@
         }
         Multifile find = new Multifile();
         find.setObjId(id);
+        find.setObjType(Constants.MultiFile.PLATFORM_GOOD_ROTATION.getKey());
         find.setIsdeleted(Constants.ZERO);
         List<Multifile> fileList=  multifileMapper.selectList(new QueryWrapper<>(find));
         goods.setFileList(fileList);
@@ -795,8 +841,9 @@
     public List<Goods> findList(Goods goods) {
         QueryWrapper<Goods> wrapper = new QueryWrapper<>(goods);
         wrapper.lambda()
-            .in(goods.getIdList() != null && goods.getIdList().size()>0, Goods::getId, goods.getIdList())
-            .eq( Goods::getIsdeleted, Constants.ZERO);
+                .in(goods.getIdList() != null && goods.getIdList().size()>0, Goods::getId, goods.getIdList())
+                .like(goods.getZhuanquId()!=null,Goods::getZhuanquIds,"["+goods.getZhuanquId()+"]")
+                .eq( Goods::getIsdeleted, Constants.ZERO);
         return goodsMapper.selectList(wrapper);
     }
 
@@ -831,6 +878,7 @@
                     " INNER JOIN goods g on  g.id=gs.GOODS_ID " +
                     " where gs.STOCK<=0 and gs.ISDELETED=0 and g.id=t.id ");
         }
+
         queryWrapper.eq(!Constants.equalsInteger(pageWrap.getModel().getTabStatus(), 3), Goods::getIsdeleted, Constants.ZERO);
         queryWrapper.eq(Constants.equalsInteger(pageWrap.getModel().getTabStatus(), 3), Goods::getIsdeleted, Constants.ONE);
 
@@ -920,43 +968,79 @@
      * @return
      */
     @Override
-    public IPage<GoodsInfoResponse> getGoodsPage(PageWrap<GoodsRequest> pageWrap) {
+    public IPage<Goods> getGoodsPage(PageWrap<GoodsRequest> pageWrap) {
        GoodsRequest model = pageWrap.getModel();
-
-       QueryWrapper<GoodsRequest> wrapper = new QueryWrapper<GoodsRequest>()
-                .eq("g.ISDELETED",Constants.ZERO)
+        MPJLambdaWrapper<Goods> wrapper = new MPJLambdaWrapper<Goods>()
+                .selectAll(Goods.class)
+                .select("  ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = t.id ),0)   ",Goods::getMinPrice)
+                .leftJoin(SystemUser.class, SystemUser::getId, Goods::getCreator)
+                .eq(Goods::getIsdeleted,Constants.ZERO)
                 .eq(!Objects.isNull(model) && Objects.nonNull(model.getCategoryId()),
-                        "g.CATEGORY_ID", model.getCategoryId())
+                        Goods::getCategoryId, model.getCategoryId())
                //閫傜敤鍝佺墝  閫傜敤绯诲垪
                .apply(!Objects.isNull(model) && Objects.nonNull(model.getApplicableBrandId()),
-                       " find_in_set( '["+model.getApplicableBrandId()+"]' , g.BRAND_IDS )  ")
+                       " find_in_set( '["+model.getApplicableBrandId()+"]' , t.BRAND_IDS )  ")
                .apply(!Objects.isNull(model) && Objects.nonNull(model.getSeriesBrandId()),
-                       " find_in_set( '["+model.getSeriesBrandId()+"]' , g.SERIAL_IDS )  ")
-                .eq("g.STATUS", Constants.ZERO)
-                .like(StringUtils.isNotBlank(model.getGoodsName()),"g.NAME",model.getGoodsName());
+                       " find_in_set( '["+model.getSeriesBrandId()+"]' , t.SERIAL_IDS )  ")
+               .apply(!Objects.isNull(model) && Objects.nonNull(model.getQualityId()),
+                        " find_in_set( '["+model.getQualityId()+"]' , t.ZHUANQU_IDS )  ")
+                .eq(Goods::getStatus, Constants.ZERO)
+                .like(StringUtils.isNotBlank(model.getGoodsName()),Goods::getName,model.getGoodsName());
+        if(Objects.nonNull(model.getShopId())){
+            wrapper.select("  ifnull( ( select sgr.PRICE from shop_goods_relation sgr where sgr.GOODS_ID = t.ID and sgr.ISDELETED = 0 and sgr.`STATUS` = 0  and sgr.SHOP_ID = "+model.getShopId()+" ) ,0) ",Goods::getExFactoryPrice);
+            wrapper.select(" ifnull(( select sum(gd.GOODS_NUM) from goodsorder_detail gd  inner join goodsorder go on gd.ORDER_ID = go.id  where gd.GOODS_ID = t.`id` and  go.DISTRIBUTION_SHOP_ID = "+model.getShopId()+" ),0) ",Goods::getRealSaleNum);
 
-                if(Objects.nonNull(model.getSortInfo())){
-                    //鎺掑簭鏂瑰紡锛�0=缁煎悎鎺掑簭锛�1=閿�閲忕敱浣庡埌楂� 锛�2=浠锋牸鐢变綆鍒伴珮锛�3=閿�閲忕敱楂樺埌浣庯紱4=浠锋牸鐢遍珮鍒颁綆
-                    if(Constants.equalsInteger(model.getSortInfo(),Constants.ZERO)){
-                        wrapper.orderByDesc("g.CREATE_DATE");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.ONE)){
-                        wrapper.orderByAsc("realSaleNum");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.TWO)){
-                        wrapper.orderByAsc("g.price");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.THREE)){
-                        wrapper.orderByDesc("realSaleNum");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.FOUR)){
-                        wrapper.orderByDesc("g.price");
-                    }
-                }
-        IPage<GoodsInfoResponse> page =
-                Objects.isNull(model.getShopId())?
-                goodsMapper.goodsPage(pageWrap.toPage(),wrapper)
-                :
-                goodsMapper.goodsPageForShop(pageWrap.toPage(),wrapper,model.getShopId()) ;
+        }else{
+            wrapper.select(" (( select ifnull(sum(GOODS_NUM),0) from goodsorder_detail gd  where gd.GOODS_ID =  t.id  )) ",Goods::getRealSaleNum);
+        }
+
+        if(Objects.nonNull(model.getSortInfo())){
+            //鎺掑簭鏂瑰紡锛�0=缁煎悎鎺掑簭锛�1=閿�閲忕敱浣庡埌楂� 锛�2=浠锋牸鐢变綆鍒伴珮锛�3=閿�閲忕敱楂樺埌浣庯紱4=浠锋牸鐢遍珮鍒颁綆
+            if(Constants.equalsInteger(model.getSortInfo(),Constants.ZERO)){
+                wrapper.orderByDesc("t.CREATE_DATE");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.ONE)){
+                wrapper.orderByAsc("realSaleNum");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.TWO)){
+                wrapper.orderByAsc("t.price");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.THREE)){
+                wrapper.orderByDesc("realSaleNum");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.FOUR)){
+                wrapper.orderByDesc("t.price");
+            }
+        }
+        IPage<Goods> page =
+                goodsMapper.selectJoinPage(pageWrap.toPage(), Goods.class, wrapper);
         if (!CollectionUtils.isEmpty(page.getRecords())){
             String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.GOODS_FILE);
-            page.getRecords().forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
+            for (Goods goodsInfoResponse:page.getRecords()) {
+                goodsInfoResponse.setImgurl(StringUtils.isNotBlank(goodsInfoResponse.getImgurl())?(preFixPath+goodsInfoResponse.getImgurl()):null);
+                if(Objects.isNull(model.getShopId())){
+                    //sku鍩虹淇℃伅
+                    this.getSkuInfo(goodsInfoResponse);
+                }
+                if(StringUtils.isNotBlank(goodsInfoResponse.getBrandIds())){
+                    List<Labels> allBrands = labelsMapper.selectList(new QueryWrapper<Labels>().lambda()
+                            .in(Labels::getId,getNumIdByIdsString(goodsInfoResponse.getBrandIds()))
+                            .eq(Labels::getType,Constants.LabelsType.APPLICABLE_BRAND.getKey())
+                            .eq(Labels::getIsdeleted,Constants.ZERO)
+                    );
+                    if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(allBrands)){
+                        goodsInfoResponse.setBrandNames(String.join("/",allBrands.stream().map(i->i.getName()).collect(Collectors.toList())));
+                    }
+                }
+            }
+        }
+        if(StringUtils.isNotBlank(model.getGoodsName())&&Objects.nonNull(model.getMemberId())){
+            searchHistoryMapper.delete(new QueryWrapper<SearchHistory>().lambda()
+                    .eq(SearchHistory::getMemberId,model.getMemberId())
+                    .eq(SearchHistory::getContent,model.getGoodsName())
+            );
+            SearchHistory searchHistory = new SearchHistory();
+            searchHistory.setIsdeleted(Constants.ZERO);
+            searchHistory.setContent(model.getGoodsName());
+            searchHistory.setMemberId(model.getMemberId());
+            searchHistory.setType(Constants.ZERO);
+            searchHistoryMapper.insert(searchHistory);
         }
         return page;
     }
@@ -967,50 +1051,18 @@
      * @param goodsResponse
      * @return
      */
-    public void getSkuInfo(GoodsInfoResponse goodsResponse) {
+    public void getSkuInfo(Goods goodsResponse) {
 
         List<GoodsSkuResponse>  goodsSkuResponseList = goodsSkuMapper.getSkuResponseList(goodsResponse.getId());
-
-        String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
-                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
         Integer sumStock = Constants.ZERO;
         for (GoodsSkuResponse goodsSkuResponse:goodsSkuResponseList) {
-            if(StringUtils.isBlank(goodsSkuResponse.getImgurl())){
-                goodsSkuResponse.setImgurl(fullUrl + goodsSkuResponse.getGoodsImgUrl());
-            }else{
-                goodsSkuResponse.setImgurl(fullUrl + goodsSkuResponse.getImgurl());
-            }
-            //澶勭悊鏁版嵁涓嬫爣
-            String goodsSkuName = goodsSkuResponse.getName();
-            List<String> strList = Arrays.asList(goodsSkuName.split(";"));
-            StringBuffer indexData = new StringBuffer();
-            for (int i = 0; i < strList.size(); i++) {
-                //鏌ヨsku淇℃伅
-                Sku sku =  skuMapper.selectOne(new QueryWrapper<Sku>()
-                        .eq("GOODS_ID",goodsResponse.getId())
-                        .eq("SORTNUM",i+1)
-                        .last(" limit 1 ")
-                );
-                if(Objects.isNull(sku)){
-                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"SKU淇℃伅寮傚父,璇峰埛鏂版煡鐪�");
-                }
-                //鏌ヨSKU_ATTR
-                SkuAttr skuAttr = skuAttrMapper.selectOne(new QueryWrapper<SkuAttr>()
-                        .eq("SKU_ID",sku.getId())
-                        .eq("NAME",strList.get(i))
-                        .last(" limit 1 ")
-                );
-                if(Objects.isNull(skuAttr)){
-                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"SKU淇℃伅寮傚父,璇峰埛鏂版煡鐪�");
-                }
-                indexData.append("," + ( skuAttr.getSortnum()-1));
-            }
-            goodsSkuResponse.setIndexData(indexData.toString().substring(1));
+            goodsSkuResponse.setStock(Objects.isNull(goodsSkuResponse.getStock())?Constants.ZERO:goodsSkuResponse.getStock());
             sumStock = sumStock + goodsSkuResponse.getStock();
         }
         //鐪熷疄閿�閲� = realSaleNum  - saleNum;
         //鐪熷疄搴撳瓨= sumStock - (realSaleNum  - saleNum)
-        goodsResponse.setStock(sumStock - goodsResponse.getRealSaleNum() + goodsResponse.getSaleNum());
+        goodsResponse.setStock(sumStock);
+        goodsResponse.setRealSaleNum(goodsResponse.getRealSaleNum()+sumStock);
         goodsResponse.setGoodsSkuResponseList(goodsSkuResponseList);
         //Sku鍩虹淇℃伅
         List<SkuResponse> skuResponseList = skuMapper.getSkuResponseList(goodsResponse.getId());
@@ -1024,12 +1076,23 @@
         goodsResponse.setSkuResponsesList(skuResponseList);
     }
 
-
     @Override
-    public GoodsInfoResponse getGoodsInfo(Integer goodsId,Integer memberId) {
+    public Goods getGoodsInfo(Integer goodsId,Integer memberId) {
         String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                 systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
-        GoodsInfoResponse goodsResponse = goodsMapper.getGoodsInfo(goodsId);
+//        GoodsInfoResponse goodsResponse = goodsMapper.getGoodsInfo(goodsId);
+        Goods goodsResponse = goodsMapper.selectOne(
+                 new MPJLambdaWrapper<Goods>()
+                        .selectAll(Goods.class)
+                        .select(" (( select ifnull(sum(GOODS_NUM),0) from goodsorder_detail gd  where gd.GOODS_ID =  t.id  )) ",Goods::getRealSaleNum)
+                        .select("  ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = t.id ),0)   ",Goods::getMinPrice)
+                         .select("  ifnull(( select min(gs.SHOW_PRICE) from goods_sku gs where gs.GOODS_ID = t.id ),0)   ",Goods::getLinePrice)
+                        .leftJoin(SystemUser.class, SystemUser::getId, Goods::getCreator)
+//                        .eq(Goods::getIsdeleted,Constants.ZERO)
+//                        .eq(Goods::getStatus, Constants.ZERO)
+                        .eq(Goods::getId,goodsId)
+                         .last("limit 1")
+        );
         if(Objects.isNull(goodsResponse)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
@@ -1056,7 +1119,6 @@
                     .eq(Collect::getObjType,Constants.ONE)
             )>Constants.ZERO?Constants.ONE:Constants.ZERO);
         }
-
         return goodsResponse;
     }
 

--
Gitblit v1.9.3