Browse Source

Merge remote-tracking branch 'origin/feature-pinganpay-yuj-20171108' into feature-pinganpay-yuj-20171108

# Conflicts:
#	pom.xml
yujia 8 years ago
parent
commit
fa56787a79
100 changed files with 5154 additions and 1696 deletions
  1. 29 1
      pom.xml
  2. 2 1
      src/main/java/com/uas/platform/b2c/advertise/ad/api/CarouselsController.java
  3. 13 0
      src/main/java/com/uas/platform/b2c/advertise/ad/constant/FloorsModule.java
  4. 0 2
      src/main/java/com/uas/platform/b2c/advertise/ad/model/RecommendProduct.java
  5. 2 1
      src/main/java/com/uas/platform/b2c/advertise/ad/service/CarouselService.java
  6. 7 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/FloorsService.java
  7. 9 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/RecommendProductService.java
  8. 24 4
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/CarouselsServiceImpl.java
  9. 63 4
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/FloorsServiceImpl.java
  10. 32 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/RecommendProductServiceImpl.java
  11. 2 0
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  12. 20 1
      src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java
  13. 5 1
      src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java
  14. 4 4
      src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java
  15. 16 0
      src/main/java/com/uas/platform/b2c/common/account/model/User.java
  16. 1 1
      src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java
  17. 111 0
      src/main/java/com/uas/platform/b2c/common/search/constant/SearchParam.java
  18. 48 0
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  19. 14 0
      src/main/java/com/uas/platform/b2c/common/search/dao/SearchHistoryDao.java
  20. 5 5
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  21. 4 4
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  22. 14 0
      src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java
  23. 257 211
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  24. 32 0
      src/main/java/com/uas/platform/b2c/common/search/util/CollectField.java
  25. 235 0
      src/main/java/com/uas/platform/b2c/common/search/util/PageParams.java
  26. 100 0
      src/main/java/com/uas/platform/b2c/common/search/util/SPage.java
  27. 96 0
      src/main/java/com/uas/platform/b2c/common/search/util/Sort.java
  28. 12 1
      src/main/java/com/uas/platform/b2c/core/constant/ReleaseStatus.java
  29. 71 65
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  30. 2 2
      src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
  31. 28 0
      src/main/java/com/uas/platform/b2c/core/utils/PatternUtil.java
  32. 19 0
      src/main/java/com/uas/platform/b2c/core/utils/RegexConstant.java
  33. 13 2
      src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/BankInfoServiceImpl.java
  34. 23 14
      src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/ProductDetailERPServiceImpl.java
  35. 2 1
      src/main/java/com/uas/platform/b2c/external/erp/commodity/util/ModelConverter.java
  36. 40 7
      src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/B2cOrderServiceImpl.java
  37. 6 0
      src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/OrderServiceImpl.java
  38. 2 0
      src/main/java/com/uas/platform/b2c/external/erp/order/util/ModelConverter.java
  39. 25 0
      src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java
  40. 10 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/DoubleConstant.java
  41. 37 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  42. 15 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/IntegerConstant.java
  43. 5 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ShortConstant.java
  44. 18 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java
  45. 112 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  46. 100 1
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java
  47. 71 6
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  48. 12 10
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  49. 148 10
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  50. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsHistoryDao.java
  51. 24 3
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java
  52. 4 5
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductImportHistDao.java
  53. 15 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductMatchResultDao.java
  54. 13 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ReleaseProductByBatchDao.java
  55. 52 16
      src/main/java/com/uas/platform/b2c/prod/commodity/facade/impl/ProductFacadeImpl.java
  56. 127 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  57. 68 3
      src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsHistory.java
  58. 89 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Product.java
  59. 260 9
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  60. 8 8
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsHistoryService.java
  61. 96 2
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  62. 44 1
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  63. 8 20
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsHistoryServiceImpl.java
  64. 466 352
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  65. 8 8
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductImportHistServiceImpl.java
  66. 527 55
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  67. 490 355
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  68. 84 0
      src/main/java/com/uas/platform/b2c/prod/commodity/task/CommodityTask.java
  69. 24 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/api/BrandController.java
  70. 24 7
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
  71. 14 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandService.java
  72. 34 1
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandServiceImpl.java
  73. 43 0
      src/main/java/com/uas/platform/b2c/prod/product/component/api/ComponentController.java
  74. 10 44
      src/main/java/com/uas/platform/b2c/prod/product/component/controller/ComponentSubmitController.java
  75. 6 0
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentCrawlDao.java
  76. 18 0
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentDao.java
  77. 19 0
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentInfoDao.java
  78. 8 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java
  79. 14 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentInfo.java
  80. 27 0
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentService.java
  81. 9 8
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentSubmitService.java
  82. 5 5
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentGoodsServiceImpl.java
  83. 27 5
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentServiceImpl.java
  84. 329 301
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentSubmitServiceImpl.java
  85. 35 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/KindInfo.java
  86. 16 6
      src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java
  87. 13 5
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDao.java
  88. 1 1
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDetailDao.java
  89. 8 0
      src/main/java/com/uas/platform/b2c/trade/order/service/OrderDetailService.java
  90. 12 3
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderDetailServiceImpl.java
  91. 59 20
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java
  92. 8 10
      src/main/java/com/uas/platform/b2c/trade/presale/facade/impl/CartFacadeImpl.java
  93. 10 10
      src/main/java/com/uas/platform/b2c/trade/presale/model/Collection.java
  94. 7 7
      src/main/java/com/uas/platform/b2c/trade/presale/model/CollectionInfo.java
  95. 69 58
      src/main/java/com/uas/platform/b2c/trade/rate/service/impl/RateServiceImpl.java
  96. 1 2
      src/main/resources/dev/jdbc.properties
  97. 4 4
      src/main/resources/dev/sys.properties
  98. BIN
      src/main/resources/jxls-tpl/trade/products.xls
  99. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  100. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-rmb.xls

+ 29 - 1
pom.xml

@@ -316,7 +316,18 @@
 		<dependency>
 			<groupId>org.apache.poi</groupId>
 			<artifactId>poi</artifactId>
-			<version>3.9</version>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.poi</groupId>
+					<artifactId>poi</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<!-- BeeCloud支付集成SDK -->
 		<dependency>
@@ -436,6 +447,23 @@
 			<groupId>javax.servlet</groupId>
 			<artifactId>servlet-api</artifactId>
 		</dependency>
+		<!--Hutool POI工具类(对MS Office操作)-->
+		<!--<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+		</dependency>-->
+		<dependency>
+			<groupId>com.xiaoleilu</groupId>
+			<artifactId>hutool-poi</artifactId>
+			<version>3.2.2</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.poi</groupId>
+					<artifactId>poi-ooxml</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
 		<dependency>
 			<groupId>org.apache.httpcomponents</groupId>
 			<artifactId>httpclient</artifactId>

+ 2 - 1
src/main/java/com/uas/platform/b2c/advertise/ad/api/CarouselsController.java

@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 
 /**
@@ -30,7 +31,7 @@ public class CarouselsController {
      * @return the carousels
      */
     @RequestMapping(value = "/{module}", method = RequestMethod.GET)
-    public List<JSONObject> getCarousels(@PathVariable("module") String module) {
+    public List<LinkedHashMap> getCarousels(@PathVariable("module") String module) {
         return carouselService.getCarousels(module);
     }
 }

+ 13 - 0
src/main/java/com/uas/platform/b2c/advertise/ad/constant/FloorsModule.java

@@ -0,0 +1,13 @@
+package com.uas.platform.b2c.advertise.ad.constant;
+
+/**
+ * 楼层模块常量类型
+ *
+ * @author yuj 2017-11-02 10:52
+ */
+public class FloorsModule {
+
+    public final static String MODULE = "home-v3";
+
+    public final static String FLOORNAME = "器件楼层";
+}

+ 0 - 2
src/main/java/com/uas/platform/b2c/advertise/ad/model/RecommendProduct.java

@@ -1,7 +1,5 @@
 package com.uas.platform.b2c.advertise.ad.model;
 
-import com.uas.platform.b2c.core.constant.Status;
-
 import java.util.Date;
 
 /**

+ 2 - 1
src/main/java/com/uas/platform/b2c/advertise/ad/service/CarouselService.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.advertise.ad.service;
 
 import net.sf.json.JSONObject;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 
 /**
@@ -18,5 +19,5 @@ public interface CarouselService {
      * @param usedFor the used for
      * @return carousels carousels
      */
-    List<JSONObject> getCarousels(String usedFor);
+    List<LinkedHashMap> getCarousels(String usedFor);
 }

+ 7 - 0
src/main/java/com/uas/platform/b2c/advertise/ad/service/FloorsService.java

@@ -35,4 +35,11 @@ public interface FloorsService {
 	 * @return the floors by module
 	 */
 	JSONObject isInHome(String batchCode);
+
+	/**
+	 * 更新首页的信息
+	 * @param batchCode
+	 * @return
+	 */
+	Boolean updateHomeInfo(String batchCode);
 }

+ 9 - 0
src/main/java/com/uas/platform/b2c/advertise/ad/service/RecommendProductService.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.advertise.ad.service;
 
 import com.uas.platform.b2c.advertise.ad.model.RecommendProduct;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
 
 import java.util.List;
 import java.util.Set;
@@ -37,4 +38,12 @@ public interface RecommendProductService {
 	 * @param productList	推荐产品列表
 	 */
 	List<RecommendProduct> saveProductsWhenSellerUpdate(String uuid, List<RecommendProduct> productList);
+
+	/**
+	 * 根据在售的产品,更新推荐产品
+	 *
+	 * @param goods
+	 * @return
+	 */
+	Boolean updateRecommendProductInfo(Goods goods);
 }

+ 24 - 4
src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/CarouselsServiceImpl.java

@@ -3,12 +3,13 @@ package com.uas.platform.b2c.advertise.ad.service.impl;
 import com.uas.platform.b2c.advertise.ad.service.CarouselService;
 import com.uas.platform.b2c.core.config.MicroServicesConf;
 import com.uas.platform.b2c.core.utils.JsonUtil;
+import net.sf.json.JSONException;
 import net.sf.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
-import java.util.List;
+import java.util.*;
 
 /**
  * The type Carousels service implementation.
@@ -30,10 +31,29 @@ public class CarouselsServiceImpl implements CarouselService{
 	}
 
 	@Override
-	public List<JSONObject> getCarousels(String usedFor) {
+	public List<LinkedHashMap> getCarousels(String usedFor) {
 		String url = conf.getRequestUrlForCarousel(20030, "/carousels?usedFor=" + usedFor);
 		String result = restTemplate.getForEntity(url, String.class).getBody();
-		List<JSONObject> r = JsonUtil.parseJsonToObject(result);
-		return r;
+		List<LinkedHashMap> jsonValues = JsonUtil.parseJsonToObject(result);
+
+		Collections.sort( jsonValues, new Comparator<LinkedHashMap>() {
+			private static final String KEY_NAME = "orderNumber";
+
+			@Override
+			public int compare(LinkedHashMap a, LinkedHashMap b) {
+				String valA = new String();
+				String valB = new String();
+
+				try {
+					valA = String.valueOf(a.get(KEY_NAME));
+					valB = String.valueOf(b.get(KEY_NAME));
+				}
+				catch (JSONException e) {
+				}
+				return valA.compareTo(valB);
+			}
+		});
+
+		return jsonValues;
 	}
 }

+ 63 - 4
src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/FloorsServiceImpl.java

@@ -1,15 +1,22 @@
 package com.uas.platform.b2c.advertise.ad.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.advertise.ad.constant.FloorsModule;
 import com.uas.platform.b2c.advertise.ad.service.FloorsService;
 import com.uas.platform.b2c.core.config.MicroServicesConf;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.JacksonUtils;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * The type Floors service implementation.
@@ -24,6 +31,9 @@ public class FloorsServiceImpl implements FloorsService {
 
 	private final RestTemplate restTemplate;
 
+	@Autowired
+	private GoodsService goodsService;
+
 	@Autowired
 	public FloorsServiceImpl(MicroServicesConf conf, RestTemplate restTemplate) {
 		this.conf = conf;
@@ -55,18 +65,67 @@ public class FloorsServiceImpl implements FloorsService {
 		String url = conf.getRequestUrlForFloor(20040, "/floors?usedFor=home-v3");
 		String result = restTemplate.getForEntity(url, String.class).getBody();
 		List<JSONObject> floors = JacksonUtils.fromJsonArray(result,JSONObject.class);
-		List<JSONObject> items;
+		List<Map<String, String>> items;
 		for (JSONObject floor : floors){
 			if (floor.get("name").equals("器件楼层")){
 				String floorId = floor.get("id").toString();
-				items = JacksonUtils.fromJsonArray(floor.get("items").toString(),JSONObject.class);
-				for (JSONObject item : items){
+				items = (List<Map<String, String>>)floor.get("items");
+				for (Map<String, String> item : items){
 					if (item.get("hrefUrl").toString().indexOf(batchCode) != -1){
-						return item.fluentPut("floorId",floorId);
+						JSONObject object = JSONObject.parseObject(FastjsonUtils.toJson(item));
+						return object.fluentPut("floorId",floorId);
 					}
 				}
 			}
 		}
 		return null;
 	}
+
+	/**
+	 * 当下架时,需要判断是否存在首页中,如果存在,做相应的操作。
+	 *
+	 * @param batchCode 下架的产品。
+	 * @return
+	 */
+	@Override
+	public Boolean updateHomeInfo(String batchCode) {
+		if(StringUtils.isEmpty(batchCode)) {
+			return Boolean.TRUE;
+		}
+		//判断是否存在首页
+		JSONObject home = isInHome(batchCode);
+		if(home != null) {
+			List<Map<String, String>> items = new ArrayList<>();
+			List<JSONObject> homeBatchList = getFloorsByModule(FloorsModule.MODULE);
+			for (JSONObject jsonObject : homeBatchList) {
+				if(FloorsModule.FLOORNAME.equals(jsonObject.get("name").toString())) {
+					List<Map<String, String>> items1 = (List<Map<String, String>>)jsonObject.get("items");
+					items.addAll(items1);
+				}
+			}
+			List<Goods> goodsList = goodsService.maxReserveLimitLength((items.size() + 1));
+			Boolean isExist = Boolean.FALSE;
+			for (Goods goods1 : goodsList) {
+				String code = goods1.getBatchCode();
+				for (Map<String, String> item : items) {
+					isExist = Boolean.FALSE;
+					String href = item.get("hrefUrl");
+					int bt = href.indexOf("BT");
+					if(code.equals(href.substring(bt))) {
+						isExist = Boolean.TRUE;
+						break;
+					}
+				}
+				if(!isExist) {
+					home.put("name", goods1.getCode());
+					home.put("body", goods1.getBrandNameEn() + "<br/>" + goods1.getKindNameCn());
+					home.put("pictureUrl", goods1.getImg());
+					home.put("hrefUrl", "http://www.usoftmall.com/store/batchInfo/" + goods1.getBatchCode());
+					break;
+				}
+			}
+			setFloorsItem(home);
+		}
+		return Boolean.TRUE;
+	}
 }

+ 32 - 0
src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/RecommendProductServiceImpl.java

@@ -126,4 +126,36 @@ public class RecommendProductServiceImpl implements RecommendProductService {
 		}
 		return recommendProducts;
 	}
+
+
+	/**
+	 * 根据在售的产品,更新推荐产品
+	 *
+	 * @param goods
+	 * @return
+	 */
+	@Override
+	public Boolean updateRecommendProductInfo(Goods goods) {
+		List<RecommendProduct> recommendProducts = findProductsWhenUserVisitStore(goods.getStoreid());
+		Boolean isUpdate = false;
+		for(int i = 0; i < recommendProducts.size(); i++) {
+			RecommendProduct recommendProduct = recommendProducts.get(i);
+			if(recommendProduct.getBatchCode().equals(goods.getBatchCode())) {
+				recommendProduct.setStatus(goods.getStatus());
+				recommendProduct.setComImg(goods.getImg());
+				recommendProduct.setMinPriceRMB(goods.getMinPriceRMB());
+				recommendProduct.setMinPriceUSD(goods.getMinPriceUSD());
+				recommendProduct.setMinBuyQty(goods.getMinBuyQty());
+				recommendProduct.setReserve(goods.getReserve());
+				recommendProduct.setUpdateTime(new Date());
+				isUpdate = true;
+			}
+		}
+		if(isUpdate) {
+			saveProductsWhenSellerUpdate(goods.getStoreid(), recommendProducts);
+		}
+
+
+		return Boolean.TRUE;
+	}
 }

+ 2 - 0
src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java

@@ -6,6 +6,8 @@ import com.uas.platform.b2c.common.account.model.UserInfo;
 import com.uas.platform.b2c.common.account.model.UserLoginTime;
 import com.uas.platform.b2c.common.account.model.UserQuestion;
 import com.uas.platform.b2c.common.account.service.UserQuestionService;
+import com.uas.platform.b2c.common.account.model.UserQuestion;
+import com.uas.platform.b2c.common.account.service.UserQuestionService;
 import com.uas.platform.b2c.common.account.service.UserService;
 import com.uas.platform.b2c.core.support.SystemSession;
 import java.util.List;

+ 20 - 1
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -2,6 +2,8 @@ package com.uas.platform.b2c.common.account.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.uas.account.entity.UserView;
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.dao.UserLoginTimeDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.SigninLog;
@@ -52,6 +54,12 @@ public class SecurityController {
 	@Autowired
 	private UserLoginTimeDao userLoginTimeDao;
 
+	@Autowired
+	private EnterpriseDao enterpriseDao;
+
+	@Autowired
+	private UserDao userDao;
+
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
 	/**
@@ -282,7 +290,18 @@ public class SecurityController {
 			if (authedUser != null && authedUser.getEnterprises() != null) {
 				// 企业资料在client系统自己的唯一标识,比如en_uu
 				if (tokenUser.getSpaceDialectUID() != null) {
-					authedUser.setCurrentEnterprise(Long.parseLong(tokenUser.getSpaceDialectUID()));
+					// 如果企业不存在则更新该企业
+					for (Enterprise enterprise : authedUser.getEnterprises()) {
+						if (enterprise.getUu().equals(Long.parseLong(tokenUser.getSpaceDialectUID()))){
+							authedUser.setEnterprise(enterprise);
+						}
+					}
+					if (null == authedUser.getEnterprise()) {
+						Enterprise newEnterprise = enterpriseDao.findByUu(Long.parseLong(tokenUser.getSpaceDialectUID()));
+						authedUser.getEnterprises().add(newEnterprise);
+						userDao.save(authedUser);
+						authedUser.setEnterprise(newEnterprise);
+					}
 				} else if (tokenUser.getSpaceUID() != null) {
 					for (Enterprise enterprise : authedUser.getEnterprises()) {
 						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号

+ 5 - 1
src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java

@@ -258,7 +258,7 @@ public class UserController {
 			throw new IllegalOperatorException("新邮箱地址与旧邮箱地址相同");
 		}
 		// 正则校验邮箱地址
-		if(!newUserEmail.matches("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+")){
+		if(!newUserEmail.matches("^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")){
 			throw new IllegalOperatorException("新邮箱地址格式不正确");
 		}
 		String _checkCode = (String) session.getAttribute("checkCode");
@@ -770,7 +770,11 @@ public class UserController {
 	public ResponseEntity<String> updateIdEnable(final User user) {
 		User oldUser = userService.findUserByUserUU(user.getUserUU());
 		oldUser.setIdEnable(user.getIdEnable());
+		oldUser.setIdRemarks(user.getIdRemarks());
 		User newUser = userService.saveRealAuth(oldUser);
+		if (!StringUtils.isEmpty(user.getIdRemarks())) {
+			smsService.send("bda635e5-156d-4e86-894b-a83071a678e8", newUser.getUserTel(), new Object[] {newUser.getIdRemarks()});
+		}
 		assert logger != null;
 		logger.log("用户信息", SystemSession.getUser().getUserUU()+"后台审核实名认证,UU:" +  newUser.getUserUU());
 		return new ResponseEntity<String>(HttpStatus.OK);

+ 4 - 4
src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java

@@ -197,7 +197,7 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		if(user != null && user.getUserTel()!=null){
 			return user.getUserTel().substring(0,user.getUserTel().length()-(user.getUserTel().substring(3)).length())+"****"+user.getUserTel().substring(7);
 		}
-		return null;
+		return user.getUserTel();
 	}
 
 	public String getUserEmail() {
@@ -209,14 +209,14 @@ public class UsageLog extends BufferedLogable implements Serializable {
 			else
 				return org.apache.commons.lang.StringUtils.rightPad(org.apache.commons.lang.StringUtils.left(email, 1), index, "*").concat(org.apache.commons.lang.StringUtils.mid(email, index, org.apache.commons.lang.StringUtils.length(email)));
 		}
-		return null;
+		return user.getUserEmail();
 	}
 
 	public String getUserName() {
-		if(user.getUserName()!=null){
+		if(user.getUserName() != null && user.getUserName() != null){
 			return user.getUserName().substring(0,1)+"**";
 		}
-		return null;
+		return user.getUserName();
 	}
 
 	public UsageLog() {

+ 16 - 0
src/main/java/com/uas/platform/b2c/common/account/model/User.java

@@ -194,9 +194,18 @@ public class User implements Serializable {
 	@Column(name = "user_pwdseclevel")
 	private Short pwdSecLevel;
 
+	/**
+	 * 最后一次登录时间
+	 */
 	@Column(name = "user_lastlogintime")
 	private Long lastLoginTime;
 
+	/**
+	 * 身份审核不通过备注
+	 */
+	@Column(name = "user_idRemarks")
+	private String idRemarks;
+
 	public Long getLastLoginTime() {
 		return lastLoginTime;
 	}
@@ -474,4 +483,11 @@ public class User implements Serializable {
 		}
 	}
 
+	public String getIdRemarks() {
+		return idRemarks;
+	}
+
+	public void setIdRemarks(String idRemarks) {
+		this.idRemarks = idRemarks;
+	}
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java

@@ -170,7 +170,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		try {
 			result = AccountUtils.applyAppForMall(detail);
 		}catch (Exception e){
-			return new ResultMap(CodeType.SYSTEM_ERROR, "注册失败");
+			return new ResultMap(CodeType.SYSTEM_ERROR, "账户中心异常,注册失败");
 		}
 		if (result.contains("errMsg") || !result.contains("enuu")){
 			return new ResultMap(CodeType.SYSTEM_ERROR, "注册失败");

+ 111 - 0
src/main/java/com/uas/platform/b2c/common/search/constant/SearchParam.java

@@ -0,0 +1,111 @@
+package com.uas.platform.b2c.common.search.constant;
+
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import com.uas.search.model.Sort;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SearchParam implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private int page;
+    private int size;
+    private Map<FilterField, Object> filters;
+    private List<Sort> sort;
+
+    public SearchParam() {
+    }
+
+    public SearchParam(int page, int size) {
+        this.page = page;
+        this.size = size;
+    }
+
+    public int getPage() {
+        return this.page;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    public int getSize() {
+        return this.size;
+    }
+
+    public void setSize(int size) {
+        this.size = size;
+    }
+
+    public Map<SearchParam.FilterField, Object> getFilters() {
+        return this.filters;
+    }
+
+    public void setFilters(Map<SearchParam.FilterField, Object> filters) {
+        this.filters = filters;
+    }
+
+    public void filter(SearchParam.FilterField key, Object value) {
+        if(this.filters == null) {
+            this.filters = new HashMap();
+        }
+
+        this.filters.put(key, value);
+    }
+
+    public void removeFilter(SearchParam.FilterField key) {
+        if(this.filters != null) {
+            this.filters.remove(key);
+        }
+
+    }
+
+    public List<Sort> getSort() {
+        return this.sort;
+    }
+
+    public void setSort(List<Sort> sort) {
+        this.sort = sort;
+    }
+
+    public String toString() {
+        return "PageParams [page=" + this.page + ", size=" + this.size + ", filters=" + this.filters + ", sort=" + this.sort + "]";
+    }
+
+    public static enum FilterField {
+        COMPONENT_KINDID,
+        COMPONENT_BRANDID,
+        COMPONENT_PROPERTIES,
+        COMPONENT_HAS_RESERVE,
+        COMPONENT_HAS_SAMPLE,
+        COMPONENT_HAS_ORIGINAL,
+        COMPONENT_HAS_INACTION_STOCK,
+        GOODS_KINDID,
+        GOODS_BRANDID,
+        GOODS_STORE_TYPE,
+        GOODS_CRNAME,
+        GOODS_MINPRICERMB,
+        GOODS_MAXPRICERMB,
+        GOODS_MINPRICEUSD,
+        GOODS_MAXPRICEUSD,
+        GOODS_STATUS,
+        ORDER_STATUS,
+        ORDER_BUYER_UU,
+        ORDER_BUYER_EN_UU,
+        ORDER_SELLER_EN_UU,
+        ORDER_MIN_TIME,
+        ORDER_MAX_TIME;
+
+        private FilterField() {
+        }
+    }
+}

+ 48 - 0
src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java

@@ -7,6 +7,7 @@ import com.uas.platform.b2c.common.search.service.SearcherService;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.StockInOutHistService;
+import com.uas.platform.b2c.prod.product.component.modal.ComponentInfo;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
 import com.uas.platform.b2c.trade.presale.service.StoreFocusService;
@@ -17,6 +18,8 @@ import org.apache.commons.collections.map.HashedMap;
 import org.apache.commons.lang3.StringUtils;
 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.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -24,6 +27,10 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -211,6 +218,20 @@ public class SearcherController {
 		map = searcherService.searchComponent(w, page);
 		return map;
 	}
+	/**
+	 * 分页按首字母搜索器件
+	 *
+	 * @param w 关键词
+	 * @param page 分页参数
+	 * @return
+	 * @throws InterruptedException
+	 * @throws IOException
+	 */
+	@RequestMapping(value = "/component/first", method = RequestMethod.GET)
+	@ResponseBody
+	public Page<ComponentInfo> searchComponentByFirst(String w, PageParams page) {
+		return searcherService.searchComponentByFirst(w, page);
+	}
 
 	/**
 	 * 器件搜索结果的类目统计
@@ -358,4 +379,31 @@ public class SearcherController {
 			return searchHistoryDao.findByUserUUAndUserEnuuOrderBySearchTimeDesc(SystemSession.getUser().getUserUU(),SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
 		}
 	}
+
+	@RequestMapping(value = "/searchHistory", method = RequestMethod.DELETE)
+	@ResponseBody
+	public int deleteSearchHistory(HttpServletRequest request){
+		SystemSession.setUser((User)request.getSession().getAttribute("user"));
+		return searcherService.deleteSearchHistoryByuserUUAndenUU();
+	}
+
+	/**
+	 * 分页获取搜索记录
+	 * @return
+	 */
+	@RequestMapping(value = "/searchHistory/page",method = RequestMethod.GET)
+	@ResponseBody
+	public Page<SearchHistory> getByUserUuByPage(PageParams params) {
+		final PageInfo info = new PageInfo(params);
+		if(info.getSort() == null){
+			info.sorting("searchTime", Sort.Direction.DESC);
+		}
+		Page<SearchHistory> pageLogs = searchHistoryDao.findAll(new Specification<SearchHistory>() {
+			public Predicate toPredicate(Root<SearchHistory> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				query.where(info.getPredicates(root, query, builder));
+				return null;
+			}
+		}, info);
+		return pageLogs;
+	}
 }

+ 14 - 0
src/main/java/com/uas/platform/b2c/common/search/dao/SearchHistoryDao.java

@@ -3,7 +3,11 @@ package com.uas.platform.b2c.common.search.dao;
 import com.uas.platform.b2c.common.search.model.SearchHistory;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -16,4 +20,14 @@ public interface SearchHistoryDao extends JpaSpecificationExecutor<SearchHistory
     List<SearchHistory> findByUserUUAndUserEnuuOrderBySearchTimeDesc(Long userUU,Long userEnuu);
 
     List<SearchHistory> findByKeywordAndUserUUAndUserEnuu(String keyword,Long userUU,Long userEnuu);
+
+    /**
+     * 根据用户企业删除搜索记录
+     * @param userUU
+     * @param userEnuu
+     */
+    @Transactional
+    @Modifying
+    @Query(value = "delete from SearchHistory s where s.userUU =:userUU and s.userEnuu = :enUU")
+    int deleteByUserUUAndUserEnuu(@Param("userUU") Long userUU, @Param("enUU") Long userEnuu);
 }

+ 5 - 5
src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java

@@ -8,9 +8,9 @@ import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.search.exception.SearchException;
-import com.uas.search.model.CollectField;
-import com.uas.search.model.PageParams;
-import com.uas.search.model.SPage;
+import com.uas.platform.b2c.common.search.util.CollectField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.SPage;
 import org.apache.commons.collections.map.HashedMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -92,14 +92,14 @@ public class SearchServiceImpl implements SearchService{
     }
 
     @Override
-    public SPage<Map<String, List<Integer>>> getBrands(String keyword, Integer page, Integer size) throws SearchException {
+    public SPage<Map<String, Object>> getBrands(String keyword, Integer page, Integer size) throws SearchException {
         Map<String, Object> map = initSearchMap(keyword, page, size);
         String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.BRAND_INFO_URL, String.class, map);
         if(StringUtils.isEmpty(str)) {
             return null;
         }else {
             try {
-                SPage<Map<String, List<Integer>>> sPage = FastjsonUtils.fromJson(str, SPage.class);
+                SPage<Map<String, Object>> sPage = FastjsonUtils.fromJson(str, SPage.class);
                 return sPage;
             }catch (Exception e) {
                 e.printStackTrace();

+ 4 - 4
src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java

@@ -6,9 +6,9 @@ package com.uas.platform.b2c.common.search.rpc.service;
  * 通过http方式调用远端的搜索接口
  */
 import com.uas.search.exception.SearchException;
-import com.uas.search.model.CollectField;
-import com.uas.search.model.PageParams;
-import com.uas.search.model.SPage;
+import com.uas.platform.b2c.common.search.util.CollectField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.SPage;
 
 import java.util.List;
 import java.util.Map;
@@ -21,7 +21,7 @@ public interface SearchService {
 
     SPage<Long> getBrandIds(String keyword, Integer page, Integer size) throws SearchException;
 
-    SPage<Map<String, List<Integer>>> getBrands(String keyword, Integer page, Integer size) throws SearchException;
+    SPage<Map<String, Object>> getBrands(String keyword, Integer page, Integer size) throws SearchException;
 
     Map<String, Object> getComponentIds(String keyword, PageParams var2) throws SearchException;
 

+ 14 - 0
src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java

@@ -1,7 +1,9 @@
 package com.uas.platform.b2c.common.search.service;
 
+import com.uas.platform.b2c.prod.product.component.modal.ComponentInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.search.exception.SearchException;
+import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
 
 import javax.servlet.http.HttpServletRequest;
@@ -49,6 +51,17 @@ public interface SearcherService {
 	 * @throws IOException
 	 */
 	public ModelMap searchComponent(String keyword, PageParams page);
+
+	/**
+	 * 首字母搜索器件
+	 *
+	 * @param keyword 关键词
+	 * @param page 分页参数
+	 * @return total, 搜索结果总数; page, 页码; size, 每页个数; components, 搜索结果集
+	 * @throws InterruptedException
+	 * @throws IOException
+	 */
+	public Page<ComponentInfo> searchComponentByFirst(String keyword, PageParams page);
 	/**
 	 * 智能搜索批次
 	 *
@@ -139,4 +152,5 @@ public interface SearcherService {
 	 */
 	public List<Map<String, Object>> getSimilarBrands(String brandName);
 
+	public int deleteSearchHistoryByuserUUAndenUU();
 }

+ 257 - 211
src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java

@@ -1,6 +1,8 @@
 package com.uas.platform.b2c.common.search.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.common.search.constant.SearchParam;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.search.dao.SearchHistoryDao;
 import com.uas.platform.b2c.common.search.model.SearchHistory;
@@ -11,21 +13,25 @@ import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
+import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentGoodsDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentInfoDao;
+import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentGoods;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentInfo;
 import com.uas.platform.core.exception.SystemException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.search.exception.SearchException;
-import com.uas.search.model.CollectField;
-import com.uas.search.model.PageParams.FilterField;
-import com.uas.search.model.SPage;
-import com.uas.search.model.Sort;
+import com.uas.platform.b2c.common.search.util.CollectField;
+import com.uas.platform.b2c.common.search.util.PageParams.FilterField;
+import com.uas.platform.b2c.common.search.util.SPage;
+import com.uas.platform.b2c.common.search.util.Sort;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.mobile.device.DeviceResolver;
 import org.springframework.mobile.device.LiteDeviceResolver;
 import org.springframework.stereotype.Service;
@@ -62,58 +68,81 @@ public class SearcherServiceImpl implements SearcherService {
 	@Autowired
 	private GoodsDao goodsDao;
 
+    @Autowired
+    private ComponentDao componentDao;
+
 	@Autowired
 	private SearchHistoryDao searchHistoryDao;
 
 	private Logger logger = LoggerFactory.getLogger(getClass());
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
-	/**
-	 * 智能搜索类目
-	 *
-	 * @param keyword
-	 * @param field
-	 * @return
-	 * @throws IOException
-	 * @throws InterruptedException
-	 */
-	@Override
-	public ModelMap searchKind(String keyword, String field) {
-		ModelMap map = new ModelMap();
-		SPage<Map<String, Object>> kinds = null;
-		try {
-			kinds = searchService.getKinds(keyword,1,1024*1024*1024);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		map.put("total", kinds.getTotalElement());// 结果总数
-		map.put("kinds", kinds.getContent());
-		return map;
-	}
+    private final int DEFAULT_PAGE = 1;
+
+    private final int DEFAULT_SIZE = 1024 * 1024 * 1024;
+
+    /**
+     * 智能搜索类目
+     *
+     * @param keyword
+     * @param field
+     * @return
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    @Override
+    public ModelMap searchKind(String keyword, String field) {
+        ModelMap map = new ModelMap();
+        SPage<Map<String, Object>> kinds = null;
+        try {
+            kinds = searchService.getKinds(keyword, DEFAULT_PAGE, DEFAULT_SIZE);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        map.put("total", kinds.getTotalElement());// 结果总数
+        map.put("kinds", kinds.getContent());
+        return map;
+    }
+
+    /**
+     * 智能搜索品牌
+     *
+     * @param keyword
+     * @param field
+     * @return
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    @Override
+    public ModelMap searchBrand(String keyword, String field) {
+        ModelMap map = new ModelMap();
+        SPage<Map<String, Object>> brands = null;
+        try {
+            brands = searchService.getBrands(keyword, DEFAULT_PAGE, DEFAULT_SIZE);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        map.put("brands", brands.getContent());// 结果集
+        map.put("total", brands.getTotalElement());// 结果总数
+        return map;
+    }
 
 	/**
-	 * 智能搜索品牌
+	 * 首字母搜索器件
 	 *
 	 * @param keyword
-	 * @param field
 	 * @return
-	 * @throws IOException
 	 * @throws InterruptedException
+	 * @throws IOException
 	 */
+	@SuppressWarnings("unchecked")
 	@Override
-	public ModelMap searchBrand(String keyword, String field) {
-		ModelMap map = new ModelMap();
-		SPage<Map<String, List<Integer>>> brands = null;
-		try {
-			brands = searchService.getBrands(keyword,1,1024*1024*1024);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		map.put("brands", brands.getContent());// 结果集
-		map.put("total", brands.getTotalElement());// 结果总数
-		return map;
+	public Page<ComponentInfo> searchComponentByFirst(String keyword, PageParams page) {
+		Pageable pageable = new PageInfo(page);
+		return componentInfoDao.findByFirst(keyword,pageable);
 	}
 
+
 	/**
 	 * 智能搜索器件
 	 *
@@ -191,6 +220,7 @@ public class SearcherServiceImpl implements SearcherService {
 			for (Map<String, Object> brand : brands){
 				if (keyword.equalsIgnoreCase(brand.get("nameCn").toString()) || keyword.equalsIgnoreCase(brand.get("nameEn").toString())){
 					map.put("brands",brand);
+					brandDao.addSearchCount(brand.get("uuid").toString());
 				}
 			}
 		}
@@ -225,191 +255,207 @@ public class SearcherServiceImpl implements SearcherService {
 				}
 			}
 			map.put("components", components);// 当前页器件内容
+            // 假如第一个结果与器件型号一致,则该型号增加一次 搜索量
+            if (components.get(0).getCode().equals(keyword)) {
+                componentDao.addSearchCount(components.get(0).getUuid());
+            }
 		}
 
-		map.put("total", results.get("total"));// 搜索结果总数
-		map.put("page", results.get("page"));// 当前页面
-		map.put("size", results.get("size"));// 每页个数
+        map.put("total", results.get("total"));// 搜索结果总数
+        map.put("page", results.get("page"));// 当前页面
+        map.put("size", results.get("size"));// 每页个数
 
-		return map;
-	}
-	/**
-	 * 批次搜索数量统计
-	 *
-	 * @param keyword
-	 * @param page
-	 * @return
-	 * @throws InterruptedException
-	 * @throws IOException
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public ModelMap searchComponentGoodsNums(String keyword, PageParams page) {
-		ModelMap map = new ModelMap();
-		Map<String, Object> results = null;
-		//Map<String, Object> results = new HashMap<>();
-		try {
-			results = searchService.getGoodsIds(keyword, convertPageParams(page));
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		map.put("total", results.get("total"));// 搜索结果总数
-		return map;
-	}
+        return map;
+    }
 
+    /**
+     * 批次搜索数量统计
+     *
+     * @param keyword
+     * @param page
+     * @return
+     * @throws InterruptedException
+     * @throws IOException
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public ModelMap searchComponentGoodsNums(String keyword, PageParams page) {
+        ModelMap map = new ModelMap();
+        Map<String, Object> results = null;
+        //Map<String, Object> results = new HashMap<>();
+        try {
+            results = searchService.getGoodsIds(keyword, convertPageParams(page));
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        map.put("total", results.get("total"));// 搜索结果总数
+        return map;
+    }
 
 
-	/**
-	 * 获取器件搜索的类目统计
-	 *
-	 * @param keyword
-	 * @return
-	 */
-	@Override
-	public List<Map<String, Object>> getKindsBySearchComponent(String keyword, String brandId) {
-		List<Map<String, Object>> kinds = new ArrayList<>();
-		try {
-			kinds = searchService.getKindsBySearchComponent(keyword, brandId);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		return kinds;
-	}
+    /**
+     * 获取器件搜索的类目统计
+     *
+     * @param keyword
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getKindsBySearchComponent(String keyword, String brandId) {
+        List<Map<String, Object>> kinds = new ArrayList<>();
+        try {
+            kinds = searchService.getKindsBySearchComponent(keyword, brandId);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        return kinds;
+    }
 
-	/**
-	 * 获取器件搜索的品牌统计列表
-	 *
-	 * @param keyword
-	 * @return
-	 */
-	@Override
-	public List<Map<String, Object>> getBrandsBySearchComponent(String keyword, String kindId) {
-		List<Map<String, Object>> brands = new ArrayList<>();
-		try {
-			brands = searchService.getBrandsBySearchComponent(keyword, kindId);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		return brands;
-	}
-	/**
-	 * 批次搜索结构的类目,器件,店铺类型,货币类型统计
-	 *
-	 * @param keyword
-	 * @return
-	 */
-	@Override
-	public List<Map<String, Object>> getCollectlistBySearchComponentGoods(String keyword, String collectList, String paramJSON , HttpServletRequest request) {
-		List<Map<String, Object>> collectResult = new ArrayList<>();
-		JSONObject jsonObject = FastjsonUtils.parseObject(paramJSON);
-		Set<Entry<String,Object>> paramEntry = jsonObject.entrySet();
-		Map<com.uas.search.model.PageParams.FilterField,Object> param= new LinkedHashMap<>();
-		for (Entry<String, Object> entry : paramEntry) {
-			param.put(FilterField.valueOf(entry.getKey().toUpperCase()), entry.getValue());
-		}
-		try {
-			collectResult = searchService.collectBySearchGoods(keyword, CollectField.valueOf(collectList.toUpperCase()),param);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		if ("goods_brand".equals(collectList)) {
-			if (this.deviceResolver.resolveDevice(request).isMobile()) {
-				for (Map<String, Object> m : collectResult) {
-					m.put("logoUrl", brandDao.findOne(Long.parseLong(m.get("br_id").toString())).getLogoUrl());
-				}
-			}
-		}
-		return collectResult;
-	}
+    /**
+     * 获取器件搜索的品牌统计列表
+     *
+     * @param keyword
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getBrandsBySearchComponent(String keyword, String kindId) {
+        List<Map<String, Object>> brands = new ArrayList<>();
+        try {
+            brands = searchService.getBrandsBySearchComponent(keyword, kindId);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        return brands;
+    }
 
-	@Override
-	public Map<String,Object> getSimilarKeywords(String keyword) {
-		Map<String,Object> result = null;
-		try {
-			result = searchService.getSimilarKeywords(keyword);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		for (Entry<String, Object> entry : result.entrySet()) {
-			if(((List)entry.getValue()).size()>8){
-				entry.setValue(((List)entry.getValue()).subList(0,8));
-			}
-		}
-		return result;
-	}
+    /**
+     * 批次搜索结构的类目,器件,店铺类型,货币类型统计
+     *
+     * @param keyword
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getCollectlistBySearchComponentGoods(String keyword, String collectList, String paramJSON, HttpServletRequest request) {
+        List<Map<String, Object>> collectResult = new ArrayList<>();
+        JSONObject jsonObject = FastjsonUtils.parseObject(paramJSON);
+        Set<Entry<String, Object>> paramEntry = jsonObject.entrySet();
+        Map<com.uas.platform.b2c.common.search.util.PageParams.FilterField, Object> param = new LinkedHashMap<>();
+        for (Entry<String, Object> entry : paramEntry) {
+            param.put(FilterField.valueOf(entry.getKey().toUpperCase()), entry.getValue());
+        }
+        try {
+            collectResult = searchService.collectBySearchGoods(keyword, CollectField.valueOf(collectList.toUpperCase()), param);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        if ("goods_brand".equals(collectList)) {
+            if (this.deviceResolver.resolveDevice(request).isMobile()) {
+                for (Map<String, Object> m : collectResult) {
+                    m.put("logoUrl", brandDao.findOne(Long.parseLong(m.get("br_id").toString())).getLogoUrl());
+                }
+            }
+        }
+        return collectResult;
+    }
 
-	@Override
-	public List<Map<String, Object>> getSimilarComponents(String componentCode) {
-		List<Map<String, Object>> components = new ArrayList<>();
-		try {
-			components = searchService.getSimilarComponents(componentCode);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		return components;
-	}
+    @Override
+    public Map<String, Object> getSimilarKeywords(String keyword) {
+        Map<String, Object> result = null;
+        try {
+            result = searchService.getSimilarKeywords(keyword);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        for (Entry<String, Object> entry : result.entrySet()) {
+            if (((List) entry.getValue()).size() > 8) {
+                entry.setValue(((List) entry.getValue()).subList(0, 8));
+            }
+        }
+        return result;
+    }
 
-	/**
-	 * 把平台中PageParams对象转化为搜索API封装的PageParams对象
-	 *
-	 * @param params
-	 * @return
-	 */
-	private com.uas.search.model.PageParams convertPageParams(PageParams params) {
-		PageInfo pageinfo = new PageInfo(params);
-		com.uas.search.model.PageParams pageParams = new com.uas.search.model.PageParams();
-		pageParams.setPage(params.getPage());
-		pageParams.setSize(params.getCount());
-		if (!StringUtils.isEmpty(params.getFilter())) {
-			JSONObject jsonObject = FastjsonUtils.parseObject(params.getFilter());
-			Set<Entry<String, Object>> entrySet = jsonObject.entrySet();
-			for (Entry<String, Object> entry : entrySet) {
-				pageParams.filter(FilterField.valueOf(entry.getKey().toUpperCase()), entry.getValue());
-			}
-		}
-		if (!StringUtils.isEmpty(params.getSorting())){
-			//com.alibaba.fastjson.JSONObject sort = FastjsonUtils.parseObject(params.getSorting());
-			Iterator<org.springframework.data.domain.Sort.Order> iterator = pageinfo.getSort().iterator();
-			List<Sort> psort = new ArrayList<>();
-			while (iterator.hasNext()){
-				org.springframework.data.domain.Sort.Order order = iterator.next();
-				boolean reverse= false;
-				if ( "DESC".equals( order.getDirection().toString())){
-					reverse = true;
-				}
-				Sort b= new Sort( Sort.Field.valueOf(order.getProperty()),reverse);
-				psort.add(b);
-			}
-			pageParams.setSort(psort);
-		}
-		return pageParams;
-	}
+    @Override
+    public List<Map<String, Object>> getSimilarComponents(String componentCode) {
+        List<Map<String, Object>> components = new ArrayList<>();
+        try {
+            components = searchService.getSimilarComponents(componentCode);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        return components;
+    }
 
-	@Override
-	public List<Map<String, Object>> getSimilarKinds(String kindName) {
-		List<Map<String, Object>> kinds = new ArrayList<>();
-		try {
-			kinds = searchService.getSimilarKinds(kindName);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		return kinds;
-	}
+    /**
+     * 把平台中PageParams对象转化为搜索API封装的PageParams对象
+     *
+     * @param params
+     * @return
+     */
+    private com.uas.platform.b2c.common.search.util.PageParams convertPageParams(PageParams params) {
+        PageInfo pageinfo = null;
+        if (null == params.getSorting() || "".equals(params.getSorting()) || "{}".equals(params.getSorting()) || JSON.parseObject(params.getSorting()).size() == 0) {
+            pageinfo = new PageInfo();
+        } else {
+            pageinfo = new PageInfo(params);
+        }
+        com.uas.platform.b2c.common.search.util.PageParams pageParams = new com.uas.platform.b2c.common.search.util.PageParams();
+        pageParams.setPage(params.getPage());
+        pageParams.setSize(params.getCount());
+        if (!StringUtils.isEmpty(params.getFilter())) {
+            JSONObject jsonObject = FastjsonUtils.parseObject(params.getFilter());
+            Set<Entry<String, Object>> entrySet = jsonObject.entrySet();
+            for (Entry<String, Object> entry : entrySet) {
+                pageParams.filter(FilterField.valueOf(entry.getKey().toUpperCase()), entry.getValue());
+            }
+        }
+        if (!StringUtils.isEmpty(pageinfo.getSort())) {
+            //com.alibaba.fastjson.JSONObject sort = FastjsonUtils.parseObject(params.getSorting());
+            Iterator<org.springframework.data.domain.Sort.Order> iterator = pageinfo.getSort().iterator();
+            com.uas.platform.b2c.common.search.util.Sort sort = new com.uas.platform.b2c.common.search.util.Sort();
+            Sort newSort = null;
+            while (iterator.hasNext()) {
+                org.springframework.data.domain.Sort.Order order = iterator.next();
+                boolean reverse = false;
+                if ("DESC".equals(order.getDirection().toString())) {
+                    reverse = true;
+                }
+                newSort = new Sort(Sort.Field.valueOf(order.getProperty()), reverse);
+            }
+            pageParams.setSort(newSort);
+        }
+        return pageParams;
+    }
 
-	@Override
-	public List<Map<String, Object>> getSimilarLeafKinds(String kindName) {
-		return searchService.getSimilarLeafKinds(kindName);
-	}
+    @Override
+    public List<Map<String, Object>> getSimilarKinds(String kindName) {
+        List<Map<String, Object>> kinds = new ArrayList<>();
+        try {
+            kinds = searchService.getSimilarKinds(kindName);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        return kinds;
+    }
+
+    @Override
+    public List<Map<String, Object>> getSimilarLeafKinds(String kindName) {
+        return searchService.getSimilarLeafKinds(kindName);
+    }
+
+    @Override
+    public List<Map<String, Object>> getSimilarBrands(String brandName) {
+        List<Map<String, Object>> brands = new ArrayList<Map<String, Object>>();
+        try {
+            brands = searchService.getSimilarBrands(brandName);
+        } catch (SearchException e) {
+            throwSystemException(e);
+        }
+        return brands;
+    }
 
 	@Override
-	public List<Map<String, Object>> getSimilarBrands(String brandName) {
-		List<Map<String, Object>> brands = new ArrayList<Map<String, Object>>();
-		try {
-			brands = searchService.getSimilarBrands(brandName);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		return brands;
+	public int deleteSearchHistoryByuserUUAndenUU() {
+		return searchHistoryDao.deleteByUserUUAndUserEnuu(SystemSession.getUser().getUserUU(),
+				SystemSession.getUser().getEnterprise() == null ? null : SystemSession.getUser().getEnterprise().getUu() );
 	}
 
 	/**

+ 32 - 0
src/main/java/com/uas/platform/b2c/common/search/util/CollectField.java

@@ -0,0 +1,32 @@
+package com.uas.platform.b2c.common.search.util;
+
+
+/**
+ * 统计信息时需要的字段
+ *
+ * @author sunyj
+ * @since 2017年7月12日 上午9:03:29
+ */
+public enum CollectField {
+
+    // 批次统计
+    /**
+     * 类目
+     */
+    GOODS_KIND,
+
+    /**
+     * 品牌
+     */
+    GOODS_BRAND,
+
+    /**
+     * 货源
+     */
+    GOODS_STORE_TYPE,
+
+    /**
+     * 货币
+     */
+    GOODS_CRNAME;
+}

+ 235 - 0
src/main/java/com/uas/platform/b2c/common/search/util/PageParams.java

@@ -0,0 +1,235 @@
+package com.uas.platform.b2c.common.search.util;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 分页参数
+ *
+ * @author suntg
+ * @since 2016年8月3日下午9:10:47
+ */
+public class PageParams implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 页码
+     */
+    private int page;
+
+    /**
+     * 页大小
+     */
+    private int size;
+
+    /**
+     * 过滤
+     */
+    private Map<FilterField, Object> filters;
+
+    /**
+     * 排序
+     */
+    private Sort sort;
+
+    public PageParams() {
+    }
+
+    /**
+     * @param page
+     *            页码
+     * @param size
+     *            页大小
+     */
+    public PageParams(int page, int size) {
+        this.page = page;
+        this.size = size;
+    }
+
+    /**
+     * @return 页码
+     */
+    public int getPage() {
+        return page;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    /**
+     * @return 页大小
+     */
+    public int getSize() {
+        return size;
+    }
+
+    public void setSize(int size) {
+        this.size = size;
+    }
+
+    /**
+     * @return 过滤
+     */
+    public Map<FilterField, Object> getFilters() {
+        return filters;
+    }
+
+    public void setFilters(Map<FilterField, Object> filters) {
+        this.filters = filters;
+    }
+
+    public void filter(FilterField key, Object value) {
+        if (this.filters == null) {
+            this.filters = new HashMap<FilterField, Object>();
+        }
+        this.filters.put(key, value);
+    }
+
+    public void removeFilter(FilterField key) {
+        if (this.filters != null) {
+            this.filters.remove(key);
+        }
+    }
+
+    /**
+     * @return 排序
+     */
+    public Sort getSort() {
+        return sort;
+    }
+
+    public void setSort(Sort sort) {
+        this.sort = sort;
+    }
+
+    @Override
+    public String toString() {
+        return "PageParams [page=" + page + ", size=" + size + ", filters=" + filters + ", sort=" + sort + "]";
+    }
+
+    /**
+     * 过滤的字段
+     *
+     * @author sunyj
+     * @since 2017年7月8日 下午5:00:55
+     */
+    public enum FilterField {
+
+        // 器件搜索
+        /**
+         * 类目id
+         */
+        COMPONENT_KINDID,
+
+        /**
+         * 品牌id
+         */
+        COMPONENT_BRANDID,
+
+        /**
+         * 属性信息
+         */
+        COMPONENT_PROPERTIES,
+
+        /**
+         * 有库存
+         */
+        COMPONENT_HAS_RESERVE,
+
+        /**
+         * 有样品
+         */
+        COMPONENT_HAS_SAMPLE,
+
+        /**
+         * 有现货
+         */
+        COMPONENT_HAS_ORIGINAL,
+
+        /**
+         * 有呆滞库存
+         */
+        COMPONENT_HAS_INACTION_STOCK,
+
+        // 批次搜索
+        /**
+         * 类目id
+         */
+        GOODS_KINDID,
+
+        /**
+         * 品牌id
+         */
+        GOODS_BRANDID,
+
+        /**
+         * 货源
+         */
+        GOODS_STORE_TYPE,
+
+        /**
+         * 货币
+         */
+        GOODS_CRNAME,
+
+        /**
+         * 状态
+         */
+        GOODS_STATUS,
+
+        /**
+         * 价格区间过滤:人民币最低价格
+         */
+        GOODS_MINPRICERMB,
+
+        /**
+         * 价格区间过滤:人民币最高价格
+         */
+        GOODS_MAXPRICERMB,
+
+        /**
+         * 价格区间过滤:美元最低价格
+         */
+        GOODS_MINPRICEUSD,
+
+        /**
+         * 价格区间过滤:美元最高价格
+         */
+        GOODS_MAXPRICEUSD,
+
+        // 以下字段用于单据搜索
+
+        /**
+         * 订单状态
+         */
+        ORDER_STATUS,
+
+        /**
+         * 买方个人uu号
+         */
+        ORDER_BUYER_UU,
+
+        /**
+         * 买方企业UU号
+         */
+        ORDER_BUYER_EN_UU,
+
+        /**
+         * 卖方企业UU号
+         */
+        ORDER_SELLER_EN_UU,
+
+        /**
+         * 单据搜索时,若限定时间范围,可以键值对的形式传递参数,该键代表最小(远)时间
+         */
+        ORDER_MIN_TIME,
+
+        /**
+         * 单据搜索时,若限定时间范围,可以键值对的形式传递参数,该键代表最大(近)时间
+         */
+        ORDER_MAX_TIME;
+    }
+}

+ 100 - 0
src/main/java/com/uas/platform/b2c/common/search/util/SPage.java

@@ -0,0 +1,100 @@
+package com.uas.platform.b2c.common.search.util;
+
+import java.io.Serializable;
+import java.util.List;
+
+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;
+
+    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;
+    }
+
+    @Override
+    public String toString() {
+        return "SPage [totalPage=" + totalPage + ", totalElement=" + totalElement + ", page=" + page + ", size=" + size
+                + ", first=" + first + ", last=" + last + ", content=" + content + "]";
+    }
+
+}

+ 96 - 0
src/main/java/com/uas/platform/b2c/common/search/util/Sort.java

@@ -0,0 +1,96 @@
+package com.uas.platform.b2c.common.search.util;
+
+import java.io.Serializable;
+
+/**
+ * 排序
+ *
+ * @author sunyj
+ * @since 2016年11月23日 下午1:47:44
+ */
+public class Sort implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 排序的字段
+     */
+    private Field field;
+
+    /**
+     * 排序默认为升序,若为true,则进行反转
+     */
+    private boolean reverse = false;
+
+    /**
+     * @param field
+     *            排序的字段
+     * @param reverse
+     *            如果为true,则反转默认的升序
+     */
+    public Sort(Field field, boolean reverse) {
+        this.field = field;
+        this.reverse = reverse;
+    }
+
+    /**
+     * @param field
+     *            排序的字段
+     */
+    public Sort(Field field) {
+        this(field, false);
+    }
+
+    public Sort() {
+
+    }
+
+    /**
+     * @return 排序的字段
+     */
+    public Field getField() {
+        return field;
+    }
+
+    public void setField(Field field) {
+        this.field = field;
+    }
+
+    /**
+     * 排序是否应该被反转
+     *
+     * @return 如果为true,则反转默认的升序
+     */
+    public boolean isReverse() {
+        return reverse;
+    }
+
+    public void setReverse(boolean reverse) {
+        this.reverse = reverse;
+    }
+
+    @Override
+    public String toString() {
+        return "Sort [field=" + field + ", reverse=" + reverse + "]";
+    }
+
+    /**
+     * 排序的字段
+     *
+     * @author sunyj
+     * @since 2017年7月8日 下午5:12:07
+     */
+    public enum Field {
+
+        /**
+         * 库存
+         */
+        RESERVE,
+
+        /**
+         * 价格(人民币)
+         */
+        PRICE
+    }
+
+}

+ 12 - 1
src/main/java/com/uas/platform/b2c/core/constant/ReleaseStatus.java

@@ -63,7 +63,18 @@ public enum ReleaseStatus {
 	/**
 	 * {@code 113  匹配失败}
 	 */
-	failure(113, "匹配失败");
+	failure(113, "匹配失败"),
+
+	/**
+	 * {@code 114  必填写丢失或填写错误}
+	 */
+	lack_info(114, "必填写未填或填写错误"),
+
+	/**
+	 * {@code 115  产品库已存在}
+	 */
+	had_exists(115, "产品库已存在");
+
 	/**
 	 * @param value
 	 *            发布状态

+ 71 - 65
src/main/java/com/uas/platform/b2c/core/constant/Status.java

@@ -2,13 +2,8 @@ package com.uas.platform.b2c.core.constant;
 
 /**
  * 状态定义,描述
- * 
- * @author yingp
- * 
- */
-/**
- * @author Pro1
  *
+ * @author yingp
  */
 public enum Status {
 	/**
@@ -156,21 +151,22 @@ public enum Status {
 	 */
 	INSPECTING(410, "验货中"),
 
-	/**
-	 * {@code 411 已验货}
-	 */
-	INSPECTED(411, "已验货"),
-
-	/**
-	 * {@code 412  等待卖家同意}
-	 */
-	WAITSELLERCOMFIRM(412, "等待卖家同意"),
+    /**
+     * {@code 411 已验货}
+     */
+    INSPECTED(411, "已验货"),
 
-	/**
-	 * {@code 413  卖家接单}
-	 */
-	ORDERTAKE(413, "卖家接单"),
+    /**
+     * {@code 412  等待卖家同意}
+     */
+    WAITSELLERCOMFIRM(412, "等待卖家同意"),
 
+    /**
+     * {@code 413  卖家接单}
+     */
+    ORDERTAKE(413, "卖家接单"),
+    /**
+     * {@code 522 已评论}
 	/**
 	 * {@code 501 待确认}
 	 */
@@ -219,7 +215,7 @@ public enum Status {
 	 * {@code 509  退货中}
 	 */
 	RETURNINGGOODS(509, "退货中"),
-	
+
 	/**
 	 * {@code 521 退货}
 	 */
@@ -275,60 +271,70 @@ public enum Status {
 	/**
 	 * {@code 522 已评论}
      */
-	REVIEWED(522, "已评论"),
-	/**
-	 * {@code 601  有效的}
-	 */
-	AVAILABLE(601, "有效地"),
-	/**
-	 * {@code 602 无效的(因库存不足而失效)}
-	 */
-	UNAVAILABLE(602, "无效的(因库存不足而失效)"),
-	/**
-	 * {@code 603 无效的(因未按时付款)}
-	 */
-	UNAVAILABLE_NOPAID(603, "无效的(因未按时付款)"),
+    REVIEWED(522, "已评论"),
+    /**
+     * {@code 601  有效的}
+     */
+    AVAILABLE(601, "有效地"),
+    /**
+     * {@code 602 无效的(因库存不足而失效)}
+     */
+    UNAVAILABLE(602, "无效的(因库存不足而失效)"),
+    /**
+     * {@code 603 无效的(因未按时付款)}
+     */
+    UNAVAILABLE_NOPAID(603, "无效的(因未按时付款)"),
 
-	/**
-	 * {@code 604  无效的(因供应商拒绝)}
-	 */
-	UNAVAILABLE_DISAGREE(604, "无效的(因供应商拒绝)"),
+    /**
+     * {@code 604  无效的(因供应商拒绝)}
+     */
+    UNAVAILABLE_DISAGREE(604, "无效的(因供应商拒绝)"),
 
-	/**
-	 * {@code 605 无效的(因全部退货完成的)}
-	 */
-	UNAVAILABLE_RETURN(605, "无效的(因全部退货完成的)"),
-	/**
-	 * {@code 606 无效的(因用户本人取消而失效)}
-	 */
-	UNAVAILABLE_PERSONAL(606, "无效的(因用户本人取消而失效)"),
-	/**
-	 * {@code 607 申请议价中}
-	 */
-	CHARGE_APPLY(607, "申请议价中"),
-	/**
-	 * {@code 608 议价结束(同意)}
-	 */
-	CHARGE_ACCEPT(608, "议价结束(同意)"),
-	/**
-	 * {@code 609 议价结束(不同意)}
-	 */
-	CHARGE_REFUSE(609, "议价结束(不同意)"),
+    /**
+     * {@code 605 无效的(因全部退货完成的)}
+     */
+    UNAVAILABLE_RETURN(605, "无效的(因全部退货完成的)"),
+    /**
+     * {@code 606 无效的(因用户本人取消而失效)}
+     */
+    UNAVAILABLE_PERSONAL(606, "无效的(因用户本人取消而失效)"),
+    /**
+     * {@code 607 申请议价中}
+     */
+    CHARGE_APPLY(607, "申请议价中"),
+    /**
+     * {@code 608 议价结束(同意)}
+     */
+    CHARGE_ACCEPT(608, "议价结束(同意)"),
+    /**
+     * {@code 609 议价结束(不同意)}
+     */
+    CHARGE_REFUSE(609, "议价结束(不同意)"),
 
-	/**
-	 * {@code 610   确认状态取消(确认状态下供应商拒绝取消)}
-	 */
-	COMFIRM_DISAGREE(610, " 确认状态取消(供应商拒绝取消)"),
+    /**
+     * {@code 610   确认状态取消(确认状态下供应商拒绝取消)}
+     */
+    COMFIRM_DISAGREE(610, " 确认状态取消(供应商拒绝取消)"),
+
+    /**
+     * {@code 611   已付款状态取消(已付款状态下供应商拒绝取消)}
+     */
+    PAIDED_DISAGREE(611, "已付款状态取消(供应商拒绝取消)"),
+
+    /**
+     * {@code 612 已下架}
+     */
+    REMOVED(612, "已下架"),
 
 	/**
-	 * {@code 611   已付款状态取消(已付款状态下供应商拒绝取消)}
+	 * {@code 613 未上架}
 	 */
-	PAIDED_DISAGREE(611, "已付款状态取消(供应商拒绝取消)"),
+	NO_SHELVE(613, "未上架"),
 
 	/**
-	 * {@code 612 已下架}
+	 * {@code, 614 库存删除}
 	 */
-	REMOVED(612, "已下架"),
+	GOODS_DELETE(614, "库存删除"),
 
 	/*
 	 * {@code 699 待开发票}

+ 2 - 2
src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java

@@ -171,7 +171,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
      */
     private void accessDecision(HttpServletRequest request, User user) {
         Collection<ConfigAttribute> configAttributes = getAttributes(request);
-        if (null == configAttributes || configAttributes.size() == 0 || user.isSys()) {
+        if (null == configAttributes || configAttributes.size() == 0) {
             return;
         }
         Iterator<ConfigAttribute> iterator = configAttributes.iterator();
@@ -195,7 +195,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
         if (needPermission != null) {
             if ("prod".equals(profile)) {
                 if (!user.getEnterprise().getUu().toString().equals(enUU)) {
-                    if ("进入优软商城后台进行运营维护".equals(needPermission)) {
+                    if ("优软商城后台-运维".equals(needPermission)) {
                         throw new AccessDeniedException("无法访问,没有 " + needPermission + " 权限!");
                     }
                 }

+ 28 - 0
src/main/java/com/uas/platform/b2c/core/utils/PatternUtil.java

@@ -0,0 +1,28 @@
+package com.uas.platform.b2c.core.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 正则表达式工具类
+ * @version 2017/11/28 23:48 wangyc
+ */
+public class PatternUtil {
+
+
+    /**
+     * 匹配中文和英文
+     */
+    public static final String chinEngPattern = "^[\\u4e00-\\u9fa5a-zA-Z]+$";
+
+    /**
+     * 匹配中英文的匹配器
+     * @param match
+     * @return
+     */
+    public static Boolean matchChineseAndEnglish(String match) {
+        Pattern pattern = Pattern.compile(chinEngPattern);
+        Matcher matcher = pattern.matcher(match);
+        return matcher.find();
+    }
+}

+ 19 - 0
src/main/java/com/uas/platform/b2c/core/utils/RegexConstant.java

@@ -1,5 +1,8 @@
 package com.uas.platform.b2c.core.utils;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * 正则表达式的常量
  *
@@ -26,4 +29,20 @@ public class RegexConstant {
      * 判断是否只包含数字,英文,特殊字符
      */
     public static final String EnglishAnDigitAndSpecialCharacter = "^[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】_\\-‘;:”“’。,、?A-Za-z0-9]+$";
+
+    /**
+     * 判断是否只包含数字,英文,英文特殊字符
+     */
+    public static final String LetterAndDigitAndEnglishSpecialCharacter = "^[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~@#¥%……&*——+|_\\-A-Za-z0-9]+$";
+
+    /**
+     * 验证字符串是否为数字
+     * @param str
+     * @return
+     */
+    public static Boolean isNumber(String str) {
+        Pattern numberPattern = Pattern.compile(NumberData);
+        Matcher matcher = numberPattern.matcher(str);
+        return matcher.find();
+    }
 }

+ 13 - 2
src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/BankInfoServiceImpl.java

@@ -7,8 +7,11 @@ import com.uas.platform.b2c.fa.payment.dao.BankInfoDao;
 import com.uas.platform.b2c.fa.payment.model.BankInfo;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.model.Type;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.List;
+
 /**
  * Created by wangyc on 2017/11/10.
  *
@@ -24,14 +27,22 @@ public class BankInfoServiceImpl implements BankInfoService {
 
     @Override
     public BankInfoERP findOne() {
-        BankInfo bankInfo = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value()).get(0);
+        List<BankInfo> bankInfoList = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value());
+        if (CollectionUtils.isEmpty(bankInfoList)) {
+            return null;
+        }
+        BankInfo bankInfo = bankInfoList.get(0);
         BankInfoERP bankInfoERP = ModelConverter.convert(bankInfo);
         return bankInfoERP;
     }
 
     @Override
     public void callback(String erpNum) {
-        BankInfo bankInfo = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value()).get(0);
+        List<BankInfo> bankInfoList = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value());
+        if (CollectionUtils.isEmpty(bankInfoList)) {
+            return;
+        }
+        BankInfo bankInfo = bankInfoList.get(0);
         bankInfo.setErpNum(erpNum);
         bankInfoDao.save(bankInfo);
     }

+ 23 - 14
src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/ProductDetailERPServiceImpl.java

@@ -57,12 +57,16 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
     @Override
     public boolean uploadProductDetailERP(List<ProductDetailERP> productDetailERPList) {
         List<ProductDetail> productDetails = new ArrayList<ProductDetail>();
+        List<Product> productList = new ArrayList<Product>();
         Long enuu = SystemSession.getUser().getEnterprise().getUu();
         for (ProductDetailERP productDetailERP : productDetailERPList) {
             ProductDetail productDetail = ModelConverter.convert(productDetailERP);
 
             List<Product> products = productDao.getProductByEnUUAndProdNum(enuu, productDetail.getCode());
             if (!CollectionUtils.isEmpty(products)) {
+                products.get(0).setErpReserve(productDetailERP.getReserve());
+                productList.add(products.get(0));
+
                 productDetail.setProductId(products.get(0).getId());
             }
             // 如果已存在物料交易信息删除之前那一条,保存新的物料交易信息
@@ -72,6 +76,8 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
             }
             productDetails.add(productDetail);
         }
+
+        productDao.save(productList);
         productDetailDao.save(productDetails);
         logger.log("物料交易详情", "初始化交易详情,企业:" + SystemSession.getUser().getEnterprise().getEnName() + ",数量:" + productDetails.size());
         return true;
@@ -85,16 +91,16 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
 
     @Override
     public void updateReserve(List<ProductDetailERP> productDetailERPList) {
-        List<ProductDetail> productDetails = new ArrayList<ProductDetail>();
+        List<Product> productList = new ArrayList<Product>();
         Long enuu = SystemSession.getUser().getEnterprise().getUu();
         for (ProductDetailERP productDetailERP : productDetailERPList) {
             List<Product> products = productDao.getProductByEnUUAndProdNum(enuu, productDetailERP.getCode());// 获取对应商城物料信息
             if (!CollectionUtils.isEmpty(products)) {
-                ProductDetail productDetail = productDetailDao.findByProductId(products.get(0).getId());// 获取商城物料信息
-                if (productDetail == null) {// 如果物料交易详情为空,新增物料交易详情
-                    productDetail = new ProductDetail();
-                    productDetail.setProductId(products.get(0).getId());
-                }
+//                ProductDetail productDetail = productDetailDao.findByProductId(products.get(0).getId());// 获取商城物料信息
+//                if (productDetail == null) {// 如果物料交易详情为空,新增物料交易详情
+//                    productDetail = new ProductDetail();
+//                    productDetail.setProductId(products.get(0).getId());
+//                }
 
                 if (products.get(0).getCmpUuId() != null) {// 如果为标准器件,更新在售商品信息
                     Double b2cReserve = goodsDao.getSumReserveByEnUUAndUuidAndStatus(enuu, products.get(0).getCmpUuId(), Status.AVAILABLE.value());
@@ -117,8 +123,13 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
                                     good.setReserve(BigDecimal.valueOf(good.getReserve()).subtract(subtractDecimal).doubleValue());
                                     good.setSelfSale(sysConf.getStoreid().equals(good.getStoreid())? IntegerConstant.B2C_SALE.toString() : IntegerConstant.SELF_SALE.toString());// 设置自营寄售
                                     loggerInfo.info(SystemSession.getUser().getEnterprise().getEnName() + "更新库存: " + products.get(0).getProdNum() + ",self is" + good.getSelfSale());
-                                    goodsService.updateGoods(nowGood, good);
-                                    goodsService.updateComponentTradeInfos(nowGood.getUuid());
+                                    // 如果调整后的库存小于最小起订量直接下架
+                                    if (good.getReserve() < good.getMinBuyQty()) {
+                                        goodsService.offShelfGoodsByProvider(good.getBatchCode());
+                                    } else {
+                                        goodsService.updateGoods(nowGood, good);
+                                        goodsService.updateComponentTradeInfos(nowGood.getUuid());
+                                    }
                                     break;
                                 }
 
@@ -131,13 +142,11 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
                     }
                 }
 
-                if (productDetail != null) {
-                    productDetail.setReserve(productDetailERP.getReserve());
-                    productDetails.add(productDetail);
-                }
+                products.get(0).setErpReserve(productDetailERP.getReserve());
+                productList.add(products.get(0));
             }
         }
-        logger.log("物料详情", "更新物料库存信息,企业:" + SystemSession.getUser().getEnterprise().getEnName() + ",数量:" + productDetails.size());
-        productDetailDao.save(productDetails);
+        logger.log("物料详情", "更新物料库存信息,企业:" + SystemSession.getUser().getEnterprise().getEnName() + ",数量:" + productList.size());
+        productDao.save(productList);
     }
 }

+ 2 - 1
src/main/java/com/uas/platform/b2c/external/erp/commodity/util/ModelConverter.java

@@ -197,7 +197,8 @@ public class ModelConverter {
 		productDetail.setPackaging(productDetailERP.getPackaging());
 		productDetail.setPrice(productDetailERP.getPrice());
 		productDetail.setProduceDate(productDetailERP.getProduceDate());
-		productDetail.setReserve(productDetailERP.getReserve());
+		// 暂时将ERP空闲库存放置在product中
+//		productDetail.setReserve(productDetailERP.getReserve());
 		productDetail.setCode(productDetailERP.getCode());
 		productDetail.setBreakUp(productDetailERP.getBreakUp());
 		return productDetail;

+ 40 - 7
src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/B2cOrderServiceImpl.java

@@ -4,6 +4,10 @@ import com.uas.api.b2c_erp.buyer.model.B2cOrder;
 import com.uas.api.b2c_erp.buyer.model.B2cOrderDetail;
 import com.uas.api.b2c_erp.buyer.model.Payment;
 import com.uas.api.b2c_erp.buyer.service.B2cOrderService;
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
@@ -20,6 +24,7 @@ import com.uas.platform.b2c.trade.order.dao.OrderDao;
 import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.b2c.trade.order.model.OrderDetail;
 import com.uas.platform.b2c.trade.order.service.OrderService;
+import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
@@ -66,6 +71,17 @@ public class B2cOrderServiceImpl implements B2cOrderService {
     @Autowired
     private BankInfoService bankInfoService;
 
+    @Autowired
+    private UserDao userDao;
+
+    @Autowired
+    private EnterpriseDao enterpriseDao;
+
+    /**
+     * 成功标语
+     */
+    private static final String SUCCESS = "success";
+
     @Override
     public List<B2cOrder> getAllOrder() {
         // 要获取的采购的状态
@@ -100,17 +116,23 @@ public class B2cOrderServiceImpl implements B2cOrderService {
                 GoodsHistory goodsHistory = goodsHistoryDao.findNewByBatchCode(orderDetail.getBatchCode());
                 if (goodsHistory != null) {
                     List<Product> products = productDao.findByEnUUAndCmpUuId(enuu, goodsHistory.getUuid());
+                    B2cOrderDetail b2cOrderDetail = ModelConverter.convertUas(orderDetail);
                     if (!CollectionUtils.isEmpty(products)) {
-                        B2cOrderDetail b2cOrderDetail = ModelConverter.convertUas(orderDetail);
                         b2cOrderDetail.setProductCode(products.get(0).getProdNum());// 添加erp物料编号
-                        b2cOrderDetails.add(b2cOrderDetail);
-                    } else {
-                        productExists = false;
                     }
+                    b2cOrderDetails.add(b2cOrderDetail);
+                    // else {
+                    //     productExists = false;
+                    // }
                 }
             }
             if (productExists) {
                 B2cOrder b2cOrder = ModelConverter.convert(order);
+                // 设置卖方企业信息
+                Enterprise sellerEnter= enterpriseDao.findByUu(b2cOrder.getSellerenuu());
+                if (sellerEnter != null) {
+                    b2cOrder.setSellerEnter(com.uas.platform.b2c.external.erp.common.util.ModelConverter.convert(sellerEnter));
+                }
                 b2cOrder.setOrderDetails(b2cOrderDetails);
                 b2cOrders.add(b2cOrder);
             }
@@ -139,17 +161,28 @@ public class B2cOrderServiceImpl implements B2cOrderService {
         if (!CollectionUtils.isEmpty(mallBankInfos)) {
             bankTransfer.setJsonReceive(FastjsonUtils.toJson(mallBankInfos.get(0)));
         }
-
+        // erp部分修改当前处理人信息
+        Order order = orderDao.findByOrderid(payment.getOrderid());
+        List<User> users = userDao.findUserByUserUU(order.getBuyeruu());
+        if (!SystemSession.getUser().getEnterprise().getUu().equals(order.getBuyerenuu())){
+            throw new IllegalOperatorException("警告!订单不能确认!您无权限操作");
+        }
+        if (!CollectionUtils.isEmpty(users)){
+            users.get(0).setCurrentEnterprise(order.getBuyerenuu());
+        }
+        SystemSession.setUser(users.get(0));
         bankTransferService.save(bankTransfer, payment.getOrderid());
         return true;
     }
 
     @Override
-    public B2cOrder ensury(String orderid) {
+    public String ensury(String orderid) {
         Order order = orderDao.findByOrderid(orderid);
         if (order != null) {
             orderService.ensureOrderAccept(order.getId().toString());
+            return SUCCESS;
+        } else {
+            throw new IllegalOperatorException("警告!订单编号有误");
         }
-        return null;
     }
 }

+ 6 - 0
src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/OrderServiceImpl.java

@@ -33,6 +33,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -180,8 +181,13 @@ public class OrderServiceImpl implements OrderService {
 	public boolean backOrder(long[] orderids) {
 		for (long orderid : orderids) {
 			Purchase purchase = purchaseDao.findOne(orderid);
+//			if (Status.CONFIRMED.value() == purchase.getStatus()) {// 将确认收款的订单生成出货单
+//				purchaseService.purToBeShiped(orderid);
+//			}
+
 			purchase.setSendstatus(Status.DOWNLOADED.value());
 			purchaseDao.save(purchase);
+
 		}
 		logger.log("销售订单", "回写已下载订单,企业:" + SystemSession.getUser().getEnterprise().getEnName() + "数量:" + orderids.length);
 		return true;

+ 2 - 0
src/main/java/com/uas/platform/b2c/external/erp/order/util/ModelConverter.java

@@ -130,6 +130,8 @@ public class ModelConverter {
 		b2cOrderDetail.setTaxes(orderDetail.getTaxes());
 		b2cOrderDetail.setUnitprice(orderDetail.getTaxUnitprice());
 		b2cOrderDetail.setUuid(orderDetail.getUuid());
+		b2cOrderDetail.setBrandNameCn(orderDetail.getBrandNameCn());
+		b2cOrderDetail.setBrName(orderDetail.getBrName());
 
 		return b2cOrderDetail;
 	}

+ 25 - 0
src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.fa.payment.utils;
 
+import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -74,4 +75,28 @@ public class StringUtils {
 		}
 		return true;
 	}
+
+	/**
+	 *	截取指定字节长度的字符串
+	 *
+	 * @param original 截取的字符串
+	 * @param length 截取的字节长度
+	 * @return
+	 */
+	public static String cutOutString(String original, int length) throws UnsupportedEncodingException {
+		if (length >= original.length()) {
+			return original;
+		}
+		StringBuilder builder = new StringBuilder(original.length());
+		String result = null;
+		for (int i = 0; i < original.length(); i++) {
+			builder.append(original.charAt(i));
+			result = builder.toString();
+			if (result.getBytes("GBK").length > length) {
+				break;
+			}
+		}
+		builder.deleteCharAt(builder.length() - 1);
+		return builder.toString();
+	}
 }

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/DoubleConstant.java

@@ -26,4 +26,14 @@ public class DoubleConstant {
      * 最小包装量的最大值
      */
     public static final Double maxMinPackageQty = 999999d;
+
+    /**
+     * 最小价格
+     */
+    public static final Double minPrice = 0.000001d;
+
+    /**
+     * 最大价格
+     */
+    public static final Double maxPrice = 10000d;
 }

+ 37 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java

@@ -0,0 +1,37 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ * 产品导入错误信息常量
+ *
+ * @author hulh
+ */
+public enum  ErrorInfoConstant {
+    CODE_PATTERN_INFO("A列:请勿输入中文或中文特殊字符"),
+    CODE_LENGTH_INFO("A列:产品型号不能超过100字符"),
+    CODE_EMPTY_INFO("A列:产品型号不能为空"),
+
+    BRAND_LENGTH_INFO("B列:品牌名称不能超过50个字符或25个汉字"),
+    BRAND_EMPTY_INFO("B列:英文品牌不能为空"),
+    BREAK_UP_INFO("C列:请选择可拆卖情况是或否"),
+    RESERVE_NUMBER_INFO("D列:库存须填写小于10亿的正整数"),
+    PRODUCE_DATE_INFO("E列:生产日期不能为空"),
+    PACKAGE_METHOD_INFO("F列:包装方式只能填写中英文"),
+    PACKAGE_EMPTY_INFO("F列:包装方式不能为空"),
+    DELIVERY_EMPTY_INFO("G-H列:存在交期的信息为空"),
+    DELIVERY_VALUE_INFO("G-H列:交期只能填写1-31之间的整数值"),
+    PRICE_INFO("K列:单价必须是小于1万的正数"),
+    MIN_PACKAGE_INFO("I列:最小包数量包含非数字字符");
+
+    /**
+     * 错误提示
+     */
+    private String info;
+
+    ErrorInfoConstant(String info) {
+        this.info = info;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 15 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/IntegerConstant.java

@@ -10,4 +10,19 @@ public class IntegerConstant {
     public static final Integer B2C_SALE = 2;
 
     public static final Integer SELF_SALE = 1;
+
+    /**
+     * 是 的Integer 类型
+     */
+    public static final Integer YES_INT = 1;
+
+    /**
+     * 否Integer 类型
+     */
+    public static final Integer NO_INT = 0;
+
+    /**
+     * 20条数据大小
+     */
+    public static final Integer PAGE_SIZE_TWENTY = 20;
 }

+ 5 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/ShortConstant.java

@@ -11,4 +11,9 @@ public class ShortConstant {
      * 最长交期
      */
     public static final Short maxDelivery = 31;
+
+    /**
+     * 最短交期
+     */
+    public static final Short minDelivery = 1;
 }

+ 18 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java

@@ -0,0 +1,18 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ *
+ * @author yuj 2017-11-30 9:59
+ */
+public class StringConstant {
+
+    /**
+     * 自定义标签
+     */
+    public static final String SELF_TAG = "类型";
+
+    /**
+     * 商城单位
+     */
+    public static final String UNIT = "PCS";
+}

+ 112 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java

@@ -0,0 +1,112 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ * 产品导入对应字段的常量
+ * 后期需求更改,维护这个常量信息即可
+ *
+ * @author hulh 10点13分
+ */
+public final class UploadConstant {
+
+    /**
+     * 私有构造器,防止创建类实例
+     */
+    private UploadConstant() {
+
+    }
+
+    /**
+     * 产品型号
+     */
+    public static final int PRODUCT_CODE = 0;
+
+    /**
+     * 英文品牌名
+     */
+    public static final int BRAND_ENGLISH = 1;
+
+    /**
+     * 是否拆卖
+     */
+    public static final int BREAK_UP = 2;
+
+    /**
+     * 库存数量
+     */
+    public static final int RESERVE_NUMBER = 3;
+
+    /**
+     * 生产日期
+     */
+    public static final int PRODUCE_DATE = 4;
+
+    /**
+     * 包装方式
+     */
+    public static final int PACKAGE_METHOD = 5;
+
+    /**
+     * 最小交期
+     */
+    public static final int MIN_DELIVERY = 6;
+
+    /**
+     * 最大交期
+     */
+    public static final int MAX_DELIVERY = 7;
+
+    /**
+     * 包装数量
+     */
+    public static final int PACKAGE_NUMBER = 8;
+
+    /**
+     * 最小起订量
+     */
+    public static final int BUY_MIN_QTY = 9;
+
+    /**
+     * 分段价格开始
+     */
+    public static final int PRICE_START = 10;
+
+    /**
+     * 第二个分段
+     */
+    public static final int QTY_SECOND_START = 11;
+
+    /**
+     * 第二个分段
+     */
+    public static final int PRICE_SECOND = 12;
+
+    /**
+     * 第三个分段
+     */
+    public static final int QTY_THIRD_START = 13;
+
+    /**
+     * 第三个分段
+     */
+    public static final int PRICE_THIRD = 14;
+
+    /**
+     * 分段价格结束
+     */
+    public static final int PRICE_END = 14;
+
+    /**
+     * 自定义标签
+     */
+    public static final int CUSTOM_LABEL = 15;
+
+    /**
+     * 导入表的最大列数
+     */
+    public static final int TOTAL_COLUMN = 16;
+
+    /**
+     * 用户可能直接用导入失败的表格进行导入
+     */
+    public static final int MAX_TOTAL_COLUMN = 17;
+}

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

@@ -285,14 +285,35 @@ public class GoodsController {
      * 单个更新/下架产品
      *
      * @param goods the goods 更新的产品
+	 * @param updateStatus 是否跟新状态
      * @return result map
      */
     @RequestMapping(method = RequestMethod.PUT)
-	public ResultMap updateGoods(@RequestBody Goods goods) {
+	public ResultMap updateGoods(@RequestBody Goods goods, Boolean updateStatus) {
 		logger.log("商品批次", "更新已上架商品信息");
 		return goodsService.updateGoods(goods);
 	}
 
+	/**
+	 * 将保存的信息上架
+	 * @return
+	 */
+	@RequestMapping(value = "/putOn/{id}", method = RequestMethod.PUT)
+	public ResultMap putOn(@PathVariable("id") Long id) {
+		logger.log("商品上架", "将保存的信息做上架处理");
+		return goodsService.putOn(id);
+	}
+
+	/**
+	 * 保存需要上架的信息,但不是上架
+	 * @return
+	 */
+	@RequestMapping(value = "/addGoods", method = RequestMethod.POST)
+	public ResultMap addGoods(@RequestBody Goods goods) {
+		logger.log("商品上架", "添加产品信息,不做上架动作");
+		return goodsService.addGoods(goods);
+	}
+
     /**
      * 下架所有已失效产品(需要登陆状态)
      *
@@ -639,6 +660,20 @@ public class GoodsController {
         return goodsService.getSimilaritiesProCount(map);
     }
 
+	/**
+	 * 根据以下参数返回该自定义标签是否重复
+	 *
+	 * @param goodId 在售商品id
+	 * @param productId 产品id
+	 * @param tag 自定义标签
+	 * @return
+	 */
+    @RequestMapping(value = "repeat/tag", method = RequestMethod.GET)
+    public ResultMap getCountByTag(Long goodId, Long productId, String tag) {
+		logger.log("自定义标签", "查询标签是否重复");
+		return goodsService.getCountByTag(goodId, productId, tag);
+	}
+
     /**
      * 下架当前企业的所有的商品信息
      *
@@ -650,4 +685,68 @@ public class GoodsController {
 		logger.log("商品管理", "下架该公司所有商品");
 		return goodsService.downAllGoodsByEnterprise(eName);
 	}
+
+	/**
+	 * 根据产品id获取对应的商家信息列表
+	 * @return
+	 */
+	@RequestMapping(value = "/by/productId", method = RequestMethod.GET)
+	public List<Goods> getGoodsByProductId(Long id){
+		return goodsService.getGoodsByProductId(id);
+	}
+
+	/**
+	 * 将goods转为在售状态
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/turn/sale", method = RequestMethod.PUT)
+	public ResultMap turnGoodsToSale(Long id){
+		return goodsService.turnToSale(id);
+	}
+
+	@RequestMapping(value = "/isRecommend/{id}", method = RequestMethod.GET)
+	public ResultMap isRecommendGoods(@PathVariable("id") Long id) {
+		return goodsService.isRecommendGoods(id);
+	}
+
+    /**
+     * 删除在售商品的信息
+     * @return
+     */
+	@RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
+	public Goods deleteGoods(@PathVariable("id") Long id) {
+        return goodsService.deleteGoods(id);
+    }
+
+	/**
+	 * 修正正式系统的数据
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/arrange", method = RequestMethod.GET)
+    public String arrangeGoods() {
+		return goodsService.arrangeGoods();
+	}
+
+	/**
+	 *	获取删除 的信息
+	 *
+	 * @param productid
+	 * @return
+	 */
+	@RequestMapping(value = "/{productid}/deleteMessage", method = RequestMethod.GET)
+	public ResultMap getDeleteProductMessage(@PathVariable("productid") Long productid) {
+		return goodsService.getDeleteProductMessage(productid);
+	}
+
+	/**
+	 * 修正正式系统的分段价格数据
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/data/modify", method = RequestMethod.GET)
+	public String modifyData() {
+		return  goodsService.modifyData();
+	}
 }

+ 71 - 6
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -1,5 +1,10 @@
 package com.uas.platform.b2c.prod.commodity.controller;
 
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.core.constant.SplitChar;
+import com.uas.platform.b2c.core.support.view.JxlsExcelView;
+import com.uas.platform.b2c.core.constant.SplitChar;
+import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
@@ -7,6 +12,8 @@ import com.uas.platform.b2c.prod.commodity.facade.ProductFacade;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.model.Product;
 import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
+import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.trade.support.ResultMap;
@@ -45,6 +52,9 @@ public class ProductController {
 
 	private final ProductFacade productFacade;
 
+	@Autowired
+	private GoodsService goodsService;
+
 	private final Logger logger = Logger.getLogger(getClass());
 
     /**
@@ -83,7 +93,7 @@ public class ProductController {
      * @return model and view
      * @throws UnsupportedEncodingException the unsupported encoding exception
      */
-    @RequestMapping(value = "/template/download/type", method = RequestMethod.POST)
+    @RequestMapping(value = "/template/download/type", method = RequestMethod.GET)
 	public ModelAndView exportProductsStandard(@RequestParam("type") String type, @RequestParam(required = false, value = "isAjax", defaultValue = "false")Boolean isAjax, HttpServletRequest request, @RequestParam(value = "keyword", required = false) String keyword) throws UnsupportedEncodingException {
 		HttpSession session = request.getSession();
 		ModelAndView modelAndView = new ModelAndView();
@@ -98,14 +108,14 @@ public class ProductController {
 			return modelAndView;
 		}
 		session.setAttribute("loading", true);
-		List<Product> products = new ArrayList<Product>();
-		products = productService.getProducts(type ,keyword);
-		if (CollectionUtils.isNotEmpty(products)) {
-			logger.info("产品导出结果 products: " + products.size());
+		List<Goods> productsGoods = productService.getProductsGoods(type, keyword);
+		if (CollectionUtils.isNotEmpty(productsGoods)) {
+			logger.info("产品导出结果 products: " + productsGoods.size());
 		} else {
 			logger.info("产品导出结果 products为空");
 		}
-		modelAndView.addObject("products", products);
+		modelAndView.addObject("data", productsGoods);
+		modelAndView.addObject("goodsService", goodsService);
 		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/products", "优软商城--产品库列表"));
 		session.setAttribute("loading", false);
 		return modelAndView;
@@ -199,6 +209,11 @@ public class ProductController {
 		return productService.updateMatch(json);
 	}
 
+	@RequestMapping(value = "/count", method = RequestMethod.GET)
+	public Map<String, Integer> getProductCount(){
+		return productService.getProductCount();
+	}
+
 	/**
 	 * 批量删除所有的非标的产品
 	 */
@@ -215,6 +230,56 @@ public class ProductController {
 		return productService.deleteBatch(ProductConstant.STANDARD);
 	}
 
+	/**
+	 * 匹配非标产品,非标上架版本
+	 * @return
+	 */
+	@RequestMapping(value = "/match/nonProduct", method = RequestMethod.GET)
+	public ResultMap matchNonProduct(){
+		return productService.matchNonStandardProduct();
+	}
+
+	/**
+	 * 保存匹配的信息,非标上架版本
+	 * @param json
+	 * @return
+	 */
+	@RequestMapping(value = "/save/matchInfo", method = RequestMethod.POST)
+	public ResultMap saveMatchInfo(@RequestBody String json){
+		return productService.saveMatchInfo(json);
+	}
+
+	/**
+	 * 根据返回的信息更新在售信息
+	 * @param beforeId 原产品id
+	 * @param afterId 匹配的标准产品id
+	 * @param resultId 匹配结果id
+	 * @param idArray 要删除的Goods id列表
+	 * @return
+	 */
+	@RequestMapping(value = "/update/goods", method = RequestMethod.POST)
+	public ResultMap updateInfoAfterChoose(Long beforeId, Long afterId, Long resultId, @RequestBody List<Long> idArray){
+		return productService.updateInfoAfterChoose(beforeId, afterId, resultId, idArray);
+	}
+
+	/**
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/goods/productid/{id}")
+	public List<Goods> getGoodsByProductId(@PathVariable("id") Long id) {
+		return productService.getGoodsByProductId(id);
+	}
+
+	/**
+	 * 根据产品id 获取产品信息
+	 * @return
+	 */
+	@RequestMapping(value = "/{id}", method = RequestMethod.GET)
+	public Product getProducts(@PathVariable("id") Long id) {
+		return productService.getProductById(id);
+	}
+
 	/**
 	 * 通过物料id获取物料交易详情
 	 * @param id

+ 12 - 10
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java

@@ -105,13 +105,15 @@ public class ReleaseProductByBatchController {
                 releaseProductByBatch.setBrandId(brandInfo.getId());
                 List<Component> component = componentDao.findByCodeAndBrandid(releaseInfo.getCode(), brandInfo.getId());
                 if (!CollectionUtils.isEmpty(component)) {
-                    releaseProductByBatch.setComponentUuId(component.get(0).getUuid());
+                    releaseProductByBatch.setComponentUuId
+                            (component.get(0).getUuid());
                 }
             }
 
         }
         // 判断componentUUid是否存在
-        if (releaseProductByBatch.getComponentUuId() == null) {
+        if (releaseProductByBatch.getComponentUuId() ==
+                null) {
             releaseProductByBatch.setReleaseCode(ReleaseStatus.error_component.value());
             releaseProductByBatch.setReleaseStatus(ReleaseStatus.error_component.getPhrase());
         }
@@ -201,7 +203,7 @@ public class ReleaseProductByBatchController {
             } else if ("xlsx".equals(suffix)) {
                 workbook = new XSSFWorkbook(is);
             } else {
-                throw new IllegalOperatorException("文件格不正确,请上传.xls或.xlsx的文件");
+                throw new IllegalOperatorException("文件格式不正确!请上传.xls或.xlsx格式的文件");
             }
             map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency);
         } catch (IOException e) {
@@ -255,12 +257,12 @@ public class ReleaseProductByBatchController {
         }
         modelAndView.addObject("data", releaseProductByBatchService.findFailureReleaseProductByBatch(batch));
         String url ="";
-        if(Currency.USD.equals(currency)) {
+        if (Currency.USD.equals(currency)) {
             url = "classpath:jxls-tpl/trade/releaseByBatchError-usd";
-        }else {
+        } else {
             url = "classpath:jxls-tpl/trade/releaseByBatchError-rmb";
         }
-        modelAndView.setView(new JxlsExcelView(url, "优软商城批量发布匹配不正确的产品"));
+        modelAndView.setView(new JxlsExcelView(url, "导入失败产品-优软商城"));
         logger.log("批量上架模块", "以Excel形式导出批量上架商品匹配不合格的数据");
         session.setAttribute("load-error-ing", false);
         return modelAndView;
@@ -275,10 +277,10 @@ public class ReleaseProductByBatchController {
     @RequestMapping(value = "/release/template", method = RequestMethod.GET)
     public ModelAndView exportOrderses(String currency) {
         ModelAndView modelAndView = new ModelAndView();
-        if(Currency.USD.equals(currency)) {
-            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releasebyBatch-usd", "优软商城库存上传模板"));
-        }else {
-            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releaseByBatch-rmb", "优软商城库存上传模板"));
+        if (Currency.USD.equals(currency)) {
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releasebyBatch-usd", "产品导入模板-优软商城"));
+        } else {
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releaseByBatch-rmb", "产品导入模板-优软商城"));
         }
 
         logger.log("商品批次", "下载批量上架商品的Excel模板");

+ 148 - 10
src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java

@@ -7,10 +7,12 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.query.Procedure;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigInteger;
 import java.util.Date;
 import java.util.List;
 import java.util.Set;
@@ -468,6 +470,24 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
     @Query(value = "select g from Goods g where g.sourceId =:sourceId")
 	List<Goods> findBySourceId(@Param("sourceId") Long id);
 
+	/**
+	 * 根据productId 获取goods
+	 *
+	 * @param id the id 来源id 的信息
+	 * @return list
+	 */
+	@Query(value = "select g from Goods g where g.productid =:productId order by g.id desc")
+	List<Goods> findByProductId(@Param("productId") Long id);
+
+    /**
+     * 根据productId 获取goods,按照时间降序排列
+     *
+     * @param id the id 来源id 的信息
+     * @return list
+     */
+    @Query(value = "select g from Goods g where g.productid =:productId order by g.id desc")
+    List<Goods> findByProductIdOrderByGoodsId(@Param("productId") Long id);
+
     /**
      * 获取库存数量前几的代理经销商品,Top k 查询
      *
@@ -475,7 +495,7 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      * @param pageable      分页参数
      * @return the list
      */
-    @Query(value = "SELECT g FROM Goods g WHERE g.storeid in :uuid and g.img is not null ORDER BY g.reserve DESC")
+    @Query(value = "SELECT g FROM Goods g WHERE g.storeid in :uuid and g.img is not null and g.status = 601 ORDER BY g.reserve DESC")
 	List<Goods> findGoodInventoryByReserve(@Param("uuid") List<String> storeUuidList, Pageable pageable);
 
     /**
@@ -502,25 +522,114 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      */
     List<Goods> findByEnUUAndUuidOrderByReserveAsc(Long enuu, String uuid);
 
+
     /**
-     * 根据企业uu和器件uuid获取当前在售商品总库存
+     * 根据企业uu和器件uuid和状态获取商品总库存
      * @param enuu
      * @param uuid
      * @return
      */
-    @Deprecated
-    @Query(value = "select sum(go_reserve) from trade$goods where go_enuu=:enuu and cmp_uuid=:uuid", nativeQuery = true)
-    Double getSumReserveByEnUUAndUuid(@Param("enuu") Long enuu, @Param("uuid") String uuid);
+    @Query(value = "select sum(go_reserve) from trade$goods where go_enuu=:enuu and cmp_uuid=:uuid and go_status=:status ", nativeQuery = true)
+    Double getSumReserveByEnUUAndUuidAndStatus(@Param("enuu") Long enuu, @Param("uuid") String uuid, @Param("status") Integer status);
 
+	/**
+	 * 根据以下条件查找对应Goods列表
+	 * @param productId
+	 * @param produceDate
+	 * @param packaging
+	 * @param minPackQty
+	 * @param minBuyQty
+	 * @return
+	 */
+	@Query(value = "select g from Goods g where g.productid = :productId and g.produceDate = :produceDate and g.packaging = :packaging and g.minPackQty = :minPackQty and g.minBuyQty = :minBuyQty and g.maxDelivery = :maxDelivery and g.minDelivery = :minDelivery and g.unit = :unit")
+	List<Goods> findRepeatGoodsInProductId(@Param("productId") Long productId, @Param("produceDate") String produceDate, @Param("packaging") String packaging, @Param("minPackQty") Double minPackQty,
+										   @Param("minBuyQty") Double minBuyQty, @Param("maxDelivery") Short maxDelivery, @Param("minDelivery") Short minDelivery, @Param("unit") String unit);
 
     /**
-     * 根据企业uu和器件uuid和状态获取商品总库存
-     * @param enuu
-     * @param uuid
+     * 根据产品编号获取相同标签的信息
+     * @param prodNum
+     * @param tag
      * @return
      */
-    @Query(value = "select sum(go_reserve) from trade$goods where go_enuu=:enuu and cmp_uuid=:uuid and go_status=:status ", nativeQuery = true)
-    Double getSumReserveByEnUUAndUuidAndStatus(@Param("enuu") Long enuu, @Param("uuid") String uuid, @Param("status") Integer status);
+	@Query(value = "select g from Goods g where g.prodNum =:prodNum and g.tag =:tag")
+	List<Goods> findSameTagInTheProdNum(@Param("prodNum") String prodNum, @Param("tag") String tag);
+
+    /**
+     * 根据产品编号获取相同标签的信息
+     * @param productid
+     * @param tag
+     * @return
+     */
+    @Query(value = "select g from Goods g where" +
+            " g.productid =:productid and g.tag " +
+            "=:tag")
+    List<Goods> findGoodsByProductidAndTag(@Param("productid") Long productid, @Param("tag") String tag);
+
+    /**
+     *
+     * @param length 长度
+     * @return 按库存降低排序,取前多少条
+     */
+    @Query(value = "select * from trade$goods g where g.cmp_img is not null order by g.go_reserve desc limit :length", nativeQuery = true)
+    List<Goods> maxReserveLimitLength(@Param("length") Integer length);
+
+	/**
+	 * 根据店铺uuid查询有效的在售产品个数
+	 * @param storeUuid
+	 * @return
+	 */
+	@Query(value = "select count(g) from Goods g where g.storeid = :storeUuid and g.status = 601 and g.kindNameCn is null")
+	int findNonstandardGoodsCount(@Param("storeUuid") String storeUuid);
+
+
+    /**
+     * 找同一种SKU的超过两条的
+     * @return List<Long>
+     */
+    @Query(value = "select max(g.id) from Goods g group by g.productid, g.minPackQty, g.packaging, g.unit, g.produceDate,g.minBuyQty, g.minDelivery, g.maxDelivery having count(1) > 1")
+    List<Long> findSameGoodsGreaterThenTwo();
+
+    /**
+     * 获取店铺的信息
+     * @return
+     */
+    @Query(value = "select distinct g.productid from Goods g")
+    List<Long> findDistictProductid();
+
+    /**
+     * 统计在售产品关联的物料信息总数
+     * @return
+     */
+    @Query(value = "select count(distinct g.productid) from Goods g")
+    Integer findCountDistictProductid();
+
+    /**
+     * 分页获取产品id的信息
+     * @param start
+     * @param end
+     * @return
+     */
+    @Query(value = "select DISTINCT g.go_productid from trade$goods g order by g.go_productid desc limit :start, :end", nativeQuery = true)
+    List<BigInteger> findProductidByPage(@Param("start") Integer start, @Param("end") Integer end);
+
+    /**
+     * 找没有自定义标签的的Good信息
+     * @return
+     */
+    @Query(value = "select g from Goods g where g.tag is null")
+    List<Goods> findGoodsByTagIsNull();
+
+    /**
+     * 更新产品的有效日期
+     */
+    @Procedure(value = "trade_update_available_days")
+    void updateCommodityAvailableDay();
+
+    /**
+     * 自动下架过期的产品
+     */
+    @Procedure(value = "trade_auto_down_goods")
+    void autoDownOverDueCommodity();
 
     /**
      * 产品点击次数加一
@@ -531,4 +640,33 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
     @Transactional
     @Query( nativeQuery = true, value = "update trade$goods set go_visit_count = ifnull(go_visit_count, 0) + 1 where go_batchcode = :batchCode")
     public void addVisitCount(@Param("batchCode") String batchCode);
+
+    /**
+     * 根据以下字段返回结果数
+     * @param enUU
+     * @param brandEn
+     * @param code
+     * @param tag
+     * @return
+     */
+    @Query(value = "select count(1) from Goods g where g.enUU = :enUU and g.brandNameEn = :brandEn and g.code = :code and g.tag = :tag")
+    int findCountByTagInGoods(@Param("enUU") Long enUU, @Param("brandEn") String brandEn, @Param("code") String code, @Param("tag") String tag);
+
+    /**
+     * 分页获取库存的信息
+     *
+     * @param start 起始值
+     * @param length 结束值
+     * @return List<Goods>
+     */
+    @Query(value = "select * from trade$goods order by go_id desc limit :start, :length", nativeQuery = true)
+    List<Goods> findGoodsByPage(@Param("start") Long start, @Param("length") Long length);
+
+    /**
+     * 获取数据总的在售信息
+     *
+     * @return
+     */
+    @Query(value = "select count(1) from Goods")
+    Long getCountGoods();
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsHistoryDao.java

@@ -48,7 +48,7 @@ public interface GoodsHistoryDao extends JpaSpecificationExecutor<GoodsHistory>,
      * @param batchCode the batch code 批次号
      * @return the goods history
      */
-    @Query(value = "select g from GoodsHistory g where g.batchCode = :batchCode and g.operateDate = (select max(c.operateDate) from GoodsHistory c where c.batchCode = :batchCode)")
+    @Query(value = "select g from GoodsHistory g where g.batchCode = :batchCode and g.id = (select max(c.id) from GoodsHistory c where c.batchCode = :batchCode)")
 	GoodsHistory findNewByBatchCode(@Param("batchCode") String batchCode);
 
     /**

+ 24 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java

@@ -4,7 +4,6 @@ import com.uas.platform.b2c.prod.commodity.model.Product;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.jpa.repository.query.Procedure;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
@@ -35,8 +34,8 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
      * @param enuu the enuu 企业enuu
      * @return string
      */
-    @Procedure(procedureName = "PRODUCT$MATCHES")
-    String upateResultByEnuuForB2C(Long enuu);
+//    @Procedure(procedureName = "PRODUCT$MATCHES")
+//    String upateResultByEnuuForB2C(Long enuu);
 
     /**
      * 获取当前的状态的数据
@@ -48,6 +47,16 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
     @Query(value = "select count(1) from products where pr_enuu =:enuu and pr_standard =:standard", nativeQuery = true)
     Integer getCountByEnuuAndStatus(@Param("enuu") Long enuu, @Param("standard") Short standard);
 
+    /**
+     * 获取当前的状态的数据
+     *
+     * @param enuu     the enuu 企业enuu
+     * @param standard the standard 标准状态
+     * @return count by enuu and status
+     */
+    @Query(value = "select count(1) from products where pr_enuu =:enuu and pr_standard =:standard and pr_b2cenabled =:enabled", nativeQuery = true)
+    Integer getCountByEnuuAndStatusAndEnabled(@Param("enuu") Long enuu, @Param("standard") Short standard, @Param("enabled") Integer enabled);
+
     /**
      * 根据器件型号,品牌 、enuu
      *
@@ -106,4 +115,16 @@ public interface ProductDao extends JpaSpecificationExecutor<Product>, JpaReposi
     @Query(value = "select p from Product p where p.enUU = :enuu and p.standard = :standard")
     List<Product> findProductByEnuuAndStandard(@Param("enuu") Long enuu, @Param("standard") Integer standard);
 
+
+    /**
+     * 查找是否有匹配成标准的非标信息
+     * @param enuu
+     * @param brand
+     * @param code
+     * @param standard
+     * @return
+     */
+    @Query(value = "select p from Product p where p.enUU = :enuu and p.brand = :brand and p.cmpCode = :code and p.standard = :standard")
+    List<Product> findMatchStandard(@Param("enuu") Long enuu, @Param("brand") String brand, @Param("code") String code, @Param("standard") Integer standard);
+
 }

+ 4 - 5
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductImportHistDao.java

@@ -4,7 +4,6 @@ import com.uas.platform.b2c.prod.commodity.model.ProductImportHist;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.jpa.repository.query.Procedure;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
@@ -25,8 +24,8 @@ public interface ProductImportHistDao extends JpaRepository<ProductImportHist, L
      * @param uploadNum 本次上传的编号
      * @param enuu      企业的uu
      */
-    @Procedure(procedureName = "PRODUCT$IMPORT$VALIDATE")
-    void validProductImportInfo(String uploadNum, Long enuu);
+//    @Procedure(procedureName = "PRODUCT$IMPORT$VALIDATE")
+//    void validProductImportInfo(String uploadNum, Long enuu);
 
 
     /**
@@ -46,8 +45,8 @@ public interface ProductImportHistDao extends JpaRepository<ProductImportHist, L
      * @param uploadNum 本次导入的标准库
      * @return Integer 导入的条数
      */
-    @Procedure(procedureName = "PRODUCT$IMPORT$REPOSITORY")
-    Integer importToProRepository(String uploadNum);
+//    @Procedure(procedureName = "PRODUCT$IMPORT$REPOSITORY")
+//    Integer importToProRepository(String uploadNum);
 
     /**
      * 导出批次下的 指定状态的信息

+ 15 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductMatchResultDao.java

@@ -0,0 +1,15 @@
+package com.uas.platform.b2c.prod.commodity.dao;
+
+import com.uas.platform.b2c.prod.commodity.model.ProductMatchResult;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 匹配结果类操作层
+ * @author hulh
+ */
+@Repository
+public interface ProductMatchResultDao extends JpaRepository<ProductMatchResult, Long>, JpaSpecificationExecutor<ProductMatchResult> {
+
+}

+ 13 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ReleaseProductByBatchDao.java

@@ -31,6 +31,8 @@ public interface ReleaseProductByBatchDao
      */
     public List<ReleaseProductByBatch> findByPublisherUuAndRelbatchidAndReleaseCode(Long publisherUu, String relbatchid, Integer releaseCode);
 
+	@Query("select r from ReleaseProductByBatch r where r.publisherUu =:publisherUu and r.relbatchid =:relbatchid and r.releaseCode in :failCodes")
+	List<ReleaseProductByBatch> findByPublisherUuAndRelbatchidAndFailCode(@Param("publisherUu") Long publisherUu, @Param("relbatchid") String relbatchid, @Param("failCodes") List<Integer> failCodes);
 
     /**
      * 创建时间 :2016年12月22日 上午10:25:36
@@ -53,13 +55,23 @@ public interface ReleaseProductByBatchDao
     @Query("select count(*) from ReleaseProductByBatch r where r.publisherUu =:publisherUu and r.relbatchid =:relbatchid and r.releaseCode =:releaseCode")
 	public Integer getCountPublisherUuAndBatchAndReleaseCode(@Param("publisherUu") Long publisherUu, @Param("relbatchid") String relbatchid, @Param("releaseCode") Integer releaseCode);
 
+	/**
+	 * 获取某次上传失败的数,包括必填项错误和已存在
+	 * @param publisherUu
+	 * @param relbatchid
+	 * @param failCodes
+	 * @return
+	 */
+	@Query("select count(*) from ReleaseProductByBatch r where r.publisherUu =:publisherUu and r.relbatchid =:relbatchid and r.releaseCode in :failCodes")
+	Integer getCountOfImportFail(@Param("publisherUu") Long publisherUu, @Param("relbatchid") String relbatchid, @Param("failCodes") List<Integer> failCodes);
+
     /**
      * 验证器件和品牌的信息
      *
      * @param publisherUu the publisher uu 发布人
      * @param batchid     the batchid 批次号
      */
-    @Procedure(procedureName = "PRODUCT_RELEASE_VALID")
+    @Procedure(procedureName = "PRODUCT_RELEASE_VALID_V1")
 	public void callValidProcedure(Long publisherUu, String batchid);
 
     /**

+ 52 - 16
src/main/java/com/uas/platform/b2c/prod/commodity/facade/impl/ProductFacadeImpl.java

@@ -3,6 +3,8 @@ package com.uas.platform.b2c.prod.commodity.facade.impl;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.prod.commodity.constant.IntegerConstant;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
 import com.uas.platform.b2c.prod.commodity.facade.ProductFacade;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
@@ -15,10 +17,13 @@ import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.util.List;
+
 @Service
 public class ProductFacadeImpl implements ProductFacade {
 
@@ -26,6 +31,8 @@ public class ProductFacadeImpl implements ProductFacade {
 
 	private final GoodsService goodsService;
 
+	private final GoodsDao goodsDao;
+
 	private final ComponentDao componentDao;
 
 	private final StoreInService storeInService;
@@ -33,37 +40,49 @@ public class ProductFacadeImpl implements ProductFacade {
 	private final SysConf sysConf;
 
 	@Autowired
-	public ProductFacadeImpl(ProductDao productDao, GoodsService goodsService, ComponentDao componentDao, StoreInService storeInService, SysConf sysConf) {
+	public ProductFacadeImpl(ProductDao productDao, GoodsService goodsService, GoodsDao goodsDao, ComponentDao componentDao, StoreInService storeInService, SysConf sysConf) {
 		this.productDao = productDao;
 		this.goodsService = goodsService;
+		this.goodsDao = goodsDao;
 		this.componentDao = componentDao;
 		this.storeInService = storeInService;
 		this.sysConf = sysConf;
 	}
 
+	public ResultMap saveModifyInfo(Goods goods){
+		return null;
+	}
+
 	@Override
 	public ResultMap newStockByStandardProduct(Long id, Boolean isSelfSupport, Goods goods) {
 		// 验证上架参数信息
 		ResultMap resultMap = validateNewStock(id, isSelfSupport, goods);
 		if (resultMap != null) return resultMap;
 
+		ResultMap repeatMap = validateGoodsRepeat(id, goods);
+		if (!repeatMap.isSuccess()) return repeatMap;
+
 		Product product = productDao.findOne(id);
-		if (product == null || StringUtils.isEmpty(product.getCmpUuId())) {
+		if (product == null) {
 			return new ResultMap(CodeType.NO_INFO, String.format("产品[%d]不存在", id));
 		}
-
-		// 设置器件信息
-		Component component = componentDao.findByUuid(product.getCmpUuId());
-		if (component == null) {
-			return new ResultMap(CodeType.ERROR_STATE, String.format("器件[%s]信息不存在", product.getCmpUuId()));
+		if (goods.getId() == null){
+			goods.convertProductToGoods(product);
+		}
+		Component component = null;
+		if (product.getCmpUuId() != null){
+			// 设置器件信息
+			component = componentDao.findByUuid(product.getCmpUuId());
+		}
+		if (component != null) {
+			goods.setUuid(component.getUuid());
+			goods.setCode(component.getCode());
+			goods.setImg(component.getImg());
+			goods.setKindUuid(component.getKindid());
+			goods.setKindNameCn(component.getKind().getNameCn());
+			goods.setBrandNameCn(component.getBrand().getNameCn());
+			goods.setBrandNameEn(component.getBrand().getNameEn());
 		}
-		goods.setUuid(component.getUuid());
-		goods.setCode(component.getCode());
-		goods.setImg(component.getImg());
-		goods.setKindUuid(component.getKindid());
-		goods.setKindNameCn(component.getKind().getNameCn());
-		goods.setBrandNameCn(component.getBrand().getNameCn());
-		goods.setBrandNameEn(component.getBrand().getNameEn());
 
 		StoreIn store;
 		if (isSelfSupport) {
@@ -80,14 +99,31 @@ public class ProductFacadeImpl implements ProductFacade {
 		goods.setStoreid(store.getUuid());
 		goods.setStoreName(store.getStoreName());
 
-		// 发布商品
 		if ("ERP".equals(product.getSourceApp())) {
 			goods = goodsService.publish(goods, "NORMAL", product);
 		} else {
 			goods = goodsService.publish(goods, "NORMAL");
 		}
+		goods = goodsService.publish(goods, "NORMAL");
+//		if (goods != null){
+//			//更新对应产品库中信息
+//			product.setCanSell(IntegerConstant.YES_INT);
+//		}
+		Product backProduct = productDao.save(product);
+		goods.setProductid(backProduct.getId());
+		goodsDao.save(goods);
 
-		return ResultMap.success(goods);
+		return ResultMap.success(backProduct);
+	}
+
+	private ResultMap validateGoodsRepeat(Long id, Goods goods){
+		//根据7个字段验证是否重复
+		List<Goods> goodsList = null;
+		// = goodsDao.findByProductIdAnd
+		if (!CollectionUtils.isEmpty(goodsList)){
+			return new ResultMap(CodeType.SAVED, "该在售信息已存在,请修改后重试");
+		}
+		return ResultMap.success(null);
 	}
 
 	private ResultMap validateNewStock(Long id, Boolean isSelfSupport, Goods goods) {

+ 127 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java

@@ -45,13 +45,20 @@ public class Goods implements Serializable {
 	//*************************************************************************
 	//* 器件基础信息
 	//*************************************************************************
-
 	/**
 	 * 对应的器件uuid
 	 */
 	@Column(name = "cmp_uuid")
 	private String uuid;
 
+	/**
+	 * 是否已在售
+	 * 1.YES<br>
+	 * 0.NO
+	 */
+	@Column(name = "go_sold")
+	private Integer sold;
+
 	/**
 	 * 原厂型号
 	 */
@@ -487,6 +494,18 @@ public class Goods implements Serializable {
 	@Column(name = "go_visit_count")
 	private Long visitCount;
 
+    /**
+     * 自定义标签
+     */
+    @Column(name = "go_tag")
+    private String tag;
+
+    /**
+     * 产品编码
+     */
+    @Column(name = "go_pronum")
+    private String prodNum;
+
 
 	@Transient
 	private String selfSale;
@@ -833,6 +852,15 @@ public class Goods implements Serializable {
 		this.usdTaxRate = usdTaxRate;
 	}
 
+	public void setTaxRate() {
+		if (this.getCurrencyName().contains("RMB".toUpperCase()) && this.getRmbTaxRate() == null) {
+			this.setRmbTaxRate(0.17);
+		}
+		if (this.getCurrencyName().contains("USD".toUpperCase()) && this.getUsdTaxRate() == null) {
+			this.setUsdTaxRate((double) 0);
+		}
+	}
+
 	public Double getMinPriceRMB() {
 		return minPriceRMB;
 	}
@@ -1013,6 +1041,20 @@ public class Goods implements Serializable {
 		return this;
 	}
 
+    public void setProductInfo(Product product) {
+        this.code = product.getPcmpcode();
+        this.uuid =product.getCmpUuId();
+        this.branduuid =product.getPbranduuid();
+        this.brandid = product.getPbrandid();
+        this.brandNameCn = product.getPbrand();
+        this.brandNameEn = product.getPbranden();
+        this.kindUuid = product.getKindid();
+        this.kindNameCn = product.getKind();
+        if(StringUtils.isEmpty(this.img)) {
+            this.img = product.getCmpImg();
+        }
+    }
+
 	/**************************************************************************
 	 * Property Method
 	 **************************************************************************/
@@ -1364,6 +1406,14 @@ public class Goods implements Serializable {
 		return this;
 	}
 
+	public Integer getSold() {
+		return sold;
+	}
+
+	public void setSold(Integer sold) {
+		this.sold = sold;
+	}
+
 	/**
 	 * 获取最大交期
 	 * @return
@@ -1446,4 +1496,80 @@ public class Goods implements Serializable {
 		this.perQty = (this.breakUp != null && this.breakUp) ? 1d : this.minPackQty;
 		return this;
 	}
+
+	public void convertProductToGoods(Product product){
+		//		this.batchid = product.get
+		this.brandNameCn = product.getPbrand();
+		this.brandNameEn = product.getPbranden();
+		this.brandid = product.getPbrandid();
+		this.branduuid = product.getPbranduuid();
+		this.code = product.getPcmpcode();
+	}
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	public String getProdNum() {
+		return prodNum;
+	}
+
+	public void setProdNum(String prodNum) {
+		this.prodNum = prodNum;
+	}
+
+	/**
+	 * 获取分段数量
+	 */
+	@Transient
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Double getPriceQty(int seg) {
+		List<GoodsQtyPrice> prices = getPrices();
+		if (!CollectionUtils.isEmpty(prices)) {
+			if(seg < prices.size()) {
+				GoodsQtyPrice price = prices.get(seg);
+				return null != price ? price.getStart() : null;
+			}
+
+		}
+		return null;
+	}
+
+	/**
+	 * 获取分段价格
+	 */
+	@Transient
+	@JsonIgnore
+	@JSONField(serialize = false)
+	public Double getPrice(int seg) {
+		List<GoodsQtyPrice> prices = getPrices();
+		if (!CollectionUtils.isEmpty(prices)) {
+			if(seg < prices.size()) {
+				GoodsQtyPrice price = prices.get(seg);
+				return this.currencyName.indexOf("RMB") > -1 ? price.getRMBPrice() : price.getUSDPrice();
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 产品转goods
+	 * @return
+	 */
+	public static Goods productConvertGoods(Product product) {
+		Goods g = new Goods();
+		g.setProdNum(product.getProdNum());
+		g.setKindNameCn(product.getKind());
+		g.setBrandNameEn(product.getPbranden());
+		g.setCode(product.getPcmpcode());
+		g.setEncapsulation(product.getEncapsulation());
+		g.setPackaging(product.getPackaging());
+		g.setUuid(product.getCmpUuId());
+		return g;
+	}
 }

+ 68 - 3
src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsHistory.java

@@ -174,6 +174,12 @@ public class GoodsHistory {
 	@Column(name = "go_remark")
 	private String remark;
 
+	/**
+	 * 单位
+	 */
+	@Column(name = "go_unit")
+	private String unit;
+
 	/**
 	 * 最小起订量
 	 */
@@ -385,6 +391,18 @@ public class GoodsHistory {
 	@Column(name = "go_breakup", columnDefinition = "TINYINT(1)")
 	private Boolean breakUp;
 
+	/**
+	 * 自定义标签
+	 */
+	@Column(name = "go_tag")
+	private String tag;
+
+	/**
+	 * 产品编码
+	 */
+	@Column(name = "go_pronum")
+	private String prodNum;
+
 	/**
 	 * 分段价格
 	 */
@@ -796,6 +814,14 @@ public class GoodsHistory {
 		return this;
 	}
 
+	public String getUnit() {
+		return unit;
+	}
+
+	public void setUnit(String unit) {
+		this.unit = unit;
+	}
+
 	public Long getKindUuid() {
 		return kindUuid;
 	}
@@ -903,9 +929,9 @@ public class GoodsHistory {
 		ReleaseReserve(107, "释放库存"),
 
 		/**
-		 * {@code  108重新上架已下架商品}
+		 * {@code  108架商品}
 		 */
-		PutOnAgain(108, "重新上架"),
+		PutOn(108, "上架"),
 
 		/**
 		 * {@code 109 增加库存}
@@ -920,9 +946,30 @@ public class GoodsHistory {
         /**
          * {@code, 111, 标准上架管理更新库存信息}
          */
-        STANDARD_MODIFY(111, "标准上架管理更新库存信息");
+        STANDARD_MODIFY(111, "标准上架管理更新库存信息"),
+
+		/**
+		 * {@code, 112, 匹配标准后重复删除}
+		 */
+		DELETE_FOR_REPEAT(112, "匹配标准后重复删除"),
+
+		/**
+		 * 增加在售产品
+		 */
+		ADD_GOODS(113, "添加在售产品信息"),
+
+		/**
+		 * {@code, 614 手动删除}
+		 */
+		DELETE(614, "手动删除"),
+
+		/**
+		 * 修改价格信息
+		 */
+		MODIFY_PRICE(615, "修改价格信息");
 
 		private final int value;
+
 		private final String phrase;
 
 		OperateType(int value, String phrase) {
@@ -1000,6 +1047,8 @@ public class GoodsHistory {
 		this.updateDate = new Date();
 		this.perQty = goods.getPerQty();
 		this.breakUp = goods.getBreakUp();
+		this.tag = goods.getTag();
+		this.prodNum = goods.getProdNum();
     }
 
 	public Short getSelfDeliveryDemMinTime() {
@@ -1091,4 +1140,20 @@ public class GoodsHistory {
 		this.breakUp = breakUp;
 		return this;
 	}
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	public String getProdNum() {
+		return prodNum;
+	}
+
+	public void setProdNum(String prodNum) {
+		this.prodNum = prodNum;
+	}
 }

+ 89 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/Product.java

@@ -73,6 +73,12 @@ public class Product {
 	@Column(name = "pr_stock")
 	private Double stock;
 
+	/**
+	 * ERP空闲库存
+	 */
+	@Column(name = "pr_reserve")
+	private Double erpReserve;
+
 	/**
 	 * 价格
 	 */
@@ -159,6 +165,12 @@ public class Product {
 	@Column(name = "pr_pbranden")
 	private String pbranden;
 
+	/**
+	 * 品牌(平台)id
+	 */
+	@Column(name = "pr_pbrandid")
+	private Long pbrandid;
+
 	/**
 	 * 品牌(平台)(uuid)
 	 */
@@ -178,6 +190,22 @@ public class Product {
 	@Column(name = "pr_standard")
 	private Integer standard;
 
+	/**
+	 * 对应Goods是否已在售
+	 * 1.YES<br>
+	 * 0.NO
+	 */
+	@Column(name = "pr_sold")
+	private Integer sold;
+
+	/**
+	 * 是否可上架,是否有对应的Good信息
+	 * 1.YES<br>
+	 * 0.NO
+	 */
+	@Column(name = "pr_can_sell")
+	private Integer canSell;
+
 	/**
 	 * 匹配状态(记录匹配状态,方便下次查看)
 	 * 111 匹配成功 ->变为标准
@@ -260,6 +288,12 @@ public class Product {
 	@Column(name = "pr_b2cenabled")
 	private Integer b2cEnabled;
 
+	/**
+	 * 产品建立时间
+	 */
+	@Column(name = "pr_create_time")
+	private Date createTime;
+
 	/**
 	 * 转成标准的时间
 	 */
@@ -280,6 +314,12 @@ public class Product {
 	@Transient
 	private ProductDetail productDetail;
 
+	/**
+	 * goods表信息中存在多少条数据
+	 */
+	@Column(name = "pr_batchcount")
+	private Integer batchCount;
+
 	public Product() {
 	}
 
@@ -355,6 +395,14 @@ public class Product {
 		return this;
 	}
 
+	public Double getErpReserve() {
+		return erpReserve;
+	}
+
+	public void setErpReserve(Double erpReserve) {
+		this.erpReserve = erpReserve;
+	}
+
 	public Double getPrice() {
 		return price;
 	}
@@ -409,6 +457,14 @@ public class Product {
 		return this;
 	}
 
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
 	public String getCmpUuId() {
 		return cmpUuId;
 	}
@@ -499,6 +555,14 @@ public class Product {
 		return this;
 	}
 
+	public Long getPbrandid() {
+		return pbrandid;
+	}
+
+	public void setPbrandid(Long pbrandid) {
+		this.pbrandid = pbrandid;
+	}
+
 	public Integer getMatchstatus() {
 		return matchstatus;
 	}
@@ -631,6 +695,31 @@ public class Product {
 		return this;
 	}
 
+	public Integer getSold() {
+		return sold;
+	}
+
+	public void setSold(Integer sold) {
+		this.sold = sold;
+	}
+
+	public Integer getCanSell() {
+		return canSell;
+	}
+
+	public void setCanSell(Integer canSell) {
+		this.canSell = canSell;
+	}
+
+	public Integer getBatchCount() {
+		return batchCount;
+	}
+
+	public Product setBatchCount(Integer batchCount) {
+		this.batchCount = batchCount;
+		return this;
+	}
+
 	public ProductDetail getProductDetail() {
 		return productDetail;
 	}

+ 260 - 9
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -2,7 +2,12 @@ package com.uas.platform.b2c.prod.commodity.model;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
+import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.core.utils.RegexConstant;
 import com.uas.platform.b2c.core.utils.StringUtilB2C;
+import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
+import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
+import com.uas.platform.b2c.prod.commodity.type.ReleaseConstant;
 import com.uas.platform.b2c.trade.order.StringConstant.Currency;
 import org.apache.commons.collections.CollectionUtils;
 import org.codehaus.jackson.annotate.JsonIgnore;
@@ -10,10 +15,13 @@ import org.springframework.util.StringUtils;
 
 import javax.persistence.*;
 import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 批量上传商品建立临时表存储相关信息
@@ -25,6 +33,16 @@ import java.util.List;
 @Table(name = "trade$releasebybatch")
 public class ReleaseProductByBatch implements Serializable {
 
+	/**
+	 * 验证产品型号
+	 */
+	private static final Pattern codePattern = Pattern.compile(RegexConstant.LetterAndDigitAndEnglishSpecialCharacter);
+
+	/**
+	 * 验收输入中英文
+	 */
+	private static final Pattern chineseAndEnglishPattern = Pattern.compile(RegexConstant.chineseAndEnglish);
+
 	/**
 	 * 序列
 	 */
@@ -192,6 +210,18 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_encapsulation")
 	private String encapsulation;
 
+	/**
+	 * 标签,用户填写
+	 */
+	@Column(name = "rel_tag_str")
+	private String tagstr;
+
+	/**
+	 * 标签,保存
+	 */
+	@Column(name = "rel_tag")
+	private String tag;
+
 	/**
 	 * 自己填写最长交期
 	 */
@@ -442,6 +472,210 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_storename")
 	private String storeName;
 
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (o == null || getClass() != o.getClass()) return false;
+
+		ReleaseProductByBatch that = (ReleaseProductByBatch) o;
+
+		if (!brandNameEn.equals(that.brandNameEn)) return false;
+		if (!code.equals(that.code)) return false;
+		if (!minBuyQtyStr.equals(that.minBuyQtyStr)) return false;
+		if (!productDate.equals(that.productDate)) return false;
+		if (!minPackageStr.equals(that.minPackageStr)) return false;
+		if (!packaging.equals(that.packaging)) return false;
+		if (!selfMaxDeliveryStr.equals(that.selfMaxDeliveryStr)) return false;
+		return selfMinDeliveryStr.equals(that.selfMinDeliveryStr);
+
+	}
+
+	public void setBrandEnByExcel(Object value) {
+		if (StringUtils.isEmpty(value)) {
+			addErrmsg(ErrorInfoConstant.BRAND_EMPTY_INFO.getInfo());
+		} else {
+			try {
+				if (value.toString().getBytes("GBK").length > 50) {
+					addErrmsg(ErrorInfoConstant.BRAND_LENGTH_INFO.getInfo());
+				}
+			} catch (UnsupportedEncodingException e) {
+				throw new RuntimeException(e + "指定字符集不支持");
+			}
+		}
+		setBrandNameEn(StringUtilB2C.getStr(value));
+		setB2cBranden(StringUtilB2C.getStr(value));
+	}
+
+	public void setCodeByExcel(Object value) {
+		if (!StringUtils.isEmpty(value)) {
+			String code = value.toString();
+			Matcher matcher = codePattern.matcher(code);
+			if (!matcher.find()) {
+				addErrmsg(ErrorInfoConstant.CODE_PATTERN_INFO.getInfo());
+			}
+			try {
+				if (code.getBytes("GBK").length > 100) {
+					addErrmsg(ErrorInfoConstant.CODE_LENGTH_INFO.getInfo());
+				}
+			} catch (UnsupportedEncodingException e) {
+				throw new RuntimeException(e + "指定字符集不支持");
+			}
+		} else {
+			addErrmsg(ErrorInfoConstant.CODE_EMPTY_INFO.getInfo());
+		}
+		setCode(StringUtilB2C.getStr(value));
+		setB2cCode(StringUtilB2C.getStr(value));
+	}
+
+	public void setBreakUpByExcel(Object value) {
+		setBreakUpStr(StringUtilB2C.getStr(value));
+		if (!StringUtils.isEmpty(value) && (ReleaseConstant.YES.equals(value.toString()))) {
+			setBreakUp(Boolean.TRUE);
+		} else if (!StringUtils.isEmpty(value) && ReleaseConstant.NO.equals(value.toString())) {
+			setBreakUp(Boolean.FALSE);
+		} else {
+			addErrmsg(ErrorInfoConstant.BREAK_UP_INFO.getInfo());
+		}
+	}
+
+	public void setReserveByExcel(Object value) {
+		setReserveStr(StringUtilB2C.getStr(value));
+		if (value == null || !RegexConstant.isNumber(value.toString())) {
+			addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
+		} else {
+			Double reserve = Double.valueOf(value.toString());
+			if (reserve % 1 != 0) {
+				addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
+			} else {
+				int compareTo = reserve.compareTo(DoubleConstant.maxReserve);
+				if (compareTo > 0) {
+					addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
+				} else if (NumberUtil.compare(reserve, DoubleConstant.zero) < 1) {
+					addErrmsg(ErrorInfoConstant.RESERVE_NUMBER_INFO.getInfo());
+				} else {
+					setReserve(reserve);
+				}
+			}
+		}
+	}
+
+	public void setProductDateByExcel(Object value) {
+		if (StringUtils.isEmpty(value)) {
+			addErrmsg(ErrorInfoConstant.PRODUCE_DATE_INFO.getInfo());
+		}
+		String productData = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(value));
+		try {
+			productData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(productData, 12);
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+		setProductDate(productData);
+	}
+
+	public void setPackagingByExcel(Object value) {
+		if (!StringUtils.isEmpty(value)) {
+			String packaging = value.toString();
+			Matcher matcher = chineseAndEnglishPattern.matcher(packaging);
+			if (!matcher.find()) {
+				addErrmsg(ErrorInfoConstant.PACKAGE_METHOD_INFO.getInfo());
+			}
+		} else {
+			addErrmsg(ErrorInfoConstant.PACKAGE_EMPTY_INFO.getInfo());
+		}
+		String packagingData = StringUtilB2C.replaceLineBreak(StringUtilB2C.getStr(value));
+		try {
+			packagingData = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(packagingData, 10);
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+		setPackaging(packagingData);
+	}
+
+	/**
+	 * 交期赋值逻辑较为复杂,在调用类进行赋值
+	 * @param minValue
+	 * @param maxValue
+	 */
+	public void setDeliveryByExcel(Object minValue, Object maxValue) {
+		setSelfMinDeliveryStr(StringUtilB2C.getStr(minValue));
+		setSelfMaxDeliveryStr(StringUtilB2C.getStr(maxValue));
+		if (StringUtils.isEmpty(minValue) && StringUtils.isEmpty(maxValue)) {
+			addErrmsg(ErrorInfoConstant.DELIVERY_EMPTY_INFO.getInfo());
+		}
+	}
+
+	public void setMinPackageByExcel(Object value) {
+		setMinPackageStr(StringUtilB2C.getStr(value));
+		if ((value != null) && (RegexConstant.isNumber(value.toString()))) {
+			Double minPackQty = Double.valueOf(value.toString());
+			if (minPackQty <= 0) {
+				// 输入负数,默认为1
+				setMinPackage(DoubleConstant.minReserve);
+			} else if (NumberUtil.compare(minPackQty, DoubleConstant.maxMinPackageQty) > 0) {
+				setMinPackage(DoubleConstant.maxMinPackageQty);
+			} else {
+				setMinPackage(minPackQty);
+			}
+		} else if (StringUtils.isEmpty(value)) {
+			setMinPackage(DoubleConstant.minReserve);
+		} else {
+			addErrmsg(ErrorInfoConstant.MIN_PACKAGE_INFO.getInfo());
+		}
+	}
+
+	public void setMinBuyQtyByExcel(Object value) {
+		setMinBuyQtyStr(StringUtilB2C.getStr(value));
+		if ((value != null) && (RegexConstant.isNumber(value.toString()))) {
+			Double minBuy = Double.valueOf(value.toString());
+			if (minBuy <= 0) {
+				setMinBuyQty(getMinPackage());
+			} else {
+				setMinBuyQty(minBuy);
+				if ((breakUp != null) && !breakUp && minPackage != null) {
+					double remainder = minBuy % minPackage;
+					if (NumberUtil.compare(remainder, 0.0) != 0) {
+						if (Double.compare(minBuy, minPackage) < 0) {
+							setMinBuyQty(minPackage);
+						} else {
+							setMinBuyQty(NumberUtil.sub(minBuy, remainder));
+						}
+					}
+				}
+			}
+		} else if (StringUtils.isEmpty(value)) {
+			setMinBuyQty(getMinPackage());
+		} else {
+			setMinBuyQty(getMinPackage());
+		}
+	}
+
+	public void setTagByExcel(Object value) {
+		String str = StringUtilB2C.getStr(value);
+		try {
+			if (!StringUtilB2C.isEmpty(str) && str.getBytes("GBK").length <= 20) {
+				setTag(str);
+			}
+			str = com.uas.platform.b2c.fa.payment.utils.StringUtils.cutOutString(str, 20);
+			setTagstr(str);
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(e + "指定字符集不支持");
+		}
+
+	}
+
+	@Override
+	public int hashCode() {
+		int result = brandNameEn.hashCode();
+		result = 31 * result + code.hashCode();
+		result = 31 * result + minBuyQtyStr.hashCode();
+		result = 31 * result + productDate.hashCode();
+		result = 31 * result + minPackageStr.hashCode();
+		result = 31 * result + packaging.hashCode();
+		result = 31 * result + selfMaxDeliveryStr.hashCode();
+		result = 31 * result + selfMinDeliveryStr.hashCode();
+		return result;
+	}
+
 	public Long getId() {
 		return id;
 	}
@@ -514,14 +748,6 @@ public class ReleaseProductByBatch implements Serializable {
 		this.code = code;
 	}
 
-	public String getComponentUuId() {
-		return componentUuId;
-	}
-
-	public void setComponentUuId(String componentUuId) {
-		this.componentUuId = componentUuId;
-	}
-
 	public String getUnit() {
 		return unit;
 	}
@@ -1247,8 +1473,24 @@ public class ReleaseProductByBatch implements Serializable {
 		return this;
 	}
 
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	public String getTagstr() {
+		return tagstr;
+	}
+
+	public void setTagstr(String tagstr) {
+		this.tagstr = tagstr;
+	}
+
 	/**
-	 * 设置结束量的String 值
+	 * 设置开始量的String 值
 	 * @param qty 结束值
 	 * @param i 分段的数值
 	 */
@@ -1286,4 +1528,13 @@ public class ReleaseProductByBatch implements Serializable {
 				break;
 		}
 	}
+
+	public String getComponentUuId() {
+		return componentUuId;
+	}
+
+	public ReleaseProductByBatch setComponentUuId(String componentUuId) {
+		this.componentUuId = componentUuId;
+		return this;
+	}
 }

+ 8 - 8
src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsHistoryService.java

@@ -25,6 +25,14 @@ public interface GoodsHistoryService {
      */
     GoodsHistory save(GoodsHistory goodsHistory);
 
+    /**
+     * 保存
+     *
+     * @param goodsHistories the goods history 历史记录
+     * @return goods history
+     */
+    List<GoodsHistory> save(List<GoodsHistory> goodsHistories);
+
     /**
      * 获取已下架产品历史记录
      *
@@ -85,14 +93,6 @@ public interface GoodsHistoryService {
      */
     ResultMap modifyGoodsHitory();
 
-    /**
-     * 通过库存初始化历史库存
-     * @param goods
-     * @return
-     */
-    GoodsHistory initByGoods(Goods goods, GoodsHistory.OperateType type);
-
-
     /**
      * 对比批次变化并记录批次改动信息
      *

+ 96 - 2
src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java

@@ -185,6 +185,20 @@ public interface GoodsService {
      */
     ResultMap updateGoods(Goods goods);
 
+    /**
+     * 将保存的信息上架
+     * @param id  需要上架信息的id
+     * @return
+     */
+    ResultMap putOn(Long id);
+
+    /**
+     * 添加上架的信息
+     * @param goods
+     * @return
+     */
+    ResultMap addGoods(Goods goods);
+
     /**
      * 批量更新/下架产品
      *
@@ -484,6 +498,16 @@ public interface GoodsService {
      */
     ResultMap getSimilarityProCount(String code, String batchCode);
 
+    /**
+     * 根据以下参数返回该自定义标签是否重复
+     *
+     * @param goodId 在售商品id
+     * @param productId 产品id
+     * @param tag 自定义标签
+     * @return
+     */
+    ResultMap getCountByTag(Long goodId, Long productId, String tag);
+
     /**
      * 批量获取相似商品的个数
      *
@@ -549,10 +573,80 @@ public interface GoodsService {
      */
     ResultMap updateGoodsRelateInfo(List<Order> orders, List<Cart> carts, List<GoodsBrowsingHistory> browsingHistoryList, Product product, ProductStandardPutOnInfo putOnInfo, GoodsHistory goodsHistory, Goods goods);
 
+    /**
+     * 获取库存的前面多少值
+     * @param length 长度的信息
+     * @return
+     */
+    List<Goods> maxReserveLimitLength(Integer length);
+
+    /**
+     * 根据产品id获取在售商品列表
+     * @param id
+     * @return
+     */
+    List<Goods> getGoodsByProductId(Long id);
+
+    /**
+     * 转为在售状态
+     * @param id
+     * @return
+     */
+    ResultMap turnToSale(Long id);
+
+    /**
+     * 是否被推荐
+     * @param id
+     * @return
+     */
+    ResultMap isRecommendGoods(Long id);
+
+    /**
+     * 删除库存信息
+     * @param id
+     * @return
+     */
+    Goods deleteGoods(Long id);
+
+
+    /**
+     * 批量删除
+     * @param goodses
+     * @return
+     */
+    List<Goods> deleteGoods(List<Goods> goodses);
+
+    /**
+     * 整理在售的信息
+     * @return
+     */
+    String arrangeGoods();
+
+    /**
+     * 根据storeId来查询非标数量
+     * @param storeUuid
+     * @return
+     */
+    int getNonstandardGoodsCount(String storeUuid);
+
     /**
      * 商品点击次数加一
-     * @param uuid
+     * @param batchCode
+     * @return
+     */
+    void addVisitCount(String batchCode);
+
+    /**
+     * 根据productid
+     * @param productid
+     */
+    ResultMap getDeleteProductMessage(Long
+                                              productid);
+
+    /**
+     * 修正测试的数据
+     *
      * @return
      */
-    public void addVisitCount(String batchCode);
+    String modifyData();
 }

+ 44 - 1
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java

@@ -11,6 +11,7 @@ import com.uas.platform.core.model.PageInfo;
 import org.springframework.data.domain.Page;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author yuj
@@ -35,7 +36,7 @@ public interface ProductService {
      * @param keyword the keyword
      * @return products
      */
-    List<Product> getProducts(String type, String keyword);
+    List<Goods> getProductsGoods(String type, String keyword);
 
     /**
      * 批量删除产品
@@ -82,6 +83,12 @@ public interface ProductService {
      */
     ResultMap updateMatch(String json);
 
+    /**
+     * 返回卖家标准和非标的数量
+     * @return
+     */
+    Map<String, Integer> getProductCount();
+
     /**
      * 保存对产品包装,包装数量,生产日期的修改
      *
@@ -120,6 +127,42 @@ public interface ProductService {
      */
     List<Product> save(List<Product> products);
 
+    /**
+     * 匹配非标商家版本
+     * @return
+     */
+    ResultMap matchNonStandardProduct();
+
+    /**
+     * 保存匹配信息
+     * @param json
+     * @return
+     */
+    ResultMap saveMatchInfo(String json);
+
+    /**
+     * 根据返回的信息更新在售信息
+     * @param beforeId 原产品id
+     * @param afterId 匹配的标准产品id
+     * @param idArray 要删除的Goods id列表
+     * @return
+     */
+    ResultMap updateInfoAfterChoose(Long beforeId, Long afterId, Long resultId, List<Long> idArray);
+
+    /**
+     *
+     * @param id 获取id
+     * @return List<Goods>
+     */
+    List<Goods> getGoodsByProductId(Long id);
+
+    /**
+     * 根据id获取信息
+     * @param id
+     * @return
+     */
+    Product getProductById(Long id);
+
     /**
      * 通过product id获取物料交易详情
      * @param id

+ 8 - 20
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsHistoryServiceImpl.java

@@ -50,6 +50,11 @@ public class GoodsHistoryServiceImpl implements GoodsHistoryService {
 		return goodsHistoryDao.save(goodsHistory);
 	}
 
+	@Override
+	public List<GoodsHistory> save(List<GoodsHistory> goodsHistories) {
+		return goodsHistoryDao.save(goodsHistories);
+	}
+
 	@Override
 	public Page<GoodsHistory> findPageByStatus(final PageInfo info, String keyword) {
 		if (StringUtils.hasText(keyword)) {
@@ -132,7 +137,9 @@ public class GoodsHistoryServiceImpl implements GoodsHistoryService {
 		goodsHistory.setOperateDate(new Date());
 		goodsHistory.setOperateUU(SystemSession.getUser().getUserUU());
 		goodsHistory.setOperateType(type);
-		goodsHistory.setMessage(compareGoodsHistory(goodsHistory));
+		if(GoodsHistory.OperateType.Update.getPhrase().equals(type)) {
+			goodsHistory.setMessage(compareGoodsHistory(goodsHistory));
+		}
 		return goodsHistory;
 	}
 
@@ -233,25 +240,6 @@ public class GoodsHistoryServiceImpl implements GoodsHistoryService {
 		return ResultMap.success(histories);
 	}
 
-
-	/**
-	 * 通过库存初始化历史库存
-	 *
-	 * @param goods
-	 * @param type
-	 * @return
-	 */
-	@Override
-	public GoodsHistory initByGoods(Goods goods, GoodsHistory.OperateType type) {
-		// 记录批此历史信息
-		GoodsHistory goodsHistory = new GoodsHistory(goods);
-		goodsHistory.setOperateUU(SystemSession.getUser().getUserUU());
-		goodsHistory.setOperateType(GoodsHistory.OperateType.Update.getPhrase());
-		goodsHistory.setOperateDate(new Date());
-		goodsHistory.setMessage(compareGoodsHistory(goodsHistory));
-		return goodsHistory;
-	}
-
 	/**
 	 * 对比批次变化并记录批次改动信息
 	 *

File diff suppressed because it is too large
+ 466 - 352
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java


+ 8 - 8
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductImportHistServiceImpl.java

@@ -1,10 +1,9 @@
 package com.uas.platform.b2c.prod.commodity.service.impl;
 
+import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.prod.commodity.dao.ProductImportHistDao;
-import com.uas.platform.b2c.prod.commodity.service.ProductImportHistService;
 import com.uas.platform.b2c.prod.commodity.model.ProductImportHist;
-import com.uas.platform.b2c.core.support.SystemSession;
-import com.uas.platform.b2c.core.constant.SplitChar;
+import com.uas.platform.b2c.prod.commodity.service.ProductImportHistService;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
@@ -51,15 +50,15 @@ public class ProductImportHistServiceImpl implements ProductImportHistService {
             ProductImportHist hist = importHists.get(0);
             String uploadNum = hist.getUploadNum();
             productImportHistDao.save(importHists);
-            productImportHistDao.validProductImportInfo(uploadNum, SystemSession.getUser().getEnterprise().getUu());
-            Integer integer = productImportHistDao.importToProRepository(uploadNum);
+//            productImportHistDao.validProductImportInfo(uploadNum, SystemSession.getUser().getEnterprise().getUu());
+//            Integer integer = productImportHistDao.importToProRepository(uploadNum);
             //导入失败的条数(重复记录,信息缺失)
             List<Integer> importFailure = new ArrayList<>();
             Collections.addAll(importFailure, ProductImportHist.ProductImportStatus.INFO_PARTIAL.getCode(), ProductImportHist.ProductImportStatus.INFO_DUPLICATE.getCode());
             Integer failureC = productImportHistDao.getCountProductImport(uploadNum, importFailure);
             map.put("importError", failureC);
             //匹配成功的条数
-            map.put("success", integer);
+//            map.put("success", integer);
             map.put("uploadNum", uploadNum);
         }
         return map;
@@ -102,8 +101,9 @@ public class ProductImportHistServiceImpl implements ProductImportHistService {
         if(StringUtils.isEmpty(uploadNum)) {
             return  ResultMap.success(0);
         }
-        Integer integer = productImportHistDao.importToProRepository(uploadNum);
-        return ResultMap.success(integer);
+        // 该功能被弃用
+//        Integer integer = productImportHistDao.importToProRepository(uploadNum);
+        return ResultMap.success(0);
     }
 
     /**

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

@@ -4,13 +4,16 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.advertise.ad.service.RecommendProductService;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
+import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.IntegerConstant;
+import com.uas.platform.b2c.core.constant.ShortConstant;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.prod.commodity.dao.*;
 import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.prod.commodity.service.GoodsHistoryService;
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.commodity.service.ProductService;
 import com.uas.platform.b2c.prod.commodity.type.ProductConstant;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
@@ -22,10 +25,16 @@ import com.uas.platform.b2c.prod.product.component.modal.ComponentSubmit;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
 import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
 import com.uas.platform.b2c.trade.order.model.Order;
+import com.uas.platform.b2c.trade.order.model.OrderDetail;
 import com.uas.platform.b2c.trade.order.model.Purchase;
 import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
 import com.uas.platform.b2c.trade.order.service.OrderDetailService;
 import com.uas.platform.b2c.trade.order.service.OrderService;
+import com.uas.platform.b2c.trade.order.status.OrderStatus;
+import com.uas.platform.b2c.trade.presale.dao.CartDao;
+import com.uas.platform.b2c.trade.presale.dao.GoodsBrowsingHistoryDao;
+import com.uas.platform.b2c.trade.presale.model.Cart;
+import com.uas.platform.b2c.trade.presale.model.GoodsBrowsingHistory;
 import com.uas.platform.b2c.trade.presale.service.CartService;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
@@ -49,6 +58,7 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.jdbc.core.CallableStatementCallback;
 import org.springframework.jdbc.core.CallableStatementCreator;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.StatementCallback;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
@@ -59,8 +69,9 @@ import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.lang.reflect.Field;
 import java.sql.CallableStatement;
-import java.sql.Connection;
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -93,6 +104,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private GoodsDao goodsDao;
 
+    @Autowired
+    private CartDao cartDao;
+
     @Autowired
     private ProductModifyHistoryDao productModifyHistoryDao;
 
@@ -111,6 +125,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private CartService cartService;
 
+    @Autowired
+    private GoodsBrowsingHistoryDao goodsBrowsingHistoryDao;
+
     @Autowired
     private OrderDetailService orderDetailService;
 
@@ -129,20 +146,30 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private EnterpriseService enterpriseService;
 
+    @Autowired
+    private SysConf sysConf;
+
+    @Autowired
+    private ProductMatchResultDao productMatchResultDao;
+
+    @Autowired
+    private GoodsService goodsService;
+
     private ConcurrentHashMap<String, Field> sortFields = new ConcurrentHashMap<String, Field>();
 
     @Override
     public Page<Product> getAllProducts(final PageInfo page, String keyword, String type) {
-        page.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
-        if(StringUtils.isEmpty(type)) {
-            type = "all";
+        page.expression(PredicateUtils.eq("enUU", SystemSession.getUser().getEnterprise().getUu(), true));
+        if (StringUtils.isEmpty(type)) {
+            type = "nStandard";
         }
-        if(type.contains("standard")) {
+        if (type.contains("standard")) {
             page.filter("standard", (short)1);
-//            page.filter("b2cEnabled", (short) 1);
-        }else if(type.contains("nStandard")){
+            page.filter("b2cEnabled", (short) 1);
+        } else if (type.contains("nStandard")) {
             page.filter("standard", (short)0);
-        }else if(type.contains("all")) {
+            page.filter("b2cEnabled", (short) 1);
+        } else if (type.contains("all")) {
             SimpleExpression[] arr = new SimpleExpression[2];
             arr[0] = PredicateUtils.eq("b2cEnabled", (short) 1, false);
             arr[1] = PredicateUtils.eq("standard", (short) 1, false);
@@ -151,16 +178,16 @@ public class ProductServiceImpl implements ProductService {
             page.orExpression(standard);
             page.orExpression(logicalExpression);
             page.sorting("standard", Sort.Direction.DESC);
-
         }
 
         if (StringUtils.hasText(keyword)) {
             SimpleExpression code = PredicateUtils.like("prodNum", keyword, true);
+            SimpleExpression kind = PredicateUtils.like("kind", keyword, true);
             SimpleExpression brandEn = PredicateUtils.like("pbranden", keyword, true);
             SimpleExpression cmpCode = PredicateUtils.like("pcmpcode", keyword, true);
-            SimpleExpression[] expressions2 = new SimpleExpression[]{code, brandEn, cmpCode};
-            LogicalExpression logicalExpression2 = PredicateUtils.or(expressions2);
-            page.expression(logicalExpression2);
+            SimpleExpression[] expressions4 = new SimpleExpression[]{code, kind, brandEn, cmpCode};
+            LogicalExpression logicalExpression4 = PredicateUtils.or(expressions4);
+            page.expression(logicalExpression4);
         }
 
         Page<Product> productPage = productDao.findAll(new Specification<Product>() {
@@ -184,29 +211,31 @@ public class ProductServiceImpl implements ProductService {
     }
 
     @Override
-    public List<Product> getProducts(String type, String keyword) {
+    public List<Goods> getProductsGoods(String type, String keyword) {
         final PageInfo page = new PageInfo();
         page.setPageNumber(1);
         page.setPageSize(10);
 
         List<Product> products = new ArrayList<Product>();
         page.filter("enUU", SystemSession.getUser().getEnterprise().getUu());
-        if(StringUtils.isEmpty(type)) {
-            type = "all";
-        }
-        if(type.contains("standard")) {
-            page.filter("standard", (short)1);
-        }else if(type.contains("nStandard")){
-            page.filter("standard", (short)0);
-        }
-        if(StringUtils.hasText(keyword)) {
-            SimpleExpression code = PredicateUtils.like("kind", keyword, true);
-            SimpleExpression brandEn = PredicateUtils.like("pbranden", keyword, true);
-            SimpleExpression cmpCode = PredicateUtils.like("pcmpcode", keyword, true);
-            SimpleExpression[] expressions2 = new SimpleExpression[] {code, brandEn, cmpCode};
-            LogicalExpression logicalExpression2 = PredicateUtils.or(expressions2);
-            page.expression(logicalExpression2);
-        }
+        page.filter("b2cEnabled", com.uas.platform.b2c.prod.commodity.constant.IntegerConstant.YES_INT);
+        //产品部要求导出是非标和标准全部导出,先注释这条代码
+//        if(StringUtils.isEmpty(type)) {
+//            type = "all";
+//        }
+//        if(type.contains("standard")) {
+//            page.filter("standard", (short)1);
+//        }else if(type.contains("nStandard")){
+//            page.filter("standard", (short)0);
+//        }
+//        if(StringUtils.hasText(keyword)) {
+//            SimpleExpression code = PredicateUtils.like("kind", keyword, true);
+//            SimpleExpression brandEn = PredicateUtils.like("pbranden", keyword, true);
+//            SimpleExpression cmpCode = PredicateUtils.like("pcmpcode", keyword, true);
+//            SimpleExpression[] expressions2 = new SimpleExpression[] {code, brandEn, cmpCode};
+//            LogicalExpression logicalExpression2 = PredicateUtils.or(expressions2);
+//            page.expression(logicalExpression2);
+//        }
         products = productDao.findAll(new Specification<Product>() {
             @Override
             public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
@@ -214,13 +243,32 @@ public class ProductServiceImpl implements ProductService {
             return null;
             }
         });
+        //先按照id降序排列
         Collections.sort(products, new Comparator<Product>() {
             @Override
             public int compare(Product o1, Product o2) {
-                return o2.getId().compareTo(o1.getId());
+                return (o2.getId().compareTo(o1.getId()));
             }
         });
-        return products;
+        //后面按照非标与标准排列
+        Collections.sort(products, new Comparator<Product>() {
+            @Override
+            public int compare(Product o1, Product o2) {
+                return o2.getStandard().compareTo(o1.getStandard());
+            }
+        });
+        List<Goods> goodses = new ArrayList<>();
+        for (Product product : products) {
+            System.out.println(product.getId() + " -" + product.getStandard());
+            List<Goods> goodses1 = goodsDao.findByProductIdOrderByGoodsId(product.getId());
+            if(goodses1.size() > 0) {
+                goodses.addAll(goodses1);
+            }else {
+                Goods g = Goods.productConvertGoods(product);
+                goodses.add(g);
+            }
+        }
+        return goodses;
     }
 
     @Override
@@ -229,11 +277,38 @@ public class ProductServiceImpl implements ProductService {
             Product product = productDao.findOne(id);
             if (product == null)
                 throw new IllegalOperatorException("选择的产品不存在,请重新选择");
-            try {
-                productDao.delete(id);
-            } catch (Exception e) {
-                throw new IllegalOperatorException("该产品可能已经被商务平台其他单据引用,无法删除");
-            }
+                //查看是否存在正常未取消的订单
+                List<Goods> goodses = goodsDao.findByProductId(product.getId());
+                Boolean isExistOrder = false;
+                String codes = OrderStatus.UNAVAILABLE.getCodes() + "-" + Status.TOBECONFIRMED.value();
+                for (Goods goods : goodses) {
+                    List<OrderDetail> orderList = orderDetailService.findOrderDetailByBatchCode(goods.getBatchCode());
+                    for (OrderDetail detail : orderList) {
+                        Order order = detail.getOrder();
+                        int status = order.getStatus() == null ? detail.getStatus() : order.getStatus();
+                        if (codes.indexOf(String.valueOf(status)) < 0) {
+                            // 区分是否是假单,or_orderids 不为空
+                           if (StringUtils.isEmpty(order.getOrderids())) {
+                               isExistOrder = true;
+                               break;
+                           }
+
+                        }
+                    }
+                    if (isExistOrder) {
+                       break;
+                    }
+                }
+                if (!isExistOrder) {
+                    //删除外键关联的匹配结果列表,不然删除product失败
+                    Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
+                    productMatchResultDao.delete(productMatchResultSet);
+                    goodsService.deleteGoods(goodses);
+                    productDao.delete(id);
+                } else {
+                    throw new
+                            IllegalOperatorException("该产品中存在已下单的在售产品信息,不能删除");
+                }
         }
     }
 
@@ -254,10 +329,44 @@ public class ProductServiceImpl implements ProductService {
             standard = IntegerConstant.NO_SHORT;
         }
         List<Product> products = productDao.findProductByEnuuAndStandard(uu, standard);
+        Set<String> uuids = new HashSet<>();
         for (Product product : products) {
             try {
-                productDao.delete(product);
-                success++;
+                //查看是否存在正常未取消的订单
+                List<Goods> goodses = goodsDao.findByProductId(product.getId());
+                Boolean isExistOrder = false;
+                String codes = OrderStatus.UNAVAILABLE.getCodes() + "-" + Status.TOBECONFIRMED.value();
+                for (Goods goods : goodses) {
+                    List<OrderDetail> orderList = orderDetailService.findOrderDetailByBatchCode(goods.getBatchCode());
+                    for (OrderDetail detail : orderList) {
+                        Order order = detail.getOrder();
+                        Integer status = order.getStatus() == null ? detail.getStatus() : order.getStatus();
+                        if(codes.indexOf(String.valueOf(status)) < 0) {
+                            //防止虚拟单据
+                            if (StringUtils.isEmpty(order.getOrderids())) {
+                                isExistOrder = true;
+                                break;
+                            }
+
+                        }
+                    }
+                    if(isExistOrder) {
+                        break;
+                    }
+                }
+                if(!isExistOrder) {
+                    //删除外键关联的匹配结果列表,不然删除product失败
+                    Set<ProductMatchResult> productMatchResultSet =  product.getMatchresults();
+                    productMatchResultDao.delete(productMatchResultSet);
+                    goodsService.deleteGoods(goodses);
+                    productDao.delete(product.getId());
+                    if (!StringUtils.isEmpty(product.getCmpUuId())) {
+                        uuids.add(product.getCmpUuId());
+                    }
+                    success++;
+                }else {
+                    fail++;
+                }
             } catch (Exception e) {
                 fail++;
             }
@@ -278,6 +387,9 @@ public class ProductServiceImpl implements ProductService {
         if((products.size() != 0) && (products.size() ==  fail.intValue())) {
             status = CodeType.ERROR_STATE.code();
         }
+        for (String uuid : uuids) {
+            goodsService.updateComponentTradeInfos(uuid);
+        }
         return new ResultMap(status, message);
     }
 
@@ -320,23 +432,26 @@ public class ProductServiceImpl implements ProductService {
 
     @Override
     public Integer matchAll() {
-//        jdbcTemplate.execute("call TRADE_UPDATE_AVAILABLE_DAYS(" + SystemSession.getUser().getEnterprise().getUu() + ")");
-        Integer updateCount = (Integer) jdbcTemplate.execute(
-            new CallableStatementCreator() {
-                public CallableStatement createCallableStatement(Connection con) throws SQLException {
-                    String sp = "{call vendor_match_products(?,?)}";
-                    CallableStatement cs = con.prepareCall(sp);
-                    cs.setLong(1, SystemSession.getUser().getEnterprise().getUu());
-                    cs.registerOutParameter(2, OracleType.STYLE_INT);
-                    return cs;
-                }
-            }, new CallableStatementCallback() {
-                public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
-                    cs.execute();
-                    return cs.getInt(2);
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        String sql = "/*#mycat:db_type=master*/ call vendor_match_products(%s, @out); select @out";
+        final String querySql = String.format(sql, enuu);
+        String updateCount = jdbcTemplate.execute(new StatementCallback<String>() {
+
+            @Override
+            public String doInStatement(Statement stmt) throws SQLException, DataAccessException {
+                stmt.executeQuery(querySql);
+                ResultSet rs = stmt.getResultSet();
+                if (rs != null) {
+                    rs.next();
+                    return rs.getString(1);
                 }
-            });
-        return updateCount;
+                return null;
+            }
+        });
+        if (StringUtils.isEmpty(updateCount)) {
+            return 0;
+        }
+        return Integer.valueOf(updateCount);
     }
 
 
@@ -368,7 +483,11 @@ public class ProductServiceImpl implements ProductService {
         }
         Integer num = null;
         if (flag) {
-            String result = productDao.upateResultByEnuuForB2C(SystemSession.getUser().getEnterprise().getUu());
+            /**
+             * 目前 测试没有这个存储过程,暂时注释掉这个代码
+             */
+            //String result = productDao.upateResultByEnuuForB2C(SystemSession.getUser().getEnterprise().getUu());
+            String result = "0";
             if (StringUtils.isEmpty(result)) {
                 map.put("size", 0);
                 map.put("redundance", 0);
@@ -480,6 +599,68 @@ public class ProductServiceImpl implements ProductService {
         return "success";
     }
 
+    /**
+     * 一键匹配非标产品,并带出该型号匹配的器件信息
+     * @return
+     */
+    @Override
+    public ResultMap matchNonStandardProduct(){
+        Map<String, Object> map = new HashMap<>();
+        final Long uu = SystemSession.getUser().getUserUU();
+        final Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        ProductStoreStatus status = productStoreStatusDao.findByEnuu(enUU);
+        if (status != null) {
+            // 有人正在操作这张单据,不能进行操作
+            if (status.getStatus().equals(Status.RUNNING.value())) {
+                Date date = new Date();
+                long l = date.getTime() - status.getDate().getTime();
+                if (l > 600000) {
+                    status.setStatus(Status.FINISH.value());
+                } else {
+                    return new ResultMap(CodeType.NOT_PERMIT, "当前有人正在进行匹配操作,无法进行匹配");
+                }
+            } else {
+                status.setStatus(Status.RUNNING.value());
+                status = productStoreStatusDao.save(status);
+            }
+        } else {
+            ProductStoreStatus storeStatus = new ProductStoreStatus();
+            storeStatus.setDate(new Date());
+            storeStatus.setEnuu(SystemSession.getUser().getEnterprise().getUu());
+            storeStatus.setUseruu(SystemSession.getUser().getUserUU());
+            storeStatus.setStatus(Status.RUNNING.value());
+            status = productStoreStatusDao.save(storeStatus);
+        }
+
+        int total = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
+        int success = 0;
+        int fail = 0;
+
+        String sql = "/*#mycat:db_type=master*/ call PRODUCT_MATCHES_V1(%s, %s, @out); select @out";
+        final String formatSql = String.format(sql, enUU, uu);
+        success = jdbcTemplate.execute(new StatementCallback<Integer>() {
+            @Override
+            public Integer doInStatement(Statement statement) throws SQLException, DataAccessException {
+                statement.execute(formatSql);
+                ResultSet rs = statement.getResultSet();
+                if (null != rs) {
+                    rs.next();
+                    return rs.getInt(1);
+                }
+                return 0;
+            }
+        });
+        fail = total - success;
+
+        status.setStatus(Status.FINISH.value());
+        productStoreStatusDao.save(status);
+        map.put("total", total);
+        map.put("fail", fail);
+        map.put("success", success);
+
+        return ResultMap.success(map);
+    }
+
     /**
      * 根据标准上架信息 保存对产品包装,包装数量,生产日期的修改
      *
@@ -503,6 +684,263 @@ public class ProductServiceImpl implements ProductService {
         return product;
     }
 
+    /**
+     * 保存匹配的信息
+     * @param json
+     * @return
+     */
+    @Override
+    public ResultMap saveMatchInfo(String json){
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        if (StringUtils.isEmpty(json)) {
+            return new ResultMap(CodeType.NO_INFO, "传入的信息为空");
+        }
+        JSONObject object = FastjsonUtils.fromJson(json, JSONObject.class);
+        Long matchId = object.getLong("matchId");
+        Long detailId = object.getLong("detailId");
+        if (StringUtils.isEmpty(matchId) || StringUtils.isEmpty(detailId)) {
+            return new ResultMap(CodeType.NO_INFO, "匹配参数丢失,刷新后重新");
+        }
+        Product product = productDao.findOne(matchId);
+        if (product == null) {
+            return new ResultMap(CodeType.NOT_EXiST, "匹配产品不存在");
+        }
+        ProductMatchResult result = productMatchResultDao.findOne(detailId);
+        if (result == null) {
+            return new ResultMap(CodeType.NO_INFO, "匹配结果信息丢失");
+        }
+        List<Product> standardList = productDao.findProductByPcmpcodeAndPbrandenAndEnUUAndStandard(result.getCmpcode(), result.getBranden(), enUU, IntegerConstant.YES_SHORT);
+        Product standardProduct = null;
+        if (!CollectionUtils.isEmpty(standardList)) {
+            standardProduct = standardList.get(0);
+        }
+        List<List<Goods>> repeatList = new ArrayList<>();
+        // 已有对应标准信息,需要判断在售商品是否重复
+        if (standardProduct != null) {
+            repeatList = getRepeatGoodsList(matchId, standardProduct.getId());
+        }
+        // 已有重复需要用户排除重复
+        if (!CollectionUtils.isEmpty(repeatList) && standardProduct != null) {
+            Map<String, Object> resultMap = new HashMap<>();
+            resultMap.put("repeatList", repeatList);
+            final Product item = standardProduct;
+            Object brandAndCode = new Object() {
+                private String brandEn = item.getPbranden();
+                private String code = item.getPcmpcode();
+
+				public String getCode() {
+					return code;
+				}
+				public String getBrandEn() {
+					return brandEn;
+				}
+			};
+            resultMap.put("brandAndCode", brandAndCode);
+            resultMap.put("beforeId", matchId);
+            resultMap.put("afterId", standardProduct.getId());
+            resultMap.put("resultId", result.getId());
+            return ResultMap.success(resultMap);
+        }
+
+        Product afterProduct = updateProductAfterMatch(product, result);
+        if (standardProduct == null) {
+            standardProduct = afterProduct;
+        } else {
+            afterProduct.setB2cEnabled(IntegerConstant.NO_SHORT);
+            afterProduct.setBatchCount(0);
+        }
+        productDao.save(afterProduct);
+        updateInfoAfterTurnStandard(matchId, standardProduct);
+        return ResultMap.success(null);
+    }
+
+    @Override
+    public ResultMap updateInfoAfterChoose(Long beforeId, Long afterId, Long resultId, List<Long> idArray) {
+        List<GoodsHistory> goodsHistoryList = new ArrayList<>(idArray.size());
+        GoodsHistory goodsHist = null;
+        for (Long id : idArray) {
+            Goods goods = goodsDao.findOne(id);
+            goodsHist = goodsHistoryService.converTGoodsHist(goods,
+                    GoodsHistory.OperateType.DELETE_FOR_REPEAT.getPhrase());
+            goodsHist.setMessage(goodsHist.getMessage() + "匹配后因为重复删除");
+            goodsHistoryList.add(goodsHist);
+            goodsDao.delete(id);
+        }
+        goodsHistoryDao.save(goodsHistoryList);
+        Product beforeProduct = productDao.findOne(beforeId);
+        beforeProduct.setB2cEnabled(IntegerConstant.NO_SHORT);
+        ProductMatchResult result = productMatchResultDao.findOne(resultId);
+        if (result == null) {
+            return new ResultMap(CodeType.NO_INFO, "匹配结果信息丢失");
+        }
+        Product standardProduct = updateProductAfterMatch(beforeProduct, result);
+        productDao.save(standardProduct);
+
+        Product afterProduct = productDao.findOne(afterId);
+        updateInfoAfterTurnStandard(beforeId, afterProduct);
+        return ResultMap.success(null);
+    }
+
+    /**
+     * 更新匹配后的产品库信息
+     * @param product 更新的产品
+     * @param result 匹配的结果
+     * @return
+     */
+    private Product updateProductAfterMatch(Product product, ProductMatchResult result) {
+        product.setPbrand(result.getBrandcn());
+        product.setPbranden(result.getBranden());
+        product.setPbrandid(result.getBrid());
+        product.setPbranduuid(result.getPbranduuid());
+        product.setPcmpcode(result.getCmpcode());
+        product.setCmpUuId(result.getUuid());
+        product.setKind(result.getKindcn());
+        product.setKinden(result.getKinden());
+        product.setKindid(result.getKindid());
+        product.setStandard(1);
+        product.setTostandard(new Date());
+        if (product.getEncapsulation() == null) {
+            product.setEncapsulation(result.getEncapsulation());
+        }
+        product.setCmpImg(result.getImg());
+
+        return product;
+    }
+
+    /**
+     * 匹配标准后更新相关信息
+     * @param oldId 匹配前产品id
+     * @param product 匹配后的product
+     */
+    private void updateInfoAfterTurnStandard(Long oldId, Product product){
+        List<Goods> goodsList = goodsDao.findByProductId(oldId);
+        List<GoodsHistory> historyList = new ArrayList<>();
+        List<Goods> saveList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(goodsList)) {
+            for (Goods goods : goodsList) {
+                updateGoodsInfo(goods, product);
+                GoodsHistory goodsHist = goodsHistoryService.converTGoodsHist(goods,
+                        GoodsHistory.OperateType.Modifying.getPhrase());
+                //更新购物车信息
+                List<Cart> cartList = cartDao.findCartByBatch(goods.getBatchCode());
+                updateCartsInfo(goods, cartList);
+                //更新浏览历史
+                List<GoodsBrowsingHistory> historyByBatch = goodsBrowsingHistoryDao.findGoodsBrowsingHistoryByBatch(goods.getBatchCode());
+                updateBrowsingHistory(goods, historyByBatch);
+
+                saveList.add(goods);
+                historyList.add(goodsHist);
+                cartDao.save(cartList);
+                goodsBrowsingHistoryDao.save(historyByBatch);
+            }
+        }
+        goodsDao.save(saveList);
+        product.setBatchCount(product.getBatchCount() + saveList.size());
+        productDao.save(product);
+        goodsHistoryDao.save(historyList);
+    }
+
+    /**
+     * 获取重复的在售商品列表
+     * @param oldId 原来的goods列表
+     * @param productId 匹配后的产品Id
+     * @return
+     */
+    private List<List<Goods>> getRepeatGoodsList(Long oldId, Long productId) {
+        List<Goods> oldList = goodsDao.findByProductId(oldId);
+        List<List<Goods>> resultList = new ArrayList<>();
+        List<Goods> addList = null;
+        for (Goods goods : oldList) {
+            List<Goods> goodsList = goodsDao.findRepeatGoodsInProductId(productId, goods.getProduceDate(),
+                    goods.getPackaging(), goods.getMinPackQty(), goods.getMinBuyQty(), goods.getMaxDelivery(),
+                    goods.getMinDelivery(), goods.getUnit());
+            if (!CollectionUtils.isEmpty(goodsList)) {
+                addList = new ArrayList<>();
+                Goods sameGoods = goodsList.get(0);
+                if (sameGoods.getStoreid().equals(sysConf.getStoreid())) {
+                    sameGoods.setSelfSale("寄售");
+                } else {
+                    sameGoods.setSelfSale("自营");
+                }
+                addList.add(sameGoods);
+
+                if (goods.getStoreid().equals(sysConf.getStoreid())) {
+                    goods.setSelfSale("寄售");
+                } else {
+                    goods.setSelfSale("自营");
+                }
+                addList.add(goods);
+                resultList.add(addList);
+            }
+        }
+        return resultList;
+    }
+
+    /**
+     * 更新浏览历史信息
+     * @param goods
+     * @param historyByBatch
+     */
+    private void updateBrowsingHistory(Goods goods, List<GoodsBrowsingHistory> historyByBatch) {
+        for (GoodsBrowsingHistory gb : historyByBatch) {
+            gb.setCode(goods.getCode());
+            gb.setKindNameCn(goods.getKindNameCn());
+            gb.setBrandNameCn(goods.getBrandNameCn());
+            gb.setBrandNameEn(goods.getBrandNameEn());
+            gb.setImg(goods.getImg());
+        }
+    }
+
+    /**
+     * 更新GoodsHistory信息
+     */
+    private void updateGoodsHistoryInfo(Goods goods, List<GoodsHistory> history) {
+        for (GoodsHistory gh : history) {
+            gh.setCode(goods.getCode());
+            gh.setUuid(goods.getUuid());
+            gh.setKindNameCn(goods.getKindNameCn());
+            gh.setImg(goods.getImg());
+            gh.setBranduuid(goods.getBranduuid());
+            gh.setKindNameCn(goods.getKindNameCn());
+            gh.setKindUuid(goods.getKindUuid());
+            gh.setBrandNameCn(goods.getBrandNameCn());
+            gh.setBrandNameEn(goods.getBrandNameEn());
+            gh.setBranduuid(goods.getBranduuid());
+            gh.setBrandid(goods.getBrandid());
+        }
+    }
+
+    /**
+     *
+     * @param goods
+     * @param cartList
+     */
+    private void updateCartsInfo(Goods goods, List<Cart> cartList) {
+        for (Cart cart : cartList){
+            cart.setCode(goods.getCode());
+            cart.setBrName(goods.getBrandNameEn());
+            cart.setKiName(goods.getKindNameCn());
+            cart.setImg(goods.getImg());
+        }
+    }
+
+    /**
+     * 更新在售信息
+     */
+    private void updateGoodsInfo(Goods goods, Product product) {
+        goods.setProductid(product.getId());
+        goods.setProdNum(product.getProdNum());
+        goods.setUuid(product.getCmpUuId());
+        goods.setCode(product.getPcmpcode());
+        goods.setImg(product.getCmpImg());
+        goods.setKindUuid(product.getKindid());
+        goods.setKindNameCn(product.getKind());
+        goods.setBrandNameCn(product.getPbrand());
+        goods.setBrandNameEn(product.getPbranden());
+        goods.setBrandid(product.getPbrandid());
+        goods.setBranduuid(product.getPbranduuid());
+    }
+
     /**
      * 用户选择对应的品牌和类目,更新非标产品为标准产品
      * @param json
@@ -719,5 +1157,39 @@ public class ProductServiceImpl implements ProductService {
 
         return productDetailDao.save(productDetail);
     }
+
+    @Override
+    public Map<String, Integer> getProductCount() {
+        Map<String, Integer> resultMap = new HashMap<>();
+        Long enUU = SystemSession.getUser().getEnterprise().getUu();
+        if (enUU == null){
+            throw new IllegalOperatorException("店铺信息丢失,请刷新后重试");
+        }
+        int standard = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.YES_SHORT, IntegerConstant.YES_SHORT);
+        int nStandard = productDao.getCountByEnuuAndStatusAndEnabled(enUU, ShortConstant.NO_SHORT, IntegerConstant.YES_SHORT);
+        resultMap.put("standard", standard);
+        resultMap.put("nStandard", nStandard);
+        return resultMap;
+    }
+
+    @Override
+    public List<Goods> getGoodsByProductId(Long id) {
+        return goodsService.getGoodsByProductId(id);
+    }
+
+    /**
+     * 根据id获取信息
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public Product getProductById(Long id) {
+        if(id == null) {
+            return null;
+        }else {
+            return productDao.findOne(id);
+        }
+    }
 }
 

File diff suppressed because it is too large
+ 490 - 355
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java


+ 84 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/task/CommodityTask.java

@@ -0,0 +1,84 @@
+package com.uas.platform.b2c.prod.commodity.task;
+
+import com.uas.platform.b2c.advertise.ad.service.FloorsService;
+import com.uas.platform.b2c.advertise.ad.service.RecommendProductService;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.StatementCallback;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.*;
+
+/**
+ * 库存的自动任务
+ *
+ * @author yuj 2017-11-02 14:33
+ */
+@Component("CommodityTask")
+public class CommodityTask {
+
+    private final GoodsDao goodsDao;
+
+    private final FloorsService floorsService;
+
+    private final GoodsHistoryDao goodsHistoryDao;
+
+    private final RecommendProductService recommendProductService;
+
+    private final JdbcTemplate jdbcTemplate;
+
+    @Autowired
+    public CommodityTask(GoodsDao goodsDao, FloorsService floorsService, GoodsHistoryDao goodsHistoryDao, RecommendProductService recommendProductService, JdbcTemplate jdbcTemplate) {
+        this.goodsDao = goodsDao;
+        this.floorsService = floorsService;
+        this.goodsHistoryDao = goodsHistoryDao;
+        this.recommendProductService = recommendProductService;
+        this.jdbcTemplate = jdbcTemplate;
+    }
+
+    @Transactional
+    public void autoDownOverDueCommodity() {
+        HashMap map = new HashMap<String, List<String>>();
+        // 设置订单的延长时间
+        goodsDao.updateCommodityAvailableDay();
+        // 自动下架的存储过程
+        List<String> list = jdbcTemplate.execute(new StatementCallback<List<String>>() {
+            @Override
+            public List<String> doInStatement(Statement stmt) throws SQLException, DataAccessException {
+                ResultSet rs = stmt.executeQuery("call trade_auto_down_goods()");
+                List<String> list = new ArrayList<>();
+                if (rs != null) {
+                    while (rs.next()) {
+                        list.add(rs.getString(1));
+                    }
+                }
+                return list;
+            }
+        });
+        //更新首页的信息
+        for (String bathcode : list) {
+            floorsService.updateHomeInfo(bathcode);
+            Goods goods = goodsDao.findByBatchCode(bathcode);
+            Set<String> baList = (Set<String>)map.get(goods.getStoreid());
+            if(CollectionUtils.isEmpty(baList)) {
+                baList = new HashSet<>();
+            }
+            baList.add(bathcode);
+            map.put(goods.getStoreid(), baList);
+        }
+
+       for(Object obj : map.keySet()) {
+           String storeid = (String) obj;
+           recommendProductService.deleteProductsWhenSellerUpdateReserve(storeid, (Set<String>)map.get(storeid));
+       }
+    }
+}

+ 24 - 0
src/main/java/com/uas/platform/b2c/prod/product/brand/api/BrandController.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.brand.api;
 
+import com.uas.platform.b2c.core.support.log.ControllerUsageLog;
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandMostSimpleInfo;
@@ -109,6 +110,19 @@ public class BrandController {
 		return brandService.getBrandInfoPage(info, keyword);
 	}
 
+	/**
+	 * 查找所有详细有效品牌信息
+	 * @param keyword 关键词
+	 * @param params
+	 *            分页信息
+	 * @return 品牌简易信息
+	 */
+	@RequestMapping(value = "/Brand/ByPage", method = RequestMethod.GET)
+	public Map<String,Object> getBrandPage(PageParams params, String keyword) {
+		PageInfo info = new PageInfo(params);
+		return brandService.getBrandPage(info, keyword);
+	}
+
 	/**
 	 * 查找所有简单有效品牌信息,并按首字母过滤
 	 * @param keyword 关键词
@@ -230,4 +244,14 @@ public class BrandController {
 	public List<BrandMostSimpleInfo> getBatchBrands(@RequestBody List<Long> batchIds) {
 		return brandService.getBatchBrandMostSimpleInfs(batchIds);
 	}
+
+	/**
+	 * 获取搜索量最高的2个品牌
+	 * @return 品牌信息
+	 */
+	@RequestMapping(value = "/mostSearchBrands", method = RequestMethod.GET)
+	@ControllerUsageLog(module = "品牌查询接口", detail = "获取搜索量最高的2个品牌")
+	public List<Brand> getMostSearchBrands() {
+		return brandService.getMostSearchBrands();
+	}
 }

+ 24 - 7
src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java

@@ -74,20 +74,37 @@ public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository
 	public List<Brand> findByUpperNameCn(@Param("nameCn") String nameCn);
 
 	/**
-	 * 分页根据首字母获取品牌信息
-	 * @param initals
+	 * 品牌点击次数加一
+	 * @param uuid
 	 * @return
 	 */
-	@Query(value = "select b from Brand b  where b.inital in :initals and (b.nameEn like %:keyword% or b.nameCn like %:keyword%)")
-	public Page<Brand> findInInitalsPage(@Param("initals") String[] initals ,@Param("keyword") String keyword, Pageable pageable);
+	@Modifying
+	@Transactional
+	@Query( nativeQuery = true, value = "update product$brand b set b.br_visit_count = ifnull(b.br_visit_count, 0) + 1 where b.br_uuid = :uuid")
+	public void addVisitCount(@Param("uuid") String uuid);
 
 	/**
-	 * 器件点击次数加一
+	 * 品牌搜索次数加一
 	 * @param uuid
 	 * @return
 	 */
 	@Modifying
 	@Transactional
-	@Query( nativeQuery = true, value = "update product$brand b set b.br_visit_count = ifnull(b.br_visit_count, 0) + 1 where b.br_uuid = :uuid")
-	public void addVisitCount(@Param("uuid") String uuid);
+	@Query( nativeQuery = true, value = "update product$brand b set b.br_search_count = ifnull(b.br_search_count, 0) + 1 where b.br_uuid = :uuid")
+	public void addSearchCount(@Param("uuid") String uuid);
+
+    /**
+     * 分页根据首字母获取品牌信息
+     * @param initals
+     * @return
+     */
+	@Query(value = "select b from Brand b  where b.inital in :initals")
+	public Page<Brand> findInInitalsPage(@Param("initals") String[] initals , Pageable pageable);
+
+	/**
+	 * 获取搜索量最高的2个品牌
+	 * @return
+	 */
+	@Query(nativeQuery = true , value = "select * from product$brand order by br_search_count desc LIMIT 2")
+	public List<Brand> findMostSearchBrands();
 }

+ 14 - 0
src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandService.java

@@ -83,6 +83,14 @@ public interface BrandService {
 	 */
 	public Page<BrandInfo> getBrandInfoPage(PageInfo pageInfo, String keyword);
 
+	/**
+	 * 获取Brand分页数据
+	 * @param keyword 关键词
+	 * @param pageInfo 分页信息
+	 * @return 品牌简易信息
+	 */
+	public Map<String,Object> getBrandPage(PageInfo pageInfo, String keyword);
+
 	/**
 	 * 获取BrandInfo分页数据
 	 * @param keyword 关键词
@@ -185,4 +193,10 @@ public interface BrandService {
 	 * @return
 	 */
 	public void addVisitCount(String uuid);
+
+	/**
+	 * 获取搜索量最高的2个品牌
+	 * @return 品牌信息
+	 */
+	public List<Brand> getMostSearchBrands();
 }

+ 34 - 1
src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandServiceImpl.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.brand.service.impl;
 
+import com.uas.platform.b2c.common.search.rpc.service.SearchService;
 import com.uas.platform.b2c.core.utils.PinyinUtils;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandInfoDao;
@@ -17,6 +18,8 @@ import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import com.uas.search.exception.SearchException;
+import com.uas.platform.b2c.common.search.util.SPage;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,6 +53,9 @@ public class BrandServiceImpl implements BrandService {
 	@Autowired
 	private JdbcTemplate jdbcTemplate;
 
+	@Autowired
+	private SearchService searchService;
+
 	@Autowired
 	private BrandMostSimpleInfoDao brandMostSimpleInfoDao;
 
@@ -136,7 +142,11 @@ public class BrandServiceImpl implements BrandService {
 	@Override
 	public Page<Brand> getInitialSimpleInfoByFirst(String key , PageParams params ,String keyword) {
 		Pageable pageable = new PageInfo(params);
-		return brandDao.findInInitalsPage(new String[]{key},keyword, pageable);
+		if ("0~9".equals(key)) {
+			return brandDao.findInInitalsPage(new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}, pageable);
+		}else {
+			return brandDao.findInInitalsPage(new String[]{key}, pageable);
+		}
 	}
 
 	// 判断一个字符串是否含有中文
@@ -199,6 +209,24 @@ public class BrandServiceImpl implements BrandService {
 		}, pageInfo);
 	}
 
+	@Override
+	public Map<String,Object> getBrandPage(final PageInfo pageInfo, String keyword) {
+		SPage<Map<String, Object>> brands = null;
+		try {
+			brands = searchService.getBrands(keyword,pageInfo.getPageNumber(),pageInfo.getPageSize());
+		} catch (SearchException e) {}
+		List<Map<String, Object>> brandPage = brands.getContent();
+		List<Brand> brandList = new ArrayList<>();
+		for (Map<String, Object> a : brandPage){
+			brandList.add(brandDao.findOne(Long.parseLong(a.get("id").toString())));
+		}
+		Map<String,Object> map = new HashMap<>();
+		map.put("content",brandList);
+		map.put("totalPages",brands.getTotalPage());
+		map.put("totalElements",brands.getTotalElement());
+		return map;
+	}
+
 	@Override
 	public Brand findByUuid(String uuid) {
 		// 这个因为是接口错误的话直接返回
@@ -385,6 +413,11 @@ public class BrandServiceImpl implements BrandService {
 		return brandMostSimpleInfoDao.findBatchBrands(batchIds);
 	}
 
+	@Override
+	public List<Brand> getMostSearchBrands() {
+		return brandDao.findMostSearchBrands();
+	}
+
 	@Override
 	public void addVisitCount(String uuid) {
 		brandDao.addVisitCount(uuid);

+ 43 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/api/ComponentController.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.prod.product.component.api;
 
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.support.log.ControllerUsageLog;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
@@ -120,6 +121,17 @@ public class ComponentController {
 		return componentService.findInfoPage(info);
 	}
 
+	/**
+	 * 查找所有简单有效品牌信息
+	 *
+	 * @return 品牌简易信息
+	 */
+	@RequestMapping(value = "/Info", method = RequestMethod.GET)
+	public List<ComponentInfo> getComonentInfo() {
+		return componentService.getAllComponentInfo();
+	}
+
+
 	/**
 	 * 根据UUId获取器件摘要
 	 * 
@@ -277,4 +289,35 @@ public class ComponentController {
 	public List<ComponentInfo> getBatchBrands(@RequestBody List<Long> batchIds) {
 		return componentService.getBatchComponents(batchIds);
 	}
+
+	/**
+	 * 查找已推广的按权重排序的器件信息
+	 *
+	 * @return 器件简易信息
+	 */
+	@RequestMapping(value = "/searchWeight", method = RequestMethod.GET)
+	public List<ComponentInfo> getComponentInfoOrderByWeight() {
+		return componentService.getAllComponentInfoByWeight();
+	}
+
+	/**
+	 * 修改某个器件的 权重
+	 *
+	 * @return 器件简易信息
+	 */
+	@RequestMapping(value = "/searchWeight", method = RequestMethod.PUT)
+	public ComponentInfo updateBrankInfoOrderByWeight(@RequestBody ComponentInfo componentInfo ,@RequestParam Double weight) {
+		return componentService.updateComponentInfoInfoOrderByWeight(componentInfo,weight);
+	}
+
+
+	/**
+	 * 获取搜索量最高的2个器件
+	 * @return 品牌信息
+	 */
+	@RequestMapping(value = "/mostSearchComponent", method = RequestMethod.GET)
+	@ControllerUsageLog(module = "品牌查询接口", detail = "获取搜索量最高的2个器件")
+	public List<Component> getMostSearchBrands() {
+		return componentService.getMostSearchComponent();
+	}
 }

+ 10 - 44
src/main/java/com/uas/platform/b2c/prod/product/component/controller/ComponentSubmitController.java

@@ -9,6 +9,7 @@ import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.external.erp.product.service.OperationInfoService;
 import com.uas.platform.b2c.prod.product.component.modal.*;
 import com.uas.platform.b2c.prod.product.component.service.ComponentSubmitService;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
@@ -28,7 +29,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -428,63 +428,29 @@ public class ComponentSubmitController {
 
 	/**
 	 * 上传器件数据到爬虫库(没有参数对应关系)
-	 * 
+	 *
 	 * @param uploadItem 文件
 	 * @return 爬取器件信息
 	 */
 	@Transactional
 	@RequestMapping(value = "upload/componentCrawls", method = RequestMethod.POST)
-	public List<ComponentCrawl> uploadComponentCrawl(FileUpload uploadItem) {
-		String fileName = uploadItem.getFile().getOriginalFilename();
-		String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
-		InputStream is = null;
-		Workbook workbook = null;
-		List<ComponentCrawl> componentCrawls = new ArrayList<ComponentCrawl>();
-		try {
-			is = uploadItem.getFile().getInputStream();
-			if ("xls".equals(suffix)) {
-				workbook = new HSSFWorkbook(is);
-			} else if ("xlsx".equals(suffix)) {
-				workbook = new XSSFWorkbook(is);
-			} else {
-				throw new IllegalOperatorException("文件格不正确,请上传.xls或.xlsx的文件");
-			}
-			componentCrawls = componentSubmitService.uploadComponentCrawl(workbook, fileName);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return componentCrawls;
+	public ResultMap uploadComponentCrawlV2(FileUpload uploadItem) {
+		logger.log("器件上传", "器件上传");
+		return componentSubmitService.uploadComponentCrawl(uploadItem);
 	}
-	
+
 	/**
 	 * 上传器件数据到爬虫库(已有参数对应关系)
-	 * 
+	 *
 	 * @param uploadItem 文件
 	 * @param kindContrastId 对应关系id
 	 * @return 爬取器件信息
 	 */
 	@Transactional
 	@RequestMapping(value = "upload/componentCrawlsWithSame/{kindContrastId}", method = RequestMethod.POST)
-	public List<ComponentCrawl> uploadComponentCrawlWithSame(FileUpload uploadItem, @PathVariable("kindContrastId") Long kindContrastId) {
-		String fileName = uploadItem.getFile().getOriginalFilename();
-		String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
-		InputStream is = null;
-		Workbook workbook = null;
-		List<ComponentCrawl> componentCrawls = new ArrayList<ComponentCrawl>();
-		try {
-			is = uploadItem.getFile().getInputStream();
-			if ("xls".equals(suffix)) {
-				workbook = new HSSFWorkbook(is);
-			} else if ("xlsx".equals(suffix)) {
-				workbook = new XSSFWorkbook(is);
-			} else {
-				throw new IllegalOperatorException("文件格不正确,请上传.xls或.xlsx的文件");
-			}
-			componentCrawls = componentSubmitService.uploadComponentCrawlWithSame(workbook, fileName, kindContrastId);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return componentCrawls;
+	public ResultMap uploadComponentCrawlWithSame(FileUpload uploadItem, @PathVariable("kindContrastId") Long kindContrastId) {
+		logger.log("器件上传", "器件重新上传");
+		return componentSubmitService.uploadComponentCrawlWithSame(uploadItem, kindContrastId);
 	}
 	
 	

+ 6 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentCrawlDao.java

@@ -30,6 +30,12 @@ public interface ComponentCrawlDao extends JpaSpecificationExecutor<ComponentCra
 	 */
 	public List<ComponentCrawl> findByTask(Long task);
 
+	/**
+	 * 通过任务但id删除数据
+	 * @param task
+	 */
+	public void deleteByTask(Long task);
+
 	/**
 	 * 通过任务id获取去重后的爬取图片路径
 	 * @param task

+ 18 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentDao.java

@@ -121,6 +121,14 @@ public interface ComponentDao extends JpaSpecificationExecutor<Component>, JpaRe
 	@Query("select count(1) from Component")
 	public Integer findAllCount();
 
+	/**
+	 * 获取搜索量最高的2个器件
+	 * @return
+	 */
+	@Query(nativeQuery = true , value = "select * from product$component order by cmp_search_count desc LIMIT 2")
+	public List<Component> findMostSearchComponent();
+
+
 	/**
 	 * 器件点击次数加一
 	 * @param uuid
@@ -130,4 +138,14 @@ public interface ComponentDao extends JpaSpecificationExecutor<Component>, JpaRe
 	@Transactional
 	@Query( nativeQuery = true, value = "update product$component set cmp_visit_count = ifnull(cmp_visit_count, 0) + 1 where cmp_uuid = :uuid")
 	public void addVisitCount(@Param("uuid") String uuid);
+
+	/**
+	 * 器件搜索次数加一
+	 * @param uuid
+	 * @return
+	 */
+	@Modifying
+	@Transactional
+	@Query( nativeQuery = true, value = "update product$component set cmp_search_count = ifnull(cmp_search_count, 0) + 1 where cmp_uuid = :uuid")
+	public void addSearchCount(@Param("uuid") String uuid);
 }

+ 19 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentInfoDao.java

@@ -6,6 +6,7 @@ import org.springframework.data.domain.Page;
 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;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
@@ -88,4 +89,22 @@ public interface ComponentInfoDao extends JpaSpecificationExecutor<ComponentInfo
 	 */
 	@Query(nativeQuery = true, value = "select * from product$component where cmp_id in :batchids")
 	public List<ComponentInfo> findByBatchids(@Param("batchids") List<Long> batchids);
+
+	@Query("select c from ComponentInfo c where c.code like :q%")
+	public Page<ComponentInfo> findByFirst(@Param("q") String keyword,Pageable pageable);
+
+	/**
+	 * 根据权重倒序排列品牌信息
+	 * @return
+	 */
+	@Query(value = "select b from ComponentInfo b where b.searchWeight is not null and b.searchWeight <> 0 order by b.searchWeight desc")
+	public List<ComponentInfo> findBySearchWeight();
+
+	/**
+	 * 根据权重倒序排列品牌信息
+	 * @return
+	 */
+	@Modifying
+	@Query(value = "update ComponentInfo b set b.searchWeight = :increaseNum where b.uuid = :uuid")
+	public int setWeight(@Param("uuid") String uuid, @Param("increaseNum") Double increaseNum);
 }

+ 8 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java

@@ -607,6 +607,14 @@ public class Component implements Serializable {
 		this.company = company;
 	}
 
+	public Integer getLifecycle() {
+		return lifecycle;
+	}
+
+	public void setLifecycle(Integer lifecycle) {
+		this.lifecycle = lifecycle;
+	}
+
 	public String getCompanyUrl() {
 		return companyUrl;
 	}

+ 14 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentInfo.java

@@ -97,6 +97,12 @@ public class ComponentInfo implements Serializable {
 	@Column(name = "cmp_weight")
 	private Float weight;
 
+	/**
+	 * 搜索排序权重
+	 */
+	@Column(name = "searchweight")
+	private Double searchWeight;
+
 	/**
 	 * 附件id
 	 */
@@ -263,6 +269,14 @@ public class ComponentInfo implements Serializable {
 		this.weight = weight;
 	}
 
+	public Double getSearchWeight() {
+		return searchWeight;
+	}
+
+	public void setSearchWeight(Double searchWeight) {
+		this.searchWeight = searchWeight;
+	}
+
 	public String getAttach() {
 		if(SystemSession.getUser() != null) {
 			return attach;

+ 27 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentService.java

@@ -103,6 +103,13 @@ public interface ComponentService {
 	 */
 	public Page<ComponentInfo> findInfoPage(PageInfo info);
 
+	/**
+	 * 获取所有的简易器件信息
+	 * @author yujia
+	 * @return 器件简易信息
+	 */
+	public List<ComponentInfo> getAllComponentInfo();
+
 	/**
 	 * 关联的goods数据会被set进去
 	 * @param info 分页参数
@@ -211,10 +218,30 @@ public interface ComponentService {
 	 */
 	List<ComponentInfo> getBatchComponents(List<Long> batchIds);
 
+	/**
+	 * 查找已推广的按权重排序的器件信息
+	 * @author wangdy
+	 * @return 品牌简易信息
+	 */
+	public List<ComponentInfo> getAllComponentInfoByWeight();
+
+	/**
+	 * 修改某个品牌的 权重
+	 * @return 品牌简易信息
+	 */
+	public ComponentInfo updateComponentInfoInfoOrderByWeight(ComponentInfo componentInfo , Double weight);
+
 	/**
 	 * 器件点击次数加一
 	 * @param uuid
 	 * @return
 	 */
 	public void addVisitCount(String uuid);
+
+	/**
+	 * 获取搜索量最高的2个器件
+	 * @return 品牌信息
+	 */
+	public List<Component> getMostSearchComponent();
+
 }

+ 9 - 8
src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentSubmitService.java

@@ -1,6 +1,8 @@
 package com.uas.platform.b2c.prod.product.component.service;
 
+import com.uas.platform.b2c.common.base.model.FileUpload;
 import com.uas.platform.b2c.prod.product.component.modal.*;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.data.domain.Page;
@@ -116,19 +118,18 @@ public interface ComponentSubmitService {
 	public ComponentCrawlSubmit saveBatch(List<ComponentCrawlSubDetail> details);
 
 	/**
-	 * 上传器件爬取数据(没有参数对应关系)
-	 * 
-	 * @param workbook 表格
+	 * 上传器件爬取数据
+	 * @param uploadItem 上传文件
 	 * @return 爬取器件
 	 */
-	public List<ComponentCrawl> uploadComponentCrawl(Workbook workbook, String fileName);
+	public ResultMap uploadComponentCrawl(FileUpload uploadItem);
 
 	/**
 	 * 上传器件爬取数据(已有参数对应关系)
-	 * @param workbook 表格
-	 * @param fileName 文件名
-	 * @param kindContrastId 参数关系id
+	 * @param uploadItem 上传文件
+	 * @param kindContrastId 对应参数对应id
 	 * @return 爬取器件
 	 */
-	public List<ComponentCrawl> uploadComponentCrawlWithSame(Workbook workbook, String fileName, Long kindContrastId);
+	public ResultMap uploadComponentCrawlWithSame(FileUpload uploadItem, Long kindContrastId);
+
 }

+ 5 - 5
src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentGoodsServiceImpl.java

@@ -9,8 +9,8 @@ import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
-import com.uas.search.model.PageParams;
-import com.uas.search.model.PageParams.FilterField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.PageParams.FilterField;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -53,9 +53,9 @@ public class ComponentGoodsServiceImpl implements ComponentGoodsService {
 			if(filter.get("properties") != null) {
 				String property = filter.get("properties").toString();
 				PageParams pageParams = new PageParams(info.getPageNumber(), info.getPageSize());
-				pageParams.filter(FilterField.COMPONENT_PROPERTIES, property);
-				pageParams.filter(FilterField.COMPONENT_KINDID, filter.get("kindid"));
-				pageParams.filter(FilterField.COMPONENT_BRANDID, filter.get("brandid"));
+				pageParams.filter(PageParams.FilterField.COMPONENT_PROPERTIES, property);
+				pageParams.filter(PageParams.FilterField.COMPONENT_KINDID, filter.get("kindid"));
+				pageParams.filter(PageParams.FilterField.COMPONENT_BRANDID, filter.get("brandid"));
 				filter.remove("properties");
 				filter.remove("kindid");
 				filter.remove("brandid");

+ 27 - 5
src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentServiceImpl.java

@@ -30,8 +30,8 @@ import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
-import com.uas.search.model.PageParams;
-import com.uas.search.model.PageParams.FilterField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.PageParams.FilterField;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -176,6 +176,11 @@ public class ComponentServiceImpl implements ComponentService {
 		return componentInfoDao.findByCode("416F374X2ALT").get(0);
 	}
 
+	@Override
+	public List<ComponentInfo> getAllComponentInfo() {
+		return componentInfoDao.findAll();
+	}
+
 	@Override
 	public Page<ComponentInfo> findInfoPage(final PageInfo info) {
 		Map<String, Object> filter = info.getFilters();
@@ -192,9 +197,9 @@ public class ComponentServiceImpl implements ComponentService {
 			if (filter.get("properties") != null) {
 				String property = filter.get("properties").toString();
 				PageParams pageParams = new PageParams(info.getPageNumber(), info.getPageSize());
-				pageParams.filter(FilterField.COMPONENT_PROPERTIES, property);
-				pageParams.filter(FilterField.COMPONENT_KINDID, filter.get("kindid"));
-				pageParams.filter(FilterField.COMPONENT_BRANDID, filter.get("brandid"));
+				pageParams.filter(PageParams.FilterField.COMPONENT_PROPERTIES, property);
+				pageParams.filter(PageParams.FilterField.COMPONENT_KINDID, filter.get("kindid"));
+				pageParams.filter(PageParams.FilterField.COMPONENT_BRANDID, filter.get("brandid"));
 //				pageParams.filter("code", filter.get("code"));
 				filter.remove("properties");
 				filter.remove("kindid");
@@ -544,8 +549,25 @@ public class ComponentServiceImpl implements ComponentService {
 		return componentInfoDao.findByBatchids(batchIds);
 	}
 
+	@Override
+	public List<ComponentInfo> getAllComponentInfoByWeight() {
+		return componentInfoDao.findBySearchWeight();
+	}
+
+	@Override
+	@Transactional
+	public ComponentInfo updateComponentInfoInfoOrderByWeight(ComponentInfo componentInfo, Double weight) {
+		componentInfoDao.setWeight(componentInfo.getUuid(),weight);
+		return componentInfoDao.findOne(componentInfo.getId());
+	}
+
 	@Override
 	public void addVisitCount(String uuid) {
 		componentDao.addVisitCount(uuid);
 	}
+
+	@Override
+	public List<Component> getMostSearchComponent() {
+		return componentDao.findMostSearchComponent();
+	}
 }

+ 329 - 301
src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentSubmitServiceImpl.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.prod.product.component.service.impl;
 
 import com.uas.platform.b2c.common.account.dao.UserBaseInfoDao;
+import com.uas.platform.b2c.common.base.model.FileUpload;
 import com.uas.platform.b2c.common.base.service.SendMessageService;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
@@ -17,11 +18,10 @@ import com.uas.platform.b2c.prod.product.kind.dao.KindDao;
 import com.uas.platform.b2c.prod.product.kind.dao.KindPropertyDao;
 import com.uas.platform.b2c.prod.product.kind.model.Kind;
 import com.uas.platform.b2c.prod.product.kind.model.KindCrawl;
-import com.uas.platform.b2c.prod.product.kind.model.KindProperty;
 import com.uas.platform.b2c.prod.product.property.dao.PropertyDao;
-import com.uas.platform.b2c.prod.product.property.model.Property;
 import com.uas.platform.b2c.prod.product.property.model.PropertyValueCrawl;
 import com.uas.platform.b2c.prod.product.property.model.PropertyValueSubmit;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.EncodingRulesConstant;
 import com.uas.platform.core.model.PageInfo;
@@ -31,7 +31,10 @@ import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import com.xiaoleilu.hutool.poi.excel.ExcelReader;
+import com.xiaoleilu.hutool.poi.excel.ExcelUtil;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.map.HashedMap;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -48,6 +51,8 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -532,211 +537,339 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 	}
 
 	@Override
-	public List<ComponentCrawl> uploadComponentCrawl(Workbook workbook, String fileName) {
-		List<ComponentCrawl> components = new ArrayList<ComponentCrawl>();
-		Sheet sheet = workbook.getSheetAt(0);
-		int rowNum = sheet.getLastRowNum();
-		if (rowNum > 10000)
-			throw new IllegalOperatorException("上传文件不可超过10000行");
-		Row fourthRow = sheet.getRow(3);
-		if (fourthRow.getCell(1) != null && fourthRow.getCell(2) != null && fourthRow.getCell(3) != null && fourthRow.getCell(4) != null) {
-			// 商城类目
-			fourthRow.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
-			List<Kind> kinds = kindDao.findByNameCn(fourthRow.getCell(1).getStringCellValue().trim());
-			if (CollectionUtils.isEmpty(kinds)) {
-				throw new IllegalOperatorException("商城类目不存在");
-			}
-			Kind kind = kinds.get(0);
+	public ResultMap uploadComponentCrawl(FileUpload uploadItem) {
+		ResultMap resultMap = new ResultMap();
+		// 验证表格格式
+		Map<String, Object> map = validateExcel(uploadItem);
+		List<List<Object>> rows = (List<List<Object>>)(List)map.get("rows");
+		String fileName = map.get("fileName").toString();
+		if (rows == null || StringUtils.isEmpty(fileName)) {
+			throw new IllegalOperatorException("表格或文件名错误,请核对后重新上传");
+		}
 
-			// 目标类目
-			fourthRow.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
-			String kindName = fourthRow.getCell(2).getStringCellValue().trim();
+		List<ComponentCrawl> components = new ArrayList<ComponentCrawl>();
 
-			// 商城品牌
-			fourthRow.getCell(3).setCellType(Cell.CELL_TYPE_STRING);
-			List<Brand> brands = brandDao.findByNameEn(fourthRow.getCell(3).getStringCellValue().trim());
-			if (CollectionUtils.isEmpty(brands)) {
-				throw new IllegalOperatorException("商城品牌不存在");
-			}
-			Brand brand = brands.get(0);
+		// 提取公共数据
+		List<Object> firstRow = rows.get(1);
+		Map<String, Object> commonData = validateCommonData(firstRow);
+		// 商城类目
+		Kind b2cKind = (Kind)commonData.get("b2cKind");
+		// 目标类目
+		String kindName = commonData.get("kindName").toString();
+		// 商城品牌
+		Brand b2cBrand = (Brand)commonData.get("b2cBrand");
+		// url
+		String url = commonData.get("url").toString();
+
+		// 如果参数参数对应关系出现重复返回前台提示是否新增参数对应关系
+		List<KindCrawl> existKindCrawls = kindContrastDao.findByKindNameAndB2cKiIdAndResourceAndB2cBrIdAndUrl(kindName, b2cKind.getId(), b2cBrand.getNameEn(), b2cBrand.getId(), url);
+		if (CollectionUtils.isNotEmpty(existKindCrawls)) {
+			ComponentCrawl isRepeated = new ComponentCrawl();
+			isRepeated.setB2cKiId(existKindCrawls.get(0).getId());
+			isRepeated.setVersion((short) -1);
+			components.add(isRepeated);
+
+			resultMap.setCode(405);
+			resultMap.setData(existKindCrawls.get(0).getId());
+			return resultMap;
+		}
+
+		// 生成参数对应关系
+		KindCrawl kindCrawl = initKindCrawl(b2cKind.getId(), b2cBrand, kindName, url, fileName);
+
+		// 生成数据解析任务
+		ComponentCrawlTask task = initComponentCrawlTask(kindCrawl, fileName);
+
+		// 写入器件数据
+		components = writeComponentCrawls(rows, b2cBrand, b2cKind, kindName, task);
+		componentCrawlDao.save(components);
+
+		resultMap.setCode(200);
+		resultMap.setData(components.size());
+		return resultMap;
+	}
 
-			// url
-			fourthRow.getCell(4).setCellType(Cell.CELL_TYPE_STRING);
-			String url = fourthRow.getCell(4).getStringCellValue().trim();
-
-			// 如果参数参数对应关系出现重复返回前台提示是否新增参数对应关系
-			List<KindCrawl> existKindCrawls = kindContrastDao.findByKindNameAndB2cKiIdAndResourceAndB2cBrIdAndUrl(kindName, kind.getId(), brand.getNameEn(), brand.getId(), url);
-			if (CollectionUtils.isNotEmpty(existKindCrawls)) {
-				ComponentCrawl isRepeated = new ComponentCrawl();
-				isRepeated.setB2cKiId(existKindCrawls.get(0).getId());
-				isRepeated.setVersion((short) -1);
-				components.add(isRepeated);
-				return components;
-			}
-			
-			Date date = new Date();
-			// 生成参数对应关系
-			KindCrawl kindCrawl = new KindCrawl();
-			kindCrawl.setResource(brand.getNameEn());
-			kindCrawl.setB2cBrId(brand.getId());
-			kindCrawl.setKindName(kindName);
-			kindCrawl.setB2cKiId(kind.getId());
-			kindCrawl.setUrl(url);
-			kindCrawl.setCreateDate(date);
-			kindCrawl.setCreaterUu(SystemSession.getUser().getUserUU());
-			kindCrawl.setInTask((short) 1);// 参数对应关系直接设置为已提交
-			kindCrawl.setUpdateDate(date);
-			kindCrawl.setUpdaterUu(SystemSession.getUser().getUserUU());
-			kindCrawl.setFile(fileName);// 设置上传文件名
-			
-			kindCrawl = kindContrastDao.save(kindCrawl);
-			kindCrawl = kindContrastDao.findOne(kindCrawl.getId());// 因为save返回的对象没有关联的实体信息只有id,所以需要重新查询一次,为后续生成json存入任务做准备
-			// 生成数据爬取任务
-			ComponentCrawlTask task = new ComponentCrawlTask();
-			task.setContrastId(kindCrawl.getId());
-			task.setContrast(FastjsonUtils.toJson(kindCrawl));
-			task.setCreateDate(date);
-			task.setCreaterUu(SystemSession.getUser().getUserUU());
-			task.setStatus(Status.TO_CROWL.value());
-			task.setFile(fileName);
-			task.setTaskId(EncodingRulesConstant.COMPONENT_CRAWL_TASK.replaceFirst("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("product$component_crawl_task", 8)));
-			
-			task = componentCrawlTaskDao.save(task);
-			
-			kindCrawl.setTaskid(task.getTaskId());// 将数据爬取任务号回写到参数对应关系中
-			kindContrastDao.save(kindCrawl);
-			
-//			// 任务
-//			fourthRow.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
-//			ComponentCrawlTask task = componentCrawlTaskDao.findByTaskId(fourthRow.getCell(5).getStringCellValue().trim());
-
-			// 取目标参数
-			Row thirdRow = sheet.getRow(2);
-			if (thirdRow.getCell(7) != null) {
-				int i = 7;
-				List<String> proeprtyNames = new ArrayList<String>();
-				while (thirdRow.getCell(i) != null) {
-					thirdRow.getCell(i).setCellType(Cell.CELL_TYPE_STRING);
-					proeprtyNames.add(thirdRow.getCell(i).getStringCellValue().trim());
-					i++;
-				}
+	/**
+	 * 写入器件数据
+	 * @param rows excel信息
+	 * @param b2cBrand 商城品牌
+	 * @param b2cKind 商城类目
+	 * @param kindName 目标类目
+	 * @param task 解析任务
+	 * @return
+	 */
+	private List<ComponentCrawl> writeComponentCrawls(List<List<Object>> rows, Brand b2cBrand, Kind b2cKind, String kindName, ComponentCrawlTask task) {
+		List<ComponentCrawl> components = new ArrayList<ComponentCrawl>();
 
-				// 取标准参数
-				Row firstRow = sheet.getRow(0);
-				List<Property> properties = new ArrayList<Property>();
-				for (int j = 7; j <= i; j++) {
-					if (firstRow.getCell(j) != null && !firstRow.getCell(j).getStringCellValue().trim().equals("") && !firstRow.getCell(j).getStringCellValue().trim().equals(" ")) {
-						firstRow.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-						List<Property> propertyList = propertyDao.findByLabelCn(firstRow.getCell(j).getStringCellValue().trim());
-						if (CollectionUtils.isEmpty(propertyList)) {
-							throw new IllegalOperatorException(firstRow.getCell(j).getStringCellValue().trim() + ",此标准参数不存在");
-						}
-						properties.add(propertyDao.findByLabelCn(firstRow.getCell(j).getStringCellValue().trim()).get(0));
-					} else {
-						properties.add(new Property());
+		// 取表头信息
+		List<String> propertyNames = (List<String>)(List)rows.get(0);
+		int maxSize = propertyNames.size();
+
+		for (int i = 1; i < rows.size(); i++) {
+			List<Object> row = rows.get(i);
+            if (row != null && row.size() > 0) {
+                ComponentCrawl component = new ComponentCrawl();
+
+                // 型号
+                Object code = row.get(0);
+                if (code != null && StringUtils.hasText(code.toString())) {
+                    component.setCode(code.toString().trim());
+                } else {
+                    throw new IllegalOperatorException(String.format("第%s行型号为空", (i + 1)));
+                }
+
+                // 规格书
+                Object attach = row.get(5);
+                if (attach != null && StringUtils.hasText(attach.toString())) {
+                    component.setAttach(attach.toString().trim());
+                }
+
+                // 图片
+                Object img = row.get(6);
+                if (img != null && StringUtils.hasText(img.toString())) {
+                    component.setImg(img.toString().trim());
+                }
+
+				/**
+				 * 生命周期 (器件所处生命周期)
+				 * ACTIVE 815 正常
+				 * DISCONTINUED 816 即将停产
+				 * OBSOLETE 817 停产
+				 * PRELIMINARY 818 新品
+				 */
+                Object lifecycle = row.get(7);
+				if (lifecycle != null && StringUtils.hasText(String.valueOf(lifecycle))) {
+					try {
+						component.setLifecycle(Integer.valueOf(String.valueOf(lifecycle)));
+					} catch (NumberFormatException e) {
 					}
+				}
 
+                // 描述
+                Object description = row.get(8);
+                if (description != null && StringUtils.hasText(description.toString())) {
+                    component.setDescription(description.toString().trim());
+                } else {
+					throw new IllegalOperatorException(String.format("第%s行描述为空,请补充完全", i + 1));
 				}
 
-				// 取标准参数单位
-				Row secondRow = sheet.getRow(1);
-				List<String> units = new ArrayList<String>();
-				if (secondRow != null) {
-					for (int j = 7; j <= i; j++) {
-						if (secondRow.getCell(j) != null) {
-							secondRow.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-							units.add(secondRow.getCell(j).getStringCellValue().trim());
+                // 参数值
+                Set<PropertyValueCrawl> propertyValues = new HashSet<PropertyValueCrawl>();
+                for (int j = 9; j < maxSize && j < row.size(); j++) {
+                    Object property = row.get(j);
+                    if (property != null && StringUtils.hasText(property.toString())) {
+                        PropertyValueCrawl propertyValue = new PropertyValueCrawl();
+                        propertyValue.setValue(property.toString().trim());
+                        propertyValue.setPropertyName(String.valueOf(propertyNames.get(j)).trim());
+                        propertyValues.add(propertyValue);
+                    }
+                }
+
+                component.setProperties(propertyValues);
+                // 设置基本参数
+                component.setB2cBrId(b2cBrand.getId());
+                component.setB2cKiId(b2cKind.getId());
+                component.setKindName(kindName);
+                component.setTask(task.getId());
+
+                components.add(component);
+            }
+		}
+		return components;
+	}
+
+	/**
+	 * 验证表格格式
+	 * @param uploadItem
+	 * @return
+	 */
+	private Map<String, Object> validateExcel(FileUpload uploadItem) {
+		Map<String, Object> map = new HashedMap();
+		String fileName = uploadItem.getFile().getOriginalFilename();
+		List<ComponentCrawl> componentCrawls = new ArrayList<ComponentCrawl>();
+
+		try {
+			InputStream is = uploadItem.getFile().getInputStream();
+			ExcelReader reader = ExcelUtil.getReader(is);
+
+			// 获取表头数据
+			List<List<Object>> headers = reader.read(0, 0);
+			if (headers != null && headers.size() > 0) {
+
+				// 验证表头信息
+				List<Object> header = headers.get(0).subList(0, 9);
+				List<Object> exceptHeader = new ArrayList<Object>();
+				exceptHeader.add("型号");
+				exceptHeader.add("商城类目");
+				exceptHeader.add("目标类目");
+				exceptHeader.add("商城品牌");
+				exceptHeader.add("来源网址");
+				exceptHeader.add("规格书");
+				exceptHeader.add("图片");
+                exceptHeader.add("生命周期");
+				exceptHeader.add("描述");
+
+				if (header.equals(exceptHeader)) {
+					// 获取全表数据
+					List<List<Object>> rows = reader.read();
+					int size = rows.size();
+
+					if (size > 0 && size < 10000) {
+						int rowSize = headers.get(0).size();
+						if (rowSize < 50) {
+							// 列数超过34的文件不得超过2000行
+							if (rowSize > 34 && size > 2000) {
+								throw new IllegalOperatorException("属性超过25个时,文件只允许上传2000行");
+							}
+							map.put("rows", rows);
+							map.put("fileName", fileName);
+							return map;
+							// 整体列数不得超过50
 						} else {
-							units.add("");
+							throw new IllegalOperatorException("属性值不得超过41个");
 						}
+						// 文件不得超过10000行
+					} else {
+						throw new IllegalOperatorException("上传文件必须大于0行小于10000行");
 					}
+				} else {
+					throw new IllegalOperatorException("表头格式错误,前8列应为 \'型号\',\'商城类目\',\'目标类目\',\'商城品牌\',\'来源网址\',\'规格书\',\'图片\',\'描述\'");
 				}
+			} else {
+				throw new IllegalOperatorException("表头信息错误,请核对后再上传");
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return map;
+	}
 
-				// 去具体器件参数
-				for (int r = 3; r <= rowNum; r++) {
-					Row row = sheet.getRow(r);
-					if (row != null && row.getCell(0) != null) {
-						ComponentCrawl component = new ComponentCrawl();
-						// 原厂型号
-						row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
-						component.setCode(row.getCell(0).getStringCellValue().trim());
-
-						// 规格书
-						if (row.getCell(5) != null) {
-							row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
-							component.setAttach(row.getCell(5).getStringCellValue().trim());
-						}
+	/**
+	 * 初始化数据解析任务
+	 * @param kindCrawl 参数对应关系
+	 * @param fileName 上传文件名
+	 * @return
+	 */
+	private ComponentCrawlTask initComponentCrawlTask(KindCrawl kindCrawl, String fileName) {
+		// 生成数据解析任务
+		ComponentCrawlTask task = new ComponentCrawlTask();
+		task.setContrastId(kindCrawl.getId());
+		task.setContrast(FastjsonUtils.toJson(kindCrawl));
+		task.setCreateDate(new Date());
+		task.setCreaterUu(SystemSession.getUser().getUserUU());
+		task.setStatus(Status.TO_CROWL.value());
+		task.setFile(fileName);
+		task.setTaskId(EncodingRulesConstant.COMPONENT_CRAWL_TASK.replaceFirst("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("product$component_crawl_task", 8)));
+
+		kindCrawl.setTaskid(task.getTaskId());// 将数据解析任务号回写到参数对应关系中
+		kindContrastDao.save(kindCrawl);
+
+		return componentCrawlTaskDao.save(task);
+	}
 
-						// 图片
-						if (row.getCell(6) != null) {
-							row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
-							component.setImg(row.getCell(6).getStringCellValue().trim());
-						}
+	/**
+	 * 初始化标准参数对应关系
+	 * @param b2cKindId 商城类目id
+	 * @param b2cBrand 商城品牌
+	 * @param kindName 目标类目
+	 * @param url 官网地址
+	 * @param fileName 上传文件名
+	 * @return
+	 */
+	private KindCrawl initKindCrawl(Long b2cKindId, Brand b2cBrand, String kindName, String url, String fileName) {
+		Date date = new Date();
+		KindCrawl kindCrawl = new KindCrawl();
+		kindCrawl.setResource(b2cBrand.getNameEn());
+		kindCrawl.setB2cBrId(b2cBrand.getId());
+		kindCrawl.setKindName(kindName);
+		kindCrawl.setB2cKiId(b2cKindId);
+		kindCrawl.setUrl(url);
+		kindCrawl.setCreateDate(date);
+		kindCrawl.setCreaterUu(SystemSession.getUser().getUserUU());
+		kindCrawl.setInTask((short) 1);// 参数对应关系直接设置为已提交
+		kindCrawl.setUpdateDate(date);
+		kindCrawl.setUpdaterUu(SystemSession.getUser().getUserUU());
+		kindCrawl.setFile(fileName);// 设置上传文件名
+
+		kindCrawl = kindContrastDao.save(kindCrawl);
+		return kindContrastDao.findOne(kindCrawl.getId());// 因为save返回的对象没有关联的实体信息只有id,所以需要重新查询一次,为后续生成json存入任务做准备
+	}
 
-						// 参数值
-						Set<PropertyValueCrawl> propertyValues = new HashSet<PropertyValueCrawl>();
-						for (int j = 7; j <= i; j++) {
-							if (row.getCell(j) != null) {
-								row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-								if (!row.getCell(j).getStringCellValue().trim().equals("") && !row.getCell(j).getStringCellValue().trim().equals(" ")) {
-									PropertyValueCrawl propertyValue = new PropertyValueCrawl();
-									row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-									propertyValue.setValue(row.getCell(j).getStringCellValue().trim());
-									if (secondRow != null) {
-										propertyValue.setUnit(units.get(j - 7));
-									}
-									propertyValue.setPropertyName(proeprtyNames.get(j - 7));
-									propertyValue.setPropertyId(properties.get(j - 7).getId());
-									if (properties.get(j - 7).getId() != null) {
-										KindProperty kindProperty = kindPropertyDao.findByKindIdAndPropertyId(kind.getId(), properties.get(j - 7).getId());
-										if (kindProperty == null) {
-											throw new IllegalOperatorException("标准参数不存在");
-										}
-										propertyValue.setDetno(kindProperty.getDetno());
-										propertyValue.setType(kindProperty.getType());
-										propertyValues.add(propertyValue);
-									}
-								}
-							}
-						}
+	/**
+	 * 验证公共数据
+	 * @param firstRow
+	 * @return
+	 */
+	private Map<String, Object> validateCommonData(List<Object> firstRow) {
+		if (CollectionUtils.isNotEmpty(firstRow)) {
+			Map<String, Object> commonData = new HashedMap();
 
-						component.setProperties(propertyValues);
+			// 商城类目
+			Object b2cKindName = firstRow.get(1);
+			if (b2cKindName != null && StringUtils.hasText(b2cKindName.toString())) {
+				List<Kind> kinds = kindDao.findByNameCn(b2cKindName.toString().trim());
+				if (CollectionUtils.isEmpty(kinds)) {
+					throw new IllegalOperatorException("商城类目不存在");
+				}
+				commonData.put("b2cKind", kinds.get(0));
+			} else {
+				throw new IllegalOperatorException("商城类目为空");
+			}
 
-						// 设置基本参数
-						component.setB2cBrId(brand.getId());
-						component.setB2cKiId(kind.getId());
-						component.setKindName(kindName);
-						component.setTask(task.getId());
+			// 目标类目
+			Object kindName = firstRow.get(2);
+			if (kindName != null &&  StringUtils.hasText(kindName.toString())) {
+				commonData.put("kindName", kindName.toString().trim());
+			} else {
+				throw new IllegalOperatorException("目标类目为空");
+			}
 
-						components.add(component);
-					}
+			// 商城品牌
+			Object brandName = firstRow.get(3);
+			if (brandName != null && StringUtils.hasText(brandName.toString())) {
+				List<Brand> brands = brandDao.findByUpperNameEn(brandName.toString().trim());
+				if (CollectionUtils.isEmpty(brands)) {
+					throw new IllegalOperatorException("商城品牌不存在");
 				}
-				components = componentCrawlDao.save(components);
-			} else {
-				throw new IllegalOperatorException("目标参数不完善或格式错误");
+				commonData.put("b2cBrand", brands.get(0));
+			}
+
+			// url
+			Object url = firstRow.get(4);
+			if (url != null && StringUtils.hasText(url.toString())) {
+				commonData.put("url", url.toString().trim());
 			}
+
+			return commonData;
 		} else {
-			throw new IllegalOperatorException("基本数据不完善");
+			throw new IllegalOperatorException("第二列数据不存在");
 		}
-		return components;
 	}
 
 	@Override
-	public List<ComponentCrawl> uploadComponentCrawlWithSame(Workbook workbook, String fileName, Long kindContrastId) {
+	public ResultMap uploadComponentCrawlWithSame(FileUpload uploadItem, Long kindContrastId) {
+		ResultMap resultMap = new ResultMap();
+		// 验证表格格式
+		Map<String, Object> map = validateExcel(uploadItem);
+		List<List<Object>> rows = (List<List<Object>>)(List)map.get("rows");
+		String fileName = map.get("fileName").toString();
+		if (rows == null || StringUtils.isEmpty(fileName)) {
+			throw new IllegalOperatorException("表格或文件名错误,请核对后重新上传");
+		}
+
 		List<ComponentCrawl> components = new ArrayList<ComponentCrawl>();
-		Sheet sheet = workbook.getSheetAt(0);
-		int rowNum = sheet.getLastRowNum();
-		if (rowNum > 10000)
-			throw new IllegalOperatorException("上传文件不可超过10000行");
-		Date date = new Date();
-		
+
+		// 获取对应的参数对应关系
 		KindCrawl kindCrawl = kindContrastDao.findOne(kindContrastId);
-		ComponentCrawlTask task = new ComponentCrawlTask();
-		
+		if (kindCrawl == null) {
+			throw new IllegalOperatorException("对应参数关系不存在,请重新核对信息");
+		}
 		// 如果参数对应关系为进行中状态,则不可上传数据
 		if (kindCrawl.getInTask().shortValue() == 2) {
 			throw new IllegalOperatorException("参数对应关系所关联任务正在进行中,如需重新上传数据,请联系相关人员");
 		}
+
+		ComponentCrawlTask task = new ComponentCrawlTask();
 		// 如果参数对应关系为已提交状态,将任务号延用;否则生成新任务
 		if (kindCrawl.getInTask().shortValue() == 1) {
 			task = componentCrawlTaskDao.findByTaskId(kindCrawl.getTaskid());
@@ -747,135 +880,30 @@ public class ComponentSubmitServiceImpl implements ComponentSubmitService {
 				task.setFile(fileName);
 				componentCrawlTaskDao.save(task);
 				
-				List<ComponentCrawl> componentCrawls = componentCrawlDao.findByTask(task.getId());// 删除之前任务上传的数据
-				if (CollectionUtils.isNotEmpty(componentCrawls)) {
-					componentCrawlDao.delete(componentCrawls);
-				}
+				componentCrawlDao.deleteByTask(task.getId());// 删除之前任务上传的数据
 			}
 		} else {
-			// 生成数据爬取任务
-			task.setContrastId(kindContrastId);
-			task.setContrast(FastjsonUtils.toJson(kindCrawl));
-			task.setCreateDate(date);
-			task.setCreaterUu(SystemSession.getUser().getUserUU());
-			task.setFile(fileName);
-			task.setStatus(Status.TO_CROWL.value());
-			task.setTaskId(EncodingRulesConstant.COMPONENT_CRAWL_TASK.replaceFirst("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("product$component_crawl_task", 8)));
-			
-			task = componentCrawlTaskDao.save(task);
-			
-			// 将数据爬取任务号回写到参数对应关系中
-			kindCrawl.setTaskid(task.getTaskId());
-			kindCrawl.setInTask((short) 1);// 参数对应关系直接设置为已提交
-			kindCrawl.setFile(fileName);// 设置上传文件名
-			kindContrastDao.save(kindCrawl);
-		}
-		
-		// 取目标参数
-		Row thirdRow = sheet.getRow(2);
-		if (thirdRow.getCell(7) != null) {
-			int i = 7;
-			List<String> proeprtyNames = new ArrayList<String>();
-			while (thirdRow.getCell(i) != null) {
-				thirdRow.getCell(i).setCellType(Cell.CELL_TYPE_STRING);
-				proeprtyNames.add(thirdRow.getCell(i).getStringCellValue().trim());
-				i++;
-			}
-
-			// 取标准参数
-			Row firstRow = sheet.getRow(0);
-			List<Property> properties = new ArrayList<Property>();
-			for (int j = 7; j <= i; j++) {
-				if (firstRow.getCell(j) != null && !firstRow.getCell(j).getStringCellValue().trim().equals("") && !firstRow.getCell(j).getStringCellValue().trim().equals(" ")) {
-					firstRow.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-					List<Property> propertyList = propertyDao.findByLabelCn(firstRow.getCell(j).getStringCellValue().trim());
-					if (CollectionUtils.isEmpty(propertyList)) {
-						throw new IllegalOperatorException(firstRow.getCell(j).getStringCellValue().trim() + ",此标准参数不存在");
-					}
-					properties.add(propertyDao.findByLabelCn(firstRow.getCell(j).getStringCellValue().trim()).get(0));
-				} else {
-					properties.add(new Property());
-				}
-
-			}
-
-			// 取标准参数单位
-			Row secondRow = sheet.getRow(1);
-			List<String> units = new ArrayList<String>();
-			if (secondRow != null) {
-				for (int j = 7; j <= i; j++) {
-					if (secondRow.getCell(j) != null) {
-						secondRow.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-						units.add(secondRow.getCell(j).getStringCellValue().trim());
-					} else {
-						units.add("");
-					}
-				}
-			}
-
-			// 取具体器件参数
-			for (int r = 3; r <= rowNum; r++) {
-				Row row = sheet.getRow(r);
-				if (row != null && row.getCell(0) != null) {
-					ComponentCrawl component = new ComponentCrawl();
-					// 原厂型号
-					row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
-					component.setCode(row.getCell(0).getStringCellValue().trim());
-
-					// 规格书
-					if (row.getCell(5) != null) {
-						row.getCell(5).setCellType(Cell.CELL_TYPE_STRING);
-						component.setAttach(row.getCell(5).getStringCellValue().trim());
-					}
-
-					// 图片
-					if (row.getCell(6) != null) {
-						row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
-						component.setImg(row.getCell(6).getStringCellValue().trim());
-					}
-
-					// 参数值
-					Set<PropertyValueCrawl> propertyValues = new HashSet<PropertyValueCrawl>();
-					for (int j = 7; j <= i; j++) {
-						if (row.getCell(j) != null) {
-							row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-							if (!row.getCell(j).getStringCellValue().trim().equals("") && !row.getCell(j).getStringCellValue().trim().equals(" ")) {
-								PropertyValueCrawl propertyValue = new PropertyValueCrawl();
-								row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
-								propertyValue.setValue(row.getCell(j).getStringCellValue().trim());
-								if (secondRow != null) {
-									propertyValue.setUnit(units.get(j - 7));
-								}
-								propertyValue.setPropertyName(proeprtyNames.get(j - 7));
-								propertyValue.setPropertyId(properties.get(j - 7).getId());
-								if (properties.get(j - 7).getId() != null) {
-									KindProperty kindProperty = kindPropertyDao.findByKindIdAndPropertyId(kindCrawl.getB2cKiId(), properties.get(j - 7).getId());
-									if (kindProperty == null) {
-										throw new IllegalOperatorException("标准参数不存在");
-									}
-									propertyValue.setDetno(kindProperty.getDetno());
-									propertyValue.setType(kindProperty.getType());
-									propertyValues.add(propertyValue);
-								}
-							}
-						}
-					}
+			// 生成数据解析任务
+			task = initComponentCrawlTask(kindCrawl, fileName);
+		}
 
-					component.setProperties(propertyValues);
+		// 对应商城品牌
+		Brand brand = brandDao.findOne(kindCrawl.getB2cBrId());
+		if (brand == null) {
+			throw new IllegalOperatorException("对应参数关系商城品牌不存在");
+		}
+		// 对应商城类目
+		Kind kind = kindDao.findOne(kindCrawl.getB2cKiId());
+		if (kind == null) {
+			throw new IllegalOperatorException("对应参数关系商城类目不存在");
+		}
 
-					// 设置基本参数
-					component.setB2cBrId(kindCrawl.getB2cBrId());
-					component.setB2cKiId(kindCrawl.getB2cKiId());
-					component.setKindName(kindCrawl.getKindName());
-					component.setTask(task.getId());
+		// 写入器件数据
+		components = writeComponentCrawls(rows, brand, kind, kindCrawl.getKindName(), task);
+		componentCrawlDao.save(components);
 
-					components.add(component);
-				}
-			}
-			components = componentCrawlDao.save(components);
-		} else {
-			throw new IllegalOperatorException("目标参数不完善或格式错误");
-		}
-		return components;
+		resultMap.setCode(200);
+		resultMap.setData(components.size());
+		return resultMap;
 	}
 }

+ 35 - 0
src/main/java/com/uas/platform/b2c/prod/product/kind/model/KindInfo.java

@@ -4,6 +4,7 @@ import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
 
 import javax.persistence.*;
+import java.util.Collections;
 import java.util.Set;
 
 /**
@@ -145,6 +146,40 @@ public class KindInfo {
 		return id.hashCode();
 	}
 
+	/**
+	 * 共用的其他类目
+	 */
+	private static volatile KindInfo otherKind = null;
+	public static KindInfo getOtherKind(){
+		if (otherKind == null){
+			synchronized (KindInfo.class){
+				if (otherKind == null){
+					otherKind = new KindInfo();
+					otherKind.setId(-10L); //默认一个不会存在的id
+					otherKind.setIsLeaf((short) 1);
+					otherKind.setNameCn("其他");
+					otherKind.setLevel((short)1);
+					otherKind.setParentid(0L);
+					otherKind.setChildren(Collections.<KindInfo>emptySet());
+				}
+			}
+		}
+		return otherKind;
+	}
+
+	/**
+	 * 初始化一个所有类目
+	 * @return
+	 */
+	public static KindInfo getAllKind(){
+		KindInfo allKind = new KindInfo();
+		allKind.setIsLeaf((short) 1);
+		allKind.setNameCn("所有类目");
+		allKind.setLevel((short) 0);
+		allKind.setParentid(0L);
+		return allKind;
+	}
+
 	@Override
 	public String toString() {
 		return "KindInfo{" + "id=" + id + ", nameCn='" + nameCn + '\'' + ", nameEn='" + nameEn + '\'' + ", parentid=" + parentid

+ 16 - 6
src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.store.facade.impl;
 
+import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.kind.model.KindInfo;
 import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.b2c.prod.store.facade.CommodityFacade;
@@ -9,9 +10,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * 商品外观实现类
@@ -26,20 +25,31 @@ public class CommodityFacadeImpl implements CommodityFacade {
 
 	private final KindService kindService;
 
+	private final GoodsService goodsService;
+
 	@Autowired
-	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService) {
+	public CommodityFacadeImpl(CommodityService commodityService, KindService kindService, GoodsService goodsService) {
 		this.commodityService = commodityService;
 		this.kindService = kindService;
+		this.goodsService = goodsService;
 	}
 
 	@Override
 	public List<KindInfo> getAllKindsInfoByStoreUuid(String storeUuid) {
+		final KindInfo allKind = KindInfo.getAllKind(); //外层所有类目包裹
+		Set<KindInfo> children = new LinkedHashSet<>();
 		if (StringUtils.hasText(storeUuid)) {
 			Set<Long> kindUuidSet = commodityService.findAllKindsByStoreUuid(storeUuid);
 			if (!CollectionUtils.isEmpty(kindUuidSet)) {
-				return kindService.getStructruingKindsByLeafKindIds(kindUuidSet);
+				List<KindInfo> kindList = kindService.getStructruingKindsByLeafKindIds(kindUuidSet);
+				children.addAll(kindList);
 			}
 		}
-		return Collections.emptyList();
+		int count = goodsService.getNonstandardGoodsCount(storeUuid); //有效的在售非标数
+		if (count != 0){ //存在非标则添加其他类目
+			children.add(KindInfo.getOtherKind());
+		}
+		allKind.setChildren(children);
+		return Collections.singletonList(allKind);
 	}
 }

+ 13 - 5
src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDao.java

@@ -69,14 +69,22 @@ public interface OrderDao extends JpaSpecificationExecutor<Order>, JpaRepository
 	List<Order> findByOrderIds(@Param("orderids") List<String> orderids);
 
 	/**
-	 * 查询未评价的订单
+	 * 根据某个状态之后的订单
+	 *
+	 * @param status the status
 	 * @return  orders
 	 */
-	@Query(nativeQuery = true, value=" select o.* from trade$order o " +
-							     	 " left join b2c$rate$vendor v " +
-									 " on o.or_id = v.order_id where locate('405',o.or_statushistory)>0  and v.id is null;")
-	List<Order> findByNotRate();
+	@Query(nativeQuery = true, value="selcet * from trade$order a where a.or_status >=:status ")
+	List<Order> findByAfterStatus(@Param("status") Integer status);
 
+    /**
+     * 查询未评价的订单
+     * @return  orders
+     */
+    @Query(nativeQuery = true, value=" select o.* from trade$order o " +
+            " left join b2c$rate$vendor v " +
+            " on o.or_id = v.order_id where locate('405',o.or_statushistory)>0  and v.id is null;")
+    List<Order> findByNotRate();
 
 	/**
 	 * Gets count by buyeruu and status.

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDetailDao.java

@@ -12,7 +12,7 @@ import java.util.List;
 /**
  * The interface Order detail dao.
  *
- * @author yaj
+ * @author yuj
  * @version 2017-08-02 18:09:48 创建文件
  */
 @Repository

+ 8 - 0
src/main/java/com/uas/platform/b2c/trade/order/service/OrderDetailService.java

@@ -122,4 +122,12 @@ public interface OrderDetailService {
 	 * @return order 主键的list
 	 */
 	List<Order> deleteOrderDetailsByGoods(List<OrderDetail> orderDetailList);
+
+
+	/**
+	 * 根据批次找订单明细
+	 * @param batchcode
+	 * @return
+	 */
+	List<OrderDetail> findOrderDetailByBatchCode(String batchcode);
 }

+ 12 - 3
src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderDetailServiceImpl.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.trade.order.service.impl;
 
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
@@ -26,7 +27,6 @@ import com.uas.platform.b2c.trade.order.type.ResultMapType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.EncodingRulesConstant;
-import com.uas.platform.core.model.Status;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
@@ -140,7 +140,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
 		checkOrderDetail(orderDetail);
 		String storeid = orderDetail.getStoreid();
 		Goods goods = goodsDao.findByBatchCode(orderDetail.getBatchCode());
-		if(goods == null || goods.getStatus().intValue() == Status.UNAVAILABLE.value()) {
+		if (goods == null || goods.getStatus().intValue() != Status.AVAILABLE.value()) {
 			return new ResultMap(ResultMapType.GOODS_UNAVAILABLE.getCode(), ResultMapType.GOODS_UNAVAILABLE.getPhrase());
 		}
 
@@ -512,7 +512,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
 			throw new IllegalOperatorException("传入的库存信息为空");
 		}
 		List<OrderDetail> orderDetailList = orderDetailDao.findByBatchCodeAndStatus(goods.getBatchCode(), Status.TOBECONFIRMED.value());
-		if(goods.getStatus().intValue() == Status.UNAVAILABLE.value()) {
+		if(goods.getStatus().intValue() == Status.UNAVAILABLE.value() || goods.getStatus().intValue() == Status.REMOVED.value() || goods.getStatus().intValue() == Status.GOODS_DELETE.value()) {
 			return deleteOrderDetailsByGoods(orderDetailList);
 		}else {
 			List<Order> orders = new ArrayList<>();
@@ -580,4 +580,13 @@ public class OrderDetailServiceImpl implements OrderDetailService {
 		}
 		return listOrder;
 	}
+
+	@Override
+	public List<OrderDetail> findOrderDetailByBatchCode(String batchcode) {
+		if(StringUtils.isEmpty(batchcode)) {
+			return new ArrayList<>();
+		}
+		List<OrderDetail> details = orderDetailDao.findByBatchCode(batchcode);
+		return details;
+	}
 }

+ 59 - 20
src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java

@@ -1,5 +1,10 @@
 package com.uas.platform.b2c.trade.order.service.impl;
 
+import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.BUYER_TO_MALL;
+import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.MALL_TO_SUP;
+import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.SUP_TO_MALL;
+import static com.uas.platform.b2c.trade.util.Preconditions.checkNotNull;
+
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.api.b2c_erp.buyer.model.B2cOrder;
@@ -34,7 +39,12 @@ import com.uas.platform.b2c.logistics.dao.AddressDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFOrderDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFPurchaseDao;
 import com.uas.platform.b2c.logistics.dao.PickUpAddressDao;
-import com.uas.platform.b2c.logistics.model.*;
+import com.uas.platform.b2c.logistics.model.Address;
+import com.uas.platform.b2c.logistics.model.InvoiceFOrder;
+import com.uas.platform.b2c.logistics.model.InvoiceFOrderDetail;
+import com.uas.platform.b2c.logistics.model.InvoiceFPurchase;
+import com.uas.platform.b2c.logistics.model.InvoiceFPurchaseDetail;
+import com.uas.platform.b2c.logistics.model.PickUpAddress;
 import com.uas.platform.b2c.logistics.service.InvoiceFPurchaseService;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsDao;
 import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
@@ -59,7 +69,14 @@ import com.uas.platform.b2c.trade.order.dao.OrderDao;
 import com.uas.platform.b2c.trade.order.dao.OrderDetailDao;
 import com.uas.platform.b2c.trade.order.dao.OrderIndexDetailDao;
 import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
-import com.uas.platform.b2c.trade.order.model.*;
+import com.uas.platform.b2c.trade.order.model.Order;
+import com.uas.platform.b2c.trade.order.model.OrderDetail;
+import com.uas.platform.b2c.trade.order.model.OrderIndex;
+import com.uas.platform.b2c.trade.order.model.OrderIndexDetail;
+import com.uas.platform.b2c.trade.order.model.OrderSimpleInfo;
+import com.uas.platform.b2c.trade.order.model.Purchase;
+import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
+import com.uas.platform.b2c.trade.order.model.TradeProofing;
 import com.uas.platform.b2c.trade.order.service.OrderDetailService;
 import com.uas.platform.b2c.trade.order.service.OrderService;
 import com.uas.platform.b2c.trade.order.service.PurchaseService;
@@ -88,6 +105,22 @@ import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.search.model.BaseOrder;
 import com.uas.search.model.PageParams;
 import com.uas.search.model.SPage;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.commons.lang.time.DateUtils;
 import org.springframework.beans.BeanUtils;
@@ -101,15 +134,6 @@ import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import java.util.*;
-
-import static com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus.*;
-import static com.uas.platform.b2c.trade.util.Preconditions.checkNotNull;
-
 /**
  * 订单业务实现类
  *
@@ -1652,13 +1676,23 @@ public class OrderServiceImpl implements OrderService {
             Goods goods = goodsService.findGoodsByBatchCode(orderDetail.getBatchCode());
             if (goods != null) {
                 orderDetail.setReserve(goods.getReserve());
-                Component component = componentService.findByUuid(goods.getUuid());
-                orderDetail.setWeight(component.getWeight());
+                Component component = null;
+                if (goods.getUuid() != null){
+                    component = componentService.findByUuid(goods.getUuid());
+                }
+                if (component != null){
+                    orderDetail.setWeight(component.getWeight());
+                }
             } else {
                 GoodsHistory goodsHistory = goodsHisDao.findByBatchCode(orderDetail.getBatchCode()).get(0);
                 orderDetail.setReserve(goodsHistory.getReserve());
-                Component component = componentService.findByUuid(goodsHistory.getUuid());
-                orderDetail.setWeight(component.getWeight());
+                Component component = null;
+                if (goodsHistory.getUuid() != null){
+                    component = componentService.findByUuid(goodsHistory.getUuid());
+                }
+                if (component != null){
+                    orderDetail.setWeight(component.getWeight());
+                }
             }
 
         }
@@ -1773,11 +1807,14 @@ public class OrderServiceImpl implements OrderService {
 
                     //统计器件的购买的数量
                     String uuid = orderDetail.getUuid();
-                    Double num = mapQty.get(uuid);
-                    num = num == null ? 0 : num;
-                    num = num + orderDetail.getNumber();
-                    uuids.add(uuid);
-                    mapQty.put(uuid, num);
+                    if (!StringUtils.isEmpty(uuid)) {
+                        Double num = mapQty.get(uuid);
+                        num = num == null ? 0 : num;
+                        num = num + orderDetail.getNumber();
+                        uuids.add(uuid);
+                        mapQty.put(uuid, num);
+                    }
+
                 }
             }
 
@@ -2780,6 +2817,8 @@ public class OrderServiceImpl implements OrderService {
             }
         }
         order.setStatus(Status.DELETED.value(), userUU);
+        // 用户自动取消订单,将erp下载状态更新为待下载状态
+        order.setSendstatus(Status.NOT_UPLOAD.value());
         orderDao.save(order);
     }
 

+ 8 - 10
src/main/java/com/uas/platform/b2c/trade/presale/facade/impl/CartFacadeImpl.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.trade.presale.facade.impl;
 
 import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
 import com.uas.platform.b2c.prod.product.component.service.ComponentService;
@@ -37,13 +38,14 @@ public class CartFacadeImpl implements CartFacade {
 		if (cart == null) {
 			return new ResultMap(CodeType.NO_INFO.code(), "请选择一个商品加入购物车");
 		}
-		if (StringUtils.isEmpty(cart.getUuid()) || StringUtils.isEmpty(cart.getBatchCode()) || StringUtils.isEmpty(cart.getStoreUuid())) {
+		if (StringUtils.isEmpty(cart.getBatchCode()) || StringUtils.isEmpty(cart.getStoreUuid())) {
 			return new ResultMap(CodeType.NOT_COMPLETE_INFO.code(), "信息提交失败,请重新提交");
 		}
 		ResultMap resultMap = goodsService.validGoodsIsChange(cart.getBatchCode(), cart.getStoreUuid());
-		if(resultMap.getCode() == ResultMapType.NO_INFO.getCode() || resultMap.getCode() == ResultMapType.GOODS_UNAVAILABLE.getCode()) {
+		if (resultMap.getCode() == ResultMapType.NO_INFO.getCode() || resultMap.getCode() == ResultMapType.GOODS_UNAVAILABLE.getCode()) {
 			return resultMap;
 		}
+		Goods goods = (Goods) resultMap.getData();
 		// 获取买家用户UU和企业UU
 		Long userUU = SystemSession.getUser().getUserUU();
 		Long enUU =  SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null;
@@ -58,16 +60,12 @@ public class CartFacadeImpl implements CartFacade {
 		if (cartService.addedSameGoods(cart.getBatchCode(), enUU, userUU)) {
 			return new ResultMap(CodeType.SAVED.code(), "商品记录已经添加");
 		}
-		// 设置器件信息
-		Component component = componentService.findByUuid(cart.getUuid());
-		if (component == null) {
-			return new ResultMap(CodeType.NOT_COMPLETE_INFO.code(), "器件信息不存在");
-		}
+
+		cart.setCode(goods.getCode());
+		cart.setKiName(goods.getKindNameCn());
+		cart.setBrName(goods.getBrandNameEn());
 		cart.setUu(userUU);
 		cart.setEnuu(enUU);
-		cart.setCode(component.getCode());
-		cart.setBrName(component.getBrand().getNameCn());
-		cart.setKiName(component.getKind().getNameCn());
 		ResultMap resultMap1 = cartService.saveCartRecord(cart);
 
 		if(resultMap1.getCode() != ResultMapType.OK.getCode() || resultMap.getCode() == ResultMapType.OK.getCode()) {

+ 10 - 10
src/main/java/com/uas/platform/b2c/trade/presale/model/Collection.java

@@ -21,64 +21,64 @@ public class Collection implements Serializable {
 	private static final long serialVersionUID = 1L;
 	
 	@Id
-	@Column(name = "store$id")
+	@Column(name = "store_id")
 	@GeneratedValue
 	private Long id;
 	
 	/**
 	  * 收藏的器件id
 	  */
-	@Column(name = "store$compid")
+	@Column(name = "store_compid")
 	private Long componentid;
 	
 	/**
 	  * 关联的器件简单信息
 	  */
 	@OneToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
-	@JoinColumn(name = "store$compid", insertable = false, updatable = false)
+	@JoinColumn(name = "store_compid", insertable = false, updatable = false)
 	private ComponentInfo componentinfo;
 	
 	/**
 	  * 器件id
 	  */
-	@Column(name = "store$brandid")
+	@Column(name = "store_brandid")
 	private Long brandid;
 
 	/**
 	 * 关联的品牌简单信息
 	 */
 	@OneToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
-	@JoinColumn(name = "store$brandid", insertable = false, updatable = false)
+	@JoinColumn(name = "store_brandid", insertable = false, updatable = false)
 	private BrandInfo brandinfo;
 	
 	/**
 	  * 收藏的类型  1 代表品牌  2 代表器件
 	  */
-	@Column(name = "store$kind")
+	@Column(name = "store_kind")
 	private Integer kind;
 	
 	/**
 	  * 收藏时间
 	  */
-	@Column(name = "store$createtime")
+	@Column(name = "store_createtime")
 	private Date createtime;
 	
 	/**
 	  * 收藏人的uu号
 	  */
-	@Column(name = "store$useruu")
+	@Column(name = "store_useruu")
 	private Long useruu;
 	
 	/**
 	  * 收藏人的enuu号
 	  */
-	@Column(name = "store$enuu")
+	@Column(name = "store_enuu")
 	private Long enuu;
 
 	/**
 	 * 是否个人用户
 	 */
-	@Column(name = "store$dissociative")
+	@Column(name = "store_dissociative")
 	private Integer dissociative;
 
 	public Long getId() {

+ 7 - 7
src/main/java/com/uas/platform/b2c/trade/presale/model/CollectionInfo.java

@@ -16,44 +16,44 @@ public class CollectionInfo implements Serializable{
 	private static final long serialVersionUID = 1L;
 	
 	@Id
-	@Column(name = "store$id")
+	@Column(name = "store_id")
 	@GeneratedValue
 	private Long id;
 	
 	/**
 	  * 收藏的器件id
 	  */
-	@Column(name = "store$compid")
+	@Column(name = "store_compid")
 	private Long componentid;
 	
 	/**
 	  * 器件id
 	  */
-	@Column(name = "store$brandid")
+	@Column(name = "store_brandid")
 	private Long brandid;
 	
 	/**
 	  * 收藏的类型  1 代表品牌  2 代表器件
 	  */
-	@Column(name = "store$kind")
+	@Column(name = "store_kind")
 	private Integer kind;
 	
 	/**
 	  * 收藏人的uu号
 	  */
-	@Column(name = "store$useruu")
+	@Column(name = "store_useruu")
 	private Long useruu;
 	
 	/**
 	 * 收藏人的enuu号
 	 */
-	@Column(name = "store$enuu")
+	@Column(name = "store_enuu")
 	private Long enuu;
 
 	/**
 	 * 是否个人用户
 	 */
-	@Column(name = "store$dissociative")
+	@Column(name = "store_dissociative")
 	private Integer dissociative;
 
 	public Long getUseruu() {

+ 69 - 58
src/main/java/com/uas/platform/b2c/trade/rate/service/impl/RateServiceImpl.java

@@ -37,7 +37,7 @@ import java.util.List;
  * Created by wangdy on 2017-08-30.
  */
 @Service
-public class RateServiceImpl implements RateService{
+public class RateServiceImpl implements RateService {
 
     @Autowired
     RateVendorDao rateVendorDao;
@@ -49,7 +49,7 @@ public class RateServiceImpl implements RateService{
     RateTemplateDao rateTemplateDao;
 
     @Autowired
-    RateBuyerDao  rateBuyerDao;
+    RateBuyerDao rateBuyerDao;
 
     @Autowired
     OrderDao orderDao;
@@ -60,7 +60,7 @@ public class RateServiceImpl implements RateService{
     final private short isAnony = 1;
 
     @Override
-    public RateVendor saveRateVendor(String orderId , RateVendor rateVendor) {
+    public RateVendor saveRateVendor(String orderId, RateVendor rateVendor) {
         rateVendor.setUserUU(SystemSession.getUser().getUserUU());
         rateVendor.setUserEnuu(SystemSession.getUser().getEnterprise().getUu());
         rateVendor.setOrderId(orderId);
@@ -70,11 +70,11 @@ public class RateServiceImpl implements RateService{
     }
 
     @Override
-    public void saveRateGoods(String orderId , List<RateGoods> rateGoodsList) {
-        if (rateGoodsDao.findByOrderId(orderId) != null && rateGoodsDao.findByOrderId(orderId).size() != 0){
+    public void saveRateGoods(String orderId, List<RateGoods> rateGoodsList) {
+        if (rateGoodsDao.findByOrderId(orderId) != null && rateGoodsDao.findByOrderId(orderId).size() != 0) {
             throw new RuntimeException();
         }
-        for (RateGoods rateGoods : rateGoodsList){
+        for (RateGoods rateGoods : rateGoodsList) {
             //默认匿名评价
             rateGoods.setIsAnony(rateGoods.getIsAnony() == null ? isAnony : rateGoods.getIsAnony());
             rateGoods.setUserUU(SystemSession.getUser().getUserUU());
@@ -95,52 +95,57 @@ public class RateServiceImpl implements RateService{
     @Override
     @Transactional
     public void savebuyerRate(String orderId, RateVendor rateVendor, List<RateGoods> rateGoodsList) {
-        if (null != getRateVendorByOrderId(orderId)){
+        if (null != getRateVendorByOrderId(orderId)) {
             throw new RuntimeException();
         }
-        saveRateVendor(orderId,rateVendor);
-        saveRateGoods(orderId,rateGoodsList);
+        saveRateVendor(orderId, rateVendor);
+        saveRateGoods(orderId, rateGoodsList);
     }
 
     @Override
-    public void autosavebuyerRate(String ids){
-            String[] idArray = ids.split(SplitChar.HYPHEN);
-            for (String id : idArray) {
-                Order order = orderDao.findByOrderid(id);
-                if(order.getRateStatus() == 523 || order.getRateStatus() == 522){continue;}
-                rateGoodsDao.delete(rateGoodsDao.findByOrderId(order.getOrderid()));
-                for (OrderDetail orderDetail : order.getOrderDetails()){
-                    RateGoods rateGoods = new RateGoods();
-                    rateGoods.setBuyerRateTime(new Date(System.currentTimeMillis()));
-                    rateGoods.setBuyerRate("此用户未及时做出评价,系统默认好评!");
-                    rateGoods.setIsAnony(isAnony);
-                    rateGoods.setEnuu(order.getSellerenuu());
-                    rateGoods.setGoodsId(orderDetail.getId());
-                    rateGoods.setLevel(isAnony);
-                    rateGoods.setOrderId(order.getOrderid());
-                    rateGoods.setStoreId(order.getStoreid());
-                    rateGoods.setUserEnuu(order.getBuyerenuu());
-                    rateGoods.setUserUU(order.getBuyeruu());
-                    rateGoodsDao.save(rateGoods);
-                }
-                RateVendor rateVendor = new RateVendor();
-                rateVendor.setUserUU(order.getBuyeruu());
-                rateVendor.setUserEnuu(order.getBuyerenuu());
-                rateVendor.setOrderId(order.getOrderid());
-                rateVendor.setTime(new Date(System.currentTimeMillis()));
-                rateVendor.setStoreId(order.getStoreid());
-                rateVendor.setEnuu(order.getSellerenuu());
-                rateVendor.setDescribeLevel((short)5);
-                rateVendor.setLogisticsLevel((short)5);
-                rateVendor.setVendorLevel((short)5);
-                rateVendorDao.save(rateVendor);
-                //订单状态变更
+    public void autosavebuyerRate(String ids) {
+        String[] idArray = ids.split(SplitChar.HYPHEN);
+        for (String id : idArray) {
+            Order order = orderDao.findByOrderid(id);
+            if (null == order) {
+                continue;
+            }
+            if (null != order.getRateStatus() && (order.getRateStatus().intValue() == Status.REVIEWED.value() || order.getRateStatus().intValue() == Status.TO_BE_AFTERREVIEWED.value())) {
+                continue;
+            }
+            rateGoodsDao.delete(rateGoodsDao.findByOrderId(order.getOrderid()));
+            for (OrderDetail orderDetail : order.getOrderDetails()) {
+                RateGoods rateGoods = new RateGoods();
+                rateGoods.setBuyerRateTime(new Date(System.currentTimeMillis()));
+                rateGoods.setBuyerRate("此用户未及时做出评价,系统默认好评!");
+                rateGoods.setIsAnony(isAnony);
+                rateGoods.setEnuu(order.getSellerenuu());
+                rateGoods.setGoodsId(orderDetail.getId());
+                rateGoods.setLevel(isAnony);
+                rateGoods.setOrderId(order.getOrderid());
+                rateGoods.setStoreId(order.getStoreid());
+                rateGoods.setUserEnuu(order.getBuyerenuu());
+                rateGoods.setUserUU(order.getBuyeruu());
+                rateGoodsDao.save(rateGoods);
+            }
+            RateVendor rateVendor = new RateVendor();
+            rateVendor.setUserUU(order.getBuyeruu());
+            rateVendor.setUserEnuu(order.getBuyerenuu());
+            rateVendor.setOrderId(order.getOrderid());
+            rateVendor.setTime(new Date(System.currentTimeMillis()));
+            rateVendor.setStoreId(order.getStoreid());
+            rateVendor.setEnuu(order.getSellerenuu());
+            rateVendor.setDescribeLevel((short) 5);
+            rateVendor.setLogisticsLevel((short) 5);
+            rateVendor.setVendorLevel((short) 5);
+            rateVendorDao.save(rateVendor);
+            //订单状态变更
                 /*if (order.getStatus().intValue() < Status.RECEIVED.value()) {
                     throw new IllegalOperatorException("当前订单不在已完成状态,不能收货!");
                 }*/
-                order.setStatusToBeAfterReviewed(SystemSession.getUser().getUserUU());
-                orderDao.save(order);
-            }
+            order.setStatusToBeAfterReviewed(SystemSession.getUser().getUserUU());
+            orderDao.save(order);
+        }
     }
 
     @Override
@@ -149,7 +154,9 @@ public class RateServiceImpl implements RateService{
         for (String id : idArray) {
             //订单状态变更
             Order order = orderDao.findByOrderid(id);
-            if (order.getRateStatus() == 522){continue;}
+            if (order.getRateStatus() == 522) {
+                continue;
+            }
             if (order.getRateStatus().intValue() != Status.TO_BE_AFTERREVIEWED.value()) {
                 throw new IllegalOperatorException("当前订单未完成初评,不能追评!");
             }
@@ -174,15 +181,17 @@ public class RateServiceImpl implements RateService{
     }
 
     @Override
-    public void autosaveVendorRate(String ids ,boolean isFirst) {
+    public void autosaveVendorRate(String ids, boolean isFirst) {
         String[] idArray = ids.split(SplitChar.HYPHEN);
         for (String id : idArray) {
             //订单状态变更
             Purchase purchase = purchaseDao.findByPurchaseid(id);
-            if(isFirst){
+            if (isFirst) {
                 Order order = orderDao.findByOrderid(purchase.getOrderid());
 
-                if(rateBuyerDao.findByOrderId(order.getOrderid()) !=null ){continue;}
+                if (rateBuyerDao.findByOrderId(order.getOrderid()) != null) {
+                    continue;
+                }
                 RateBuyer rateBuyer = new RateBuyer();
                 rateBuyer.setLevel(isAnony);
                 rateBuyer.setOrderId(purchase.getOrderid());
@@ -196,14 +205,16 @@ public class RateServiceImpl implements RateService{
                 rateBuyerDao.save(rateBuyer);
                 //purchase.setTobeRate(SystemSession.getUser().getUserUU());
                 //purchaseDao.save(purchase);
-            }else {
+            } else {
                 RateBuyer rateBuyer;
                 try {
-                     rateBuyer = rateBuyerDao.findByOrderId(purchase.getOrderid()).get(0);
-                }catch (Exception e ){
+                    rateBuyer = rateBuyerDao.findByOrderId(purchase.getOrderid()).get(0);
+                } catch (Exception e) {
+                    continue;
+                }
+                if (rateBuyer.getVendorAfterRateTime() != null) {
                     continue;
                 }
-                if(rateBuyer.getVendorAfterRateTime() !=null ){continue;}
                 rateBuyer.setVendorAfterRateTime(new Date(System.currentTimeMillis()));
                 rateBuyerDao.save(rateBuyer);
                 //purchase.setTobeAfterRate(SystemSession.getUser().getUserUU());
@@ -221,7 +232,7 @@ public class RateServiceImpl implements RateService{
 
     @Override
     public RateGoods saveReply(String orderId, Long goodsId, String reply) {
-        RateGoods rateGoods = rateGoodsDao.findByOrderIdAndGoodsId(orderId,goodsId).get(0);
+        RateGoods rateGoods = rateGoodsDao.findByOrderIdAndGoodsId(orderId, goodsId).get(0);
         rateGoods.setReturnMeg(reply);
         rateGoods.setReturnMegTime(new Date(System.currentTimeMillis()));
         return rateGoodsDao.save(rateGoods);
@@ -229,7 +240,7 @@ public class RateServiceImpl implements RateService{
 
     @Override
     public RateGoods saveAfterReply(String orderId, Long goodsId, String reply) {
-        RateGoods rateGoods = rateGoodsDao.findByOrderIdAndGoodsId(orderId,goodsId).get(0);
+        RateGoods rateGoods = rateGoodsDao.findByOrderIdAndGoodsId(orderId, goodsId).get(0);
         rateGoods.setAfterReturnMeg(reply);
         rateGoods.setAfterReturnMegTime(new Date(System.currentTimeMillis()));
         return rateGoodsDao.save(rateGoods);
@@ -247,10 +258,10 @@ public class RateServiceImpl implements RateService{
 
     @Override
     public RateBuyer getRateBuyerByOrderId(String orderId) {
-        RateBuyer rateBuyer ;
+        RateBuyer rateBuyer;
         try {
             rateBuyer = rateBuyerDao.findByOrderId(orderId).get(0);
-        }catch (IndexOutOfBoundsException e){
+        } catch (IndexOutOfBoundsException e) {
             return null;
         }
         return rateBuyer;
@@ -261,7 +272,7 @@ public class RateServiceImpl implements RateService{
         RateVendor rateVendor;
         try {
             rateVendor = rateVendorDao.findByOrderId(orderId).get(0);
-        }catch (IndexOutOfBoundsException e){
+        } catch (IndexOutOfBoundsException e) {
             return null;
         }
         return rateVendor;
@@ -272,7 +283,7 @@ public class RateServiceImpl implements RateService{
         RateGoods rateGoods;
         try {
             rateGoods = rateGoodsDao.findByGoodsId(goodsId).get(0);
-        }catch (IndexOutOfBoundsException e){
+        } catch (IndexOutOfBoundsException e) {
             return null;
         }
         return rateGoods;

+ 1 - 2
src/main/resources/dev/jdbc.properties

@@ -1,6 +1,5 @@
 jdbc.driverClassName=com.mysql.jdbc.Driver
-#jdbc.url=jdbc:oracle:thin:@192.168.253.6:1521:orcl
-jdbc.url=7e5ef205e2ff4ca4ac98c9f833880ec6e2fe1a4579ebe6946c98747cbe3897b66b5c4cb4985aa8f22aa1cbab4bc6bfe12e09403e6255e2fda2f113bc366bbfc5d9a2cf99c34ce47ba6bd752a9bf5f04c3faf83464996ab6930a84c7d3b9f62d759eb691bc8cd1fe3225f6e7efa5ab3a583896b06178e65c56c3c4e448a0ae4fe
+jdbc.url=7e5ef205e2ff4ca4ac98c9f833880ec6e2fe1a4579ebe694e129681326fc2cb1b5fe058042985e2f72b57c8be4fa3e1544065eabf2ab94ad017d02162675aa969997adc7fd7bd04c0eb8bcc3a1733fe6a27f40bcf87efef4566f5872030efe79859a9abb7cbad9c1aa1ae7c2bb1cb23007adc91d94a9369cec407809597189c5
 jdbc.username=474e1aeadeeecac5
 jdbc.password=48981af937f010627b96e886a0d38aad
 jdbc.initialSize=1

+ 4 - 4
src/main/resources/dev/sys.properties

@@ -25,13 +25,13 @@ orderProxyUrl=http://192.168.253.12:23400/order/proxy
 reportPrintUrl=http://print.ubtob.com/report/print?userName=B2C&profile=${profile}&reportName=%s&whereCondition=%s
 reportUploadUrl=http://print.ubtob.com/report/fileUpload?userName=B2C
 # micro service IP(Swarm Manager IP)
-microServiceIp=10.10.101.23
+microServiceIp=10.10.100.23
 newsMicroServiceIp=news.usoftchina.com
 newsRedisRefresh=3600
-floorMicroServiceIp=10.10.101.23
-carouselMicroServiceIp=10.10.101.23
+floorMicroServiceIp=10.10.100.23
+carouselMicroServiceIp=10.10.100.23
 storecmsMicroServiceIp=192.168.253.12
-endpointUri=10.10.101.23
+endpointUri=10.10.100.23
 recommendPort=20100
 # upload file
 uploadFileUrl = http://10.10.100.200:9999

BIN
src/main/resources/jxls-tpl/trade/products.xls


BIN
src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls


BIN
src/main/resources/jxls-tpl/trade/releaseByBatchError-rmb.xls


Some files were not shown because too many files changed in this diff