Browse Source

处理加入个人物料报错的问题。(该物料已被加入到个人物料库)
提升批量加入个人物料速度(28000条 5秒 测试系统)

yuj 7 years ago
parent
commit
292061c49f

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductPersonDao.java

@@ -25,6 +25,16 @@ public interface ProductPersonDao extends JpaRepository<ProductPerson, Long>, Jp
      */
     List<ProductPerson> findByProductIdAndUserUU(Long productId, Long userUU);
 
+    /**
+     * 获取已存在个人物料的物料id
+     *
+     * @param prids 物料的id
+     * @param useruu 个人用户
+     * @return
+     */
+    @Query(value = "select p.productId from ProductPerson p where p.userUU = :useruu and p.productId in (:prids)")
+    List<Long> findProductIdInProductPerson(@Param("prids") List<Long> prids, @Param("useruu") Long useruu);
+
     /**
      * 根据productId查找物料信息
      * @param productId

+ 22 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductPersonService.java

@@ -0,0 +1,22 @@
+package com.uas.platform.b2c.prod.commodity.service;
+
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+
+import java.util.List;
+
+/**
+ *
+ * 个人物料的service层
+ *
+ * @author yuj
+ *
+ * @date 2018/10/24 19:17
+ */
+public interface ProductPersonService {
+
+    /**
+     * 批量插入个人物料信息
+     * @param list 需要插入的数据
+     */
+    public void batchInsert(List<ProductPerson> list);
+}

+ 77 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductPersonServiceImpl.java

@@ -0,0 +1,77 @@
+package com.uas.platform.b2c.prod.commodity.service.impl;
+
+import com.uas.platform.b2c.fa.payment.utils.StringUtils;
+import com.uas.platform.b2c.prod.commodity.model.ProductPerson;
+import com.uas.platform.b2c.prod.commodity.service.ProductPersonService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BatchPreparedStatementSetter;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * @author yuj
+ * @date 2018/10/24 19:18
+ */
+@Service
+public class ProductPersonServiceImpl implements ProductPersonService {
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Transactional(propagation = Propagation.REQUIRED)
+    @Override
+    public void batchInsert(List<ProductPerson> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            return ;
+        }
+
+        String sql  = "insert into product$users(pu_date, pu_enuu, pu_prid, pu_useruu) values (?, ?, ?, ?)";
+        try {
+            jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
+                @Override
+                public void setValues(PreparedStatement ps, int i) throws SQLException {
+                    ps.setDate(1, new Date(System.currentTimeMillis()));
+                    ps.setLong(2, list.get(i).getEnuu());
+                    ps.setLong(3, list.get(i).getProductId());
+                    ps.setLong(4, list.get(i).getUserUU());
+                }
+
+                @Override
+                public int getBatchSize() {
+                    return list.size();
+                }
+            });
+        } catch (Exception e) {
+            // 如果报了已经存在了这颗料,则做移除动作
+            String message = e.getMessage();
+            if (!StringUtils.isEmpty(message) && message.contains("UNIQUE_ENUU_USERUU_PRID")) {
+                //截取物料id
+                int lastH = message.lastIndexOf("-");
+                message = message.substring(0, lastH);
+                lastH = message.lastIndexOf("-");
+                String prid = message.substring(lastH + 1);
+
+                //移除对应物料
+                for (ProductPerson productPerson : list) {
+                    if (productPerson.getProductId().longValue() == Long.valueOf(prid).longValue()) {
+                        list.remove(productPerson);
+                        break;
+                    }
+                }
+                batchInsert(list);
+            } else {
+                throw new IllegalOperatorException(e.getMessage());
+            }
+        }
+
+    }
+}

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

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.parser.Feature;
 import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
 import com.uas.platform.b2c.common.base.dao.CommonDao;
 import com.uas.platform.b2c.common.search.rpc.service.SearchService;
@@ -58,12 +59,7 @@ 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.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.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.service.*;
 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;
@@ -118,6 +114,7 @@ import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
 import org.springframework.jdbc.core.StatementCallback;
 import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
@@ -278,6 +275,9 @@ public class ProductServiceImpl implements ProductService {
 
     private final CommonDao commonDao;
 
+    @Autowired
+    private ProductPersonService productPersonService;
+
     @Autowired
     public ProductServiceImpl(CommonDao commonDao) {
         this.commonDao = commonDao;
@@ -449,28 +449,40 @@ public class ProductServiceImpl implements ProductService {
         }
     }
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     @Override
     public Integer setAllProductsByProductIds(String ids, Integer isAll, Integer isStardand) {
         List<Long> prIds;
-        int count = 0;
         try {
             prIds = JSON.parseArray(ids,Long.class);
-        } catch (RuntimeException e){prIds = new ArrayList<>();}
-        Long useruu = SystemSession.getUser().getUserUU();
+        } catch (RuntimeException e) {
+            prIds = new ArrayList<>();
+        }
+
+        //查找物料信息
+        User user = SystemSession.getUser();
         if (isAll != null && isAll.equals(IntegerConstant.YES_SHORT)) {
-            prIds = productDao.findPridsByEnuuAndStardand(SystemSession.getUser().getEnterprise().getUu(), isStardand);
+            prIds = productDao.findPridsByEnuuAndStardand(user.getEnterprise().getUu(), isStardand);
         }
+
+        //筛选已经存在个人物料库的信息
         if (!CollectionUtils.isEmpty(prIds)) {
-            for (Long prId : prIds) {
-                List<ProductPerson> p = productPersonDao.findByProductIdAndUserUU(prId,useruu);
-                if (CollectionUtils.isEmpty(p)) {
-                    ProductPerson productPerson = new ProductPerson(useruu, SystemSession.getUser().getEnterprise().getUu(), prId);
-                    productPersonDao.save(productPerson);
-                    count++;
-                }
+            List<Long> productIdInProductPerson = productPersonDao.findProductIdInProductPerson(prIds, user.getUserUU());
+            for (Long productid : productIdInProductPerson) {
+                prIds.remove(productid);
             }
         }
-        return count;
+
+        //转成需要保存的信息
+        List<ProductPerson> list = new ArrayList<>();
+        for (Long prId : prIds) {
+            ProductPerson productPerson = new ProductPerson(user.getEnterprise().getUu(), user.getUserUU(), prId);
+            list.add(productPerson);
+        }
+        if (CollectionUtils.isNotEmpty(list)) {
+            productPersonService.batchInsert(list);
+        }
+        return prIds.size();
     }
 
     @Override