Explorar o código

增加后台管理产品列表查询和导出

hejq %!s(int64=7) %!d(string=hai) anos
pai
achega
703ebefb4c

+ 45 - 0
src/main/java/com/uas/platform/b2c/core/utils/CollectionUtils.java

@@ -0,0 +1,45 @@
+package com.uas.platform.b2c.core.utils;
+
+import com.uas.platform.b2c.prod.commodity.model.AbstractKeyEntity;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 集合处理工具类
+ *
+ * @author hejq
+ * @date 2018-07-19 11:03
+ */
+public class CollectionUtils {
+
+    /**
+     * 用继承自KeyEntity的类,重写的getKey方法来取值,封装成List一次性查询数据
+     *
+     * @param paramArray
+     * @return
+     */
+    public static Set<Long> getKeyCollection(Collection<? extends AbstractKeyEntity> paramArray) {
+        Set<Long> idList = new HashSet<>();
+        if (!org.springframework.util.CollectionUtils.isEmpty(paramArray)) {
+            for (AbstractKeyEntity param : paramArray) {
+                Object val = param.getKey();
+                if (val != null) {
+                    idList.add(Long.valueOf(val.toString()));
+                }
+            }
+        }
+        return idList;
+    }
+
+    /**
+     * 集合是否为空
+     *
+     * @param coll 集合
+     * @return true or false
+     */
+    public static boolean isEmpty(Collection<?> coll) {
+        return (coll == null || coll.isEmpty());
+    }
+}

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java

@@ -855,7 +855,7 @@ public class GoodsController {
         if (!modelAndView.isEmpty()) {
             return modelAndView;
         }
-        PageInfo info = new PageInfo(1, JxlsExcelView.GOODS_MAX_SIZE);
+        PageInfo info = new PageInfo(params);
         List<Goods> goodsList = goodsService.multiSearch(info, goodsFilter);
         if (CollectionUtils.isNotEmpty(goodsList)) {
             logger.info("产品导出结果 products: " + goodsList.size());

+ 62 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -7,28 +7,43 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.uas.platform.b2c.prod.commodity.facade.ProductFacade;
-import com.uas.platform.b2c.prod.commodity.model.*;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
+import com.uas.platform.b2c.prod.commodity.model.ProductReplace;
+import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
+import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
+import com.uas.platform.b2c.trade.order.support.AjaxUtil;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -483,4 +498,48 @@ public class ProductController {
         USELOG.log("卖家中心物料", "单个物料录入操作");
 	    return productService.editOne(jsonObject);
     }
+
+	/**
+	 * 根据分页参数和过滤对象分页获取数据
+	 *
+	 * @param params 分页参数
+	 * @param goodsFilter 过滤对象
+	 * @return Page<Product>
+	 */
+	@RequestMapping(value = "/background/page", method = RequestMethod.POST)
+	public Page<V_ProductPrivate> getPageDataOfBackground(PageParams params, @RequestBody GoodsFilter goodsFilter) {
+		PageInfo info = new PageInfo(params);
+		logger.info("后台产品管理", "分页获取Goods信息");
+		return productService.getPageDataOfBackground(info, goodsFilter);
+	}
+
+    /**
+     * 根据分页参数和过滤对象导出数据
+     *
+     * @param goodsFilter 过滤对象
+     * @return ModelAndView
+     */
+    @RequestMapping(value = "/background/download", method = RequestMethod.GET)
+    public ModelAndView exportProductsStandard(GoodsFilter goodsFilter, HttpServletRequest request, PageParams params, HttpServletResponse response,
+                                               @RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax) {
+        HttpSession session = request.getSession();
+        ModelAndView modelAndView = AjaxUtil.checkIsAjax(session, isAjax);
+        if (!modelAndView.isEmpty()) {
+            return modelAndView;
+        }
+        PageInfo info = new PageInfo(params);
+        Page<V_ProductPrivate> page = productService.getPageDataOfBackground(info, goodsFilter);
+        if (CollectionUtils.isNotEmpty(page.getContent())) {
+            logger.info("产品导出结果 products: " + page.getContent().size());
+        } else {
+            logger.info("产品导出结果 products为空");
+        }
+        FastDateFormat dateFormat = FastDateFormat.getInstance("yyyy年MM月dd日 HH:mm");
+        modelAndView.addObject("dateFormat", dateFormat);
+        modelAndView.addObject("data", page.getContent());
+        modelAndView.addObject("title", "优软商城--产品库列表");
+        modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/background", "优软商城--产品库列表"));
+        session.setAttribute("loading", false);
+        return modelAndView;
+    }
 }

+ 21 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/AbstractKeyEntity.java

@@ -0,0 +1,21 @@
+package com.uas.platform.b2c.prod.commodity.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * 外键值
+ *
+ * @author hejq
+ * @date 2018-11-06 9:10
+ */
+public abstract class AbstractKeyEntity {
+
+
+    /**
+     * 主键值
+     *
+     * @return
+     */
+    @JsonIgnore
+    public abstract Object getKey();
+}

+ 5 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/V_ProductPrivate.java

@@ -15,6 +15,11 @@ import java.io.*;
 import java.util.Date;
 import java.util.Set;
 
+/**
+ * 商城物料私有字段
+ *
+ * @author US50
+ */
 @Entity
 @Table(name = "v$product$private")
 public class V_ProductPrivate implements Serializable {

+ 15 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java

@@ -843,4 +843,19 @@ public interface GoodsService {
      * @return List<Goods>
      */
     List<Goods> multiSearch(PageInfo info, GoodsFilter goodsFilter);
+
+    /**
+     * 通过batchCode查询冻结数量
+     *
+     * @param batchCode 批号
+     * @return 冻结数量
+     */
+    int getFrozenCount(String batchCode);
+
+    /**
+     * 给goods信息赋值
+     *
+     * @param goods Goods
+     */
+    void defineGoodsInfo(Goods goods);
 }

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.prod.commodity.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
 import com.uas.platform.b2c.prod.commodity.model.InOutboundDetail;
 import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
@@ -403,4 +404,13 @@ public interface ProductService {
      * @return ResultMap
      */
     ResultMap checkCriterion(Product product);
+
+    /**
+     * 根据分页参数和过滤对象分页获取数据
+     *
+     * @param info 分页参数
+     * @param goodsFilter 过滤对象
+     * @return Page<Product>
+     */
+    Page<V_ProductPrivate> getPageDataOfBackground(PageInfo info, GoodsFilter goodsFilter);
 }

+ 37 - 25
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java

@@ -3524,33 +3524,43 @@ public class GoodsServiceImpl implements GoodsService {
                 -> query.where(info.getPredicates(root, query, builder)).getRestriction(), info);
         List<Goods> goodsList = page.getContent();
         for (Goods goods : goodsList) {
-            if (sysConf.getStoreid().equals(goods.getStoreid())) {
-                goods.setSelfSale(StringConstant.CONSIGNMENT);
-            } else {
-                goods.setSelfSale(StringConstant.SALE_SELF);
-            }
-            goods.setFrozen(getFrozenCount(goods.getBatchCode()));
-            List<GoodsQtyPrice> prices = goods.getPrices();
-            if (CollectionUtils.isNotEmpty(prices)) {
-                int size = prices.size();
-                StringBuffer gradeBuffer = new StringBuffer();
-                StringBuffer priceBuffer = new StringBuffer();
-                for (int i = 0; i < size; i++) {
-                    if (gradeBuffer.length() > 0) {
-                        gradeBuffer.append("\n");
-                        priceBuffer.append("\n");
-                    }
-                    String priceEnd = i + 1 == size ? "以上" : prices.get(i).getEnd().toString();
-                    gradeBuffer.append(prices.get(i).getStart()).append("-").append(priceEnd);
-                    String currencyName = StringConstant.RMB.equals(goods.getCurrencyName()) ? "¥" : "$";
-                    Double price = StringConstant.RMB.equals(goods.getCurrencyName()) ? prices.get(i).getRMBPrice() : prices.get(i).getUSDPrice();
-                    priceBuffer.append(currencyName).append(price);
+           defineGoodsInfo(goods);
+        }
+        return page;
+    }
+
+    /**
+     * 给goods赋值
+     *
+     * @param goods goods
+     */
+    @Override
+    public void defineGoodsInfo(Goods goods) {
+        if (sysConf.getStoreid().equals(goods.getStoreid())) {
+            goods.setSelfSale(StringConstant.CONSIGNMENT);
+        } else {
+            goods.setSelfSale(StringConstant.SALE_SELF);
+        }
+        goods.setFrozen(getFrozenCount(goods.getBatchCode()));
+        List<GoodsQtyPrice> prices = goods.getPrices();
+        if (CollectionUtils.isNotEmpty(prices)) {
+            int size = prices.size();
+            StringBuffer gradeBuffer = new StringBuffer();
+            StringBuffer priceBuffer = new StringBuffer();
+            for (int i = 0; i < size; i++) {
+                if (gradeBuffer.length() > 0) {
+                    gradeBuffer.append("\n");
+                    priceBuffer.append("\n");
                 }
-                goods.setPriceGradeStr(gradeBuffer.toString());
-                goods.setPriceStr(priceBuffer.toString());
+                String priceEnd = i + 1 == size ? "以上" : prices.get(i).getEnd().toString();
+                gradeBuffer.append(prices.get(i).getStart()).append("-").append(priceEnd);
+                String currencyName = StringConstant.RMB.equals(goods.getCurrencyName()) ? "¥" : "$";
+                Double price = StringConstant.RMB.equals(goods.getCurrencyName()) ? prices.get(i).getRMBPrice() : prices.get(i).getUSDPrice();
+                priceBuffer.append(currencyName).append(price);
             }
+            goods.setPriceGradeStr(gradeBuffer.toString());
+            goods.setPriceStr(priceBuffer.toString());
         }
-        return page;
     }
 
     /**
@@ -3632,7 +3642,9 @@ public class GoodsServiceImpl implements GoodsService {
 
         return goodsPage;
     }
-    private int getFrozenCount(String batchCode) {
+
+    @Override
+    public int getFrozenCount(String batchCode) {
         String statusStr = OrderStatus.TOBEPAID.getCodes() + SplitChar.HYPHEN + OrderStatus.TOBEDELIVER.getCodes();
         List<Integer> statusList = new ArrayList<>();
         for (String str : statusStr.split(SplitChar.HYPHEN)) {

+ 84 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java

@@ -43,6 +43,7 @@ import com.uas.platform.b2c.prod.commodity.dao.V_ProductPersonDao;
 import com.uas.platform.b2c.prod.commodity.dao.V_ProductPrivateDao;
 import com.uas.platform.b2c.prod.commodity.model.CommodityInOutbound;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.model.GoodsFilter;
 import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
 import com.uas.platform.b2c.prod.commodity.model.InOutboundDetail;
@@ -59,7 +60,13 @@ import com.uas.platform.b2c.prod.commodity.model.ReleaseProductByBatch;
 import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPerson;
 import com.uas.platform.b2c.prod.commodity.model.V_ProductPrivate;
-import com.uas.platform.b2c.prod.commodity.service.*;
+import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.b2c.prod.commodity.service.ProductAttachService;
+import com.uas.platform.b2c.prod.commodity.service.ProductPersonService;
+import com.uas.platform.b2c.prod.commodity.service.ProductPrivateService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
 import com.uas.platform.b2c.prod.commodity.type.InOutBoundType;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.prod.commodity.util.GoodsUtil;
@@ -93,6 +100,7 @@ import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
@@ -2876,4 +2884,79 @@ public class ProductServiceImpl implements ProductService {
         goods = goodsDao.save(goods);
         LOGGER.log("上架商品", "新增上架商品", "通过卖家中心单个物料上传新增上架商品", goods.getCode(), goods.getId());
     }
+
+    /**
+     * 根据分页参数和过滤对象分页获取数据
+     *
+     * @param info        分页参数
+     * @param goodsFilter 过滤对象
+     * @return Page<Product>
+     */
+    @Override
+    public Page<V_ProductPrivate> getPageDataOfBackground(PageInfo info, GoodsFilter goodsFilter) {
+        if (info == null) {
+            throw new IllegalOperatorException("分页参数丢失");
+        }
+        if (goodsFilter != null) {
+            convertPageInfo(info, goodsFilter);
+        }
+        Page<V_ProductPrivate> page = v_productPrivateDao.findAll((Root<V_ProductPrivate> root, CriteriaQuery<?> query, CriteriaBuilder builder)
+                -> query.where(info.getPredicates(root, query, builder)).getRestriction(), info);
+        page.getContent().forEach(product -> {
+            List<Goods> goodsList = goodsDao.findByProductId(product.getId());
+            if (CollectionUtils.isNotEmpty(goodsList)) {
+                Goods goods = goodsList.get(0);
+                goodsService.defineGoodsInfo(goods);
+                product.setGoods(goods);
+            }
+        });
+        return page;
+    }
+
+    /**
+     * 封装分页条件
+     *
+     * @param info 分页信息
+     * @param goodsFilter 过滤条件
+     */
+    private void convertPageInfo(PageInfo info, GoodsFilter goodsFilter) {
+        info.filter("b2cEnabled", Constant.YES);
+        if (!StringUtils.isEmpty(goodsFilter.getStartTime())) {
+            java.sql.Date startDate = new java.sql.Date(goodsFilter.getStartTime());
+            info.expression(PredicateUtils.gte("createTime", startDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getEndTime())) {
+            // 截止日期是到当天23:59:59,java.sql.Date精确到天,这里采用加一天小于的方法设置截止日期判断
+            java.sql.Date endDate = new java.sql.Date(goodsFilter.getEndTime() + com.uas.platform.b2c.prod.commodity.constant.IntegerConstant.ONE_DAY_MILLISECONDS);
+            info.expression(PredicateUtils.lt("createTime", endDate, true));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getCode())) {
+            info.filter("cmpCode", goodsFilter.getCode());
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getBrand())) {
+            SimpleExpression[] brandExpression = new SimpleExpression[2];
+            brandExpression[0] = PredicateUtils.like("pbrand", goodsFilter.getBrand(), false, true);
+            brandExpression[1] = PredicateUtils.like("pbranden", goodsFilter.getBrand(), false, true);
+            info.expression(PredicateUtils.or((CriterionExpression[]) brandExpression));
+        }
+        if (!StringUtils.isEmpty(goodsFilter.getKindUuid())) {
+            // 如果包含多个叶子类目ID,则获取所有的叶子类目对应的商品信息
+            if (goodsFilter.getKindUuid().contains(SplitChar.COMMA)) {
+                String[] kindIds = goodsFilter.getKindUuid().split(SplitChar.COMMA);
+                info.expression(PredicateUtils.in("kindid", kindIds, false));
+            } else {
+                info.expression(PredicateUtils.eq("kindid", goodsFilter.getKindUuid(), false));
+            }
+        }
+        if (goodsFilter.getHaveImg() != null) {
+            if (goodsFilter.getHaveImg()) {
+                info.expression(PredicateUtils.isNotNull("cmpImg"));
+            } else {
+                info.expression(PredicateUtils.isNull("cmpImg"));
+            }
+        }
+        if (goodsFilter.getStandard() != null) {
+            info.filter("standard", goodsFilter.getStandard() ? Constant.YES : Constant.NO);
+        }
+    }
 }