Browse Source

Merge remote-tracking branch 'origin/dev-mysql' into dev-mysql

wangyc 8 years ago
parent
commit
e05d4ef0f8
100 changed files with 6567 additions and 1886 deletions
  1. 13 0
      src/main/java/com/uas/platform/b2c/advertise/ad/constant/FloorsModule.java
  2. 0 2
      src/main/java/com/uas/platform/b2c/advertise/ad/model/RecommendProduct.java
  3. 7 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/FloorsService.java
  4. 9 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/RecommendProductService.java
  5. 63 4
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/FloorsServiceImpl.java
  6. 32 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/RecommendProductServiceImpl.java
  7. 2 0
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  8. 4 4
      src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java
  9. 12 1
      src/main/java/com/uas/platform/b2c/core/constant/ReleaseStatus.java
  10. 71 65
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  11. 28 0
      src/main/java/com/uas/platform/b2c/core/utils/PatternUtil.java
  12. 19 0
      src/main/java/com/uas/platform/b2c/core/utils/RegexConstant.java
  13. 6 0
      src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/OrderServiceImpl.java
  14. 25 0
      src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java
  15. 10 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/DoubleConstant.java
  16. 37 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  17. 15 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/IntegerConstant.java
  18. 5 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ShortConstant.java
  19. 18 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java
  20. 112 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  21. 79 1
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java
  22. 70 5
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  23. 12 10
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  24. 130 10
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  25. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsHistoryDao.java
  26. 22 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java
  27. 15 0
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductMatchResultDao.java
  28. 13 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/ReleaseProductByBatchDao.java
  29. 52 16
      src/main/java/com/uas/platform/b2c/prod/commodity/facade/impl/ProductFacadeImpl.java
  30. 127 1
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  31. 62 3
      src/main/java/com/uas/platform/b2c/prod/commodity/model/GoodsHistory.java
  32. 75 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Product.java
  33. 260 9
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  34. 8 8
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsHistoryService.java
  35. 89 2
      src/main/java/com/uas/platform/b2c/prod/commodity/service/GoodsService.java
  36. 44 1
      src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java
  37. 8 20
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsHistoryServiceImpl.java
  38. 497 384
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  39. 504 37
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java
  40. 484 369
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  41. 84 0
      src/main/java/com/uas/platform/b2c/prod/commodity/task/CommodityTask.java
  42. 15 15
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
  43. 6 6
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandService.java
  44. 35 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/KindInfo.java
  45. 16 6
      src/main/java/com/uas/platform/b2c/prod/store/facade/impl/CommodityFacadeImpl.java
  46. 13 5
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDao.java
  47. 1 1
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDetailDao.java
  48. 8 0
      src/main/java/com/uas/platform/b2c/trade/order/service/OrderDetailService.java
  49. 12 3
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderDetailServiceImpl.java
  50. 22 9
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java
  51. 8 10
      src/main/java/com/uas/platform/b2c/trade/presale/facade/impl/CartFacadeImpl.java
  52. 2 2
      src/main/resources/dev/sys.properties
  53. BIN
      src/main/resources/jxls-tpl/trade/products.xls
  54. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  55. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-rmb.xls
  56. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-usd.xls
  57. BIN
      src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls
  58. 4 0
      src/main/resources/spring/context.xml
  59. 5 0
      src/main/resources/spring/task.xml
  60. 2 2
      src/main/resources/test/sys.properties
  61. BIN
      src/main/webapp/resources/img/store/common/nonstandard.png
  62. BIN
      src/main/webapp/resources/img/store/common/standard.png
  63. BIN
      src/main/webapp/resources/img/tour/step1.png
  64. BIN
      src/main/webapp/resources/img/tour/step1_1.png
  65. BIN
      src/main/webapp/resources/img/tour/step2.png
  66. BIN
      src/main/webapp/resources/img/tour/step2_2.png
  67. BIN
      src/main/webapp/resources/img/tour/step3.png
  68. BIN
      src/main/webapp/resources/img/tour/step3_3.png
  69. BIN
      src/main/webapp/resources/img/tour/step4.png
  70. BIN
      src/main/webapp/resources/img/tour/step4_4.png
  71. BIN
      src/main/webapp/resources/img/tour/step5.png
  72. BIN
      src/main/webapp/resources/img/vendor/images/angle-down.png
  73. BIN
      src/main/webapp/resources/img/vendor/images/detail.png
  74. BIN
      src/main/webapp/resources/img/vendor/images/label.png
  75. 3 5
      src/main/webapp/resources/js/admin/controllers/search/search_See.js
  76. 45 1
      src/main/webapp/resources/js/common/directives.js
  77. 56 1
      src/main/webapp/resources/js/common/query/goods.js
  78. 21 0
      src/main/webapp/resources/js/common/query/material.js
  79. 10 0
      src/main/webapp/resources/js/common/query/product.js
  80. 4 0
      src/main/webapp/resources/js/common/query/productImport.js
  81. 24 1
      src/main/webapp/resources/js/common/services.js
  82. 18 2
      src/main/webapp/resources/js/store/controllers/default/StoreHomeCtrl.js
  83. 290 310
      src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js
  84. 2 2
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_order_ctrl.js
  85. 3 3
      src/main/webapp/resources/js/vendor/app.js
  86. 1 1
      src/main/webapp/resources/js/vendor/controllers/ReleaseProductByBatchCtrl.js
  87. 1 1
      src/main/webapp/resources/js/vendor/controllers/forstore/pay_center_ctrl.js
  88. 929 63
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialCtrl.js
  89. 492 248
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js
  90. 1 1
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_proRepository_ctrl.js
  91. 102 38
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js
  92. 1 1
      src/main/webapp/resources/view/admin/search/search_See.html
  93. 6 2
      src/main/webapp/resources/view/common/modal/delete_modal.html
  94. 6 5
      src/main/webapp/resources/view/common/modal/product_upload_modal.html
  95. 19 5
      src/main/webapp/resources/view/usercenter/forstore/buyer_cart.html
  96. 24 13
      src/main/webapp/resources/view/usercenter/forstore/buyer_order.html
  97. 16 4
      src/main/webapp/resources/view/usercenter/forstore/order_detail.html
  98. 11 3
      src/main/webapp/resources/view/usercenter/forstore/order_pay.html
  99. 17 5
      src/main/webapp/resources/view/vendor/forstore/purchase_detail.html
  100. 1192 158
      src/main/webapp/resources/view/vendor/forstore/vendor_material.html

+ 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;
 
 /**

+ 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);
 }

+ 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;

+ 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 != null && user.getUserName() != null){
+		if(user.getUserName() != null && user.getUserName() != null){
 			return user.getUserName().substring(0,1)+"**";
 		}
-		return null;
+		return user.getUserName();
 	}
 
 	public UsageLog() {

+ 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 待开发票}

+ 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();
+    }
 }

+ 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;

+ 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;
+}

+ 79 - 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,47 @@ 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);
+    }
+
+    @RequestMapping(value = "/arrange", method = RequestMethod.GET)
+    public String arrangeGoods() {
+		return goodsService.arrangeGoods();
+	}
+
+	@RequestMapping(value = "/{productid}/deleteMessage", method = RequestMethod.GET)
+	public ResultMap getDeleteProductMessage(@PathVariable("productid") Long productid) {
+		return goodsService.getDeleteProductMessage(productid);
+	}
 }

+ 70 - 5
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());
 
     /**
@@ -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模板");

+ 130 - 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);
 
+    /**
+     * 根据产品编号获取相同标签的信息
+     * @param prodNum
+     * @param tag
+     * @return
+     */
+	@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);
 
     /**
-     * 根据企业uu和器件uuid和状态获取商品总库存
-     * @param enuu
-     * @param uuid
+     * 根据产品编号获取相同标签的信息
+     * @param productid
+     * @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.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,15 @@ 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);
 }

+ 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);
 
     /**

+ 22 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/dao/ProductDao.java

@@ -47,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
      *
@@ -105,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);
+
 }

+ 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;
+	}
 }

+ 62 - 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,7 +946,22 @@ public class GoodsHistory {
         /**
          * {@code, 111, 标准上架管理更新库存信息}
          */
-        STANDARD_MODIFY(111, "标准上架管理更新库存信息");
+        STANDARD_MODIFY(111, "标准上架管理更新库存信息"),
+
+		/**
+		 * {@code, 112, 匹配标准后重复删除}
+		 */
+		DELETE_FOR_REPEAT(112, "匹配标准后重复删除"),
+
+		/**
+		 * 增加在售产品
+		 */
+		ADD_GOODS(113, "添加在售产品信息"),
+
+		/**
+		 * {@code, 614 手动删除}
+		 */
+		DELETE(614, "手动删除");
 
 		private final int value;
 		private final String phrase;
@@ -1000,6 +1041,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 +1134,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;
+	}
 }

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

@@ -165,6 +165,12 @@ public class Product {
 	@Column(name = "pr_pbranden")
 	private String pbranden;
 
+	/**
+	 * 品牌(平台)id
+	 */
+	@Column(name = "pr_pbrandid")
+	private Long pbrandid;
+
 	/**
 	 * 品牌(平台)(uuid)
 	 */
@@ -184,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 匹配成功 ->变为标准
@@ -266,6 +288,12 @@ public class Product {
 	@Column(name = "pr_b2cenabled")
 	private Integer b2cEnabled;
 
+	/**
+	 * 产品建立时间
+	 */
+	@Column(name = "pr_create_time")
+	private Date createTime;
+
 	/**
 	 * 转成标准的时间
 	 */
@@ -286,6 +314,12 @@ public class Product {
 	@Transient
 	private ProductDetail productDetail;
 
+	/**
+	 * goods表信息中存在多少条数据
+	 */
+	@Column(name = "pr_batchcount")
+	private Integer batchCount;
+
 	public Product() {
 	}
 
@@ -423,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;
 	}
@@ -513,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;
 	}
@@ -645,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);
-
-
     /**
      * 对比批次变化并记录批次改动信息
      *

+ 89 - 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,73 @@ 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
      */
-    public void addVisitCount(String batchCode);
+    void addVisitCount(String batchCode);
+
+    /**
+     * 根据productid
+     * @param productid
+     */
+    ResultMap getDeleteProductMessage(Long
+                                              productid);
 }

+ 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
+ 497 - 384
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java


+ 504 - 37
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;
@@ -37,6 +46,7 @@ import com.uas.platform.core.model.Type;
 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 oracle.jdbc.oracore.OracleType;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +55,8 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Sort;
 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;
@@ -56,6 +68,7 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.lang.reflect.Field;
+import java.sql.CallableStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -91,6 +104,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private GoodsDao goodsDao;
 
+    @Autowired
+    private CartDao cartDao;
+
     @Autowired
     private ProductModifyHistoryDao productModifyHistoryDao;
 
@@ -109,6 +125,9 @@ public class ProductServiceImpl implements ProductService {
     @Autowired
     private CartService cartService;
 
+    @Autowired
+    private GoodsBrowsingHistoryDao goodsBrowsingHistoryDao;
+
     @Autowired
     private OrderDetailService orderDetailService;
 
@@ -127,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);
@@ -149,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>() {
@@ -182,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) {
@@ -212,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
@@ -227,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("该产品中存在已下单的在售产品信息,不能删除");
+                }
         }
     }
 
@@ -252,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++;
             }
@@ -276,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);
     }
 
@@ -485,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);
+    }
+
     /**
      * 根据标准上架信息 保存对产品包装,包装数量,生产日期的修改
      *
@@ -508,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
@@ -724,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
+ 484 - 369
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));
+       }
+    }
+}

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

@@ -73,21 +73,6 @@ public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository
 	@Query("select b from Brand b where upper(b.nameCn)=upper(:nameCn)")
 	public List<Brand> findByUpperNameCn(@Param("nameCn") String nameCn);
 
-	/**
-	 * 分页根据首字母获取品牌信息
-	 * @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();
-
 	/**
 	 * 品牌点击次数加一
 	 * @param uuid
@@ -107,4 +92,19 @@ public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository
 	@Transactional
 	@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();
 }

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

@@ -187,16 +187,16 @@ public interface BrandService {
 	 */
 	public List<BrandMostSimpleInfo> getBatchBrandMostSimpleInfs(List<Long> batchIds);
 
-	/**
-	 * 获取搜索量最高的2个品牌
-	 * @return 品牌信息
-	 */
-	public List<Brand> getMostSearchBrands();
-
 	/**
 	 * 器件点击次数加一
 	 * @param uuid
 	 * @return
 	 */
 	public void addVisitCount(String uuid);
+
+	/**
+	 * 获取搜索量最高的2个品牌
+	 * @return 品牌信息
+	 */
+	public List<Brand> getMostSearchBrands();
 }

+ 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;
+	}
 }

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

@@ -1652,13 +1652,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 +1783,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);
+                    }
+
                 }
             }
 

+ 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()) {

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

@@ -28,8 +28,8 @@ reportUploadUrl=http://print.ubtob.com/report/fileUpload?userName=B2C
 microServiceIp=10.10.101.23
 newsMicroServiceIp=news.usoftchina.com
 newsRedisRefresh=3600
-floorMicroServiceIp=10.10.100.23
-carouselMicroServiceIp=10.10.100.23
+floorMicroServiceIp=10.10.101.23
+carouselMicroServiceIp=10.10.101.23
 storecmsMicroServiceIp=192.168.253.12
 endpointUri=10.10.101.23
 recommendPort=20100

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


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


BIN
src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls


+ 4 - 0
src/main/resources/spring/context.xml

@@ -145,6 +145,10 @@
 	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 		<property name="dataSource" ref="dataSource" />
 	</bean>
+	<!-- namedParameterJdbcTemplate -->
+	<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
+		<constructor-arg ref="dataSource" />
+	</bean>
 	<!-- 使用ehcache对象缓存 -->
 	<cache:annotation-driven />
 	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">

+ 5 - 0
src/main/resources/spring/task.xml

@@ -19,6 +19,11 @@
         <task:scheduled ref="RateTask" method="autoAfterRate" cron="0 0 1 * * ?"/>
        <!-- <task:scheduled ref="RateTask" method="autoAfterRate" cron="* */10 * * * ?"/>-->
     </task:scheduled-tasks>
+
+    <!--批次过期自动下架-->
+    <!--<task:scheduled-tasks>-->
+        <!--<task:scheduled ref="CommodityTask" method="autoDownOverDueCommodity" cron="0 0 1 * * ?"/>-->
+    <!--</task:scheduled-tasks>-->
     <task:scheduled-tasks>
         <task:scheduled ref="CommonTask" method="updateCount" cron="0 0 1 * * ?"/>
     </task:scheduled-tasks>

+ 2 - 2
src/main/resources/test/sys.properties

@@ -28,8 +28,8 @@ reportUploadUrl=http://print.ubtob.com/report/fileUpload?userName=B2C
 microServiceIp=10.10.101.23
 newsMicroServiceIp=news.usoftchina.com
 newsRedisRefresh=3600
-floorMicroServiceIp=10.10.100.23
-carouselMicroServiceIp=10.10.100.23
+floorMicroServiceIp=10.10.101.23
+carouselMicroServiceIp=10.10.101.23
 storecmsMicroServiceIp=192.168.253.12
 endpointUri=10.10.101.23
 recommendPort=20100

BIN
src/main/webapp/resources/img/store/common/nonstandard.png


BIN
src/main/webapp/resources/img/store/common/standard.png


BIN
src/main/webapp/resources/img/tour/step1.png


BIN
src/main/webapp/resources/img/tour/step1_1.png


BIN
src/main/webapp/resources/img/tour/step2.png


BIN
src/main/webapp/resources/img/tour/step2_2.png


BIN
src/main/webapp/resources/img/tour/step3.png


BIN
src/main/webapp/resources/img/tour/step3_3.png


BIN
src/main/webapp/resources/img/tour/step4.png


BIN
src/main/webapp/resources/img/tour/step4_4.png


BIN
src/main/webapp/resources/img/tour/step5.png


BIN
src/main/webapp/resources/img/vendor/images/angle-down.png


BIN
src/main/webapp/resources/img/vendor/images/detail.png


BIN
src/main/webapp/resources/img/vendor/images/label.png


+ 3 - 5
src/main/webapp/resources/js/admin/controllers/search/search_See.js

@@ -68,7 +68,7 @@ define(['app/app'], function (app) {
                             'keyword' : $scope.keyword
                      }}).then(function (data) {
                         $scope.result = data.data;
-                        $scope.result.time = (new Date()).valueOf() - timestart;
+                        $scope.searchtime = (new Date()).valueOf() - timestart;
                         console.log(data);
                     },function (error) {
                     });
@@ -81,7 +81,6 @@ define(['app/app'], function (app) {
                             'collectList' : 'goods_kind',
                             'paramJSON':{}
                         }}).then(function (data) {
-                        $scope.result = data.data;
                         $scope.kindtime = (new Date()).valueOf() - timestart;
                         console.log(data);
                     },function (error) {
@@ -95,7 +94,6 @@ define(['app/app'], function (app) {
                             'collectList' : 'goods_brand',
                             'paramJSON':{}
                         }}).then(function (data) {
-                        $scope.result = data.data;
                         $scope.brandtime = (new Date()).valueOf() - timestart;
                         console.log(data);
                     },function (error) {
@@ -182,13 +180,13 @@ define(['app/app'], function (app) {
                 if($rootScope.userInfo) {
                     params.userUU = $rootScope.userInfo.userUU;
                 }
-                $http.get('search/similarKeywords', {
+                /*$http.get('search/similarKeywords', {
                     params : params
                 }).success(function(data){
                     $scope.associates = data;// 联想词数组
                 }).error(function(response) {
 
-                });
+                });*/
             } else {
                 $scope.associates = [];// 联想词数组
             }

+ 45 - 1
src/main/webapp/resources/js/common/directives.js

@@ -282,7 +282,51 @@ define(['angular', 'showdown', 'angular-toaster'], function(angular) {
 					element.css({'left': left, 'top' : top});
 				}
 			}
-		}]);
+		}]).
+	/**
+	 * 验证所有分段价格的信息
+	 */
+	directive('validataPrice', ['toaster', function (toaster) {
+		return {
+			restrict:'A',
+			require:'?^ngModel',
+			link:function(scope, iele, iattr, ctrl){
+				var validataPrice =  function () {
+					if(ctrl.$viewValue) {
+						var value = ctrl.$viewValue;
+						var model = ctrl.$modelValue;
+						if(!value) {
+							return ;
+						}
+						if(value.indexOf('.') > -1) {
+							var arr = value.split(".");
+							if(arr[0].length > 4) {
+								ctrl.$setViewValue(model);
+								ctrl.$render();
+								// toaster.pop('warning', '提示', '单价必须小于10000');
+								return model;
+							}
+							if(arr[1].length > 6) {
+								ctrl.$setViewValue(model);
+								ctrl.$render();
+								// toaster.pop('warning', '提示', '单价只精确到小数点后6位');
+								return model;
+							}
+						}else {
+							if(value.toString().length > 4) {
+								ctrl.$setViewValue(model);
+								ctrl.$render();
+								// toaster.pop('warning', '提示', '单价必须小于10000');
+								return model;
+							}
+						}
+					}
+					return value;
+				};
+				ctrl.$parsers.push(validataPrice);
+			}
+		}
+	}]);
 
 
 	angular.module("common.tpls", ["template/common/datetrigger.html"]);

+ 56 - 1
src/main/webapp/resources/js/common/query/goods.js

@@ -123,16 +123,26 @@ define([ 'ngResource' ], function() {
 				url : 'trade/goods/store/status',
 				method : 'GET'
 			},
-			// 重新上架已下架商品
+			// 重新上架已下架商品 该方法的后台代码又问题,被弃用
 			putOnCommodityOnce : {
 				url : rootPath + '/trade/goods/:batchCode/putOnOnce',
 				method : 'PUT'
 			},
+			//商品上架
+			putOn : {
+				url : 'trade/goods/putOn/:id',
+				method: 'PUT'
+			},
 			// 卖家下架已上架商品
 			offShelfGoodsByProvider : {
 				url : rootPath + '/trade/goods/provider/off/shelf',
 				method : 'PUT'
 			},
+			// 卖家下架已上架商品
+			offShelfGoodsByids : {
+				url : rootPath + '/trade/goods/provider/down/id',
+				method : 'PUT'
+			},
 			// 随机生成4个热卖商品 Deprecated
             randomGetHotCommodity : {
 				url : rootPath + '/trade/goods/hot/random',
@@ -199,6 +209,51 @@ define([ 'ngResource' ], function() {
 			downAllGoodsByEnterprise : {
 				url : 'trade/goods/downAllGoods/enterprise',
 				method : 'GET'
+			},
+			/**
+			 * 根据产品id获取对应上架信息
+			 */
+			getGoodsByProductId : {
+				url : 'trade/goods/by/productId',
+				method : 'GET',
+				isArray : true
+			},
+			/**
+			 * 修改goods状态,转为在售
+			 */
+			modifyGoodsStatus : {
+				url : 'trade/goods/turn/sale',
+				method : 'PUT'
+			},
+			/**
+			 * 是否被推荐了
+			 */
+			isRecommendGoods : {
+				url : 'trade/goods/isRecommend/:id',
+				method: 'GET'
+			},
+
+			/**
+			 * 删除产品信息
+			 */
+			deleteGoodsById : {
+				url : 'trade/goods/delete/:id',
+				method:  'DELETE'
+			},
+			/**
+			 * 添加产品信息
+			 */
+			addGoods : {
+				url : 'trade/goods/addGoods',
+				method : 'POST'
+			},
+			getDeleteProductMessage : {
+				url : 'trade/goods/:productid/deleteMessage',
+				method : 'GET'
+			},
+			getRepeatByTagAndProductId : {
+				url : 'trade/goods/repeat/tag',
+				method : 'GET'
 			}
 		});
 	}]);

+ 21 - 0
src/main/webapp/resources/js/common/query/material.js

@@ -39,6 +39,11 @@ define([ 'ngResource' ], function() {
                 url: 'trade/products/match',
                 method: 'GET'
             },
+            // 匹配非标产品,非标上架版本
+            matchNonProduct : {
+                url: 'trade/products/match/nonProduct',
+                method: 'GET'
+            },
             updateProduct : {
                 url: 'trade/products/update',
                 method: 'POST'
@@ -55,6 +60,22 @@ define([ 'ngResource' ], function() {
             saveDetail: {
                 url: 'trade/products/savedetail/:productId',
                 method: 'POST'
+            },
+            //返回标准和非标的数量
+            getCountOfProduct : {
+                url: 'trade/products/count',
+                method: 'GET'
+            },
+            //根据物料id的信息获取产品信息
+            getGoodsByProductId : {
+                url: 'trade/products/goods/productid/:id',
+                method: 'GET',
+                isArray: true
+            },
+            //选择保留产品信息后更新在售相关信息
+            updateInfoAfterChoose : {
+                url: 'trade/products/update/goods',
+                method: 'POST'
             }
         });
     }]);

+ 10 - 0
src/main/webapp/resources/js/common/query/product.js

@@ -74,5 +74,15 @@ define([ 'angular', 'ui-bootstrap', 'ngResource', 'ngLocal' ], function(angular)
 			$modalInstance.close(product);
 		};
 		
+	}]).factory('ProductServiceQuery', ['$resource', function ($resource) {
+		return $resource('trade/products', {}, {
+			/**
+			 * 根据id 获取products信息
+			 */
+			getProductById: {
+				url: 'trade/products/:id',
+				method: 'GET'
+			}
+		});
 	}]);
 });

+ 4 - 0
src/main/webapp/resources/js/common/query/productImport.js

@@ -39,6 +39,10 @@ define(['ngResource'], function(ngResource) {
             updateMatch : {
                 url : 'trade/products/update',
                 method : 'PUT'
+            },
+            saveMatchInfo : {
+                url : 'trade/products/save/matchInfo',
+                method : 'POST'
             }
         });
     }]);

+ 24 - 1
src/main/webapp/resources/js/common/services.js

@@ -822,5 +822,28 @@ define([ 'angular', 'common/utils', 'big'], function(angular, utils, Big) {
                 method : 'POST'
             }
         });
-    }]);
+    }]).factory('ByteCountService', [function () {
+		/**
+		 * 统计字符串的字节数
+		 * 中文字符两个字节,
+		 * 英文是一个字节
+		 */
+		return {
+			strByteLength : function(str) {
+				if(str) {
+					var byteLen = 0, len = str.length;
+					for(var i = 0; i < len; i++) {
+						if(str.charCodeAt(i) > 255) {
+							byteLen += 2;
+						}else {
+							byteLen++;
+						}
+					}
+					return byteLen;
+				}else {
+					return 0;
+				}
+			}
+		}
+	}]);
 });

+ 18 - 2
src/main/webapp/resources/js/store/controllers/default/StoreHomeCtrl.js

@@ -99,7 +99,19 @@ define(['app/app'], function(app) {
 				return ;
 			}
 			Commodity.getAllKindsInfoByStoreUuid({ StoreUuid : $scope.storeInfo.uuid }, function (kinds) {
-				$scope.kinds = kinds ? kinds : [];
+				$scope.kinds = [];
+				if (kinds){
+					var others = {
+						id : -10,
+						nameCn : '其他',
+						children : [],
+						isLeaf : 1,
+						parentid : 0,
+						level : 1
+					};
+					kinds.push(others);
+					$scope.kinds = kinds;
+				}
 			}, function () {
 				$scope.kinds = [];
 			});
@@ -211,7 +223,11 @@ define(['app/app'], function(app) {
 		function refreshGoodsListByKind(kind) {
 			$scope.code = null;
 			if (kind) {
-				$scope.kindUuid = getAllLeafKindId(kind);
+				if (kind.nameCn == '其他'){
+					$scope.kindUuid = '其他';
+				}else {
+					$scope.kindUuid = getAllLeafKindId(kind);
+				}
 				// 获取所有叶子节点信息
 				reloadGoodsList();
 			} else if ($scope.kindUuid && !kind) {

+ 290 - 310
src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js

@@ -86,253 +86,243 @@ define(['app/app'], function (app) {
           // 	$scope.isModify = false;
           // };
 
-          //删除地址
-          $scope.deleteAddress = function (address) {
-            $scope.deleteObject = angular.copy(address);
-            ;
-            $scope.showDeleteFrame = true;
-          };
-
-          $scope.cancelDelete = function () {
-            $scope.showDeleteFrame = false;
-          };
-
-          $scope.ensureDelete = function (addressId) {
-            ShippingAddress.del({addid: addressId}, {}, function () {
-              $scope.showDeleteFrame = false;
-              $scope.loadAddresses();
-            }, function () {
-              toaster.pop('error', '删除收货地址失败');
-            });
-          };
-          $scope.telFlag = true;
-          $scope.emailFlag = true;
-          /**
-           * 验证手机号是否可用
-           */
-          $scope.telValid = function (tel) {
-            if (tel) {
-              if (tel == $scope.userInfoBackup.userTel) {
-                $scope.telFlag = true;
-                return;
-              }
-              $http.get('basic/user/telEnable', {
-                params: {
-                  tel: tel
-                }
-              }).success(function (data) {
-                data = eval(data);
-                if (data == true) {
-                  $scope.telFlag = true;
-                } else {
-                  if (tel.length == 11) {
-                    toaster.pop('error', '错误', '手机号 ' + tel + ' 已被注册');
-                  }
-                  $scope.telFlag = false;
-                }
-              }).error(function () {
-                $scope.telFlag = false;
-              });
-            } else {
-              $scope.telFlag = false;
-            }
-          };
-
-          /**
-           * 验证邮箱是否可用
-           */
-          $scope.emailValid = function (email) {
-            if (email) {
-              if (email == $scope.userInfoBackup.userEmail) {
-                $scope.emailFlag = true;
-                return;
-              }
-              $http.get('basic/user/emailEnable', {
-                params: {
-                  email: email
-                }
-              }).success(function (data) {
-                data = eval(data);
-                if (data == true) {
-                  $scope.emailFlag = true;
-                } else {
-                  toaster.pop('error', '错误', '邮箱 ' + email + ' 已被注册');
-                  $scope.emailFlag = false;
-                }
-              }).error(function () {
-                $scope.emailFlag = false;
-              });
-            } else {
-              $scope.emailFlag = false;
-            }
-          };
-          /**
-           * 变更到更新状态
-           */
-          $scope.changeToUpdate = function (isUpdate) {
-            $scope.updateState = isUpdate;
-            if ($scope.updateState == false) {
-              $scope.userInfo = angular.copy($scope.userInfoBackup);
-            }
-          };
-
-          /**
-           * 验证用户信息
-           */
-          function validateUserInfo() {
-            var props = ['userName', 'userEmail', 'userTel'];
-
-            var flag = true;
-            angular.forEach(props, function (prop) {
-              if ($scope.userInfo.hasOwnProperty(prop)) {
-                if (!$scope.userInfo[prop] || $scope.userInfo[prop] === '') {
-                  console.log(prop + '不能为空');
-                  // TODO 记录验证信息
-                  flag = false;
-                }
-              } else {
-                console.log(prop + '不能为空');
-                flag = false;
-              }
-            });
-            return flag;
-          }
-
-          /**
-           * 保存用户信息
-           */
-          $scope.saveUpdate = function () {
-            // 先检查信息是否为空
-            if (angular.equals($scope.userInfo, $scope.userInfoBackup)) {
-              toaster.pop('error', '未做任何修改');
-              $scope.updateState = false;
-              return;
-            }
-            var userInfoFlag = validateUserInfo();
-            if (!userInfoFlag) {
-              toaster.pop('error', '请补充完信息后再次提交');
-              return;
-            }
-
-            if ($scope.telFlag && $scope.emailFlag) {
-              Enterprise.updateUser({uu: $scope.userInfo.userUU},
-                  $scope.userInfo, function () {
-                    $scope.loading = false;
-                    toaster.pop('success', '提示', '用户信息修改成功');
-                    $scope.userInfoBackup = angular.copy($scope.userInfo);
-                    $scope.updateState = false;
-
-                  }, function (response) {
-                    $scope.updateState = false;
-                    $scope.userInfo = angular.copy($scope.userInfoBackup);
-                    toaster.pop('error', '修改失败', response.data);
-                  });
-            }
-            else {
-              toaster.pop('error', '提示', '修改失败!');
-              $scope.userInfo = angular.copy($scope.userInfoBackup);
-              $scope.updateState = false;
-            }
-          };
+		//删除地址
+		$scope.deleteAddress = function (address) {
+			$scope.deleteObject = angular.copy(address);;
+			$scope.showDeleteFrame = true;
+		};
 
-          // 分页数据
-          $scope.addressList = [];
-          //总条数是否大于5个
-          $scope.isBiggerFive = false;
-          $scope.shippingAddressTableParams = new ngTableParams({
-            page: 1,
-            count: 20,
-            sorting: {
-              num: 'ASC'
-            }
-          }, {
-            total: 0,
-            getData: function ($defer, params) {
-              const param = BaseService.parseParams(params.url());
-              param.isSend = false;
-              ShippingAddress.pageAddressOfUser(param, {}, function (page) {
-                $scope.isBiggerFive = false;
-                $scope.total = page.totalElements;
-                params.total(page.totalElements);
-                if (page.content) {
-                  $scope.addressList = page.content;
-                } else {
-                  $scope.addressList = [];
-                }
-                angular.forEach($scope.addressList, function (attr) {
-                  var arr = attr.area.split(',');
-                  attr.province = arr[0];
-                  attr.city = arr[1];
-                  attr.district = arr[2];
-                });
-                if ($scope.total > 5) {
-                  $scope.isBiggerFive = true;
-                }
-              });
-            }
-          });
+		$scope.cancelDelete = function () {
+			$scope.showDeleteFrame = false;
+		};
 
-          $scope.loadAddresses = function () {
-            $scope.shippingAddressTableParams.page(1);
-            $scope.shippingAddressTableParams.reload();
-          };
-          $scope.loadAddresses();
+		$scope.ensureDelete = function (addressId) {
+			ShippingAddress.del({ addid : addressId }, {}, function () {
+				$scope.showDeleteFrame = false;
+				$scope.loadAddresses();
+			}, function () {
+				toaster.pop('error', '删除收货地址失败');
+			});
+		};
+		$scope.telFlag = true;
+		$scope.emailFlag = true;
+		/**
+		 * 验证手机号是否可用
+		 */
+		$scope.telValid = function (tel) {
+			if (tel) {
+				if (tel == $scope.userInfoBackup.userTel){
+					$scope.telFlag = true;
+					return;
+				}
+				$http.get('basic/user/telEnable', {
+					params: {
+						tel: tel
+					}
+				}).success(function (data) {
+					data = eval(data);
+					if (data == true) {
+						$scope.telFlag = true;
+					} else {
+						if (tel.length == 11)
+							toaster.pop('error', '错误', '手机号 ' + tel + ' 已被注册');
+						$scope.telFlag = false;
+					}
+				}).error(function () {
+					$scope.telFlag = false;
+				});
+			} else {
+				$scope.telFlag = false;
+			}
+		};
 
-          // 获取区域信息
-          $http.get('static/js/prod/data/city.json').success(function (data) {
-            $scope.division = data;
-          }).error(function () {
-            toaster.pop('error', '系统错误 ' + '加载城市信息失败');
-          });
+		/**
+		 * 验证邮箱是否可用
+		 */
+		$scope.emailValid = function (email) {
+			if (email) {
+				if (email == $scope.userInfoBackup.userEmail){
+					$scope.emailFlag = true;
+					return;
+				}
+				$http.get('basic/user/emailEnable', {
+					params: {
+						email: email
+					}
+				}).success(function (data) {
+					data = eval(data);
+					if (data == true) {
+						$scope.emailFlag = true;
+					} else {
+						toaster.pop('error', '错误', '邮箱 ' + email + ' 已被注册');
+						$scope.emailFlag = false;
+					}
+				}).error(function () {
+					$scope.emailFlag = false;
+				});
+			} else {
+				$scope.emailFlag = false;
+			}
+		};
+		/**
+		 * 变更到更新状态
+		 */
+		$scope.changeToUpdate = function(isUpdate) {
+			$scope.updateState = isUpdate;
+			if ($scope.updateState == false){
+				$scope.userInfo = angular.copy($scope.userInfoBackup);
+			}
+		};
+		/**
+		 * 验证用户信息
+		 */
+		function validateUserInfo() {
+			var props = ['userName', 'userEmail', 'userTel'];
+
+			var flag = true;
+			angular.forEach(props, function (prop) {
+				if ($scope.userInfo.hasOwnProperty(prop)) {
+					if (!$scope.userInfo[prop] || $scope.userInfo[prop] === '') {
+						console.log(prop + '不能为空');
+						// TODO 记录验证信息
+						flag = false;
+					}
+				} else {
+					console.log(prop + '不能为空');
+					flag = false;
+				}
+			});
+			return flag;
+		}
+		/**
+		 * 保存用户信息
+		 */
+		$scope.saveUpdate = function () {
+			// 先检查信息是否为空
+			if (angular.equals($scope.userInfo,$scope.userInfoBackup)){
+				toaster.pop('error', '未做任何修改');
+				$scope.updateState = false;
+				return ;
+			}
+			var userInfoFlag = validateUserInfo();
+			if (!userInfoFlag) {
+				toaster.pop('error', '请补充完信息后再次提交');
+				return ;
+			}
+
+			if ($scope.telFlag && $scope.emailFlag) {
+				Enterprise.updateUser({uu: $scope.userInfo.userUU}, $scope.userInfo, function () {
+					$scope.loading = false;
+					toaster.pop('success', '提示', '用户信息修改成功');
+					$scope.userInfoBackup = angular.copy($scope.userInfo);
+					$scope.updateState = false;
+
+				}, function (response) {
+					$scope.updateState = false;
+					$scope.userInfo = angular.copy($scope.userInfoBackup);
+					toaster.pop('error', '修改失败', response.data);
+				});
+			}
+			else{
+				toaster.pop('error', '提示', '修改失败!');
+				$scope.userInfo = angular.copy($scope.userInfoBackup);
+				$scope.updateState = false;
+			}
+		};
 
-          // 切换tab
-          $scope.checkTab = function (t) {
-            $scope.tab = t;
-          };
+		// 分页数据
+		$scope.addressList = [];
+		//总条数是否大于5个
+		$scope.isBiggerFive = false;
+		$scope.shippingAddressTableParams = new ngTableParams({
+			page : 1,
+			count : 20,
+			sorting : {
+				num : 'ASC'
+			}
+		}, {
+			total : 0,
+			getData : function ($defer, params) {
+				const param = BaseService.parseParams(params.url());
+				param.isSend = false;
+				ShippingAddress.pageAddressOfUser(param, {}, function (page) {
+					$scope.isBiggerFive = false;
+					$scope.total = page.totalElements;
+					params.total(page.totalElements);
+					if (page.content) {
+						$scope.addressList = page.content;
+					} else {
+						$scope.addressList = [];
+					}
+					angular.forEach($scope.addressList, function (attr) {
+						var arr = attr.area.split(',');
+						attr.province = arr[0];
+						attr.city = arr[1];
+						attr.district = arr[2];
+					});
+					if($scope.total > 5) {
+						$scope.isBiggerFive = true;
+					}
+				});
+			}
+		});
+
+		$scope.loadAddresses = function () {
+			$scope.shippingAddressTableParams.page(1);
+			$scope.shippingAddressTableParams.reload();
+		};
+		$scope.loadAddresses();
+
+		// 获取区域信息
+		$http.get('static/js/prod/data/city.json').success(function(data) {
+			$scope.division = data;
+		}).error(function() {
+			toaster.pop('error', '系统错误 ' + '加载城市信息失败');
+		});
+
+		// 切换tab
+		$scope.checkTab = function (t) {
+			$scope.tab = t;
+		};
 
-          $scope.modifyAddress = function (address) {
-            $modal.open({
-              templateUrl: $rootScope.rootPath
-              + '/static/view/common/modal/edit_address_modal.html',
-              controller: 'editAddrCtrl',
-              size: 'lg',
-              resolve: {
-                addr: function () {
-                  return angular.copy(address);
-                },
-                isSendType: function () {
-                  return false;
-                },
-                isModify: function () {
-                  if (address) {
-                    return true;
-                  } else {
-                    return false;
-                  }
-                }
-              }
-            }).result.then(function (address) {
-              if (address) {
-                $scope.loadAddresses();
-              }
-            }, function () {
-              // toaster.pop('info', '提示 ' + '您已取消发货地址的编辑');
-            });
-          };
+		$scope.modifyAddress = function (address) {
+			$modal.open({
+				templateUrl : $rootScope.rootPath + '/static/view/common/modal/edit_address_modal.html',
+				controller : 'editAddrCtrl',
+				size : 'lg',
+				resolve : {
+					addr : function(){
+						return angular.copy(address);
+					},
+					isSendType : function () {
+						return false;
+					},
+					isModify : function () {
+						if (address){
+							return true;
+						}else {
+							return false;
+						}
+					}
+				}
+			}).result.then(function(address){
+				if (address) {
+					$scope.loadAddresses();
+				}
+			}, function(){
+				// toaster.pop('info', '提示 ' + '您已取消发货地址的编辑');
+			});
+		};
 
-          //地址编辑模态框
-          app.register.controller('editAddrCtrl',
-              ['$scope', 'addr', '$modalInstance', 'toaster', '$http',
-                'ShippingAddress', 'isSendType', 'isModify',
-                function ($scope, addr, $modalInstance, toaster, $http,
-                    ShippingAddress, isSendType, isModify) {
-                  if (addr) {
-                    $scope.isSetTop = addr.num == 1;
-                  } else {
-                    $scope.isSetTop = false;
-                  }
-                  $scope.isSendType = isSendType;
-                  $scope.isModify = isModify;
+		//地址编辑模态框
+		app.register.controller('editAddrCtrl', ['$scope', 'addr', '$modalInstance', 'toaster', '$http', 'ShippingAddress', 'isSendType', 'isModify', function($scope, addr, $modalInstance, toaster, $http, ShippingAddress, isSendType, isModify){
+			if (addr){
+				$scope.isSetTop = addr.num == 1;
+			}else {
+				$scope.isSetTop = false;
+			}
+			$scope.isSendType = isSendType;
+			$scope.isModify = isModify;
 
                   $scope.checkForm = function (num) {
                     var size;
@@ -385,76 +375,66 @@ define(['app/app'], function (app) {
                     }
                   };
 
-                  $http.get('static/js/prod/data/city.json').success(
-                      function (data) {
-                        $scope.division = data;
-                        if (addr && addr.area) {
-                          // $scope.address = addr;
-                          //拼装下拉选择框
-                          var arr = addr.area.split(',');
-                          addr.province = arr[0];
-                          addr.city = arr[1];
-                          addr.district = arr[2];
-                          $scope.address = addr;
-                        }
-                      }).error(function () {
-                    toaster.pop('error', '系统错误 ' + '加载城市信息失败');
-                  });
-
-                  $scope.save = function () {
-                    var address = $scope.address;
-
-                    if (!address) {
-                      toaster.pop('error', '请补充未填写的信息');
-                      return;
-                    }
-                    if (!address.name || !address.province || !address.city
-                        || !address.district ||
-                        !address.detailAddress || !address.tel) {
-                      toaster.pop('error', '请补充未填写的信息');
-                      return;
-                    }
-                    if ($scope.userError || $scope.telError || $scope.addrError
-                        || $scope.telPatternError ||
-                        $scope.emailPatternError) {
-                      toaster.pop('error', '请修改红色框内的信息');
-                      return;
-                    }
-
-                    //拼装地区
-                    address.area = address.province + ',' + address.city + ','
-                        + address.district;
-
-                    // send属性 控制本地址是否是发货地址
-                    ShippingAddress.save({
-                      isSetTop: $scope.isSetTop,
-                      send: $scope.isSendType,
-                      isPersonal: !$scope.isSendType
-                    }, address, function (data) {
-                      toaster.pop('success', '成功 ', '保存收货地址成功');
-                      $modalInstance.close(data);
-                    }, function () {
-                      toaster.pop('error', '系统错误 ', '保存收货地址失败');
-                    });
-                  };
-
-                  $scope.cancel = function () {
-                    $modalInstance.dismiss();
-                  };
-                }]);
+			$http.get('static/js/prod/data/city.json').success(function(data) {
+				$scope.division = data;
+				if(addr && addr.area){
+					// $scope.address = addr;
+					//拼装下拉选择框
+					var arr = addr.area.split(',');
+					addr.province = arr[0];
+					addr.city = arr[1];
+					addr.district = arr[2];
+					$scope.address = addr;
+				}
+			}).error(function() {
+				toaster.pop('error', '系统错误 ' + '加载城市信息失败');
+			});
 
-          $scope.updatePassword = function () {
-            var modalInstance = $modal.open({
-              animation: true,
-              templateUrl: $rootScope.rootPath
-              + '/static/view/vendor/modal/updatePassword.html',
-              controller: 'PasswordCtrl',
-              resolve: {
-                user: function () {
-                  return angular.copy($rootScope.userInfo);
-                }
-              }
-            });
+			$scope.save = function () {
+				var address = $scope.address;
+
+				if (!address){
+					toaster.pop('error', '请补充未填写的信息');
+					return ;
+				}
+				if (!address.name || !address.province || !address.city || !address.district ||
+					!address.detailAddress || !address.tel){
+					toaster.pop('error', '请补充未填写的信息');
+					return ;
+				}
+				if ($scope.userError || $scope.telError || $scope.addrError || $scope.telPatternError ||
+					$scope.emailPatternError){
+					toaster.pop('error', '请修改红色框内的信息');
+					return ;
+				}
+
+				//拼装地区
+				address.area = address.province + ',' + address.city + ',' + address.district;
+
+				// send属性 控制本地址是否是发货地址
+				ShippingAddress.save({isSetTop: $scope.isSetTop, send: $scope.isSendType, isPersonal: !$scope.isSendType}, address, function(data){
+					toaster.pop('success', '成功 ', '保存收货地址成功');
+					$modalInstance.close(data);
+				}, function(){
+					toaster.pop('error', '系统错误 ', '保存收货地址失败');
+				});
+			};
+
+			$scope.cancel = function() {
+				$modalInstance.dismiss();
+			};
+		}]);
+
+
+		$scope.updatePassword = function(){
+			var modalInstance = $modal.open({
+				animation: true,
+				templateUrl: $rootScope.rootPath + '/static/view/vendor/modal/updatePassword.html',
+				controller: 'PasswordCtrl',
+				resolve: {
+					user: function(){return angular.copy($rootScope.userInfo);}
+				}
+			});
 
             modalInstance.result.then(function () {
             }, function () {

+ 2 - 2
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_order_ctrl.js

@@ -4,7 +4,7 @@
  */
 define(['app/app'], function (app) {
 	'use strict';
-	app.register.controller('orderCtrl', ['$scope', '$rootScope', 'Order', 'toaster', '$filter', 'OrderSimpleInfo', 'Recommendation', '$modal', 'tradeMessageNoticeService', 'tradeBasicProperties', 'NumberService', 'ChatBusinessLayer','Rate', function($scope, $rootScope, Order, toaster, $filter, OrderSimpleInfo, Recommendation, $modal, tradeMessageNoticeService, tradeBasicProperties, NumberService, ChatBusinessLayer,Rate) {
+	app.register.controller('orderCtrl', ['$scope', '$rootScope', 'Order', 'toaster', '$filter', 'OrderSimpleInfo', 'Recommendation', '$modal', 'tradeMessageNoticeService', 'tradeBasicProperties', 'NumberService', 'ChatBusinessLayer','Rate', function($scope, $rootScope, Order, toaster, $filter, OrderSimpleInfo, Recommendation, $modal, tradeMessageNoticeService, tradeBasicProperties, NumberService, ChatBusinessLayer, Rate) {
 
 		document.title = '已买到的产品-优软商城';
 		//初始化数据
@@ -269,7 +269,7 @@ define(['app/app'], function (app) {
 			OrderSimpleInfo.ensureAccept({ids: ids},{},function(data){
 				loadData();
 				getCounts();
-				toaster.pop('success', '处理成功');
+				toaster.pop('success', '成功' ,'确认收货成功');
 			}, function(res){
 				toaster.pop('error', '失败!' + res.data);
 			});

+ 3 - 3
src/main/webapp/resources/js/vendor/app.js

@@ -1,4 +1,4 @@
-define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'common/query/brand', 'common/query/kind', 'common/query/component', 'common/query/goods', 'common/query/rate','common/query/cart', 'common/query/order', 'common/query/address', 'common/query/invoice', 'common/query/property', 'common/query/kindAdvice', 'common/query/propertyAdvice', 'common/query/return' , 'common/query/change', 'common/query/logistics', 'ui.router', 'ui-bootstrap', 'ui-form', 'ui-jquery','angular-toaster', 'ngDraggable', 'angular-sanitize', 'ngTable', 'dynamicInput', 'jquery-imagezoom', 'file-upload', 'file-upload-shim', 'common/query/urlencryption' , 'common/query/purchase', 'common/query/vendor', 'common/query/goods', 'common/query/bankTransfer', 'common/query/enterprise', 'common/query/bill', 'common/query/receipt', 'common/query/collection', 'common/query/express', 'common/query/bankInfo','common/query/charge', 'common/query/statistics', 'common/query/currency', 'jquery-chart', 'common/query/responseLogistics', 'common/query/goodsPrice', 'common/query/address' , 'common/query/search', 'common/query/urlencryption', 'common/query/releaseProInfo', 'common/query/makerDemand', 'common/query/afterSale', 'common/query/messageBoard', 'common/query/logistics', 'common/query/storeInfo', 'common/query/recommendation', 'common/query/user', 'common/query/logisticsPort', 'common/query/cms', 'common/query/material', 'common/query/storeCms', 'common/query/productImport', 'common/query/stockInOut', 'common/module/store_recommend_product', 'common/module/chat_web_module', 'common/query/standardPutOnAdmin', 'common/query/storeViolations', 'common/query/internalMessage', 'common/query/installments'], function(angularAMD) {
+define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'common/query/brand', 'common/query/kind', 'common/query/component', 'common/query/goods','common/query/rate', 'common/query/cart', 'common/query/order', 'common/query/address', 'common/query/invoice', 'common/query/property', 'common/query/kindAdvice', 'common/query/propertyAdvice', 'common/query/return' , 'common/query/change', 'common/query/logistics', 'ui.router', 'ui-bootstrap', 'ui-form', 'ui-jquery', 'angular-toaster', 'ngDraggable', 'angular-sanitize', 'ngTable', 'dynamicInput', 'jquery-imagezoom', 'file-upload', 'file-upload-shim', 'common/query/urlencryption' , 'common/query/purchase', 'common/query/vendor', 'common/query/goods', 'common/query/bankTransfer', 'common/query/enterprise', 'common/query/bill', 'common/query/receipt', 'common/query/collection', 'common/query/express', 'common/query/bankInfo','common/query/charge', 'common/query/statistics', 'common/query/currency', 'jquery-chart', 'common/query/responseLogistics', 'common/query/goodsPrice', 'common/query/address' , 'common/query/search', 'common/query/urlencryption', 'common/query/releaseProInfo', 'common/query/makerDemand', 'common/query/afterSale', 'common/query/messageBoard', 'common/query/logistics', 'common/query/storeInfo', 'common/query/recommendation', 'common/query/user', 'common/query/logisticsPort', 'common/query/cms', 'common/query/material', 'common/query/storeCms', 'common/query/productImport', 'common/query/stockInOut', 'common/module/store_recommend_product', 'common/module/chat_web_module', 'common/query/standardPutOnAdmin', 'common/query/storeViolations', 'common/query/internalMessage', 'common/query/installments','common/query/product'], function(angularAMD) {
 	'use strict';
 	/**
 	 * 自定义Array对象的属性last 方法
@@ -8,7 +8,7 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
 		return this.length > 0 ? this[this.length - 1] : null;
 	};
 
-	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ng.local', 'ui.form', 'ui.jquery', 'toaster', 'ngDraggable', 'tool.directives', 'ngSanitize', 'common.query.kind', 'common.services', 'brandServices', 'componentServices', 'goodsServices',  'rateServices','cartServices', 'orderServices', 'addressServices', 'invoiceServices', 'common.query.propertyAdvice', 'propertyServices', 'returnServices' , 'changeServices',  'logisticsServices', 'common.query.kindAdvice', 'ngTable', 'ngDynamicInput', 'common.directives', 'angularFileUpload', 'urlencryptionServices', 'purchaseServices', 'vendorServices', 'goodsServices', 'bankTransfer', 'common.query.enterprise', 'billServices', 'receiptServices', 'collection', 'expressServices', 'bankInfo','Charge', 'statisticsServices', 'currencyService', 'responseLogisticsService', 'PriceServices', 'addressServices', 'searchService', 'urlencryptionServices', 'ReleaseProductByBatchService', 'makerDemand', 'afterSaleService', 'messageBoardServices', 'logisticsServices', 'table.directives', 'storeInfoServices', 'recommendation', 'common.query.user', 'logisticsPortService', 'cmsService', 'materialServices', 'StoreCmsServices', 'productImportModule', 'stockInOutModule', 'StoreCmsModule', 'WebChatModule', 'StandardPutOnAdminModule', 'StoreViolationsServices', 'internalMessageServices', 'installmentServices', 'ui.tour']);
+	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ng.local', 'ui.form', 'ui.jquery', 'toaster', 'ngDraggable', 'tool.directives', 'ngSanitize', 'common.query.kind', 'common.services', 'brandServices', 'componentServices', 'goodsServices',  'rateServices','cartServices', 'orderServices', 'addressServices', 'invoiceServices', 'common.query.propertyAdvice', 'propertyServices', 'returnServices' , 'changeServices',  'logisticsServices', 'common.query.kindAdvice', 'ngTable', 'ngDynamicInput', 'common.directives', 'angularFileUpload', 'urlencryptionServices', 'purchaseServices', 'vendorServices', 'goodsServices', 'bankTransfer', 'common.query.enterprise', 'billServices', 'receiptServices', 'collection', 'expressServices', 'bankInfo','Charge', 'statisticsServices', 'currencyService', 'responseLogisticsService', 'PriceServices', 'addressServices', 'searchService', 'urlencryptionServices', 'ReleaseProductByBatchService', 'makerDemand', 'afterSaleService', 'messageBoardServices', 'logisticsServices', 'table.directives', 'storeInfoServices', 'recommendation', 'common.query.user', 'logisticsPortService', 'cmsService', 'materialServices', 'StoreCmsServices', 'productImportModule', 'stockInOutModule', 'StoreCmsModule', 'WebChatModule', 'StandardPutOnAdminModule', 'StoreViolationsServices', 'internalMessageServices', 'common.query.product', 'ui.tour', 'installmentServices']);
 	//初始化,启动时载入app
 	app.init = function() {
 		angularAMD.bootstrap(app);
@@ -1018,7 +1018,7 @@ define([ 'angularAMD', 'ngLocal', 'common/services', 'common/directives', 'commo
 	});
 
 	app.controller('editPictureCtrl', ['$scope', 'pic', '$modalInstance', function ($scope, pic, $modalInstance) {
-		console.log('log')
+		console.log('log');
 		$scope.pic = pic;
 		$scope.cancel = function () {
 			$modalInstance.close();

+ 1 - 1
src/main/webapp/resources/js/vendor/controllers/ReleaseProductByBatchCtrl.js

@@ -290,7 +290,7 @@ define([ 'app/app'], function(app) {
 		}
 		
 		$scope.donShowAgain = function() {
-			var show = SessionService.set($scope.userInfo.userUU + "-releasetip", 1);
+			var show = SessionService.setCookie($scope.userInfo.userUU + "-releasetip", 1);
 			$modalInstance.dismiss();
 		}
 		

+ 1 - 1
src/main/webapp/resources/js/vendor/controllers/forstore/pay_center_ctrl.js

@@ -3,7 +3,7 @@
  */
 define(['app/app'], function(app) {
     'use strict';
-    app.register.controller('payCenterCtrl', ['$scope', '$rootScope', 'bankInfoService', 'Loading', 'toaster', '$upload', 'ngTableParams', 'BaseService', 'SessionService', 'bankTransferService', 'Purchase', '$filter', '$stateParams', function($scope, $rootScope, bankInfoService, Loading, toaster, $upload, ngTableParams, BaseService, SessionService, bankTransferService, Purchase, $filter, $stateParams) {
+    app.register.controller('payCenterCtrl', ['$scope', '$rootScope', 'bankInfoService', 'toaster', '$upload', 'bankTransferService', 'Purchase', '$filter', 'Loading', 'ngTableParams', 'BaseService', 'SessionService', '$stateParams', function($scope, $rootScope, bankInfoService, toaster, $upload, bankTransferService, Purchase, $filter, Loading, ngTableParams, BaseService, SessionService, $stateParams) {
         $rootScope.active = 'pay_center';
 
         document.title = '结算中心-优软商城';

File diff suppressed because it is too large
+ 929 - 63
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_materialCtrl.js


File diff suppressed because it is too large
+ 492 - 248
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_onSaleCtrl.js


+ 1 - 1
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_proRepository_ctrl.js

@@ -10,7 +10,7 @@ define(['app/app'], function (app) {
         $rootScope.$$productOn.leadIn = 'product_repository';
 
         $scope.$$productRepository = {};
-        $scope.$$productRepository.status = 'all';
+        $scope.$$productRepository.status = 'matchResult';
 
         $scope.taggeleToMatchResult = function () {
             if($scope.$$productRepository.status != 'matchResult') {

+ 102 - 38
src/main/webapp/resources/js/vendor/controllers/forstore/vendor_upload_ctrl.js

@@ -10,6 +10,8 @@ define([ 'app/app' ], function(app) {
 	//批量上架的Ctrl
 	app.register.controller('batchPutOnCtrl', ['$scope', '$rootScope', 'ngTableParams', '$upload', '$q', 'AuthenticationService', 'BaseService', 'StoreInfo', 'SessionService', '$modal', 'toaster', 'ReleaseProductByBatch', 'Loading', 'Enterprise', 'DistributionRule', function ($scope, $rootScope, ngTableParams, $upload, $q, AuthenticationService, BaseService, StoreInfo, SessionService, $modal, toaster, ReleaseProductByBatch, Loading, Enterprise, DistributionRule) {
 
+		$scope.deletePop = false;
+
 		//获取币别信息
 		Enterprise.getCurrencyByRegisterAddress(null, function (data) {
 			if(data.code == 1) {
@@ -76,17 +78,29 @@ define([ 'app/app' ], function(app) {
 			}
 		});
 
-		//删除指定id的信息
-		$scope.deleteBatch = function (id) {
-			if(!id || id == '') {
-				return ;
-			}
-			ReleaseProductByBatch.deleteProInfo({id : id}, function () {
-				toaster.pop('success', '删除成功');
+		/**
+		 * 打开删除的模态框
+		 */
+		$scope.showDelete = function (item) {
+			var modalInstance = $modal.open({
+				animation: true,
+				templateUrl: 'static/view/common/modal/delete_modal.html',
+				controller: 'product_delete_ctrl',
+				resolve: {
+					id : function() {
+						return item.id;
+					}
+				}
+			});
+			modalInstance.result.then(function(){
+				if (item.releaseCode == 112){
+					$scope.result.success = $scope.result.success - 1;
+				}else if(item.releaseCode == 113){
+					$scope.result.failure = $scope.result.failure - 1;
+				}
 				//不需要返回的第一页
 				$scope.relTableParams.reload();
-			}, function (response) {
-				toaster.pop('error', '删除失败,请重新操作');
+			}, function(){
 			});
 		};
 
@@ -184,38 +198,40 @@ define([ 'app/app' ], function(app) {
 				url: 'release/product/release/excel',
 				file: file,
 				method: 'POST',
-				params : {selfSale : $scope.batch.sellType == 'self' ? true : false, currency : $scope.batch.currency}
+				params : {selfSale : $scope.batch.sellType == 'self', currency : $scope.batch.currency}
 			}).success(function(data) {
 				$scope.selectFile(' ');
 				$scope.batch.myFiles = [];
 				$scope.proInfo = data.info;
 				$scope.result = data;
-				var message = "";
-				if($scope.result.success) {
-					message = '验证通过' + $scope.result.success + '条';
-				}
-				if($scope.result.failure) {
-					if(message) {
-						message = message + ',验证失败' + $scope.result.failure +  '条';
-					}else {
-						message = '验证失败' + $scope.result.failure +  '条';
-					}
-				}
-				if($scope.result.filter) {
-					if(message) {
-						message = message + ',过滤' + $scope.result.filter +  '条';
-					}else {
-						message = '过滤' + $scope.result.filter +  '条';
-					}
-				}
-				if(!message) {
-					message = '没有提交任何信息'
-				}
-				toaster.pop('info', '提示', message);
+				$scope.hadImport = false;
+				// var message = "";
+				// if($scope.result.success) {
+				// 	message = '标准产品' + $scope.result.success + '个';
+				// }
+				// if($scope.result.failure) {
+				// 	if(message) {
+				// 		message = message + ',非标产品' + $scope.result.failure +  '个';
+				// 	}else {
+				// 		message = '非标产品' + $scope.result.failure +  '个';
+				// 	}
+				// }
+				// if($scope.result.filter) {
+				// 	if(message) {
+				// 		message = message + ',过滤' + $scope.result.filter +  '条';
+				// 	}else {
+				// 		message = '过滤' + $scope.result.filter +  '条';
+				// 	}
+				// }
+				// if(!message) {
+				// 	message = '没有提交任何信息'
+				// }
+				toaster.pop('info', '提示', '上传完成');
 				$scope.relTableParams.page(1);
 				$scope.relTableParams.reload();
 			}).error(function(response) {
 				$scope.result = {};
+				$scope.result.total = 0;
 				$scope.pageParams.number = 0;
 				$scope.pageParams.content = null;
 				$scope.pageParams.totalElements = 0;
@@ -227,17 +243,17 @@ define([ 'app/app' ], function(app) {
 		// 下载模板
 		$scope.download = function() {
 			var show = SessionService.get($scope.userInfo.userUU + "-releasetip");
-			if(!show) {
+			if (!show) {
 				var modalInstance = $modal.open({
 					animation: true,
 					templateUrl : $rootScope.rootPath + '/static/view/vendor/modal/releaseProductByBatchTip.html',
-					controller : 'releaseProductByBatchTipCtrl',
+					controller : 'releaseProductByBatchTipCtrl'
 				});
 				modalInstance.result.then(function(response) {
 				}, function(res) {
 					window.location.href = $rootScope.rootPath + '/release/product/release/template?currency' + '=' + $scope.batch.currency;
 				});
-			}else {
+			} else {
 				window.location.href = $rootScope.rootPath + '/release/product/release/template?currency' + '=' + $scope.batch.currency;
 			}
 		};
@@ -270,10 +286,11 @@ define([ 'app/app' ], function(app) {
 					$scope.relTableParams.page(1);
 					$scope.relTableParams.reload();
 					$scope.result.success = 0;//设置成0,让前端用户不能点击
+					$scope.hadImport = true; //上架后隐藏提示语
 				}, function(res) {
 					toaster.pop("error", "发布失败", res.data);
 				});
-			}else {
+			} else {
 				event.stopPropagation();//阻止冒泡事件
 				event.preventDefault();//阻止默认的事件。
 				toaster.pop("info", "提示", "没有信息发布");
@@ -282,7 +299,7 @@ define([ 'app/app' ], function(app) {
 
 		//下载未匹配成功的数据
 		$scope.downloadExcel = function(){
-			if($scope.result&&$scope.result.batch&&$scope.result.failure) {
+			if($scope.result && $scope.result.batch && $scope.result.filter) {
 				var form = document.getElementById('load-error');
 				form.action= 'release/product/release/failure/xls';
 				form.submit();
@@ -315,7 +332,7 @@ define([ 'app/app' ], function(app) {
 			}else {
 				if(!$scope.result || !$scope.result.batch) {
 					toaster.pop('info', '提示', '您没有上传信息');
-				}else if(!$scope.result.failure) {
+				}else if(!$scope.result.filter) {
 					toaster.pop('info', '提示', '您没有匹配不成功的数据');
 				}
 			}
@@ -334,4 +351,51 @@ define([ 'app/app' ], function(app) {
 		};
 	}]);
 
+	app.register.controller('product_delete_ctrl', ['$scope', 'id', 'toaster', '$modalInstance', 'ReleaseProductByBatch', function ($scope, id, toaster, $modalInstance, ReleaseProductByBatch) {
+		$scope.deleteModal = true;
+
+		$scope.cancleDelete = function () {
+			$scope.deleteModal = false;
+			$modalInstance.dismiss();
+		};
+
+		$scope.confirmDelete = function () {
+			//删除指定id的信息
+			if(!id || id == '') {
+				return ;
+			}
+			ReleaseProductByBatch.deleteProInfo({id : id}, function (data) {
+				if (data){
+					$scope.deleteModal = false;
+					$modalInstance.close();
+				}
+			}, function (error) {
+				toaster.pop('error', '删除失败,请重新操作');
+			});
+		};
+
+		/**
+		 * 监听点击的事件
+		 */
+		document.onclick = function (event) {
+			if($scope.deleteModal) {
+				if(event) {
+					var tag = event.target;
+					if(tag) {
+						var attribute = tag.getAttribute("name");
+						while(tag.nodeName != 'BODY') {
+							if((attribute == 'comfirm-delete-modal') ||
+								attribute == 'delete-material') {
+								return ;
+							}
+							tag = tag.parentElement;
+							attribute = tag.getAttribute("name");
+						}
+						$scope.deleteModal = false;
+						$modalInstance.dismiss();
+					}
+				}
+			}
+		};
+	}]);
 });

+ 1 - 1
src/main/webapp/resources/view/admin/search/search_See.html

@@ -14,7 +14,7 @@
                     共<span class="totalNum">{{result.total}}</span>条
                 </p>
                 <p style="margin-top: 8px; font-weight: bold;">
-                    共耗时<span class="totalNum">{{result.time}}</span>ms  <br><br>
+                    共耗时<span class="totalNum">{{searchtime}}</span>ms  <br><br>
                     类目统计共耗时 {{kindtime}} ms <br><br>
                     品牌统计共耗时 {{brandtime}} ms
                 </p>

+ 6 - 2
src/main/webapp/resources/view/common/modal/delete_modal.html

@@ -10,7 +10,7 @@
         height: 152px;
         width: 310px;
         position: fixed;
-        margin: -155px 0 0 -75px;
+        margin: -155px 0 0 -76px;
         top: 55%;
         left: 50%;
     }
@@ -69,12 +69,16 @@
         color: #fff;
     }
 </style>
-<div class="com-del-box">
+<div class="com-del-box"
+     name="comfirm-delete-modal">
     <div class="title">
         <a ng-click="cancleDelete()"><i class="fa fa-close fa-lg"></i></a>
     </div>
     <div class="content">
         <p><i class="fa fa-exclamation-circle"></i>是否删除此信息</p>
+        <div class="red"
+             ng-if="message">*<i ng-if="message" ng-bind="message"></i>
+        </div>
         <div><a ng-click="cancleDelete()">取消</a><a ng-click="confirmDelete()">确认</a></div>
     </div>
 </div>

+ 6 - 5
src/main/webapp/resources/view/common/modal/product_upload_modal.html

@@ -26,14 +26,13 @@
         font-size: 16px;
     }
     .com-del-box .content{
-        padding: 15px 12px 14px 20px;
+        padding: 15px 20px 14px;
         width: 100%;
         text-align: center;
         margin: 0 auto;
     }
     .com-del-box .content p{
         font-size: 14px;
-        padding-top: 10px;
         padding-bottom: 10px;
         margin-bottom: 7px;
         overflow: hidden;
@@ -48,11 +47,11 @@
     }
     .com-del-box .content p span{
         float: left;
-        width: 230px;
+        width: 256px;
         line-height: 21px;
         text-align: left;
         font-size: 14px;
-        color: #333333
+        color: #333333;
     }
     .com-del-box .content div {
         margin: 0 auto;
@@ -69,7 +68,6 @@
         color: #fff;
     }
     .com-del-box .content div a:first-child {
-        margin-right: 15px ;
         background: #c8c6c6;
     }
     .com-del-box .content div a:last-child {
@@ -119,6 +117,9 @@
     .com-del-box .product p{
         margin-bottom: -5px;
     }
+    .com-del-box .content div a:first-child{
+        margin-right: 0 !important;
+    }
 </style>
 <div class="com-del-box" name="rule_model">
     <div class="title">

+ 19 - 5
src/main/webapp/resources/view/usercenter/forstore/buyer_cart.html

@@ -3,7 +3,12 @@
 	#buyer_cart a {
 		text-decoration: none;
 	}
-
+	#buyer_cart a.unstand{
+		cursor: default ;
+	}
+	#buyer_cart a.unstand:hover{
+		color: #666 !important ;
+	}
 	#buyer_cart a:hover {
 		text-decoration: none;
 	}
@@ -523,6 +528,13 @@
 		/*width: 200px;*/
 		/*margin-left: -10px;*/
 	/*}*/
+    /*删除弹框样式调整*/
+    .modal-content {
+        background-color: transparent;
+        border: none;
+        border-radius: 0;
+        box-shadow: none;
+    }
 	.com-del-box {
 		top: 101%!important ;
 		left: 24%!important ;
@@ -611,9 +623,11 @@
 									<a href="store/{{store.arr[0].storeUuid}}/{{::cart.batchCode}}" target="_blank">
                                         <img ng-src="{{cart.img || 'static/img/store/common/default.png'}}" width="60" height="60"/></a>
 									<div class="car_pro_xq">
-									    <i class="text-hidden">类目:<a href="product/kind/{{cart.goods.kindUuid}}" target="_blank" ng-bind="::cart.kiName" title="{{::cart.kiName}}"></a></i>
-									    <i class="text-hidden">型号:<a href="store/{{store.arr[0].storeUuid}}/{{::cart.batchCode}}" target="_blank" ng-bind="::cart.code" title="{{::cart.code}}"></a></i>
-									   <i class="text-hidden">品牌:<a href="product/brand/{{::cart.goods.branduuid}}/" target="_blank" ng-bind="::cart.goods.brandNameEn" title="{{::cart.goods.brandNameEn}}"></a></i>
+									    <i class="text-hidden" ng-if="!cart.uuid">类目:<a ng-bind="::cart.kiName || '-'" title="{{::cart.kiName}}" class="unstand"></a></i>
+									    <i class="text-hidden" ng-if="cart.uuid">类目:<a href="product/kind/{{cart.goods.kindUuid}}" target="_blank" ng-bind="::cart.kiName" title="{{::cart.kiName}}"></a></i>
+									    <i class="text-hidden">型号:<a href="store/{{store.arr[0].storeUuid}}/{{::cart.batchCode}}" target="_blank" ng-bind="::cart.code || '-'" title="{{::cart.code}}"></a></i>
+									   <i class="text-hidden" ng-if="!cart.uuid">品牌:<a ng-bind="::cart.goods.brandNameEn || '-'" title="{{::cart.goods.brandNameEn}}" class="unstand"></a></i>
+									   <i class="text-hidden" ng-if="cart.uuid">品牌:<a href="product/brand/{{::cart.goods.branduuid}}/" target="_blank" ng-bind="::cart.goods.brandNameEn" title="{{::cart.goods.brandNameEn}}"></a></i>
 									</div>
 								</div>
                         	</span>
@@ -675,7 +689,7 @@
 								<div class="deal_btn" ng-class="{'top': cart.similarCount!=0}">
 									<!--<a ng-click="">申请样品</a>-->
 									<!--<a ng-if="!cart.isActive" style="color: red;">该批次已下架</a>-->
-									<a ng-click="collect(cart.uuid, cart.id)" title="移入收藏">移入收藏</a>
+									<!--<a ng-click="collect(cart.uuid, cart.id)" title="移入收藏">移入收藏</a>-->
 									<a ng-click="deleteById(cart.id)" title="删除">删除</a>
 									<a ng-click="similarOpen(cart)" title="相似产品" style="color: #5078cb !important;" ng-class="{'active': cart.similarShow}" ng-if="cart.similarCount!=0">相似产品<i class="fa fa-angle-down"></i></a>
 								</div>

+ 24 - 13
src/main/webapp/resources/view/usercenter/forstore/buyer_order.html

@@ -677,16 +677,25 @@
 		background: #eff0f2;
 		font-size: 12px;
 	}
-	/*含运费*/
-	.oder_list dl b.freight{
-		font-size: 12px;
-		color: #999;
-	}
-	.oder_list dl b.total{
-		margin-right: 0;
-	}
-	.com-sub-pager .pagination li:first-child a, .pagination li:last-child a{
-		font-size: 12px;
+    /*含运费*/
+    .oder_list dl b.freight{
+        font-size: 12px;
+        color: #999;
+    }
+    .oder_list dl b.total{
+        margin-right: 0;
+    }
+    .com-sub-pager .pagination li:first-child a, .pagination li:last-child a{
+        font-size: 12px;
+    }
+	.oder_list dl .pro_xq a.unstand{
+		cursor: default ;
+	}
+	.oder_list dl .pro_xq a.unstand em{
+		color: #666 !important;
+	}
+	.oder_list dl .pro_xq a.unstand:hover em{
+		color: #666 !important;
 	}
 </style>
 <div class="user_right fr">
@@ -835,9 +844,11 @@
 							<div class="pro_xq">
 								<a href="store/{{::order.storeid}}/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img || 'static/img/store/common/default.png'}}" width="55" height="55"/></a>
 								<p>
-									类目:<a href="product/kind/{{::detail.kindUuid}}" target="_blank"><em ng-bind="::detail.kiName" title="{{::detail.kiName}}"></em></a><br/>
-									型号:<a href="store/{{::order.storeid}}/{{::detail.batchCode}}" target="_blank"><em ng-bind="::detail.cmpCode" title="{{::detail.cmpCode}}"></em></a><br/>
-									品牌:<a href="product/brand/{{::detail.branduuid}}/" target="_blank"><em ng-bind="::detail.brName" title="{{::detail.brName}}"></em></a>
+									类目:<a href="product/kind/{{::detail.kindUuid}}" target="_blank" ng-if="detail.uuid"><em ng-bind="::detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="detail.uuid"/>
+									<a class="unstand" ng-if="!detail.uuid"><em ng-bind="detail.kiName || '-'" title="{{::detail.kiName}}"></em></a><br ng-if="!detail.uuid"/>
+									型号:<a href="store/{{::order.storeid}}/{{::detail.batchCode}}" target="_blank"><em ng-bind="::detail.cmpCode || '-'" title="{{::detail.cmpCode}}"></em></a><br/>
+									品牌:<a href="product/brand/{{::detail.branduuid}}/" target="_blank" ng-if="detail.uuid"><em ng-bind="::detail.brName || '-'" title="{{::detail.brName}}"></em></a>
+									<a  class="unstand" ng-if="!detail.uuid"><em ng-bind="detail.brName || '-'" title="{{::detail.brName}}"></em></a>
 								</p>
 							</div>
 						</span>

+ 16 - 4
src/main/webapp/resources/view/usercenter/forstore/order_detail.html

@@ -95,6 +95,12 @@
 	.oder_xq_list dl span a{
 		color: #333;
 	}
+	.oder_xq_list dl span a.unstand{
+		cursor: default ;
+	}
+	.oder .oder_list dl dd.line01 a.unstand:hover, .shopCar .oder_list dl .deal_btn a.unstand:hover, #buyer_cart .shopCar .oder_list dl .line02 .car_pro_xq a.unstand:hover em, .oder_list dl .pro_xq a.unstand:hover, #oder-detail .oder_xq_list dl .oder_l p.style01 a.unstand:hover{
+		color: #333 !important ;
+	}
 	.oder-remark,.oder_xq_list dl .line60{
 		background: #f1f6ff;
 	}
@@ -436,15 +442,21 @@
                             <a href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank">
 								<img ng-src="{{detail.img ? detail.img : 'static/img/store/common/default.png'}}"/>
 							</a>
-                            <p class="style01" style="margin-top: 10px;">类目:
-								<a ng-bind="detail.kiName" href="product/kind/{{::detail.kindUuid}}" title="{{detail.kiName}}" target="_blank"></a>
+                            <p class="style01" style="margin-top: 10px;" ng-if="detail.uuid">类目:
+								<a ng-bind="detail.kiName || '-'" href="product/kind/{{::detail.kindUuid}}" title="{{detail.kiName}}" target="_blank"></a>
+							</p>
+							 <p class="style01" style="margin-top: 10px;" ng-if="!detail.uuid">类目:
+								<a ng-bind="detail.kiName || '-'"  title="{{detail.kiName}}" class="unstand"></a>
 							</p>
 							<p class="style01">型号:
-								<a ng-bind="detail.cmpCode" href="store/{{::detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
+								<a ng-bind="detail.cmpCode || '-'" href="store/{{::detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
 							</p>
-							<p class="style01">品牌:
+							<p class="style01" ng-if="detail.uuid">品牌:
 								<a ng-bind="detail.brName" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>
 							</p>
+							<p class="style01" ng-if="!detail.uuid">品牌:
+								<a ng-bind="detail.brName || '-'" title="{{detail.brName}}" class="unstand"></a>
+							</p>
                         </span>
 							<span class="wd01">交期:
 							<i ng-if="detail.b2cMinDelivery != detail.b2cMaxDelivery" ng-bind="detail.b2cMinDelivery + '-' + detail.b2cMaxDelivery"></i>

+ 11 - 3
src/main/webapp/resources/view/usercenter/forstore/order_pay.html

@@ -605,6 +605,12 @@
 		/*width: 124px;*/
 		/*text-align: center;*/
 	/*}*/
+	.oder_xq_list dl span a.unstand{
+		cursor: default ;
+	}
+	.oder_xq_list dl span a.unstand:hover b{
+		color: #323232!important;
+	}
 </style>
 <!--右侧主体部分-->
 <div class="user_right fr" id="pay-cart">
@@ -717,9 +723,11 @@
                         <span class="wd02">
                             <a  href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" href="javascript:void(0)"> <img ng-src="{{detail.img || 'static/img/store/common/default.png'}}"/></a>
 							<div class="style-type">
-								<p title="{{detail.kiName}}"><a href="product/kind/{{detail.goodsHistory.kindUuid}}" target="_blank" style="color: #323232">类目:<b ng-bind="detail.kiName"></b></a></p>
-								<p><a href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" style="color: #323232">型号:<b ng-bind="detail.cmpCode" title="{{detail.cmpCode}}"></b></a></p>
-								<p><a href="product/brand/{{detail.branduuid}}/" target="_blank" style="color: #323232">品牌:<b ng-bind="detail.brName" style="color: #323232" title="{{detail.brName}}"></b></a></p>
+								<p title="{{detail.kiName}}" ng-if="detail.uuid"><a href="product/kind/{{detail.goodsHistory.kindUuid}}" target="_blank" style="color: #323232">类目:<b ng-bind="detail.kiName || '-'"></b></a></p>
+								<p title="{{detail.kiName}}" ng-if="!detail.uuid"><a style="color: #323232" class="unstand">类目:<b ng-bind="detail.kiName || '-'"></b></a></p>
+								<p><a href="store/{{detail.storeid}}/{{::detail.batchCode}}" target="_blank" style="color: #323232">型号:<b ng-bind="detail.cmpCode || '-'" title="{{detail.cmpCode}}"></b></a></p>
+								<p  ng-if="detail.uuid"><a href="product/brand/{{detail.branduuid}}/" target="_blank" style="color: #323232">品牌:<b ng-bind="detail.brName || '-'" style="color: #323232" title="{{detail.brName}}"></b></a></p>
+								<p ng-if="!detail.uuid"><a style="color: #323232" class="unstand">品牌:<b ng-bind="detail.brName || '-'" style="color: #323232" title="{{detail.brName}}"></b></a></p>
 							</div>
                         </span>
 						<span class="wd01" ng-if="order.status == 501">

+ 17 - 5
src/main/webapp/resources/view/vendor/forstore/purchase_detail.html

@@ -133,6 +133,12 @@
 	.oder_xq_list dl span a{
 		color: #333;
 	}
+	.oder_xq_list dl span a.unstand{
+		cursor: default;
+	}
+	.oder_xq_list dl span a.unstand:hover{
+		color: #333 !important ;
+	}
 	.oder-remark,.oder_xq_list dl .line60{
 		background: #f1f6ff;
 	}
@@ -486,14 +492,20 @@
 						<dd class="oder_l" ng-repeat="detail in purchase.purchaseDetails">
 						<span class="wd02">
 							<a href="store/{{::detail.storeid}}/{{::detail.batchCode}}" target="_blank"><img ng-src="{{detail.img ? detail.img : 'static/img/store/common/default.png'}}"/></a>
-							<p class="style01" style="margin-top: 10px;">类目:
-								<a ng-bind="detail.kiName" href="product/kind/{{::detail.kindUuid}}" title="{{detail.kiName}}" target="_blank"></a>
+							<p class="style01" style="margin-top: 10px;" ng-if="detail.uuid">类目:
+								<a ng-bind="detail.kiName || '-'" href="product/kind/{{::detail.kindUuid}}" title="{{detail.kiName}}" target="_blank"></a>
+							</p>
+							<p class="style01" style="margin-top: 10px;" ng-if="!detail.uuid">类目:
+								<a ng-bind="detail.kiName || '-'" title="{{detail.kiName}}" class="unstand"></a>
 							</p>
 							<p class="style01">型号:
-								<a ng-bind="detail.cmpCode" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
+								<a ng-bind="detail.cmpCode || '-'" href="store/{{detail.storeid}}/{{::detail.batchCode}}" title="{{detail.cmpCode}}" target="_blank"></a>
+							</p>
+							<p class="style01" ng-if="detail.uuid">品牌:
+								<a ng-bind="detail.brName || '-'" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>
 							</p>
-							<p class="style01">品牌:
-								<a ng-bind="detail.brName" href="product/brand/{{::detail.branduuid}}/" title="{{detail.brName}}" target="_blank"></a>
+							<p class="style01" ng-if="!detail.uuid">品牌:
+								<a ng-bind="detail.brName || '-'" title="{{detail.brName}}" class="unstand"></a>
 							</p>
 						</span>
 						<span class="wd01">交期:

File diff suppressed because it is too large
+ 1192 - 158
src/main/webapp/resources/view/vendor/forstore/vendor_material.html


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