Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

dongbw 7 tahun lalu
induk
melakukan
2d85282141
27 mengubah file dengan 1776 tambahan dan 213 penghapusan
  1. 20 0
      src/main/java/com/uas/ps/config/RestTemplateConfig.java
  2. 20 11
      src/main/java/com/uas/ps/product/controller/ProductController.java
  3. 106 9
      src/main/java/com/uas/ps/product/controller/ProductGetController.java
  4. 17 0
      src/main/java/com/uas/ps/product/dao/ProductPrivateViewDao.java
  5. 53 0
      src/main/java/com/uas/ps/product/entity/InviteProdInfo.java
  6. 106 0
      src/main/java/com/uas/ps/product/entity/ProductInfo.java
  7. 393 0
      src/main/java/com/uas/ps/product/entity/ProductPrivateView.java
  8. 35 49
      src/main/java/com/uas/ps/product/repository/ProductDao.java
  9. 28 0
      src/main/java/com/uas/ps/product/search/SPageUtils.java
  10. 62 0
      src/main/java/com/uas/ps/product/search/model/MultiValue.java
  11. 61 0
      src/main/java/com/uas/ps/product/search/model/MultiValueField.java
  12. 128 0
      src/main/java/com/uas/ps/product/search/model/PageParams.java
  13. 118 0
      src/main/java/com/uas/ps/product/search/model/SPage.java
  14. 19 0
      src/main/java/com/uas/ps/product/search/model/SearchUrl.java
  15. 28 0
      src/main/java/com/uas/ps/product/search/service/RestTempSearchService.java
  16. 126 0
      src/main/java/com/uas/ps/product/search/service/RestTempSearchServiceImpl.java
  17. 34 0
      src/main/java/com/uas/ps/product/search/service/SearchService.java
  18. 170 0
      src/main/java/com/uas/ps/product/search/service/SearchServiceImpl.java
  19. 18 3
      src/main/java/com/uas/ps/product/service/ProductService.java
  20. 10 13
      src/main/java/com/uas/ps/product/service/ProductUsersService.java
  21. 116 45
      src/main/java/com/uas/ps/product/service/impl/ProductServiceImpl.java
  22. 52 80
      src/main/java/com/uas/ps/product/service/impl/ProductUsersServiceImpl.java
  23. 17 0
      src/main/java/com/uas/ps/properties/UrlProperties.java
  24. 4 1
      src/main/resources/config/application-cloud.properties
  25. 4 1
      src/main/resources/config/application-dev.properties
  26. 4 1
      src/main/resources/config/application-test.properties
  27. 27 0
      src/main/resources/config/application-txcloud.properties

+ 20 - 0
src/main/java/com/uas/ps/config/RestTemplateConfig.java

@@ -0,0 +1,20 @@
+package com.uas.ps.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * RestTemplate配置bean
+ * @author suntg
+ * @create 2017/2/15
+ * @version 2017年8月2日16:07:06 suntg 修改文件类名
+ */
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+}

+ 20 - 11
src/main/java/com/uas/ps/product/controller/ProductController.java

@@ -9,12 +9,15 @@ import com.uas.ps.entity.Status;
 import com.uas.ps.httplog.annotation.HttpLog;
 import com.uas.ps.product.data.MyJdbcTemplate;
 import com.uas.ps.product.entity.Prod;
+import com.uas.ps.product.entity.ProductInfo;
 import com.uas.ps.product.entity.ProductSaler;
 import com.uas.ps.product.service.ProductService;
 import com.uas.ps.product.support.ProductBufferedLogger;
 import com.uas.ps.product.sync.WaitSyncHelper;
 import com.uas.ps.support.ResultMap;
 import java.util.Map;
+
+import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -50,17 +53,14 @@ public class ProductController {
     private MyJdbcTemplate jdbcTemplate;
 
     /**
-     * 一键开启/关闭 对应的物料采购属性
+     * 记录操作日志
      */
-    private static final String PRODUCT_PURCHASE_STATUS = "purc";
+    private final static ProductBufferedLogger logger = BufferedLoggerManager.getLogger(ProductBufferedLogger.class);
 
     /**
-     * 一键开启/关闭 对应的物料销售属性
+     * 日志提示
      */
-    private static final String PRODUCT_SALE_STATUS = "sale";
-
-    private final static ProductBufferedLogger logger = BufferedLoggerManager.getLogger(ProductBufferedLogger.class);
-
+    private static final Logger log = Logger.getLogger(ProductController.class);
 
     /**
      * 将ERP的产品资料写到公共物料库
@@ -221,12 +221,9 @@ public class ProductController {
             List<Long> ids = productService.update(data);
             waitSyncHelper.waitResponse();
             List<Product> products = productService.findAll(ids);
-//            System.out.println("更新完物料:" + (System.currentTimeMillis()  - start));
-//            start = System.currentTimeMillis();
             waitSyncHelper.preWait("B2B", jdbcTemplate);
             int sum = productService.updateProductUser(products);
             waitSyncHelper.waitResponse();
-//            System.out.println("保存完个人物料:" + (System.currentTimeMillis()  - start));
             map.put("success", "true");
             map.put("result", sum);
             log(data, "成功", "B2B批量导入个人产品成功,数据量:" + data.size(), null, null);
@@ -236,7 +233,7 @@ public class ProductController {
             map.put("success", "false");
             map.put("message", e.getCause() + e.getMessage());
         }
-        System.out.println("接口方法总耗时" + (System.currentTimeMillis() - start));
+        log.info("接口方法总耗时" + (System.currentTimeMillis() - start));
         return map;
     }
 
@@ -578,4 +575,16 @@ public class ProductController {
     public ModelMap getBusinessOpportunity(Long enUU, String pCmpCode, String pBrandEn) {
         return productService.getBusinessOpportunity(enUU, pCmpCode, pBrandEn);
     }
+
+    /**
+     * B2B 新增单据导入物料进行相关校验操作
+     *
+     * @param products 导入的物料信息
+     * @return
+     */
+    @HttpLog
+    @RequestMapping(value = "/checkImportProductList", method = RequestMethod.POST)
+    public Map<String, Object> checkImportProductList(@RequestBody List<ProductInfo> products) {
+        return productService.checkImportProductList(products);
+    }
 }

+ 106 - 9
src/main/java/com/uas/ps/product/controller/ProductGetController.java

@@ -1,25 +1,28 @@
 package com.uas.ps.product.controller;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.uas.ps.core.page.PageInfo;
-import com.uas.ps.core.page.criteria.CriterionExpression;
 import com.uas.ps.entity.Product;
+import com.uas.ps.entity.ProductUsers;
+import com.uas.ps.product.entity.InviteProdInfo;
+import com.uas.ps.product.entity.ProductPrivateView;
+import com.uas.ps.product.search.model.PageParams;
+import com.uas.ps.product.search.service.RestTempSearchService;
 import com.uas.ps.product.service.ProductService;
+import com.uas.ps.product.search.model.SPage;
+import com.uas.ps.product.search.service.SearchService;
+import com.uas.ps.product.service.ProductUsersService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
-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.RestController;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * 物料相关的查询接口
@@ -33,6 +36,20 @@ public class ProductGetController {
     @Autowired
     private ProductService productService;
 
+    @Autowired
+    private SearchService searchService;
+
+    @Autowired
+    private ProductUsersService productUsersService;
+
+    @Autowired
+    private RestTempSearchService restTempSearchService;
+
+    /**
+     * 物料信息表
+     */
+    final String PRODUCT_TABLE_NAME = "v$product$private";
+
     /**
      * 根据enUU和code查找企业物料
      * @param enUU  企业UU
@@ -77,7 +94,7 @@ public class ProductGetController {
      * @return  物料
      */
     @RequestMapping(value = "/findByPageInfo", method = RequestMethod.GET)
-    public Page<Product> findByPageInfo(int pageNumber, int pageSize, String filters, Sort sort, String keyword) {
+    public Page<ProductPrivateView> findByPageInfo(int pageNumber, int pageSize, String filters, Sort sort, String keyword) {
         PageInfo pageInfo = new PageInfo(pageNumber, pageSize);
         Map<String, Object> map = JSON.parseObject(filters);
         pageInfo.setFilters(map);
@@ -85,6 +102,74 @@ public class ProductGetController {
         return productService.findByPageInfo(pageInfo, keyword);
     }
 
+    /**
+     * 物料搜索接口
+     *
+     * @param page 页码
+     * @param size 大小
+     * @param filters 过滤条件(包含)
+     * @param notEqualFilters 过滤条件(不包含)
+     * @param keyword 关键字
+     * @return SPage<Product>
+     */
+    @RequestMapping(value = "/searchProducts", method = RequestMethod.GET)
+    public SPage<Product> searchProducts(int page, int size, String filters, String notEqualFilters, String keyword, String keywordSearchColumns) {
+        Map<String, Object> equalMap = JSON.parseObject(filters);
+        Map<String, Object> notEqualMap = JSON.parseObject(notEqualFilters);
+        List<String> searchColumns = new ArrayList<>();
+        if (null != keywordSearchColumns) {
+            searchColumns = JSON.parseArray(keywordSearchColumns, String.class);
+        }
+        PageParams pageParams = new PageParams(page, size, equalMap, notEqualMap, searchColumns);
+        return searchService.searchProducts(keyword, pageParams);
+    }
+
+    /**
+     * 物料搜索接口
+     *
+     * @param page 页码
+     * @param size 大小
+     * @param filters 过滤条件(包含)
+     * @param notEqualFilters 过滤条件(不包含)
+     * @param keyword 关键字
+     * @return SPage<Integer>
+     */
+    @RequestMapping(value = "/searchProductIds", method = RequestMethod.GET)
+    public SPage<Integer> searchProductIds(int page, int size, String filters, String notEqualFilters, String keyword, String keywordSearchColumns) {
+        Map<String, Object> equalMap = JSON.parseObject(filters);
+        Map<String, Object> notEqualMap = JSON.parseObject(notEqualFilters);
+        List<String> searchColumns = new ArrayList<>();
+        if (null != keywordSearchColumns) {
+            searchColumns = JSON.parseArray(keywordSearchColumns, String.class);
+        }
+        PageParams pageParams = new PageParams(page, size, equalMap, notEqualMap, searchColumns);
+        return restTempSearchService.searchIds(keyword, PRODUCT_TABLE_NAME, pageParams);
+    }
+
+    /**
+     * 根据分页信息查找个人物料
+     *
+     * @param page  页码
+     * @param size 分页大小
+     * @param sort 排序
+     * @param keyword  关键词   不建议使用关键词搜索,jpa获取会很慢
+     * @return  物料
+     */
+    @RequestMapping(value = "/findProductUsers", method = RequestMethod.GET)
+    public SPage<ProductUsers> findProductUsersByPageInfo(int page, int size, String filters, String notEqualFilters, Sort sort, String keyword) {
+        Map<String, Object> equalMap = JSON.parseObject(filters);
+        Map<String, Object> notEqualMap = JSON.parseObject(notEqualFilters);
+        PageParams pageParams = new PageParams(page, size, equalMap, notEqualMap, null);
+        if (StringUtils.isEmpty(keyword)) {
+            PageInfo pageInfo = new PageInfo(page, size);
+            for (Map.Entry<String, Object> map : equalMap.entrySet()) {
+                pageInfo.filter(map.getKey(), map.getValue());
+            }
+            return productUsersService.findByPageInfo(pageInfo);
+        }
+        return searchService.searchProductUsers(keyword, pageParams);
+    }
+
     /**
      * 根据ids查找企业物料
      * @param ids  物料id
@@ -186,4 +271,16 @@ public class ProductGetController {
     public Long countByEnUU(@RequestParam("enUU") Long enUU) {
         return productService.countByEnUU(enUU);
     }
+
+    /**
+     * 根据传入的企业UU信息获取物料数量和最近一次上传时间
+     *
+     * @param json 企业UU信息
+     * @return InviteProdInfo List
+     */
+    @RequestMapping(value = "/getCountAndTime", method = RequestMethod.GET)
+    public List<InviteProdInfo> findByEnUUList(@RequestParam("enUUList") String json) {
+        List<Long> enUUList = JSON.parseArray(json, Long.class);
+        return productService.getCountAndTime(enUUList);
+    }
 }

+ 17 - 0
src/main/java/com/uas/ps/product/dao/ProductPrivateViewDao.java

@@ -0,0 +1,17 @@
+package com.uas.ps.product.dao;
+
+import com.uas.ps.product.entity.ProductPrivateView;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 物料信息
+ *  与搜索用表“v$product$private”对应
+ *
+ * @author hejq
+ * @date 2018-08-02 19:41
+ */
+@Repository
+public interface ProductPrivateViewDao extends JpaSpecificationExecutor<ProductPrivateView>, JpaRepository<ProductPrivateView, Long> {
+}

+ 53 - 0
src/main/java/com/uas/ps/product/entity/InviteProdInfo.java

@@ -0,0 +1,53 @@
+package com.uas.ps.product.entity;
+
+import java.util.Date;
+
+/**
+ * 邀请注册信息获取到的企业物料数据
+ * <pre>
+ *   关于物料信息相关查询统一移到物料服务
+ * </pre>
+ * @author hejq
+ * @date 2018-08-20 14:48
+ */
+public class InviteProdInfo {
+
+    /**
+     * 企业UU号
+     */
+    private Long enUU;
+
+    /**
+     * 企业上传物料数
+     */
+    private Long count;
+
+    /**
+     * 最近一次上传时间
+     */
+    private Date lastDate;
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getCount() {
+        return count;
+    }
+
+    public void setCount(Long count) {
+        this.count = count;
+    }
+
+    public Date getLastDate() {
+        return lastDate;
+    }
+
+    public void setLastDate(Date lastDate) {
+        this.lastDate = lastDate;
+    }
+}

+ 106 - 0
src/main/java/com/uas/ps/product/entity/ProductInfo.java

@@ -0,0 +1,106 @@
+package com.uas.ps.product.entity;
+
+
+import com.uas.ps.entity.Product;
+
+import java.util.Date;
+
+/**
+ * 新增采购po批量导入物料信息
+ * 
+ * @author hejq
+ * @time 创建时间:2017年5月17日
+ */
+public class ProductInfo extends Product {
+
+	/**
+	 * 数量
+	 */
+	private Double amount;
+
+    /**
+     * 不含税单价
+     */
+    private Double unitPrice;
+
+	/**
+	 * 税率
+	 */
+	private Integer rate;
+
+	/**
+	 * 含税单价
+	 */
+	private Double rateprice;
+
+	/**
+	 * 不含税总额
+	 */
+	private Double totalprice;
+
+	/**
+	 * 交货日期
+	 */
+	private Date date;
+
+	/**
+	 * 备注
+	 */
+	private String remark;
+
+	public Double getAmount() {
+		return amount;
+	}
+
+	public void setAmount(Double amount) {
+		this.amount = amount;
+	}
+
+	public Integer getRate() {
+		return rate;
+	}
+
+	public void setRate(Integer rate) {
+		this.rate = rate;
+	}
+
+    public Double getUnitPrice() {
+        return unitPrice;
+    }
+
+    public void setUnitPrice(Double unitPrice) {
+        this.unitPrice = unitPrice;
+    }
+
+    public Double getRateprice() {
+		return rateprice;
+	}
+
+	public void setRateprice(Double rateprice) {
+		this.rateprice = rateprice;
+	}
+
+	public Double getTotalprice() {
+		return totalprice;
+	}
+
+	public void setTotalprice(Double totalprice) {
+		this.totalprice = totalprice;
+	}
+
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+}

+ 393 - 0
src/main/java/com/uas/ps/product/entity/ProductPrivateView.java

@@ -0,0 +1,393 @@
+package com.uas.ps.product.entity;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 物料信息
+ *  与搜索用表“v$product$private”对应
+ *
+ * @author hejq
+ * @date 2018-08-02 19:32
+ */
+@Entity
+@Table(name = "v$product$private")
+public class ProductPrivateView implements Serializable {
+
+    @Id
+    @Column(name = "pr_id")
+    private Long id;
+
+    /**
+     * 商品信息标题
+     */
+    @Column(name = "pr_title")
+    private String title;
+
+    /**
+     * 产品编号
+     */
+    @Column(name = "pr_code")
+    private String code;
+
+    /**
+     * 产品规格
+     */
+    @Column(name = "pr_spec")
+    private String spec;
+
+    /**
+     * 单位
+     */
+    @Column(name = "pr_unit")
+    private String unit;
+
+    /**
+     * 所属企业UU
+     */
+    @Column(name = "pr_enuu")
+    private Long enUU;
+
+    /**
+     * 个人UU 上传人的UU
+     */
+    @Column(name = "pr_useruu")
+    private Long userUU;
+
+    /**
+     * 价格
+     */
+    @Column(name = "pr_price")
+    private Double price;
+
+    /**
+     * 品牌(ERP) 上传时的品牌
+     */
+    @Column(name = "pr_brand")
+    private String brand;
+
+    /**
+     * 原厂型号(erp) 用户上传的型号
+     */
+    @Column(name = "pr_cmpcode")
+    private String cmpCode;
+
+    /**
+     * 买方ERP物料ID
+     */
+    @Column(name = "pr_sourceid")
+    private Long sourceId;
+
+    /**
+     * 保存erp传入数据的时间
+     */
+    @Column(name = "pr_erpdate")
+    private Date erpDate;
+
+    /**
+     * UUID 标准料号
+     */
+    @Column(name = "pr_cmpuuid")
+    private String cmpUuid;
+
+    /**
+     * 应用来源<br>
+     * 平台上传的为可以销售的
+     */
+    @Column(name = "pr_sourceapp")
+    private String sourceApp;
+
+    /**
+     * 类目(平台)(中文)
+     */
+    @Column(name = "pr_kind")
+    private String kind;
+
+    /**
+     * 类目(平台)(英文)
+     */
+    @Column(name = "pr_kinden")
+    private String kindEn;
+
+    /**
+     * 品牌(平台)(中文)
+     */
+    @Column(name = "pr_pbrand")
+    private String pBrand;
+
+    /**
+     * 品牌(平台)(英文)
+     */
+    @Column(name = "pr_pbranden")
+    private String pBrandEn;
+
+    /**
+     * 品牌(平台)(uuid)
+     */
+    @Column(name = "pr_pbranduuid")
+    private String pBrandUuid;
+
+    /**
+     * 型号(平台)
+     */
+    @Column(name = "pr_pcmpcode", length = 800)
+    private String pCmpCode;
+
+    /**
+     * 是否可卖<br>
+     * 1. 可以卖 <br>
+     * 0. 不可
+     */
+    @Column(name = "pr_issale")
+    private Short isSale;
+
+    /**
+     * 是否可买<br>
+     * 1. 可以买<br>
+     * 0. 不可
+     */
+    @Column(name = "pr_ispurchase")
+    private Short isPurchase;
+
+    /**
+     * 公开展示<br>
+     * <p>
+     * 1. 是<br>
+     * 0. 否
+     */
+    @Column(name = "pr_isshow")
+    private Short isShow;
+
+    /**
+     * 公开销售 <br>
+     * 1. 是<br>
+     * 0. 否
+     */
+    @Column(name = "pr_ispubsale")
+    private Short isPubsale;
+
+    /**
+     * 是否是标准物料<br>
+     * 1.YES<br>
+     * 0.NO
+     */
+    @Column(name = "pr_standard")
+    private Short standard;
+
+    /**
+     * 启用状态
+     *  1: 启用
+     *  0: 禁用
+     */
+    @Column(name = "pr_b2cenabled")
+    private Short b2cEnabled;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getSpec() {
+        return spec;
+    }
+
+    public void setSpec(String spec) {
+        this.spec = spec;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public String getBrand() {
+        return brand;
+    }
+
+    public void setBrand(String brand) {
+        this.brand = brand;
+    }
+
+    public String getCmpCode() {
+        return cmpCode;
+    }
+
+    public void setCmpCode(String cmpCode) {
+        this.cmpCode = cmpCode;
+    }
+
+    public Long getSourceId() {
+        return sourceId;
+    }
+
+    public void setSourceId(Long sourceId) {
+        this.sourceId = sourceId;
+    }
+
+    public Date getErpDate() {
+        return erpDate;
+    }
+
+    public void setErpDate(Date erpDate) {
+        this.erpDate = erpDate;
+    }
+
+    public String getCmpUuid() {
+        return cmpUuid;
+    }
+
+    public void setCmpUuid(String cmpUuid) {
+        this.cmpUuid = cmpUuid;
+    }
+
+    public String getSourceApp() {
+        return sourceApp;
+    }
+
+    public void setSourceApp(String sourceApp) {
+        this.sourceApp = sourceApp;
+    }
+
+    public String getKind() {
+        return kind;
+    }
+
+    public void setKind(String kind) {
+        this.kind = kind;
+    }
+
+    public String getKindEn() {
+        return kindEn;
+    }
+
+    public void setKindEn(String kindEn) {
+        this.kindEn = kindEn;
+    }
+
+    public String getpBrand() {
+        return pBrand;
+    }
+
+    public void setpBrand(String pBrand) {
+        this.pBrand = pBrand;
+    }
+
+    public String getpBrandEn() {
+        return pBrandEn;
+    }
+
+    public void setpBrandEn(String pBrandEn) {
+        this.pBrandEn = pBrandEn;
+    }
+
+    public String getpBrandUuid() {
+        return pBrandUuid;
+    }
+
+    public void setpBrandUuid(String pBrandUuid) {
+        this.pBrandUuid = pBrandUuid;
+    }
+
+    public String getpCmpCode() {
+        return pCmpCode;
+    }
+
+    public void setpCmpCode(String pCmpCode) {
+        this.pCmpCode = pCmpCode;
+    }
+
+    public Short getIsSale() {
+        return isSale;
+    }
+
+    public void setIsSale(Short isSale) {
+        this.isSale = isSale;
+    }
+
+    public Short getIsPurchase() {
+        return isPurchase;
+    }
+
+    public void setIsPurchase(Short isPurchase) {
+        this.isPurchase = isPurchase;
+    }
+
+    public Short getIsShow() {
+        return isShow;
+    }
+
+    public void setIsShow(Short isShow) {
+        this.isShow = isShow;
+    }
+
+    public Short getIsPubsale() {
+        return isPubsale;
+    }
+
+    public void setIsPubsale(Short isPubsale) {
+        this.isPubsale = isPubsale;
+    }
+
+    public Short getStandard() {
+        return standard;
+    }
+
+    public void setStandard(Short standard) {
+        this.standard = standard;
+    }
+
+    public Short getB2cEnabled() {
+        return b2cEnabled;
+    }
+
+    public void setB2cEnabled(Short b2cEnabled) {
+        this.b2cEnabled = b2cEnabled;
+    }
+}

+ 35 - 49
src/main/java/com/uas/ps/product/repository/ProductDao.java

@@ -1,6 +1,7 @@
 package com.uas.ps.product.repository;
 
 import com.uas.ps.entity.Product;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
@@ -9,6 +10,7 @@ import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import javax.transaction.Transactional;
+import java.sql.SQLException;
 import java.util.List;
 import java.util.Set;
 
@@ -27,6 +29,16 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      */
     List<Product> findByEnUUAndCode(Long pr_enuu, String pr_code);
 
+    /**
+     * 精简查询字段,只返回id就行
+     *
+     * @param enUU 企业UU
+     * @param code 物料编号
+     * @return
+     */
+    @Query("select p.id from Product p where p.enUU = :enUU and p.code = :code")
+    List<Long> findIdByEnUUAndCode(@Param("enUU") long enUU, @Param("code") String code);
+
     /**
      * 查找企业下所有标准或非标物料
      * @param enUU
@@ -72,18 +84,6 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      */
     List<Product> findByTitleAndCmpCodeAndBrandAndEnUU(String title, String cmpcode, String brand, Long enUU);
 
-    /**
-     * 通过企业UU,规格、品牌(非标准)、型号
-     *
-     * @param enUU 企业UU
-     * @param spec 物料规格
-     * @param cmpCode 规格C
-     * @param brand 品牌
-     * @return
-     */
-    List<Product> findByEnUUAndCmpCodeAndBrandAndSpec(Long enUU, String cmpCode, String brand, String spec);
-
-
     /**
      * 通过企业UU,物料名称、规格、品牌(标准)
      *
@@ -109,8 +109,8 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * 更新销售状态(企业)
      * @param switchStatus 开关状态 1 or 0
      */
-    @Transactional
     @Modifying
+    @Transactional(rollbackOn = SQLException.class)
     @Query("update Product p set p.isSale = :switchStatus where p.enUU = :enUU and (p.isSale <> :switchStatus or p.isSale is null)")
     void updateSaleStatusByEnUU(@Param("enUU") Long enUU, @Param("switchStatus") Short switchStatus);
 
@@ -118,8 +118,8 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * 更新采购状态(企业)
      * @param switchStatus 开关状态 1 or 0
      */
-    @Transactional
     @Modifying
+    @Transactional(rollbackOn = SQLException.class)
     @Query("update Product p set p.isPurchase = :switchStatus where p.enUU = :enUU and (p.isPurchase <> :switchStatus or p.isPurchase is null)")
     void updatePurchaseStatusByEnUU(@Param("enUU") Long enUU, @Param("switchStatus") Short switchStatus);
 
@@ -127,8 +127,8 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * 更新销售状态(单个)
      * @param switchStatus 开关状态 1 or 0
      */
-    @Transactional
     @Modifying
+    @Transactional(rollbackOn = SQLException.class)
     @Query("update Product p set p.isSale = :switchStatus where p.id = :id")
     void updateSaleStatusById(@Param("id") Long id, @Param("switchStatus") Short switchStatus);
 
@@ -137,18 +137,11 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * 更新采购状态(单个)
      * @param switchStatus 开关状态 1 or 0
      */
-    @Transactional
     @Modifying
+    @Transactional(rollbackOn = SQLException.class)
     @Query("update Product p set p.isPurchase = :switchStatus where p.id = :id")
     void updatePurchaseStatusById(@Param("id") Long id, @Param("switchStatus") Short switchStatus);
 
-    /**
-     * 根据企业UU获取该企业物料
-     * @param enUU 企业UU
-     * @return
-     */
-    List<Product> findByEnUU(Long enUU);
-
     /**
      * 根据企业UU和销售状态获取企业物料
      * @param enUU 企业UU
@@ -201,6 +194,17 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
     @Deprecated
     List<Product> findByEnUUAndTitle(Long enUU, String title);
 
+    /**
+     * 精简查询字段,只返回id就行
+     *
+     * @param enUU 企业UU
+     * @param title 物料名称
+     * @param pageable 分页信息(默认只取一条数据,优化效率)
+     * @return
+     */
+    @Query("select p.id, p.code from Product p where p.enUU = :enUU and p.title = :title")
+    List<Object[]> findIdAndCodeByEnUUAndTitle(@Param("enUU") long enUU, @Param("title") String title, Pageable pageable);
+
     /**
      * 通过品牌和enuu查询所有信息
      *                      数量大时,速度会很慢  2018年7月11日 15:18:43  dongbw
@@ -267,30 +271,12 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
     @Query("from Product p where p.enUU = :enUU and p.code in :codeSet")
     List<Product> findByEnUUAndCodeSet(@Param("enUU") Long enUU, @Param("codeSet") Set<String> codeSet);
 
-//    /**
-//     * 通过uu查询非标准器件进行存储
-//     *
-//     * @param enuu
-//     * @return
-//     */
-//    @Procedure(procedureName = "PRODUCT$MATCHES")
-//    String updateResultByEnuu(Long enuu);
-//
-//    /**
-//     * 通过uu查询非标准器件进行存储
-//     *
-//     * @param enuu
-//     * @return
-//     */
-//    @Procedure(procedureName = "PRODUCT$MATCHES_SALE")
-//    String updateResultByEnuuForSale(Long enuu);
-//
-//    /**
-//     * 通过uu查询非标准器件进行存储
-//     *
-//     * @param enuu
-//     * @return
-//     */
-//    @Procedure(procedureName = "PRODUCT$MATCHES_PURC")
-//    String updateResultByEnuuForPurc(Long enuu);
+    /**
+     * 通过id批量查询物料信息
+     *
+     * @param idSet id数组
+     * @return
+     */
+    @Query("from Product p where p.id in :idSet")
+    List<Product> findByIdList(@Param("idSet") List<Long> idSet);
 }

+ 28 - 0
src/main/java/com/uas/ps/product/search/SPageUtils.java

@@ -0,0 +1,28 @@
+package com.uas.ps.product.search;
+
+import com.uas.ps.product.search.model.SPage;
+import org.springframework.data.domain.Page;
+
+/**
+ * SPage<T> 与 Page<T>转换
+ *
+ * @author hejq
+ * @date 2018-08-01 14:26
+ */
+public class SPageUtils {
+
+    /**
+     * 将Page<T> 转成平台封装的SPage<T>
+     * @param page page信息
+     * @param <T> 实体对象
+     * @return
+     */
+    public static <T> SPage<T> covert(Page<T> page) {
+        SPage<T> sPage = new SPage<T>();
+        sPage.setTotalElement(page.getTotalElements());
+        sPage.setSize(page.getSize());
+        sPage.setPage(page.getNumber());
+        sPage.setContent(page.getContent());
+        return sPage;
+    }
+}

+ 62 - 0
src/main/java/com/uas/ps/product/search/model/MultiValue.java

@@ -0,0 +1,62 @@
+package com.uas.ps.product.search.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 搜索时,一个字段可能对应多个值
+ * 
+ * @author sunyj
+ * @since 2016年11月28日 上午8:47:54
+ */
+public class MultiValue implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 字段对应的多个值
+	 */
+	private List<Object> values;
+
+	/**
+	 * 多个值之间默认是AND逻辑关系,若该成员变量为true,则为OR逻辑关系
+	 */
+	private boolean or = false;
+
+	public MultiValue() {
+		super();
+	}
+
+	public MultiValue(List<Object> values) {
+		super();
+		this.values = values;
+	}
+
+	public MultiValue(List<Object> values, boolean or) {
+		super();
+		this.values = values;
+		this.or = or;
+	}
+
+	public List<Object> getValues() {
+		return values;
+	}
+
+	public void setValues(List<Object> values) {
+		this.values = values;
+	}
+
+	public boolean isOr() {
+		return or;
+	}
+
+	public void setOr(boolean or) {
+		this.or = or;
+	}
+
+	@Override
+	public String toString() {
+		return "MultiValueField [values=" + values + ", or=" + or + "]";
+	}
+
+}

+ 61 - 0
src/main/java/com/uas/ps/product/search/model/MultiValueField.java

@@ -0,0 +1,61 @@
+package com.uas.ps.product.search.model;
+
+
+/**
+ * 多条件封装
+ *
+ * @author hejq
+ * @date 2018-07-06 16:59
+ */
+public class MultiValueField {
+
+    /**
+     * 字段
+     */
+    private String field;
+
+    /**
+     * 值
+     */
+    private MultiValue multiValue;
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public MultiValue getMultiValue() {
+        return multiValue;
+    }
+
+    public void setMultiValue(MultiValue multiValue) {
+        this.multiValue = multiValue;
+    }
+
+    /**
+     * 无参构造
+     */
+    public MultiValueField(){}
+
+    /**
+     * 通过传入字段和multiValue构造MultiValueField
+     *
+     * @param field 字段
+     * @param multiValue multiValue
+     */
+    public MultiValueField(String field, MultiValue multiValue) {
+        this.field = field;
+        this.multiValue = multiValue;
+    }
+
+    @Override
+    public String toString() {
+        return "MultiValueField{" +
+                "field='" + field + '\'' +
+                ", multiValue=" + multiValue +
+                '}';
+    }
+}

+ 128 - 0
src/main/java/com/uas/ps/product/search/model/PageParams.java

@@ -0,0 +1,128 @@
+package com.uas.ps.product.search.model;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 重新编写搜索分页参数,为了和搜索接口对应
+ * 
+ * @author hejq
+ * @date 2018-08-02 11:04
+ */
+public class PageParams implements Serializable {
+
+	/**
+	 * 序列号
+	 */
+	private static final long serialVersionUID = 1L;
+
+    /**
+     * 页码
+     */
+	private int page;
+
+    /**
+     * 分页大小
+     */
+	private int size;
+
+	/**
+	 * keyword模糊搜索的字段名称
+	 */
+	private List<String> keywordSearchColumns;
+
+    /**
+     * 过滤条件(包含)
+     */
+	private Map<String, Object> filters;
+
+    /**
+     * 过滤条件(不包含)
+     */
+	private Map<String, Object> notEqualFilters;
+
+    /**
+     * 无参构造
+     */
+	public PageParams() {
+
+	}
+
+    /**
+     * 根据条件初始化分页参数
+     *
+     * @param page 页码
+     * @param size 大小
+     * @param filters 过滤条件(包含)
+     * @param notEqualFilters 过滤条件(不包含)
+     */
+	public PageParams(int page, int size, Map<String, Object> filters, Map<String, Object> notEqualFilters, List<String> keywordSearchColumns) {
+		this.page = page;
+		this.size = size;
+		this.filters = filters;
+		this.notEqualFilters = notEqualFilters;
+		this.keywordSearchColumns = keywordSearchColumns;
+	}
+
+	public int getPage() {
+		return page;
+	}
+
+	public void setPage(int page) {
+		this.page = page;
+	}
+
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+
+	public List<String> getKeywordSearchColumns() {
+		return keywordSearchColumns;
+	}
+
+	public void setKeywordSearchColumns(List<String> keywordSearchColumns) {
+		this.keywordSearchColumns = keywordSearchColumns;
+	}
+
+	public Map<String, Object> getFilters() {
+		return filters;
+	}
+
+	public void setFilters(Map<String, Object> filters) {
+		this.filters = filters;
+	}
+
+	public void filter(String key, Object value) {
+		if (this.filters == null) {
+			this.filters = new HashMap<String, Object>();
+		}
+		this.filters.put(key, value);
+	}
+
+	public void removeFilter(String key) {
+		if (this.filters != null) {
+			this.filters.remove(key);
+		}
+	}
+
+	public Map<String, Object> getNotEqualFilters() {
+		return notEqualFilters;
+	}
+
+	public void setNotEqualFilters(Map<String, Object> notEqualFilters) {
+		this.notEqualFilters = notEqualFilters;
+	}
+
+	@Override
+	public String toString() {
+		return "PageParams [page=" + page + ", size=" + size + ", keywordSearchColumns=" + keywordSearchColumns
+				+ ", filters=" + filters + ", notEqualFilters=" + notEqualFilters + "]";
+	}
+
+}

+ 118 - 0
src/main/java/com/uas/ps/product/search/model/SPage.java

@@ -0,0 +1,118 @@
+package com.uas.ps.product.search.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 自定义分页参数新
+ * @param <T>
+ *     
+ * @author hejq
+ * @date 2018-08-01 9:57
+ */
+public class SPage<T> implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private int totalPage;
+
+	private long totalElement;
+
+	private int page;
+
+	private int size;
+
+	private boolean first;
+
+	private boolean last;
+
+	private List<T> content;
+
+	private String token;
+
+	public SPage() {
+		super();
+	}
+
+	public SPage(int totalPage, long totalElement, int page, int size, boolean first, boolean last) {
+		super();
+		this.totalPage = totalPage;
+		this.totalElement = totalElement;
+		this.page = page;
+		this.size = size;
+		this.first = first;
+		this.last = last;
+	}
+
+	public int getTotalPage() {
+		return totalPage;
+	}
+
+	public void setTotalPage(int totalPage) {
+		this.totalPage = totalPage;
+	}
+
+	public long getTotalElement() {
+		return totalElement;
+	}
+
+	public void setTotalElement(long totalElement) {
+		this.totalElement = totalElement;
+	}
+
+	public int getPage() {
+		return page;
+	}
+
+	public void setPage(int page) {
+		this.page = page;
+	}
+
+	public int getSize() {
+		return size;
+	}
+
+	public void setSize(int size) {
+		this.size = size;
+	}
+
+	public boolean isFirst() {
+		return first;
+	}
+
+	public void setFirst(boolean first) {
+		this.first = first;
+	}
+
+	public boolean isLast() {
+		return last;
+	}
+
+	public void setLast(boolean last) {
+		this.last = last;
+	}
+
+	public List<T> getContent() {
+		return content;
+	}
+
+	public void setContent(List<T> content) {
+		this.content = content;
+	}
+
+	public String getToken() {
+		return token;
+	}
+
+	public void setToken(String token) {
+		this.token = token;
+	}
+
+	@Override
+	public String toString() {
+		return "SPage [totalPage=" + totalPage + ", totalElement=" + totalElement + ", page=" + page + ", size=" + size
+				+ ", first=" + first + ", last=" + last + ", content=" + content + ", token=" + token + "]";
+	}
+
+
+}

+ 19 - 0
src/main/java/com/uas/ps/product/search/model/SearchUrl.java

@@ -0,0 +1,19 @@
+package com.uas.ps.product.search.model;
+
+/**
+ * 搜索链接
+ *
+ * @author hejq
+ * @date 2018-07-05 16:15
+ */
+public class SearchUrl {
+
+    /**
+     * 获取id链接
+     */
+    public static final String ID_LIST = "/search/productIds/b2b?keywordSearchColumns={keywordSearchColumns}&keyword={keyword}" +
+            "&tableName={tableName}&page={page}&size={size}" +
+            "&filters={filters}&multiValueField={multiValueField}&sort={sort}" +
+            "&notEqualFilters={notEqualFilters}&multiValueNotField={multiValueNotField}";
+
+}

+ 28 - 0
src/main/java/com/uas/ps/product/search/service/RestTempSearchService.java

@@ -0,0 +1,28 @@
+package com.uas.ps.product.search.service;
+
+
+import com.uas.ps.core.page.PageInfo;
+import com.uas.ps.product.search.model.PageParams;
+import com.uas.ps.product.search.model.SPage;
+import net.sf.ehcache.search.SearchException;
+
+/**
+ * 采用restTempLate方式重写搜索功能
+ *
+ * @author hejq
+ * @date 2018-07-05 16:04
+ */
+public interface RestTempSearchService {
+
+    /**
+     * 通过表名,关键词,分页参数查询id信息
+     *
+     * @param tableName 表名
+     * @param keyword 关键词
+     * @param pageParams 分页参数
+     * @throws SearchException
+     * @return
+     */
+    SPage<Integer> searchIds(String keyword, String tableName, PageParams pageParams) throws SearchException;
+
+}

+ 126 - 0
src/main/java/com/uas/ps/product/search/service/RestTempSearchServiceImpl.java

@@ -0,0 +1,126 @@
+package com.uas.ps.product.search.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+import com.uas.ps.core.util.ContextUtils;
+import com.uas.ps.core.util.StringUtils;
+import com.uas.ps.product.search.model.*;
+import com.uas.ps.properties.UrlProperties;
+import net.sf.ehcache.search.SearchException;
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.poi.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 采用restTempLate方式重写搜索功能
+ *
+ * @author hejq
+ * @date 2018-07-05 16:05
+ */
+@Service
+public class RestTempSearchServiceImpl implements RestTempSearchService {
+
+    private final RestTemplate restTemplate;
+
+    /**
+     * 搜索地址
+     */
+    final String SEARCH_URL = ContextUtils.getBean(UrlProperties.class).getSearchUrl();
+
+    @Autowired
+    public RestTempSearchServiceImpl(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+
+    /**
+     * 通过表名,关键词,分页参数查询id信息
+     *
+     * @param tableName  表名
+     * @param keyword    关键词
+     * @param pageParams 分页参数
+     * @throws SearchException
+     * @return
+     */
+    @Override
+    public SPage<Integer> searchIds(String keyword, String tableName, PageParams pageParams) throws SearchException {
+        Map<String, Object> map = initSearchMap(tableName, keyword, pageParams);
+        String url = SEARCH_URL + SearchUrl.ID_LIST;
+        String str = restTemplate.getForObject(url, String.class, map);
+        if (StringUtils.isEmpty(str)) {
+            return new SPage<>();
+        } else {
+            try {
+                SPage<Integer> sPage = JSONObject.parseObject(str, SPage.class);
+                return sPage;
+            } catch (Exception e) {
+                e.printStackTrace();
+                return new SPage<>();
+            }
+        }
+    }
+
+    /**
+     * 定义搜索属性
+     *
+     * @param tableName 表名
+     * @param keyword 关键字
+     * @param pageParams 分页属性
+     * @return
+     */
+    public Map<String, Object> initSearchMap(String tableName, String keyword, PageParams pageParams) {
+        Map<String, Object> map = new HashedMap();
+        map.put("tableName", tableName);
+        map.put("page", pageParams.getPage());
+        map.put("size", pageParams.getSize());
+        map.put("keyword", keyword);
+        Object object = pageParams.getFilters().get("sort");
+        map.put("sort", object == null ? "" : JSON.toJSONString(object));
+        pageParams.getFilters().remove("sort");
+        boolean notEqual = true;
+        String nullString = "null";
+        if (null == pageParams.getNotEqualFilters() || pageParams.getNotEqualFilters().containsKey(nullString)) {
+            notEqual = false;
+        }
+        // 取出filters里面的信息单独处理
+        Iterator<Map.Entry<String, Object>> it = pageParams.getFilters().entrySet().iterator();
+        List<MultiValueField> valueFields = new ArrayList<>();
+        while (it.hasNext()) {
+            Map.Entry<String, Object> entry = it.next();
+            if (entry.getValue() instanceof MultiValue) {
+                valueFields.add(new MultiValueField(entry.getKey(), (MultiValue) entry.getValue()));
+                it.remove();
+            }
+        }
+        // notEqualFilters处理和filters一样
+        List<MultiValueField> valueNotFields = new ArrayList<>();
+        if (notEqual) {
+            Iterator<Map.Entry<String, Object>> notFields = pageParams.getNotEqualFilters().entrySet().iterator();
+            while (notFields.hasNext()) {
+                Map.Entry<String, Object> entry = notFields.next();
+                if (entry.getValue() instanceof MultiValue) {
+                    valueNotFields.add(new MultiValueField(entry.getKey(), (MultiValue) entry.getValue()));
+                    notFields.remove();
+                }
+            }
+        }
+        map.put("notEqualFilters", notEqual ? JSON.toJSONString(pageParams.getNotEqualFilters()) : "");
+        map.put("multiValueField", CollectionUtils.isEmpty(valueFields) ? "" : FlexJsonUtils.toJsonDeep(valueFields));
+        map.put("multiValueNotField", CollectionUtils.isEmpty(valueNotFields) ? "" : FlexJsonUtils.toJsonDeep(valueNotFields));
+        map.put("filters", JSON.toJSONString(pageParams.getFilters()));
+        if (!CollectionUtils.isEmpty(pageParams.getKeywordSearchColumns())) {
+            map.put("keywordSearchColumns", org.apache.tomcat.util.buf.StringUtils.join(pageParams.getKeywordSearchColumns()));
+        } else  {
+            map.put("keywordSearchColumns", null);
+        }
+        return map;
+    }
+}

+ 34 - 0
src/main/java/com/uas/ps/product/search/service/SearchService.java

@@ -0,0 +1,34 @@
+package com.uas.ps.product.search.service;
+
+import com.uas.ps.core.page.PageInfo;
+import com.uas.ps.entity.Product;
+import com.uas.ps.entity.ProductUsers;
+import com.uas.ps.product.search.model.PageParams;
+import com.uas.ps.product.search.model.SPage;
+
+/**
+ * 搜索服务接口
+ *
+ * @author hejq
+ * @date 2018-08-01 10:36
+ */
+public interface SearchService {
+
+    /**
+     * 通过关键词和分页信息查询物料信息
+     *
+     * @param keyword 搜索关键词
+     * @param pageParams 分页信息
+     * @return
+     */
+    SPage<Product> searchProducts(String keyword, PageParams pageParams);
+
+    /**
+     * 通过关键词和分页信息查询个人物料信息
+     *
+     * @param keyword 搜索关键词
+     * @param pageParams 分页信息
+     * @return
+     */
+    SPage<ProductUsers> searchProductUsers(String keyword, PageParams pageParams);
+}

+ 170 - 0
src/main/java/com/uas/ps/product/search/service/SearchServiceImpl.java

@@ -0,0 +1,170 @@
+package com.uas.ps.product.search.service;
+
+import com.uas.ps.entity.Product;
+import com.uas.ps.entity.ProductUsers;
+import com.uas.ps.product.repository.ProductDao;
+import com.uas.ps.product.repository.ProductUsersDao;
+import com.uas.ps.product.search.model.PageParams;
+import com.uas.ps.product.search.model.SPage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 搜索接口
+ *
+ * @author hejq
+ * @date 2018-08-01 10:38
+ */
+@Service
+public class SearchServiceImpl implements SearchService {
+
+    @Autowired
+    private RestTempSearchService searchService;
+
+    @Autowired
+    private ProductDao productDao;
+
+    @Autowired
+    private ProductUsersDao productUsersDao;
+
+    /**
+     * 物料信息表
+     */
+    final String PRODUCT_TABLE_NAME = "v$product$private";
+
+    /**
+     * 个人物料信息表
+     */
+    final String PRODUCT_USER_TABLE_NAME = "product$users";
+
+    private ConcurrentHashMap<String, Field> sortFields = new ConcurrentHashMap<>();
+
+    /**
+     * 将id的SPage信息、数据合并
+     *
+     * @param idsPage
+     *            id的SPage信息
+     * @param content
+     *            数据
+     * @return 合并后的结果
+     */
+    private <T> SPage<T> toSPage(SPage<Integer> idsPage, List<T> content) {
+        if (idsPage == null) {
+            return null;
+        }
+        SPage<T> result = new SPage<>();
+        result.setContent(content);
+        result.setFirst(idsPage.isFirst());
+        result.setLast(idsPage.isLast());
+        result.setPage(idsPage.getPage());
+        result.setSize(idsPage.getSize());
+        result.setTotalElement(idsPage.getTotalElement());
+        result.setTotalPage(idsPage.getTotalPage());
+        return result;
+    }
+
+    /**
+     * 自定义排序规则
+     *
+     * @param content 数据集合
+     * @param targetCls 目标类
+     * @param properyName 字段名
+     * @param propertyList 字段
+     * @param <T>
+     */
+    private <T> void sortByProperty(List<T> content, Class<T> targetCls, String properyName,
+                                    final List<Integer> propertyList) {
+        final Field field = getPropertyField(targetCls, properyName);
+        if (null != field) {
+            Collections.sort(content, new Comparator<T>() {
+
+                @Override
+                public int compare(T param1, T param2) {
+                    try {
+                        return Integer.compare(propertyList.indexOf((long) field.get(param1)),
+                                propertyList.indexOf((long) field.get(param2)));
+                    } catch (IllegalArgumentException e) {
+                        e.printStackTrace();
+                    } catch (IllegalAccessException e) {
+                        e.printStackTrace();
+                    }
+                    return 0;
+                }
+
+            });
+        }
+    }
+
+    /**
+     * 获取字段列名
+     *
+     * @param targetCls 目标类
+     * @param properyName
+     * @return
+     */
+    private Field getPropertyField(Class<?> targetCls, String properyName) {
+        Field field = sortFields.get(targetCls.toString());
+        if (null == field) {
+            Field[] fields = targetCls.getDeclaredFields();
+            for (Field f : fields) {
+                if (f.getName().equals(properyName)) {
+                    field = f;
+                    field.setAccessible(true);
+                    sortFields.put(targetCls.toString(), f);
+                    break;
+                }
+            }
+        }
+        return field;
+    }
+
+    /**
+     * 通过关键词和分页信息查询物料信息
+     *
+     * @param keyword 搜索关键词
+     * @param pageParams 分页信息
+     * @return
+     */
+    @Override
+    public SPage<Product> searchProducts(String keyword, PageParams pageParams) {
+        SPage<Integer> idsPage = searchService.searchIds(keyword, PRODUCT_TABLE_NAME, pageParams);
+        List<Product> content = null;
+        if (!CollectionUtils.isEmpty(idsPage.getContent())) {
+            Set<Long> idSet = new HashSet<>();
+            for (Integer id : idsPage.getContent()) {
+                idSet.add(Long.valueOf(id));
+            }
+            content = productDao.findAll(idSet);
+            sortByProperty(content, Product.class, "id", idsPage.getContent());
+        }
+        return toSPage(idsPage, content);
+    }
+
+    /**
+     * 通过关键词和分页信息查询个人物料信息
+     *
+     * @param keyword  搜索关键词
+     * @param pageParams 分页信息
+     * @return
+     */
+    @Override
+    public SPage<ProductUsers> searchProductUsers(String keyword, PageParams pageParams) {
+        SPage<Integer> idsPage = searchService.searchIds(keyword, PRODUCT_USER_TABLE_NAME, pageParams);
+        List<ProductUsers> content = null;
+        if (!CollectionUtils.isEmpty(idsPage.getContent())) {
+            Set<Long> idSet = new HashSet<>();
+            for (Integer id : idsPage.getContent()) {
+                idSet.add(Long.valueOf(id));
+            }
+            content = productUsersDao.findAll(idSet);
+            sortByProperty(content, ProductUsers.class, "id", idsPage.getContent());
+        }
+        return toSPage(idsPage, content);
+    }
+
+}

+ 18 - 3
src/main/java/com/uas/ps/product/service/ProductService.java

@@ -2,8 +2,7 @@ package com.uas.ps.product.service;
 
 import com.uas.ps.core.page.PageInfo;
 import com.uas.ps.entity.Product;
-import com.uas.ps.product.entity.Prod;
-import com.uas.ps.product.entity.ProductSaler;
+import com.uas.ps.product.entity.*;
 import com.uas.ps.support.ResultMap;
 import org.springframework.data.domain.Page;
 import org.springframework.transaction.annotation.Transactional;
@@ -377,5 +376,21 @@ public interface ProductService {
      * @param keyword 关键词
      * @return 物料page
      */
-    Page<Product> findByPageInfo(PageInfo pageInfo, String keyword);
+    Page<ProductPrivateView> findByPageInfo(PageInfo pageInfo, String keyword);
+
+    /**
+     * 批量校验导入物料信息
+     *
+     * @param products 物料
+     * @return
+     */
+    Map<String,Object> checkImportProductList(List<ProductInfo> products);
+
+    /**
+     * 根据传入的企业UU信息获取物料数量和最近一次上传时间
+     *
+     * @param enUUList 企业UU信息
+     * @return InviteProdInfo List
+     */
+    List<InviteProdInfo> getCountAndTime(List<Long> enUUList);
 }

+ 10 - 13
src/main/java/com/uas/ps/product/service/ProductUsersService.java

@@ -1,8 +1,10 @@
 package com.uas.ps.product.service;
 
+import com.uas.ps.core.page.PageInfo;
 import com.uas.ps.entity.Product;
 import com.uas.ps.entity.ProductUsers;
 import com.uas.ps.product.entity.ProductSaler;
+import com.uas.ps.product.search.model.SPage;
 import org.springframework.ui.ModelMap;
 
 import java.util.List;
@@ -14,12 +16,6 @@ import java.util.List;
  */
 public interface ProductUsersService {
 
-    /**
-     * 保存个人物料信息
-     * @param productUsers 个人物料信息
-     */
-    void save(List<ProductUsers> productUsers);
-
     /**
      * 新增个人物料信息
      *
@@ -63,16 +59,17 @@ public interface ProductUsersService {
      */
     List<ProductUsers> getProductUsersByEnUUAndCmpCode(Long enUU, String cmpCode);
 
-    /**
-     * ERP productSaler 实体转换成 productUsers 实体
-     * @param productSalers productUsers List
-     * @return
-     */
-    List<ProductUsers> convertProductUsers(List<ProductSaler> productSalers);
-
     /**
      * 更新我的个人产品库方法
      * @param productUsersList
      */
     void update(List<ProductUsers> productUsersList);
+
+    /**
+     * 通过分页信息查询个人物料
+     *
+     * @param pageInfo 分页信息
+     * @return
+     */
+    SPage<ProductUsers> findByPageInfo(PageInfo pageInfo);
 }

+ 116 - 45
src/main/java/com/uas/ps/product/service/impl/ProductServiceImpl.java

@@ -12,11 +12,9 @@ import com.uas.ps.core.page.criteria.SimpleExpression;
 import com.uas.ps.core.util.StringUtils;
 import com.uas.ps.entity.*;
 import com.uas.ps.product.ProductConstant;
+import com.uas.ps.product.dao.ProductPrivateViewDao;
 import com.uas.ps.product.data.MyJdbcTemplate;
-import com.uas.ps.product.entity.Constant;
-import com.uas.ps.product.entity.Prod;
-import com.uas.ps.product.entity.ProductReplace;
-import com.uas.ps.product.entity.ProductSaler;
+import com.uas.ps.product.entity.*;
 import com.uas.ps.product.repository.*;
 import com.uas.ps.product.service.ProductService;
 import com.uas.ps.product.sync.WaitSyncHelper;
@@ -26,6 +24,7 @@ import com.uas.ps.support.ResultMap;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.log4j.Logger;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
@@ -73,9 +72,6 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private MyJdbcTemplate jdbcTemplate;
 
-    @Autowired
-    private WaitSyncHelper waitSyncHelper;
-
     @Autowired
     private ProductPrivateDao productPrivateDao;
 
@@ -85,6 +81,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private SyncMessageDao syncMessageDao;
 
+    @Autowired
+    private ProductPrivateViewDao privateViewDao;
+
     /**
      * B2C物料可用属性
      */
@@ -740,7 +739,7 @@ public class ProductServiceImpl implements ProductService {
      * @param data 物料资料
      * @return 保存之后的idList
      */
-    @Transactional
+    @Transactional(rollbackFor = SQLException.class)
     @Override
     public List<Long> update(List<Product> data) {
         List<Product> newList = new ArrayList<>();
@@ -780,7 +779,7 @@ public class ProductServiceImpl implements ProductService {
     @Override
     public void updateExisted(List<Product> updateList) {
         jdbcTemplate.batchUpdate("update products set pr_enuu=?,pr_useruu=?,pr_code=?,pr_title=?,pr_spec=?,pr_cmpcode=?,pr_brand=?," +
-                        "pr_unit=?,pr_minorder=?,pr_minpack=?,pr_leadtime=?,pr_ltinstock=?,pr_issale=?,pr_ispurchase=?,pr_sourceapp=?,pr_pcmpcode=?,pr_pbranden=? " +
+                        "pr_unit=?,pr_minorder=?,pr_minpack=?,pr_leadtime=?,pr_ltinstock=?,pr_issale=?,pr_ispurchase=?,pr_sourceapp=?,pr_pcmpcode=?,pr_pbranden=?,pr_kind=? " +
                         "where pr_id=?",
                 updateList, updateList.size(), new ParameterizedPreparedStatementSetter<Product>() {
                     @Override
@@ -802,7 +801,8 @@ public class ProductServiceImpl implements ProductService {
                         ps.setObject(15, product.getSourceApp());
                         ps.setObject(16, product.getCmpCode());
                         ps.setObject(17, product.getBrand());
-                        ps.setLong(18, product.getId());
+                        ps.setObject(18, product.getKind());
+                        ps.setLong(19, product.getId());
                     }
                 });
     }
@@ -815,9 +815,10 @@ public class ProductServiceImpl implements ProductService {
     @Override
     public List<Long> insertAndReturnKey(final List<Product> newList) {
         return jdbcTemplate.batchInsert("insert into products(pr_enuu,pr_useruu,pr_code,pr_title,pr_spec,pr_cmpcode,pr_brand," +
-                "pr_unit,pr_minorder,pr_minpack,pr_leadtime,pr_ltinstock,pr_issale,pr_ispurchase,pr_sourceapp,pr_pcmpcode,pr_pbranden) " +
-                "values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) on duplicate key update pr_useruu=?,pr_title=?,pr_spec=?,pr_cmpcode=?,pr_brand=?," +
-                "pr_unit=?,pr_minorder=?,pr_minpack=?,pr_leadtime=?,pr_ltinstock=?,pr_issale=?,pr_ispurchase=?,pr_sourceapp=?,pr_pcmpcode=?,pr_pbranden=?", new BatchPreparedStatementSetter() {
+                "pr_unit,pr_minorder,pr_minpack,pr_leadtime,pr_ltinstock,pr_issale,pr_ispurchase,pr_sourceapp,pr_pcmpcode,pr_pbranden,pr_kind) " +
+                "values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) on duplicate key update pr_useruu=?,pr_title=?,pr_spec=?,pr_cmpcode=?,pr_brand=?," +
+                "pr_unit=?,pr_minorder=?,pr_minpack=?,pr_leadtime=?,pr_ltinstock=?,pr_issale=?,pr_ispurchase=?,pr_sourceapp=?,pr_pcmpcode=?," +
+                "pr_pbranden=?,pr_kind=?", new BatchPreparedStatementSetter() {
             @Override
             public void setValues(PreparedStatement ps, int i) throws SQLException {
                 Product product = newList.get(i);
@@ -838,22 +839,26 @@ public class ProductServiceImpl implements ProductService {
                 ps.setObject(15, product.getSourceApp());
                 ps.setObject(16, product.getCmpCode());
                 ps.setObject(17, product.getBrand());
+                // 这里将导入的title信息赋值给kind
+                ps.setObject(18, product.getTitle());
+
+                ps.setLong(19, product.getUserUU());
+                ps.setObject(20, product.getTitle());
+                ps.setObject(21, product.getSpec());
+                ps.setObject(22, product.getCmpCode());
+                ps.setObject(23, product.getBrand());
+                ps.setObject(24, product.getUnit());
+                ps.setObject(25, product.getMinOrder());
+                ps.setObject(26, product.getMinPack());
+                ps.setObject(27, product.getLeadTime());
+                ps.setObject(28, product.getLtinstock());
+                ps.setObject(29, product.getIsSale());
+                ps.setObject(30, product.getIsPurchase());
+                ps.setObject(31, product.getSourceApp());
+                ps.setObject(32, product.getCmpCode());
+                ps.setObject(33, product.getBrand());
+                ps.setObject(34, product.getTitle());
 
-                ps.setLong(18, product.getUserUU());
-                ps.setObject(19, product.getTitle());
-                ps.setObject(20, product.getSpec());
-                ps.setObject(21, product.getCmpCode());
-                ps.setObject(22, product.getBrand());
-                ps.setObject(23, product.getUnit());
-                ps.setObject(24, product.getMinOrder());
-                ps.setObject(25, product.getMinPack());
-                ps.setObject(26, product.getLeadTime());
-                ps.setObject(27, product.getLtinstock());
-                ps.setObject(28, product.getIsSale());
-                ps.setObject(29, product.getIsPurchase());
-                ps.setObject(30, product.getSourceApp());
-                ps.setObject(31, product.getCmpCode());
-                ps.setObject(32, product.getBrand());
             }
 
             @Override
@@ -867,7 +872,7 @@ public class ProductServiceImpl implements ProductService {
      * 更新个人产品库
      * @param products 物料信息
      */
-    @Transactional
+    @Transactional(rollbackFor = SQLException.class)
     @Override
     public int updateProductUser(List<Product> products) {
         final Date now = new Date();
@@ -1077,8 +1082,7 @@ public class ProductServiceImpl implements ProductService {
                     info.setPrid(product.getId());
                     info.setUseruu(productSaler.getEm_uu());
                     info.setErpid(productSaler.getPs_id());
-                    info = productUsersDao.save(info);
-//                    erpLogger.log("ERP个人物料信息同步", "关联物料id:" + info.getPrid(), 1);
+                    productUsersDao.save(info);
                 }
             }
         }
@@ -1098,7 +1102,6 @@ public class ProductServiceImpl implements ProductService {
             List<ProductUsers> prods = productUsersDao.findByEnuuAndUseruuAndErpid(productSaler.getEn_uu(), productSaler.getEm_uu(), productSaler.getPs_id());
             if (!CollectionUtils.isEmpty(prods)) {
                 deleteList.addAll(prods);
-//                erpLogger.log("ERP删除个人物料信息同步", "关联物料id: " + prod.getPrid(), 1);
             }
         }
         if (!CollectionUtils.isEmpty(deleteList)) {
@@ -1142,7 +1145,7 @@ public class ProductServiceImpl implements ProductService {
      * @return 物料page
      */
     @Override
-    public Page<Product> findByPageInfo(final PageInfo pageInfo, String keyword) {
+    public Page<ProductPrivateView> findByPageInfo(final PageInfo pageInfo, String keyword) {
         if (null == pageInfo) {
             return null;
         }
@@ -1150,18 +1153,9 @@ public class ProductServiceImpl implements ProductService {
             Sort sort = new Sort(Sort.Direction.DESC, "id");
             pageInfo.setSort(sort);
         }
-        if (!StringUtils.isEmpty(keyword)) {
-            SimpleExpression pBrandEn = new SimpleExpression("pBrandEn", keyword, CriterionExpression.Operator.LIKE);
-            SimpleExpression title = new SimpleExpression("title", keyword, CriterionExpression.Operator.LIKE);
-            SimpleExpression pCmpCode = new SimpleExpression("pCmpCode", keyword, CriterionExpression.Operator.LIKE);
-            SimpleExpression spec = new SimpleExpression("spec", keyword, CriterionExpression.Operator.LIKE);
-            SimpleExpression[] simpleExpressions = new SimpleExpression[]{pBrandEn, title, pCmpCode, spec};
-            LogicalExpression logicalExpression = PredicateUtils.or(simpleExpressions);
-            pageInfo.expression(logicalExpression);
-        }
-        return productDao.findAll(new Specification<Product>() {
+        return privateViewDao.findAll(new Specification<ProductPrivateView>() {
             @Override
-            public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+            public Predicate toPredicate(Root<ProductPrivateView> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                 query.where(pageInfo.getPredicates(root, query, cb));
                 return null;
             }
@@ -1216,8 +1210,85 @@ public class ProductServiceImpl implements ProductService {
      */
     public int ordinalIndexOf(String str, String substr, int start, int n) {
         int pos = str.indexOf(substr, start);
-        while (--n > 0 && pos != -1)
+        while (--n > 0 && pos != -1) {
             pos = str.indexOf(substr, pos + 1);
+        }
         return pos;
     }
+
+    /**
+     * 批量校验导入物料信息
+     *
+     * @param products 物料
+     * @return
+     */
+    @Override
+    public Map<String, Object> checkImportProductList(List<ProductInfo> products) {
+        int success = 0;
+        for (ProductInfo productInfo : products) {
+            if (null != productInfo.getCode()) {
+                List<Long> idList = productDao.findIdByEnUUAndCode(productInfo.getEnUU(), productInfo.getCode());
+                if (!CollectionUtils.isEmpty(idList)) {
+                    productInfo.setId(idList.get(0));
+                    success++;
+                } else {
+                    List<Product> productList = new ArrayList<>();
+                    Product product = new Product();
+                    BeanUtils.copyProperties(productInfo, product, Product.class);
+                    productList.add(product);
+                    productList = updateB2bProdInfo(productList);
+                    productInfo.setId(productList.get(0).getId());
+                    success++;
+                }
+            } else {
+                PageInfo pageInfo = new PageInfo(1, 1);
+                List<Object[]> objects = productDao.findIdAndCodeByEnUUAndTitle(productInfo.getEnUU(), productInfo.getTitle(), pageInfo);
+                if (!CollectionUtils.isEmpty(objects)) {
+                    Object[] object = objects.get(0);
+                    productInfo.setId(Long.valueOf(object[0].toString()));
+                    productInfo.setCode(object[1].toString());
+                    success++;
+                } else {
+                    //生成随机编码
+                    SimpleDateFormat sdf = new SimpleDateFormat("yymmddhhmm_sss");
+                    productInfo.setCode("prod" + sdf.format(new Date()));
+                    List<Product> productList = new ArrayList<>();
+                    Product product = new Product();
+                    BeanUtils.copyProperties(productInfo, product, Product.class);
+                    productList.add(product);
+                    productList = updateB2bProdInfo(productList);
+                    productInfo.setCode(productList.get(0).getCode());
+                    productInfo.setId(productList.get(0).getId());
+                    success++;
+                }
+            }
+        }
+        Map<String, Object> map = new HashedMap();
+        map.put("products", products);
+        map.put("success", success);
+        return map;
+    }
+
+    /**
+     * 根据传入的企业UU信息获取物料数量和最近一次上传时间
+     *
+     * @param enUUList 企业UU信息
+     * @return InviteProdInfo List
+     */
+    @Override
+    public List<InviteProdInfo> getCountAndTime(List<Long> enUUList) {
+        List<InviteProdInfo> infoList = new ArrayList<>();
+        for (Long enUU : enUUList) {
+            InviteProdInfo info = new InviteProdInfo();
+            info.setEnUU(enUU);
+            Long count = countByEnUU(enUU);
+            info.setCount(count);
+            if (count > 0) {
+                Date date = jdbcTemplate.queryForObject("select max(pr_erpdate) from products where pr_enuu = " + enUU, Date.class);
+                info.setLastDate(date);
+            }
+            infoList.add(info);
+        }
+        return infoList;
+    }
 }

+ 52 - 80
src/main/java/com/uas/ps/product/service/impl/ProductUsersServiceImpl.java

@@ -2,6 +2,10 @@ package com.uas.ps.product.service.impl;
 
 import com.uas.platform.core.persistence.criteria.PredicateFactory;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.ps.core.page.PageInfo;
+import com.uas.ps.core.page.criteria.CriterionExpression;
+import com.uas.ps.core.page.criteria.LogicalExpression;
+import com.uas.ps.core.page.criteria.SimpleExpression;
 import com.uas.ps.core.util.CollectionUtils;
 import com.uas.ps.core.util.StringUtils;
 import com.uas.ps.entity.Product;
@@ -10,8 +14,12 @@ import com.uas.ps.product.entity.Constant;
 import com.uas.ps.product.entity.ProductSaler;
 import com.uas.ps.product.repository.ProductDao;
 import com.uas.ps.product.repository.ProductUsersDao;
+import com.uas.ps.product.search.SPageUtils;
+import com.uas.ps.product.search.model.SPage;
 import com.uas.ps.product.service.ProductUsersService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.ModelMap;
@@ -28,7 +36,10 @@ import java.util.List;
 import java.util.Set;
 
 /**
- * Created by hejq on 2017-11-08.
+ * 个人物料
+ * 
+ * @author hejq
+ * @date 2018-08-02 19:32
  */
 @Service
 public class ProductUsersServiceImpl implements ProductUsersService {
@@ -39,44 +50,29 @@ public class ProductUsersServiceImpl implements ProductUsersService {
     @Autowired
     private ProductDao productDao;
 
-    /**
-     * 保存个人物料信息
-     *
-     * @param productUsers 个人物料信息
-     */
-    @Override
-    public void save(List<ProductUsers> productUsers) {
-        List<ProductUsers> saveList = new ArrayList<>();
-        for (ProductUsers prodUsers : productUsers) {
-            List<ProductUsers> existedProductUsers = productUsersDao.findByEnuuAndUseruuAndErpid(prodUsers.getEnuu(), prodUsers.getUseruu(), prodUsers.getPrid());
-            if (CollectionUtils.isEmpty(existedProductUsers)) {
-                prodUsers.setDate(new Date());
-                saveList.add(prodUsers);
-            }
-        }
-        productUsersDao.save(saveList);
-    }
-
     @Override
     public ModelMap addNewProduct(Product prodInfo) {
         ModelMap map = new ModelMap();
         // 先查找以前的个人物料是否存在
         List<ProductUsers> productUsers = productUsersDao.findByEnuuAndUseruuAndTitleAndCmpCodeAndBrand(prodInfo.getEnUU(), prodInfo.getUserUU(), prodInfo.getTitle(), prodInfo.getCmpCode(), prodInfo.getBrand());
-        if(CollectionUtils.isEmpty(productUsers)) {// 如果不存在则进行其他操作,存在不处理(先查询非标)
+        // 如果不存在则进行其他操作,存在不处理(先查询非标)
+        if (CollectionUtils.isEmpty(productUsers)) {
             List<Product> productList = productDao.findByTitleAndCmpCodeAndBrandAndEnUU(prodInfo.getTitle(), prodInfo.getCmpCode(), prodInfo.getBrand(), prodInfo.getEnUU());
-            if(CollectionUtils.isEmpty(productList)) {// 如果非标不存在再查询标准
+            // 如果非标不存在再查询标准
+            if (CollectionUtils.isEmpty(productList)) {
                 productList = productDao.findByTitleAndPCmpCodeAndPBrandAndEnUU(prodInfo.getTitle(), prodInfo.getCmpCode(), prodInfo.getBrand(), prodInfo.getEnUU());
             }
-            if(!CollectionUtils.isEmpty(productList)) { // 如果存在,找出其中一个进行绑定
+            // 如果存在,找出其中一个进行绑定
+            if (!CollectionUtils.isEmpty(productList)) {
                 ProductUsers prod = new ProductUsers();
                 prod.setDate(new Date());
                 prod.setEnuu(prodInfo.getEnUU());
                 prod.setPrid(productList.get(0).getId());
                 prod.setUseruu(prodInfo.getUserUU());
                 productUsersDao.save(prod);
-//                logger.log("个人产品库增加产品", "关联:" + productList.get(0).getId());
                 map.put("success", "新增成功");
-            } else {// 不存在的话新增再绑定
+                // 不存在的话新增再绑定
+            } else {
                 SimpleDateFormat sdf = new SimpleDateFormat("mmsssss");
                 if(null == prodInfo.getCode()) {
                     String code = prodInfo.getEnUU() + sdf.format(new Date());
@@ -84,23 +80,14 @@ public class ProductUsersServiceImpl implements ProductUsersService {
                 } else {
                     List<Product> products = productDao.findByEnUUAndCode(prodInfo.getEnUU(), prodInfo.getCode());
                     String code = prodInfo.getEnUU() + sdf.format(new Date());
-                    if(products.size() != 0) // 如果该企业下该编号的物料存在,重新赋值
+                    if(products.size() != 0) {
                         prodInfo.setCode(code);
+                    }
 
                 }
-//                List<Role> roles = roleService.findByEnUUAndUserUU(enuu, useruu);
-//                if(!CollectionUtils.isEmpty(roles)) {
-//                    for(Role role : roles) {
-//                        if(role.getDesc().equals("业务员") || role.getDesc().equals("销售经理")) {
-//                            prodInfo.setIsSale(Constant.YES);
-//                        } else  if(role.getDesc().equals("采购员")) {
-//                            prodInfo.setIsPurchase(Constant.YES);
-//                        }
-//                    }
-//                }
-//                prodInfo.setEnUU(enuu);
-                if (null == prodInfo.getUnit())
+                if (null == prodInfo.getUnit()) {
                     prodInfo.setUnit("PCS");
+                }
                 prodInfo.setSourceApp("B2B");
                 prodInfo.setIsPubsale(Constant.NO);
                 prodInfo.setIsShow(Constant.NO);
@@ -113,7 +100,6 @@ public class ProductUsersServiceImpl implements ProductUsersService {
                 prod.setPrid(prodInfo.getId());
                 prod.setUseruu(prodInfo.getUserUU());
                 productUsersDao.save(prod);
-//                logger.log("个人产品库增加产品", "关联:" + prodInfo.getId());
                 map.put("success", "新增成功");
             }
         } else {
@@ -142,7 +128,6 @@ public class ProductUsersServiceImpl implements ProductUsersService {
             }
         }
         productUsersList = productUsersDao.save(productUsersList);
-//        logger.log("我的产品库", "新增了我产品信息", "size:" + count);
         return productUsersList.size();
     }
 
@@ -150,31 +135,12 @@ public class ProductUsersServiceImpl implements ProductUsersService {
     public void coverToUserProdById(Long id, Long userUU, Long enUU) {
         List<ProductUsers> prods = productUsersDao.findByEnuuAndUseruuAndPrid(enUU, userUU, id);
         if(CollectionUtils.isEmpty(prods)) {
-//        	Product product = productDao.findOne(id);
-//	        List<Role> roles = roleService.findByEnUUAndUserUU(enuu, useruu);
-//	        // 根据当前用户角色更新物料销售采购属性
-//	        if(!CollectionUtils.isEmpty(roles)) {
-//		        for(Role role : roles) {
-//			        if(role.getDesc().equals("业务员") || role.getDesc().equals("销售经理")) {
-//			        	if(product.getIsSale() == null || product.getIsSale().equals(Constant.NO)) {
-//					        product.setIsSale(Constant.YES);
-//					        productDao.save(product);
-//				        }
-//			        } else if(role.getDesc().equals("采购员")) {
-//				        if(product.getIsPurchase() == null || product.getIsPurchase().equals(Constant.NO)) {
-//					        product.setIsPurchase(Constant.YES);
-//					        productDao.save(product);
-//				        }
-//			        }
-//		        }
-//	        }
             ProductUsers prod = new ProductUsers();
             prod.setUseruu(userUU);
             prod.setEnuu(enUU);
             prod.setPrid(id);
             prod.setDate(new Date());
-            prod = productUsersDao.save(prod);
-//            logger.log("我的产品库", "新增了我产品信息", "id:" + prod.getId());
+            productUsersDao.save(prod);
         }
     }
 
@@ -194,10 +160,11 @@ public class ProductUsersServiceImpl implements ProductUsersService {
     @Override
     public List<ProductUsers> getProductUsersByEnUUAndCmpCode(final Long enUU, final String cmpCode) {
         List<ProductUsers> returnList = new ArrayList<>();
+        String NONE_KEYWORD = "无";
         // 去掉同一企业下同一个人相同原厂型号的不同物料的记录,保证一个原厂型号只发一条
         Set<String> enUUAndUserUUs = new HashSet<>();
         // 过滤掉为空和填无的型号
-        if (StringUtils.isEmpty(cmpCode) || "无".equals(cmpCode)) {
+        if (StringUtils.isEmpty(cmpCode) || NONE_KEYWORD.equals(cmpCode)) {
             return returnList;
         }
         List<ProductUsers> productUsersList = productUsersDao.findAll(new Specification<ProductUsers>() {
@@ -222,26 +189,6 @@ public class ProductUsersServiceImpl implements ProductUsersService {
         return returnList;
     }
 
-    /**
-     * ERP productSaler 实体转换成 productUsers 实体
-     *
-     * @param productSalers productUsers List
-     * @return
-     */
-    @Override
-    public List<ProductUsers> convertProductUsers(List<ProductSaler> productSalers) {
-        List<ProductUsers> productUsersList = new ArrayList<>();
-        for (ProductSaler productSaler : productSalers) {
-            List<Product> products = productDao.findByEnUUAndCode(productSaler.getEn_uu(), productSaler.getPs_code());
-            if (!CollectionUtils.isEmpty(products)) {
-                ProductUsers productUsers = productSaler.convert();
-                productUsers.setPrid(products.get(0).getId());
-                productUsersList.add(productUsers);
-            }
-        }
-        return productUsersList;
-    }
-
     /**
      * 更新我的个人产品库方法
      *
@@ -260,4 +207,29 @@ public class ProductUsersServiceImpl implements ProductUsersService {
         }
         productUsersDao.save(productUsers);
     }
+
+    /**
+     * 通过分页信息查询个人物料
+     *
+     * @param pageInfo 分页信息
+     * @return
+     */
+    @Override
+    public SPage<ProductUsers> findByPageInfo(final PageInfo pageInfo) {
+        if (null == pageInfo) {
+            return null;
+        }
+        if (null == pageInfo.getSort()) {
+            Sort sort = new Sort(Sort.Direction.DESC, "id");
+            pageInfo.setSort(sort);
+        }
+        Page<ProductUsers> productUsersPage = productUsersDao.findAll(new Specification<ProductUsers>() {
+            @Override
+            public Predicate toPredicate(Root<ProductUsers> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(pageInfo.getPredicates(root, query, cb));
+                return null;
+            }
+        }, pageInfo);
+        return SPageUtils.covert(productUsersPage);
+    }
 }

+ 17 - 0
src/main/java/com/uas/ps/properties/UrlProperties.java

@@ -9,8 +9,17 @@ import org.springframework.stereotype.Component;
 @Component
 @ConfigurationProperties(prefix = "url")
 public class UrlProperties {
+
+    /**
+     * B2C url
+     */
     private String b2cUrl;
 
+    /**
+     * search service url
+     */
+    private String searchUrl;
+
     public String getB2cUrl() {
         return b2cUrl;
     }
@@ -18,4 +27,12 @@ public class UrlProperties {
     public void setB2cUrl(String b2cUrl) {
         this.b2cUrl = b2cUrl;
     }
+
+    public String getSearchUrl() {
+        return searchUrl;
+    }
+
+    public void setSearchUrl(String searchUrl) {
+        this.searchUrl = searchUrl;
+    }
 }

+ 4 - 1
src/main/resources/config/application-cloud.properties

@@ -21,4 +21,7 @@ datasource.maxPoolPreparedStatementPerConnectionSize=20
 datasource.filters=stat,slf4j
 datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
 
-url.b2c-url=https://www.usoftmall.com
+url.b2c-url=https://www.usoftmall.com
+
+#search url
+url.search-url=http://10.10.0.76:8081

+ 4 - 1
src/main/resources/config/application-dev.properties

@@ -20,4 +20,7 @@ datasource.timeBetweenLogStatsMillis=60000
 datasource.maxPoolPreparedStatementPerConnectionSize=20
 datasource.filters=stat,slf4j
 datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
-url.b2c-url=http://192.168.253.12:23400/
+url.b2c-url=http://192.168.253.12:23400/
+
+#search url
+url.search-url=http://10.10.100.191:8092

+ 4 - 1
src/main/resources/config/application-test.properties

@@ -21,4 +21,7 @@ datasource.maxPoolPreparedStatementPerConnectionSize=20
 datasource.filters=stat,slf4j
 datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
 
-url.b2c-url=http://218.17.158.219:9090/platform-b2c
+url.b2c-url=http://218.17.158.219:9090/platform-b2c
+
+#search url
+url.search-url=http://10.10.100.191:8092

+ 27 - 0
src/main/resources/config/application-txcloud.properties

@@ -0,0 +1,27 @@
+datasource.url=jdbc:mysql://172.16.0.200:3306/mall_prod?characterEncoding=utf-8&useSSL=false
+datasource.username=root
+datasource.password=select111***
+datasource.driverClassName=com.mysql.jdbc.Driver
+datasource.initialSize=1
+datasource.minIdle=1
+datasource.maxActive=100
+datasource.maxWait=60000
+datasource.timeBetweenEvictionRunsMillis=60000
+datasource.minEvictableIdleTimeMillis=300000
+datasource.validationQuery=SELECT 1 FROM DUAL
+datasource.testWhileIdle=true
+datasource.testOnBorrow=true
+datasource.testOnReturn=false
+datasource.removeAbandoned=true
+datasource.removeAbandonedTimeout=1800
+datasource.logAbandoned=true
+datasource.poolPreparedStatements=true
+datasource.timeBetweenLogStatsMillis=300000
+datasource.maxPoolPreparedStatementPerConnectionSize=20
+datasource.filters=stat,slf4j
+datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
+
+url.b2c-url=https://www.usoftmall.com
+
+#search url
+url.search-url=http://172.16.0.34:8081