Browse Source

导入物料校验方法修改

yingp 8 years ago
parent
commit
f6d9fe0542

+ 16 - 0
src/main/java/com/uas/platform/b2b/dao/CommonDao.java

@@ -7,6 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
+import org.springframework.jdbc.core.namedparam.SqlParameterSource;
+import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
 import org.springframework.stereotype.Repository;
 
 @Repository
@@ -121,4 +124,17 @@ public class CommonDao {
 		return jdbcTemplate;
 	}
 
+	public void save(List<?> beans, String tableName) {
+		SqlParameterSource[] sqlSource = new SqlParameterSource[beans.size()];
+		int i = 0;
+		for (Object obj : beans) {
+			sqlSource[i++] = new BeanPropertySqlParameterSource(obj);
+		}
+		SimpleJdbcInsert insertActor = new SimpleJdbcInsert(getJdbcTemplate());
+		insertActor.setTableName(tableName);
+		insertActor.executeBatch(sqlSource);
+	}
+
+
+
 }

+ 111 - 0
src/main/java/com/uas/platform/b2b/dao/ProductTempDao.java

@@ -0,0 +1,111 @@
+package com.uas.platform.b2b.dao;
+
+import com.uas.platform.b2b.model.Product;
+import com.uas.platform.b2b.model.ProductTemp;
+import com.uas.platform.b2b.model.ProductUsers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
+import org.springframework.stereotype.Repository;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * Created by Pro1 on 2018/3/2.
+ */
+@Repository
+public class ProductTempDao {
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    public void save(List<ProductTemp> temps) {
+        jdbcTemplate.batchUpdate("insert into products_temp(pr_import_id,pr_code,pr_title,pr_spec,pr_cmpcode,pr_brand,pr_unit," +
+                "pr_minpack,pr_minorder,pr_leadtime,pr_ltinstock,pr_enuu,pr_useruu,pr_issale,pr_ispurchase,pr_isshow,pr_standard," +
+                "pr_ispubsale,pr_sourceapp,pr_create_time,pr_exist_id) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
+                temps, temps.size(), new ParameterizedPreparedStatementSetter<ProductTemp>() {
+            @Override
+            public void setValues(PreparedStatement ps, ProductTemp t) throws SQLException {
+                ps.setString(1, t.getPr_import_id());
+                ps.setObject(2, t.getPr_code());
+                ps.setObject(3, t.getPr_title());
+                ps.setObject(4, t.getPr_spec());
+                ps.setObject(5, t.getPr_cmpcode());
+                ps.setObject(6, t.getPr_brand());
+                ps.setObject(7, t.getPr_unit());
+                ps.setObject(8, t.getPr_minpack());
+                ps.setObject(9, t.getPr_minorder());
+                ps.setObject(10, t.getPr_leadtime());
+                ps.setObject(11, t.getPr_ltinstock());
+                ps.setObject(12, t.getPr_enuu());
+                ps.setObject(13, t.getPr_useruu());
+                ps.setObject(14, t.getPr_issale());
+                ps.setObject(15, t.getPr_ispurchase());
+                ps.setObject(16, t.getPr_isshow());
+                ps.setObject(17, t.getPr_standard());
+                ps.setObject(18, t.getPr_ispubsale());
+                ps.setObject(19, t.getPr_sourceapp());
+                ps.setObject(20, t.getPr_create_time());
+                ps.setObject(21, t.getPr_exist_id());
+            }
+        });
+    }
+
+    public void matchExists(String importId) {
+        jdbcTemplate.update("Merge Into (Select * From Products_Temp Where Pr_Import_Id=? And Pr_Exist_Id Is Null) T " +
+                "Using Products P On (T.Pr_Title=P.Pr_Title And ((T.Pr_Cmpcode=P.Pr_Cmpcode And T.Pr_Brand=P.Pr_Brand) Or (T.Pr_Cmpcode=P.Pr_Pcmpcode And T.Pr_Brand=P.Pr_Pbrand)) " +
+                "and t.pr_enuu=p.pr_enuu) when matched then update set t.pr_exist_id=p.pr_id", importId);
+    }
+
+    public void toggleDisabled(String importId) {
+        jdbcTemplate.update("merge into (select * from product$status where prs_b2bdisabled=1) p using \n" +
+                "(select * from products_temp where pr_import_id=? and pr_exist_id is not null) t on (p.prs_prid=t.pr_exist_id)\n" +
+                "when matched then update set p.prs_b2bdisabled=0", importId);
+    }
+
+    public List<String> getExistsTitle(String importId) {
+        return jdbcTemplate.queryForList("select pr_title from products_temp where pr_import_id=? and pr_exist_id is not null",
+                String.class, importId);
+    }
+
+    public List<String> getUserExistsTitle(String importId) {
+        return jdbcTemplate.queryForList("select pr_title from products_temp where pr_import_id=? and pr_exist_id is not null " +
+                        "and exists (select 1 from product$users where pu_enuu=pr_enuu and pu_useruu=pr_useruu and pu_prid=pr_exist_id)",
+                String.class, importId);
+    }
+
+    public List<Product> getNotMatchedProducts(String importId) {
+        return jdbcTemplate.query("select pr_code,pr_title,pr_spec,pr_cmpcode,pr_brand,pr_unit,pr_minpack,pr_minorder,pr_leadtime,pr_ltinstock,pr_enuu,pr_useruu," +
+                        "pr_issale,pr_ispurchase,pr_isshow,pr_standard,pr_ispubsale,pr_sourceapp,pr_create_time from products_temp where pr_import_id=? and pr_exist_id is null",
+                new BeanPropertyRowMapper<Product>(Product.class), importId);
+    }
+
+    public List<Product> getMatchedProducts(String importId) {
+        return jdbcTemplate.query("select * from products p where exists (select 1 from products_temp t where t.pr_exist_id=p.pr_id and t.pr_import_id=?)",
+                new BeanPropertyRowMapper<Product>(Product.class), importId);
+    }
+
+    public List<ProductTemp> findByImportId(String importId) {
+        return jdbcTemplate.query("select * from products_temp where pr_import_id=?", new BeanPropertyRowMapper<ProductTemp>(ProductTemp.class), importId);
+    }
+
+    public List<ProductUsers> getNotMatchedProductUsers(final String importId, final long enUU, final long userUU, List<Long> ids) {
+        jdbcTemplate.batchUpdate("insert into productusers_temp(pu_import_id,pu_date,pu_enuu,pu_useruu,pu_prid) values (?,sysdate,?,?,?)",
+                ids, ids.size(), new ParameterizedPreparedStatementSetter<Long>() {
+                    @Override
+                    public void setValues(PreparedStatement ps, Long id) throws SQLException {
+                        ps.setString(1, importId);
+                        ps.setLong(2, enUU);
+                        ps.setLong(3, userUU);
+                        ps.setLong(4, id);
+                    }
+                });
+        return jdbcTemplate.query("select pu_date,pu_enuu,pu_useruu,pu_prid from productusers_temp t where pu_import_id=? and not exists " +
+                "(select 1 from Product$users p where t.pu_enuu=p.pu_enuu and t.pu_useruu=p.pu_useruu and t.pu_prid=p.pu_prid)",
+                new BeanPropertyRowMapper<ProductUsers>(ProductUsers.class), importId);
+    }
+
+}

+ 292 - 0
src/main/java/com/uas/platform/b2b/model/ProductTemp.java

@@ -0,0 +1,292 @@
+package com.uas.platform.b2b.model;
+
+import java.util.Date;
+
+/**
+ * Created by Pro1 on 2018/3/2.
+ */
+public class ProductTemp {
+
+    private String pr_import_id;
+
+    /**
+     * 商品信息标题
+     */
+    private String pr_title;
+
+    /**
+     * 产品编号
+     */
+    private String pr_code;
+
+    /**
+     * 产品规格
+     */
+    private String pr_spec;
+
+    /**
+     * 单位
+     */
+    private String pr_unit;
+
+    /**
+     * 所属企业UU
+     */
+    private Long pr_enuu;
+
+    /**
+     * 个人UU
+     */
+    private Long pr_useruu;
+
+    /**
+     * 最小包装量
+     */
+    private Double pr_minpack;
+
+    /**
+     * 最小采购量
+     */
+    private Double pr_minorder;
+
+    /**
+     * 采购提前期
+     */
+    private Double pr_leadtime;
+
+    /**
+     * 备货提前期(天数)
+     */
+    private Double pr_ltinstock;
+
+    /**
+     * 品牌(ERP)
+     */
+    private String pr_brand;
+
+    /**
+     * 原厂型号(erp)
+     *
+     * @return
+     */
+    private String pr_cmpcode;
+
+    /**
+     * 应用来源<br>
+     * 平台上传的为可以销售的
+     *
+     * @return
+     */
+    private String pr_sourceapp;
+
+    /**
+     * 是否可卖<br>
+     * 1. 可以卖 <br>
+     * 0. 不可
+     */
+    private Short pr_issale;
+
+    /**
+     * 是否可买<br>
+     * 1. 可以买<br>
+     * 0. 不可
+     */
+    private Short pr_ispurchase;
+
+    /**
+     * 公开展示<br>
+     *
+     * 1. 是<br>
+     * 0. 否
+     */
+    private Short pr_isshow;
+
+    /**
+     * 公开销售 <br>
+     * 1. 是<br>
+     * 0. 否
+     */
+    private Short pr_ispubsale;
+
+    /**
+     * 是否是标准物料<br>
+     * 1.YES<br>
+     * 0.NO
+     */
+    private Short pr_standard;
+
+    /**
+     * 产品建立时间
+     */
+    private Date pr_create_time;
+
+    private Long pr_exist_id;
+
+    public String getPr_import_id() {
+        return pr_import_id;
+    }
+
+    public void setPr_import_id(String pr_import_id) {
+        this.pr_import_id = pr_import_id;
+    }
+
+    public String getPr_title() {
+        return pr_title;
+    }
+
+    public void setPr_title(String pr_title) {
+        this.pr_title = pr_title;
+    }
+
+    public String getPr_code() {
+        return pr_code;
+    }
+
+    public void setPr_code(String pr_code) {
+        this.pr_code = pr_code;
+    }
+
+    public String getPr_spec() {
+        return pr_spec;
+    }
+
+    public void setPr_spec(String pr_spec) {
+        this.pr_spec = pr_spec;
+    }
+
+    public String getPr_unit() {
+        return pr_unit;
+    }
+
+    public void setPr_unit(String pr_unit) {
+        this.pr_unit = pr_unit;
+    }
+
+    public Long getPr_enuu() {
+        return pr_enuu;
+    }
+
+    public void setPr_enuu(Long pr_enuu) {
+        this.pr_enuu = pr_enuu;
+    }
+
+    public Long getPr_useruu() {
+        return pr_useruu;
+    }
+
+    public void setPr_useruu(Long pr_useruu) {
+        this.pr_useruu = pr_useruu;
+    }
+
+    public Double getPr_minpack() {
+        return pr_minpack;
+    }
+
+    public void setPr_minpack(Double pr_minpack) {
+        this.pr_minpack = pr_minpack;
+    }
+
+    public Double getPr_minorder() {
+        return pr_minorder;
+    }
+
+    public void setPr_minorder(Double pr_minorder) {
+        this.pr_minorder = pr_minorder;
+    }
+
+    public Double getPr_leadtime() {
+        return pr_leadtime;
+    }
+
+    public void setPr_leadtime(Double pr_leadtime) {
+        this.pr_leadtime = pr_leadtime;
+    }
+
+    public Double getPr_ltinstock() {
+        return pr_ltinstock;
+    }
+
+    public void setPr_ltinstock(Double pr_ltinstock) {
+        this.pr_ltinstock = pr_ltinstock;
+    }
+
+    public String getPr_brand() {
+        return pr_brand;
+    }
+
+    public void setPr_brand(String pr_brand) {
+        this.pr_brand = pr_brand;
+    }
+
+    public String getPr_cmpcode() {
+        return pr_cmpcode;
+    }
+
+    public void setPr_cmpcode(String pr_cmpcode) {
+        this.pr_cmpcode = pr_cmpcode;
+    }
+
+    public String getPr_sourceapp() {
+        return pr_sourceapp;
+    }
+
+    public void setPr_sourceapp(String pr_sourceapp) {
+        this.pr_sourceapp = pr_sourceapp;
+    }
+
+    public Short getPr_issale() {
+        return pr_issale;
+    }
+
+    public void setPr_issale(Short pr_issale) {
+        this.pr_issale = pr_issale;
+    }
+
+    public Short getPr_ispurchase() {
+        return pr_ispurchase;
+    }
+
+    public void setPr_ispurchase(Short pr_ispurchase) {
+        this.pr_ispurchase = pr_ispurchase;
+    }
+
+    public Short getPr_isshow() {
+        return pr_isshow;
+    }
+
+    public void setPr_isshow(Short pr_isshow) {
+        this.pr_isshow = pr_isshow;
+    }
+
+    public Short getPr_ispubsale() {
+        return pr_ispubsale;
+    }
+
+    public void setPr_ispubsale(Short pr_ispubsale) {
+        this.pr_ispubsale = pr_ispubsale;
+    }
+
+    public Short getPr_standard() {
+        return pr_standard;
+    }
+
+    public void setPr_standard(Short pr_standard) {
+        this.pr_standard = pr_standard;
+    }
+
+    public Date getPr_create_time() {
+        return pr_create_time;
+    }
+
+    public void setPr_create_time(Date pr_create_time) {
+        this.pr_create_time = pr_create_time;
+    }
+
+    public Long getPr_exist_id() {
+        return pr_exist_id;
+    }
+
+    public void setPr_exist_id(Long pr_exist_id) {
+        this.pr_exist_id = pr_exist_id;
+    }
+}

+ 37 - 1
src/main/java/com/uas/platform/b2b/ps/ProductUtils.java

@@ -26,6 +26,42 @@ public class ProductUtils {
 
     private static final String PRODUCT_PUBLIC_SERVICE_URL = ContextUtils.getBean(SysConf.class).getProductServiceUrl();
 
+    /**
+     * 物料单次请求数据量大小
+     */
+    private static final Double ONE_TIME_DATA_SIZE = 1000d;
+
+    /**
+     * 分页批量更新物料
+     *
+     * @author dongbw
+     * @param  products 要保存的物料信息
+     * @return 所有更新成功的id
+     * @throws Exception
+     */
+    public static List<Long> paginationUpdate(List<Product> products) throws Exception {
+        List<Long> ids = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(products)) {
+            if (products.size() <= ONE_TIME_DATA_SIZE) {
+                ids = update(products);
+            } else {
+                List<Product> pageContent = new ArrayList<>();
+                int i = 1;
+                for (Product product : products) {
+                    pageContent.add(product);
+                    if (i++ % ONE_TIME_DATA_SIZE == 0) {
+                        ids.addAll(update(pageContent));
+                        pageContent = new ArrayList<>();
+                    }
+                }
+                if (!pageContent.isEmpty()) {
+                    ids.addAll(update(pageContent));
+                }
+            }
+        }
+        return ids;
+    }
+
     /**
      * 批量更新物料
      *
@@ -41,7 +77,7 @@ public class ProductUtils {
                 // 保存成功物料的id
                 return JSON.parseArray(res, Long.class);
             } catch (Exception e) {
-                throw new RuntimeException("批量更新物料出现异常");
+                throw new RuntimeException("批量更新物料出现异常:" + e.getMessage());
             }
         }
         return null;

+ 207 - 204
src/main/java/com/uas/platform/b2b/service/impl/ProductUsersServiceImpl.java

@@ -1,15 +1,14 @@
 package com.uas.platform.b2b.service.impl;
 
-import com.alibaba.dubbo.common.utils.CollectionUtils;
 import com.alibaba.fastjson.JSON;
+import com.uas.platform.b2b.core.util.DateUtils;
+import com.uas.platform.b2b.core.util.StringUtil;
 import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.dao.ProductDao;
 import com.uas.platform.b2b.dao.ProductStatusDao;
+import com.uas.platform.b2b.dao.ProductTempDao;
 import com.uas.platform.b2b.dao.ProductUsersDao;
-import com.uas.platform.b2b.model.Product;
-import com.uas.platform.b2b.model.ProductStatus;
-import com.uas.platform.b2b.model.ProductUsers;
-import com.uas.platform.b2b.model.Role;
+import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.ps.ProductUtils;
 import com.uas.platform.b2b.service.ProductUsersService;
 import com.uas.platform.b2b.service.RoleService;
@@ -19,6 +18,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.search.b2b.model.SPage;
+import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -29,6 +29,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -59,10 +60,8 @@ public class ProductUsersServiceImpl implements ProductUsersService {
     @Autowired
     private ProductStatusDao productStatusDao;
 
-    /**
-     * 物料单次请求数据量大小
-     */
-    private static final Double ONE_TIME_DATA_SIZE = 1000d;
+    @Autowired
+    private ProductTempDao productTempDao;
 
     @Override
     public SPage<ProductUsers> findProductInfoByPageInfo(PageInfo pageInfo) {
@@ -164,226 +163,230 @@ public class ProductUsersServiceImpl implements ProductUsersService {
 
     @Override
     public ModelMap releaseByWorkbook(Workbook workbook) throws Exception {
+        long start = System.currentTimeMillis();
         ModelMap modelMap = new ModelMap();
-        List<String> alters = new ArrayList<String>();
-        List<String> existedProducts = new ArrayList<>();
-        Long enuu = SystemSession.getUser().getEnterprise().getUu();
-        Long useruu = SystemSession.getUser().getUserUU();
+        List<ProductTemp> temps = new ArrayList<>();
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        Long userUU = SystemSession.getUser().getUserUU();
         // 生成随机物料编码
-        StringBuilder codeString = new StringBuilder();
-        SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmsssss");
-        codeString.append("PR").append(sdf.format(new Date()));
+        String codePrefix = "PR" + DateUtils.format(new Date(), "yyMMddHHmmsssss") + StringUtil.getRandomNumber(3);
         Sheet sheet = workbook.getSheetAt(0);
         int rowNum = sheet.getLastRowNum();
         Row headerRow = sheet.getRow(0);
         int total = 0;
-        // 上传成功的个人产品数量
-        int successProductUser = 0;
+        short isSale = Constant.NO;
+        short isPurchase = Constant.NO;
+        List<Role> roles = roleService.findByEnUUAndUserUU(enUU, userUU);
+        if(!CollectionUtils.isEmpty(roles)) {
+            for(Role role : roles) {
+                if(role.getDesc().equals("业务员") || role.getDesc().equals("销售经理")) {
+                    isSale = Constant.YES;
+                } else if(role.getDesc().equals("采购员")) {
+                    isPurchase = Constant.YES;
+                }
+            }
+        }
+        String importId = StringUtil.getRandomNumber(8);
         if (headerRow != null) {
-            // 根据每次发送数据量,计算发送几次
-            int times = (int) Math.ceil((rowNum - 2) / ONE_TIME_DATA_SIZE);
-            int r = 3;
-            for (int i = 1; i <= times; i++) {
-                // 每批次都需要重置用来保存的list
-                List<ProductUsers> productUsers = new ArrayList<ProductUsers>();
-                List<Product> products = new ArrayList<>();
-                int end = (int) (i * ONE_TIME_DATA_SIZE + 2);
-                for (; r <= (rowNum <= end ? rowNum : end); r++) {
-                    Row row = sheet.getRow(r);
-                    if (row != null && row.getCell(1) != null &&  row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
-                        total++;
-                        Product product = new Product();
-                        // 物料编号
-                        if (row.getCell(0) != null && row.getCell(0).getCellType() != Cell.CELL_TYPE_BLANK) {
-                            row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
-                            product.setCode(row.getCell(0).getStringCellValue().trim());
-                        } else {
-                            product.setCode(codeString.toString() + (r - 2));
-                        }
+            for (int r = 3; r <= rowNum; r++) {
+                Row row = sheet.getRow(r);
+                if (row != null) {
+                    total++;
+                    ProductTemp temp = new ProductTemp();
+                    temp.setPr_import_id(importId);
+                    temp.setPr_enuu(enUU);
+                    temp.setPr_useruu(userUU);
+                    temp.setPr_issale(isSale);
+                    temp.setPr_ispurchase(isPurchase);
+                    temp.setPr_sourceapp("B2B");
+                    // 物料编号
+                    if (row.getCell(0) != null) {
+                        row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_code(row.getCell(0).getStringCellValue().trim());
+                    } else {
+                        temp.setPr_code(codePrefix + StringUtils.leftPad(String.valueOf(r), 4, "0"));
+                    }
 
-                        // 物料名称
-                        if (row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
-                            row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
-                            product.setTitle(row.getCell(1).getStringCellValue().trim());
-                        } else {
-                            modelMap.put("error", "第" + (r + 1) + "行物料名称未填写");
-                            return modelMap;
-                        }
+                    // 物料名称
+                    if (row.getCell(1) != null && row.getCell(1).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_title(row.getCell(1).getStringCellValue().trim());
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行物料名称未填写");
+                        return modelMap;
+                    }
 
-                        // 物料规格
-                        if (row.getCell(2) != null && row.getCell(2).getCellType() != Cell.CELL_TYPE_BLANK) {
-                            row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
-                            product.setSpec(row.getCell(2).getStringCellValue().trim());
-                        } else {
-                            modelMap.put("error", "第" + (r + 1) + "行物料规格未填写");
-                            return modelMap;
-                        }
+                    // 物料规格
+                    if (row.getCell(2) != null && row.getCell(2).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_spec(row.getCell(2).getStringCellValue().trim());
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行物料规格未填写");
+                        return modelMap;
+                    }
 
-                        // 原厂型号
-                        if (row.getCell(3) != null && row.getCell(3).getCellType() != Cell.CELL_TYPE_BLANK) {
-                            row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
-                            product.setCmpCode(row.getCell(3).getStringCellValue().trim());
-                        } else {
-                            modelMap.put("error", "第" + (r + 1) + "行物料型号未填写");
-                            return modelMap;
-                        }
+                    // 原厂型号
+                    if (row.getCell(3) != null && row.getCell(3).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_cmpcode(row.getCell(3).getStringCellValue().trim());
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行物料型号未填写");
+                        return modelMap;
+                    }
 
-                        // 品牌
-                        if (row.getCell(4) != null && row.getCell(4).getCellType() != Cell.CELL_TYPE_BLANK) {
-                            row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
-                            product.setBrand(row.getCell(4).getStringCellValue().trim());
-                        } else {
-                            modelMap.put("error", "第" + (r + 1) + "行品牌未填写");
-                            return modelMap;
-                        }
+                    // 品牌
+                    if (row.getCell(4) != null && row.getCell(4).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
+                        temp.setPr_brand(row.getCell(4).getStringCellValue().trim());
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行品牌未填写");
+                        return modelMap;
+                    }
 
-                        // 单位
-                        if (row.getCell(5) != null && row.getCell(5).getCellType() != Cell.CELL_TYPE_BLANK) {
-                            row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
-                            if (null != row.getCell(5).getStringCellValue()
-                                    && !row.getCell(5).getStringCellValue().trim().equals("")) {
-                                product.setUnit(row.getCell(5).getStringCellValue());
-                            }
-                        } else {
-                            modelMap.put("error", "第" + (r + 1) + "行单位未填写");
-                            return modelMap;
-                        }
-                        // 最小包装量
-                        if (row.getCell(6) != null) {
-                            row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
-                            if (null != row.getCell(6).getStringCellValue().trim()
-                                    && !row.getCell(6).getStringCellValue().trim().equals("")) {
-                                product.setMinPack(Double.valueOf(row.getCell(6).getStringCellValue()));
-                            }
+                    // 单位
+                    if (row.getCell(5) != null && row.getCell(5).getCellType() != Cell.CELL_TYPE_BLANK) {
+                        row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(5).getStringCellValue()
+                                && !row.getCell(5).getStringCellValue().trim().equals("")) {
+                            temp.setPr_unit(row.getCell(5).getStringCellValue());
                         }
-                        // 最小订购量
-                        if (row.getCell(7) != null) {
-                            row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
-                            if (null != row.getCell(7).getStringCellValue().trim()
-                                    && !row.getCell(7).getStringCellValue().trim().equals("")) {
-                                product.setMinOrder(Double.valueOf(row.getCell(7).getStringCellValue()));
-                            }
+                    } else {
+                        modelMap.put("error", "第" + (r + 1) + "行单位未填写");
+                        return modelMap;
+                    }
+                    // 最小包装量
+                    if (row.getCell(6) != null) {
+                        row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(6).getStringCellValue().trim()
+                                && !row.getCell(6).getStringCellValue().trim().equals("")) {
+                            temp.setPr_minpack(Double.valueOf(row.getCell(6).getStringCellValue()));
                         }
-                        // 交货周期
-                        if (row.getCell(8) != null) {
-                            row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
-                            if (null != row.getCell(8).getStringCellValue().trim()
-                                    && !row.getCell(8).getStringCellValue().trim().equals("")) {
-                                product.setLeadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
-                            }
+                    }
+                    // 最小订购量
+                    if (row.getCell(7) != null) {
+                        row.getCell(7).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(7).getStringCellValue().trim()
+                                && !row.getCell(7).getStringCellValue().trim().equals("")) {
+                            temp.setPr_minorder(Double.valueOf(row.getCell(7).getStringCellValue()));
                         }
-                        // 交货提前期
-                        if (row.getCell(9) != null) {
-                            row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
-                            if (null != row.getCell(9).getStringCellValue().trim()
-                                    && !row.getCell(9).getStringCellValue().trim().equals("")) {
-                                product.setLtinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
-                            }
+                    }
+                    // 交货周期
+                    if (row.getCell(8) != null) {
+                        row.getCell(8).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(8).getStringCellValue().trim()
+                                && !row.getCell(8).getStringCellValue().trim().equals("")) {
+                            temp.setPr_leadtime(Double.valueOf(row.getCell(8).getStringCellValue()));
                         }
-                        List<ProductUsers> existProds = productUsersDao.findByEnuuAndUseruuAndTitleAndCmpCodeAndBrand
-                                (enuu, useruu, product.getTitle(), product.getCmpCode(), product.getBrand());
-                        if(CollectionUtils.isEmpty(existProds)) {
-                            List<Product> prods = productDao.findByEnUUAndCode(enuu, product.getCode());
-                            if (CollectionUtils.isEmpty(prods)) {
-                                prods = productDao.findByTitleAndCmpCodeAndBrandAndEnUU(
-                                        product.getTitle(), product.getCmpCode(), product.getBrand(), enuu);
-                            }
-                            if(CollectionUtils.isEmpty(prods)) {// 如果非标不存在再查询标准
-                                prods = productDao.findByTitleAndPcmpcodeAndPbrandAndEnUU(product.getTitle(), product.getCmpCode(), product.getBrand(), SystemSession.getUser().getEnterprise().getUu());
-                            }
-                            if (CollectionUtils.isEmpty(prods)) {
-                                // 如果物料不存在,先生成物料信息
-                                product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
-                                product.setUserUU(SystemSession.getUser().getUserUU());
-                                product.setSourceApp("B2B");
-                                product.setIsPubsale(Constant.NO);
-                                product.setIsShow(Constant.NO);
-                                product.setStandard(Constant.NO);
-                                product.setCreateTime(new Date());
-                                List<Role> roles = roleService.findByEnUUAndUserUU(enuu, useruu);
-                                if(!CollectionUtils.isEmpty(roles)) {
-                                    for(Role role : roles) {
-                                        if(role.getDesc().equals("业务员") || role.getDesc().equals("销售经理")) {
-                                            product.setIsSale(Constant.YES);
-                                        } else if(role.getDesc().equals("采购员")) {
-                                            product.setIsPurchase(Constant.YES);
-                                        }
-                                    }
-                                }
-                                products.add(product);
-                            } else {
-                                // 已存在,直接更新
-                                Product oldProd = prods.get(0);
-                                oldProd.setCode(product.getCode());
-                                oldProd.setCmpCode(product.getCmpCode());
-                                oldProd.setBrand(product.getBrand());
-                                oldProd.setTitle(product.getTitle());
-                                oldProd.setSpec(product.getSpec());
-                                oldProd.setUnit(product.getUnit());
-                                oldProd.setMinOrder(product.getMinOrder());
-                                oldProd.setMinPack(product.getMinPack());
-                                oldProd.setLeadtime(product.getLeadtime());
-                                oldProd.setLtinstock(product.getLtinstock());
-                                List<Role> roles = roleService.findByEnUUAndUserUU(enuu, useruu);
-                                if(!CollectionUtils.isEmpty(roles)) {
-                                    for(Role role : roles) {
-                                        if(role.getDesc().equals("业务员") || role.getDesc().equals("销售经理")) {
-                                            oldProd.setIsSale(Constant.YES);
-                                        } else if(role.getDesc().equals("采购员")) {
-                                            oldProd.setIsPurchase(Constant.YES);
-                                        }
-                                    }
-                                }
-                                products.add(oldProd);
-                                // 如果已存在,且被禁用,修改为可用
-                                List<ProductStatus> productStatuses = productStatusDao.findByPrIdAndB2bDisabled(oldProd.getId(), Constant.YES);
-                                if (!CollectionUtils.isEmpty(productStatuses)) {
-                                    ProductStatus status = productStatuses.get(0);
-                                    status.setB2bDisabled(Constant.NO);
-                                    productStatusDao.save(status);
-                                }
-                                existedProducts.add(product.getTitle());
-                            }
-//                        productUsers.add(prod);
-                        } else {
-                            alters.add(existProds.get(0).getProduct().getTitle());
+                    }
+                    // 交货提前期
+                    if (row.getCell(9) != null) {
+                        row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
+                        if (null != row.getCell(9).getStringCellValue().trim()
+                                && !row.getCell(9).getStringCellValue().trim().equals("")) {
+                            temp.setPr_ltinstock(Double.valueOf(row.getCell(9).getStringCellValue()));
                         }
                     }
+                    temps.add(temp);
                 }
-                if (!CollectionUtils.isEmpty(products)) {
-                    try {
-                        List<Long> idList = ProductUtils.update(products);
-                        if (!CollectionUtils.isEmpty(idList)) {
-                            for (Long id: idList) {
-                                ProductUsers prodUser = productUsersDao.findByEnuuAndUseruuAndPrid(enuu, useruu, id);
-                                if (null == prodUser) {
-                                    ProductUsers prod = new ProductUsers();
-                                    prod.setDate(new Date());
-                                    prod.setEnuu(enuu);
-                                    prod.setPrid(id);
-                                    prod.setUseruu(useruu);
-                                    productUsers.add(prod);
-                                }
-                            }
-                            if (!CollectionUtils.isEmpty(productUsers)) {
-                                ProductUtils.updateProductUsersByBatch(productUsers);
-                                successProductUser = successProductUser + productUsers.size();
-                            }
+            }
+
+            modelMap.put("total", total);
+            // 本地校验
+            checkTempProducts(temps, modelMap);
+            // 保存到公共库
+            saveToDataCenter(temps, modelMap);
+            System.out.println("总耗时:" + (System.currentTimeMillis() - start));
+        }
+        return modelMap;
+    }
+
+    /**
+     * 校验导入的物料
+     *
+     * @param temps
+     */
+    private void checkTempProducts(List<ProductTemp> temps, ModelMap modelMap) {
+        long start = System.currentTimeMillis();
+        if (!CollectionUtils.isEmpty(temps)) {
+            String importId = temps.get(0).getPr_import_id();
+            // 放入数据库
+            productTempDao.save(temps);
+            // 匹配已存在物料
+            productTempDao.matchExists(importId);
+            // 已禁用物料自动解禁
+            productTempDao.toggleDisabled(importId);
+            // 返回在物料库已存在的物料名称
+            List<String> existed = productTempDao.getExistsTitle(importId);
+            if (!CollectionUtils.isEmpty(existed)) {
+                modelMap.put("existed", existed);
+            }
+            // 返回在个人物料库已存在的物料名称
+            List<String> userExisted = productTempDao.getUserExistsTitle(importId);
+            if (!CollectionUtils.isEmpty(userExisted)) {
+                modelMap.put("alters", userExisted);
+            }
+            System.out.println("校验:" + (System.currentTimeMillis() - start));
+        }
+    }
+
+    /**
+     * 保存到公共库
+     */
+    private void saveToDataCenter(List<ProductTemp> temps, ModelMap modelMap){
+        long start = System.currentTimeMillis();
+        if (!CollectionUtils.isEmpty(temps)) {
+            String importId = temps.get(0).getPr_import_id();
+            // 匹配后结果
+            temps = productTempDao.findByImportId(importId);
+            // 未匹配到的物料
+            List<Product> products = productTempDao.getNotMatchedProducts(importId);
+            // 匹配的当前物料库相关数据
+            List<Product> exists = productTempDao.getMatchedProducts(importId);
+            if (!CollectionUtils.isEmpty(exists)) {
+                for (Product e : exists) {
+                    for (ProductTemp t : temps) {
+                        // 替换为新导入的数据
+                        if (e.getId().equals(t.getPr_exist_id())) {
+                            e.setCode(t.getPr_code());
+                            e.setCmpCode(t.getPr_cmpcode());
+                            e.setBrand(t.getPr_brand());
+                            e.setTitle(t.getPr_title());
+                            e.setSpec(t.getPr_spec());
+                            e.setUnit(t.getPr_unit());
+                            e.setMinOrder(t.getPr_minorder());
+                            e.setMinPack(t.getPr_minpack());
+                            e.setLeadtime(t.getPr_leadtime());
+                            e.setLtinstock(t.getPr_ltinstock());
+                            e.setIsSale(t.getPr_issale());
+                            e.setIsPurchase(t.getPr_ispurchase());
+                            products.add(e);
+                            break;
                         }
-                    } catch (Exception e) {
-                        modelMap.put("error", "物料添加失败");
                     }
                 }
             }
-            modelMap.put("total", total);
-            modelMap.put("success", successProductUser);
-            if(alters.size() > 0)
-                modelMap.put("alters", alters);
-            if (existedProducts.size() > 0) {
-                modelMap.put("existed", existedProducts);
+            System.out.println("取匹配后结果:" + (System.currentTimeMillis() - start));
+            start = System.currentTimeMillis();
+            System.out.println(JSON.toJSONString(products.get(0)));
+            try {
+                // 更新物料
+                List<Long> idList = ProductUtils.paginationUpdate(products);
+                System.out.println("更新物料:" + (System.currentTimeMillis() - start));
+                start = System.currentTimeMillis();
+                if (!CollectionUtils.isEmpty(idList)) {
+                    // 更新个人物料
+                    List<ProductUsers> productUsersList = productTempDao.getNotMatchedProductUsers(importId,
+                            temps.get(0).getPr_enuu(), temps.get(0).getPr_useruu(), idList);
+                    if (!CollectionUtils.isEmpty(productUsersList)) {
+                        ProductUtils.updateProductUsersByBatch(productUsersList);
+                        modelMap.put("success", productUsersList.size());
+                        System.out.println("更新个人物料:" + (System.currentTimeMillis() - start));
+                    }
+                }
+            } catch (Exception e) {
+                modelMap.put("error", "物料添加失败(" + e.getMessage() + ")");
             }
         }
-        return modelMap;
     }
 
     @Override