Browse Source

Merge branch 'dev-mysql' into feature/hb-brandMaintenceSuperBackground-1127

# Conflicts:
#	src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/OrderServiceImpl.java
#	src/main/webapp/resources/js/admin/app.js
#	src/main/webapp/resources/view/vendor/modal/recommend_product_modal.html
wangyc 8 years ago
parent
commit
25be012924
100 changed files with 5699 additions and 771 deletions
  1. 44 2
      pom.xml
  2. 2 1
      src/main/java/com/uas/platform/b2c/advertise/ad/api/CarouselsController.java
  3. 13 0
      src/main/java/com/uas/platform/b2c/advertise/ad/constant/FloorsModule.java
  4. 0 2
      src/main/java/com/uas/platform/b2c/advertise/ad/model/RecommendProduct.java
  5. 2 1
      src/main/java/com/uas/platform/b2c/advertise/ad/service/CarouselService.java
  6. 7 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/FloorsService.java
  7. 9 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/RecommendProductService.java
  8. 24 4
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/CarouselsServiceImpl.java
  9. 63 4
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/FloorsServiceImpl.java
  10. 32 0
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/RecommendProductServiceImpl.java
  11. 45 3
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  12. 127 1
      src/main/java/com/uas/platform/b2c/common/account/controller/EnterpriseController.java
  13. 72 0
      src/main/java/com/uas/platform/b2c/common/account/controller/SecQuestionController.java
  14. 45 2
      src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java
  15. 539 24
      src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java
  16. 1 1
      src/main/java/com/uas/platform/b2c/common/account/dao/EnterpriseDao.java
  17. 10 0
      src/main/java/com/uas/platform/b2c/common/account/dao/SecQuestionDao.java
  18. 15 0
      src/main/java/com/uas/platform/b2c/common/account/dao/UserLoginTimeDao.java
  19. 16 0
      src/main/java/com/uas/platform/b2c/common/account/dao/UserQuestionDao.java
  20. 1 1
      src/main/java/com/uas/platform/b2c/common/account/model/Enterprise.java
  21. 74 0
      src/main/java/com/uas/platform/b2c/common/account/model/SecQuestion.java
  22. 4 4
      src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java
  23. 130 5
      src/main/java/com/uas/platform/b2c/common/account/model/User.java
  24. 1 1
      src/main/java/com/uas/platform/b2c/common/account/model/UserBaseInfo.java
  25. 209 15
      src/main/java/com/uas/platform/b2c/common/account/model/UserInfo.java
  26. 89 0
      src/main/java/com/uas/platform/b2c/common/account/model/UserLoginTime.java
  27. 113 0
      src/main/java/com/uas/platform/b2c/common/account/model/UserQuestion.java
  28. 11 1
      src/main/java/com/uas/platform/b2c/common/account/service/EnterpriseService.java
  29. 38 0
      src/main/java/com/uas/platform/b2c/common/account/service/SecQuestionService.java
  30. 24 0
      src/main/java/com/uas/platform/b2c/common/account/service/UserQuestionService.java
  31. 50 1
      src/main/java/com/uas/platform/b2c/common/account/service/UserService.java
  32. 12 2
      src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java
  33. 62 0
      src/main/java/com/uas/platform/b2c/common/account/service/impl/SecQuestionServiceImpl.java
  34. 42 0
      src/main/java/com/uas/platform/b2c/common/account/service/impl/UserQuestionServiceImpl.java
  35. 120 17
      src/main/java/com/uas/platform/b2c/common/account/service/impl/UserServiceImpl.java
  36. 1 0
      src/main/java/com/uas/platform/b2c/common/account/v2/controller/UserController.java
  37. 60 12
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java
  38. 111 0
      src/main/java/com/uas/platform/b2c/common/search/constant/SearchParam.java
  39. 10 10
      src/main/java/com/uas/platform/b2c/common/search/constant/SearchUrl.java
  40. 50 2
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  41. 14 0
      src/main/java/com/uas/platform/b2c/common/search/dao/SearchHistoryDao.java
  42. 10 9
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  43. 4 4
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  44. 14 0
      src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java
  45. 277 215
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  46. 32 0
      src/main/java/com/uas/platform/b2c/common/search/util/CollectField.java
  47. 235 0
      src/main/java/com/uas/platform/b2c/common/search/util/PageParams.java
  48. 100 0
      src/main/java/com/uas/platform/b2c/common/search/util/SPage.java
  49. 96 0
      src/main/java/com/uas/platform/b2c/common/search/util/Sort.java
  50. 5 0
      src/main/java/com/uas/platform/b2c/core/constant/IntegerConstant.java
  51. 12 1
      src/main/java/com/uas/platform/b2c/core/constant/ReleaseStatus.java
  52. 71 65
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  53. 243 221
      src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
  54. 28 0
      src/main/java/com/uas/platform/b2c/core/utils/PatternUtil.java
  55. 19 0
      src/main/java/com/uas/platform/b2c/core/utils/RegexConstant.java
  56. 15 0
      src/main/java/com/uas/platform/b2c/core/utils/StringUtilB2C.java
  57. 49 0
      src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/BankInfoServiceImpl.java
  58. 154 0
      src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/ProductDetailERPServiceImpl.java
  59. 38 0
      src/main/java/com/uas/platform/b2c/external/erp/commodity/util/ModelConverter.java
  60. 51 0
      src/main/java/com/uas/platform/b2c/external/erp/common/util/ModelConverter.java
  61. 188 0
      src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/B2cOrderServiceImpl.java
  62. 77 12
      src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/OrderServiceImpl.java
  63. 73 1
      src/main/java/com/uas/platform/b2c/external/erp/order/util/ModelConverter.java
  64. 186 0
      src/main/java/com/uas/platform/b2c/external/erp/prod/service/impl/ProdServiceImpl.java
  65. 2 1
      src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/OperationInfoServiceImpl.java
  66. 41 4
      src/main/java/com/uas/platform/b2c/external/erp/product/util/ModelConverter.java
  67. 4 3
      src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentController.java
  68. 14 0
      src/main/java/com/uas/platform/b2c/fa/payment/model/BankInfo.java
  69. 3 2
      src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentService.java
  70. 1 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankTransferServiceImpl.java
  71. 55 26
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java
  72. 25 0
      src/main/java/com/uas/platform/b2c/fa/payment/utils/StringUtils.java
  73. 9 0
      src/main/java/com/uas/platform/b2c/fa/settlement/service/BillSubmitService.java
  74. 39 1
      src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/BillSubmitServiceImpl.java
  75. 53 0
      src/main/java/com/uas/platform/b2c/logistics/constant/TipType.java
  76. 9 0
      src/main/java/com/uas/platform/b2c/logistics/controller/DistributionRuleController.java
  77. 36 0
      src/main/java/com/uas/platform/b2c/logistics/controller/TipRecordController.java
  78. 8 0
      src/main/java/com/uas/platform/b2c/logistics/dao/DistributionRuleDao.java
  79. 31 0
      src/main/java/com/uas/platform/b2c/logistics/dao/TipRecordDao.java
  80. 84 0
      src/main/java/com/uas/platform/b2c/logistics/model/TipRecord.java
  81. 24 0
      src/main/java/com/uas/platform/b2c/logistics/model/UsableRuleInfo.java
  82. 7 0
      src/main/java/com/uas/platform/b2c/logistics/service/DistributionRuleService.java
  83. 22 0
      src/main/java/com/uas/platform/b2c/logistics/service/TipRecordService.java
  84. 21 20
      src/main/java/com/uas/platform/b2c/logistics/service/impl/AddressServiceImpl.java
  85. 42 11
      src/main/java/com/uas/platform/b2c/logistics/service/impl/DistributionRuleServiceImpl.java
  86. 11 15
      src/main/java/com/uas/platform/b2c/logistics/service/impl/InvoiceFPurchaseServiceImpl.java
  87. 63 0
      src/main/java/com/uas/platform/b2c/logistics/service/impl/TipRecordServiceImpl.java
  88. 20 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/DoubleConstant.java
  89. 39 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ErrorInfoConstant.java
  90. 40 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/GoodStatusEnum.java
  91. 15 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/IntegerConstant.java
  92. 5 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/ShortConstant.java
  93. 38 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/StringConstant.java
  94. 127 0
      src/main/java/com/uas/platform/b2c/prod/commodity/constant/UploadConstant.java
  95. 107 6
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java
  96. 139 17
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java
  97. 40 18
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java
  98. 55 0
      src/main/java/com/uas/platform/b2c/prod/commodity/controller/UASBatchPutOnPropertyController.java
  99. 200 2
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsDao.java
  100. 1 1
      src/main/java/com/uas/platform/b2c/prod/commodity/dao/GoodsHistoryDao.java

+ 44 - 2
pom.xml

@@ -71,7 +71,7 @@
 		<dependency>
 			<groupId>com.uas.api</groupId>
 			<artifactId>b2c-erp-api</artifactId>
-			<version>0.0.2</version>
+			<version>0.0.2-SNAPSHOT</version>
 		</dependency>
 		<dependency>
 			<groupId>com.uas.api</groupId>
@@ -316,7 +316,18 @@
 		<dependency>
 			<groupId>org.apache.poi</groupId>
 			<artifactId>poi</artifactId>
-			<version>3.9</version>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.poi</groupId>
+					<artifactId>poi</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<!-- BeeCloud支付集成SDK -->
 		<dependency>
@@ -432,6 +443,37 @@
 			<artifactId>classmate</artifactId>
 			<version>1.1.0</version>
 		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.uas.ps</groupId>
+			<artifactId>ps-entity</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>com.uas.ps</groupId>
+			<artifactId>ps-entity</artifactId>
+			<version>0.0.1-SNAPSHOT</version>
+		</dependency>
+		<!--Hutool POI工具类(对MS Office操作)-->
+		<!--<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+		</dependency>-->
+		<dependency>
+			<groupId>com.xiaoleilu</groupId>
+			<artifactId>hutool-poi</artifactId>
+			<version>3.2.2</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.poi</groupId>
+					<artifactId>poi-ooxml</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
 	</dependencies>
 	<build>
 		<finalName>platform-b2c</finalName>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 45 - 3
src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java

@@ -1,12 +1,20 @@
 package com.uas.platform.b2c.common.account.controller;
 
+import com.uas.platform.b2c.common.account.dao.UserLoginTimeDao;
 import com.uas.platform.b2c.common.account.model.User;
 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;
 import net.sf.ehcache.CacheManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -21,6 +29,12 @@ public class AuthenticationController {
 	@Autowired
 	private UserService userService;
 
+	@Autowired
+	private UserQuestionService userQuestionService;
+
+	@Autowired
+	private UserLoginTimeDao userLoginTimeDao;
+
 	@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseBody
 	@ResponseStatus(value = HttpStatus.OK)
@@ -28,7 +42,18 @@ public class AuthenticationController {
 		if (SystemSession.getUser() == null) {
 			return null;
 		}
-		return new UserInfo(SystemSession.getUser());
+		User sysUser = SystemSession.getUser();
+		List<UserQuestion> userQuestion = userQuestionService.findUserQuestionByUserUUOrderBySortAsc(sysUser.getUserUU());
+		User user = userService.findUserByUserUU(sysUser.getUserUU());
+		user.setEnterprise(sysUser.getEnterprise());
+		UserInfo userInfo = new UserInfo(user);
+		if(userQuestion!=null){
+			if(userQuestion.size()>0){
+				userInfo.setHaveUserQuestion(true);
+				userInfo.setSecLevel((short)(1+userInfo.getSecLevel()));
+			}
+		}
+		return userInfo;
 	}
 
 	/**
@@ -58,9 +83,26 @@ public class AuthenticationController {
 	@ResponseBody
 	public void switchEnterprise(@PathVariable("enUU") long enUU) {
 		User user = SystemSession.getUser();
-		if ( enUU == 0L){
+		//保存登录时间
+		List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(user.getUserUU(), user.getEnterprise() == null ? 0L : user.getEnterprise().getUu());
+		UserLoginTime userLoginTime;
+		if (!CollectionUtils.isEmpty(userLoginTimeList)) {
+			userLoginTime = userLoginTimeList.get(0);
+		} else {
+			userLoginTime = new UserLoginTime();
+			userLoginTime.setUserUU(user.getUserUU());
+			userLoginTime.setEnUU(user.getEnterprise() == null ? 0L : user.getEnterprise().getUu());
+		}
+		userLoginTime.setLoginTime(System.currentTimeMillis());
+		try {
+			userLoginTimeDao.save(userLoginTime);
+		} catch (Exception e) {
+
+		}
+
+		if ( enUU == 0L) {
 			user.setEnterprise(null);
-		}else {
+		} else {
 			user.setCurrentEnterprise(enUU);
 		}
 	}

+ 127 - 1
src/main/java/com/uas/platform/b2c/common/account/controller/EnterpriseController.java

@@ -1,18 +1,25 @@
 package com.uas.platform.b2c.common.account.controller;
 
+import com.uas.account.entity.ApplyUserSpace;
 import com.uas.account.entity.UserSpaceDetail;
+import com.uas.account.support.Page;
 import com.uas.account.util.AccountUtils;
 import com.uas.platform.b2c.common.account.model.Enterprise;
-import com.uas.platform.b2c.common.account.model.FormEnterprise;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.model.UserBaseInfo;
+import com.uas.platform.b2c.common.account.model.FormEnterprise;
 import com.uas.platform.b2c.common.account.service.EnterpriseService;
+import com.uas.platform.b2c.common.account.service.UserService;
 import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.fa.payment.utils.StringUtils;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
 import com.uas.platform.b2c.trade.support.ResultMap;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.*;
+
 /**
  * 企业信息
  * @author suntg
@@ -28,6 +35,9 @@ public class EnterpriseController {
 	@Autowired
 	private StoreInService storeService;
 
+	@Autowired
+	private UserService userService;
+
 	/**
 	 * 根据UU获取企业信息
 	 * @param enuu 企业uu号
@@ -52,6 +62,16 @@ public class EnterpriseController {
 		}
 	}
 
+	/**
+	 * 根据UU获取管理员信息
+	 * @param enuu 企业uu号
+	 * @return 完整的企业信息
+	 */
+	@RequestMapping(value = "/{enuu}/admin", method = RequestMethod.GET)
+	public UserBaseInfo getEnterpriseAdminInfo(@PathVariable Long enuu){
+		return enterpriseService.getEnterpriseAdminInfo(enuu);
+	}
+
 	/**
 	 * 修改企业基本资料
 	 *
@@ -140,4 +160,110 @@ public class EnterpriseController {
 		enterpriseService.openVendor(enUU,false,false);
 	}
 
+	/**
+	 * 通过名字查找企业详细信息(账户中心)
+	 *
+	 * @param enName
+	 */
+	@RequestMapping(value = "/findByName/{enName}", method = RequestMethod.GET)
+	public UserSpaceDetail findByName(@PathVariable("enName") String enName) {
+		UserSpaceDetail userSpaceDetail = null;
+		if (StringUtils.isEmpty(enName)) {
+			throw new IllegalArgumentException("信息未填写完整!");
+		}
+		try {
+			userSpaceDetail = AccountUtils.findByName(enName);
+		} catch (Exception e) {
+			throw new IllegalArgumentException("账户中心异常!");
+		}
+		return userSpaceDetail;
+	}
+
+	/**
+	 * 发起绑定个人到企业的申请
+	 * @param phone
+	 * @param enName
+	 * @param businessCode
+	 */
+	@RequestMapping(value = "/applyUserSpace", method = RequestMethod.GET)
+	public ResultMap applyUserSpace(String phone, String enName, String businessCode) {
+		if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(enName) || StringUtils.isEmpty(businessCode)) {
+			return ResultMap.success("信息缺失");
+		}
+		try {
+			AccountUtils.applyUserSpace(phone,enName,businessCode);
+		} catch (Exception e) {
+			return ResultMap.success(e.getMessage());
+		}
+		return ResultMap.success("success");
+	}
+
+	/**
+	 * 返回个人申请记录
+	 * @param phone
+	 */
+	@RequestMapping(value = "/findApplyInfo", method = RequestMethod.GET)
+	public List<Map<String,Object>> findApplyInfo(String phone) {
+		if (StringUtils.isEmpty(phone)) {
+			throw new IllegalArgumentException("信息未填写完整!");
+		}
+		Page<ApplyUserSpace> applyUserSpacePage= null;
+		List<Map<String,Object>> mapList = new ArrayList<>();
+		try {
+			applyUserSpacePage = AccountUtils.findApplyInfo(phone,1,1024*1024*1024);
+			if (!CollectionUtils.isEmpty(applyUserSpacePage.getContent())) {
+				List<ApplyUserSpace> applyUserSpaceList = applyUserSpacePage.getContent();
+				for (ApplyUserSpace applyUserSpace : applyUserSpaceList) {
+					List<Enterprise> e = enterpriseService.findByEnBussinessCode(applyUserSpace.getBusinessCode());
+					User admin = null;
+					if (!CollectionUtils.isEmpty(e) && e.get(0).getEnAdminuu() != null) {
+						admin = userService.findUserByUserUU(e.get(0).getEnAdminuu());
+					}
+					Map<String,Object> map = new HashMap<>();
+					map.put("enName", CollectionUtils.isEmpty(e) ? "" : e.get(0).getEnName());
+					map.put("date",applyUserSpace.getSubmitDate());
+					map.put("adminName",admin == null ? null : admin.getUserName());
+					map.put("status",applyUserSpace.getStatus());
+					mapList.add(map);
+				}
+			}
+		} catch (Exception e) {
+			throw new IllegalArgumentException("系统异常");
+		}
+		Collections.sort(mapList,new Comparator(){
+			@Override
+			public int compare(Object o1, Object o2) {
+				Map<String,Object> s1 = (Map<String,Object>) o1;
+				Map<String,Object> s2 = (Map<String,Object>)o2;
+				Long timeA = Long.parseLong(s1.get("date").toString());
+				Long timeB = Long.parseLong(s2.get("date").toString());
+				return timeA.compareTo(timeB);
+			}
+		});
+		return mapList;
+	}
+
+	/**
+	 * 返回企业未处理审批数量
+	 * @param businessCode
+	 */
+	@RequestMapping(value = "/applyCount", method = RequestMethod.GET)
+	public ResultMap applyCount(String businessCode) {
+		if (StringUtils.isEmpty(businessCode)) {
+			throw new IllegalArgumentException("信息未填写完整!");
+		}
+		Map<String, Integer> result= null;
+		try {
+			result = AccountUtils.applyCount(businessCode);
+		} catch (Exception e) {
+			throw new IllegalArgumentException("系统异常");
+		}
+		int count = 0;
+		for (String key : result.keySet()) {
+			if ("311".equals(key)){
+				count = count + result.get(key);
+			}
+		}
+		return ResultMap.success(count);
+	}
 }

+ 72 - 0
src/main/java/com/uas/platform/b2c/common/account/controller/SecQuestionController.java

@@ -0,0 +1,72 @@
+package com.uas.platform.b2c.common.account.controller;
+
+import com.uas.platform.b2c.common.account.model.SecQuestion;
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.account.service.SecQuestionService;
+import com.uas.platform.b2c.prod.product.property.model.Property;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+import com.wordnik.swagger.annotations.ApiOperation;
+import com.wordnik.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/user/secQuestion")
+public class SecQuestionController {
+
+    @Autowired
+    private SecQuestionService secQuestionService;
+
+    /**
+     * 添加密保问题
+     * @param secQuestion
+     * @return
+     */
+    @RequestMapping(value = "/add", method = RequestMethod.POST)
+    public ResponseEntity<String> add(@RequestBody SecQuestion secQuestion) {
+        secQuestionService.save(secQuestion);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+    /**
+     * 分页获取密保问题
+     * @param pageInfo
+     * @return
+     */
+    @RequestMapping(value = "/getPageInfo", method = RequestMethod.GET)
+    @ApiOperation(value = "分页获取密保问题", httpMethod = "GET")
+    public Page<SecQuestion> getPageStatusRealAuth(@ApiParam(required = true, value = "分页参数") PageParams pageInfo) {
+        return secQuestionService.getPageSecQuestion(pageInfo);
+    }
+
+    /**
+     * 根据Id获取密保问题信息
+     * @param id
+     * @return
+     */
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    @ResponseBody
+    public SecQuestion getProperty(@PathVariable("id") Long id) {
+        return secQuestionService.findById(id);
+    }
+
+    /**
+     * 删除密保问题
+     * @param id
+     * @return
+     */
+    @RequestMapping(value = "/delete", method = RequestMethod.GET)
+    public ResponseEntity<String> delete(Long id) {
+        secQuestionService.delete(id);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+}

+ 45 - 2
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -2,9 +2,13 @@ package com.uas.platform.b2c.common.account.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.uas.account.entity.UserView;
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserDao;
+import com.uas.platform.b2c.common.account.dao.UserLoginTimeDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.SigninLog;
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.account.model.UserLoginTime;
 import com.uas.platform.b2c.common.account.service.SigninLogService;
 import com.uas.platform.b2c.common.account.service.UserService;
 import com.uas.platform.b2c.core.support.SystemSession;
@@ -24,12 +28,14 @@ import org.springframework.mobile.device.LiteDeviceResolver;
 import org.springframework.mobile.device.site.SitePreference;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.IOException;
+import java.util.List;
 
 /**
  * 处理登录和登录跳转
@@ -45,6 +51,15 @@ public class SecurityController {
 	private UserService userService;
 	@Autowired
 	private SigninLogService signinLogService;
+	@Autowired
+	private UserLoginTimeDao userLoginTimeDao;
+
+	@Autowired
+	private EnterpriseDao enterpriseDao;
+
+	@Autowired
+	private UserDao userDao;
+
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
 	/**
@@ -201,7 +216,7 @@ public class SecurityController {
 	 */
 	@RequestMapping(value = "/login/other")
 	@ResponseBody
-	public String afterCrossLogin(HttpServletRequest request, HttpServletResponse response, UserView userView) {
+	public String afterCrossLogin(HttpServletRequest request, HttpServletResponse response, UserView userView, Integer maxage) {
 		String callback =request.getParameter("jsoncallback");
 		response.setContentType("text/html;charset=UTF-8");
 		if (userView != null && userView.getUid() != null) {
@@ -209,6 +224,9 @@ public class SecurityController {
 				tk.setUid(userView.getUid());
 				tk.setTime(System.currentTimeMillis());
 				tk.setData(JSON.toJSONString(userView));
+				if (null != maxage) {
+					request.setAttribute("sso_cookie_maxage", maxage);
+				}
 				SSOHelper.setSSOCookie(request, response, tk, true);
 				User user = getUserByToken(tk);
 				if (user != null) {
@@ -272,12 +290,37 @@ public class SecurityController {
 			if (authedUser != null && authedUser.getEnterprises() != null) {
 				// 企业资料在client系统自己的唯一标识,比如en_uu
 				if (tokenUser.getSpaceDialectUID() != null) {
-					authedUser.setCurrentEnterprise(Long.parseLong(tokenUser.getSpaceDialectUID()));
+					// 如果企业不存在则更新该企业
+					for (Enterprise enterprise : authedUser.getEnterprises()) {
+						if (enterprise.getUu().equals(Long.parseLong(tokenUser.getSpaceDialectUID()))){
+							authedUser.setEnterprise(enterprise);
+						}
+					}
+					if (null == authedUser.getEnterprise()) {
+						Enterprise newEnterprise = enterpriseDao.findByUu(Long.parseLong(tokenUser.getSpaceDialectUID()));
+						authedUser.getEnterprises().add(newEnterprise);
+						userDao.save(authedUser);
+						authedUser.setEnterprise(newEnterprise);
+					}
 				} else if (tokenUser.getSpaceUID() != null) {
 					for (Enterprise enterprise : authedUser.getEnterprises()) {
 						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
 						if (tokenUser.getSpaceUID().equals(enterprise.getEnBussinessCode())) {
 							authedUser.setEnterprise(enterprise);
+							//保存登录时间
+							List<UserLoginTime> userLoginTimeList = userLoginTimeDao.findByUserUUAndEnUU(authedUser.getUserUU(),enterprise.getUu());
+							UserLoginTime userLoginTime;
+							if (!CollectionUtils.isEmpty(userLoginTimeList)){
+								userLoginTime = userLoginTimeList.get(0);
+							}else {
+								userLoginTime = new UserLoginTime();
+								userLoginTime.setUserUU(authedUser.getUserUU());
+								userLoginTime.setEnUU(enterprise.getUu());
+							}
+							userLoginTime.setLoginTime(System.currentTimeMillis());
+							try {
+								userLoginTimeDao.save(userLoginTime);
+							}catch (Exception e){}
 							break;
 						}
 					}

+ 539 - 24
src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java

@@ -1,35 +1,44 @@
 package com.uas.platform.b2c.common.account.controller;
 
-import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.message.mail.service.MailService;
+import com.uas.message.sms.service.SmsService;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.model.UserCacheEnterprise;
 import com.uas.platform.b2c.common.account.model.UserInfo;
+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 com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
-import com.uas.platform.b2c.trade.inquiry.model.TradeCharge;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.util.StringUtil;
 import com.uas.platform.core.util.encry.Md5Utils;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
+import com.wordnik.swagger.annotations.ApiOperation;
+import com.wordnik.swagger.annotations.ApiParam;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import java.util.List;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * 用户信息的请求
@@ -44,6 +53,18 @@ public class UserController {
 	@Autowired
 	private UserService userService;
 
+	@Autowired
+	private MailService mailService;
+
+	@Autowired
+	private SmsService smsService;
+
+	@Autowired
+	private UserQuestionService uqService;
+
+	@Value("#{sys.profile}")
+	private String profile;
+
 	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
 
 	/**
@@ -55,6 +76,21 @@ public class UserController {
 		return SystemSession.getUser();
 	}
 
+	/**
+	 * 获取当前环境
+	 * @return
+	 */
+	@RequestMapping(value = "/isDev", method = RequestMethod.GET)
+	public String isDev() {
+		if (StringUtils.isEmpty(profile)) {
+			return "fasle";
+		} else if ("prod".equals(profile)) {
+			return "success";
+		} else {
+			return "false";
+		}
+	}
+
 	/**
 	 * 设置头像路径
 	 * @param imageUrl
@@ -67,6 +103,8 @@ public class UserController {
 			throw new IllegalOperatorException("您当前的账号不存在,或未登录!不能设置图像。");
 		}
 		user.setImageUrl(imageUrl);
+		assert logger != null;
+		logger.log("用户信息", "设置头像路径,UU:" + user.getUserUU());
 		return userService.save(user);
 	}
 
@@ -81,7 +119,7 @@ public class UserController {
 	 * @param password 用户输入密码
 	 */
 	@RequestMapping(value = "/checkPassword", method = RequestMethod.GET)
-	public ResponseEntity<String> checkPassword(String password) {
+	public ResponseEntity<String> checkPassword(final String password) {
 		User sysUser = SystemSession.getUser();
 		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
 		if (!StringUtils.isEmpty(password)) {
@@ -97,20 +135,29 @@ public class UserController {
 
 	/**
 	 * 修改用户密码
-	 *
-	 * @param password	用户输入密码
+	 * @param session 获取session
+	 * @param password 旧密码
+	 * @param newPassword 新密码
+	 * @param secLevel 密码强度
+	 * @return
 	 */
 	@RequestMapping(value = "/updatePassword", method = RequestMethod.POST)
-	public ResponseEntity<String> updatePassword(HttpSession session, String password, String newPassword) {
-		if (password.equals(newPassword)){
+	public ResponseEntity<String> updatePassword(final HttpSession session, final String password, final String newPassword, final Short secLevel) {
+		if (password.equals(newPassword)) {
 			throw new IllegalOperatorException("新密码与旧密码相同");
 		}
+		String middlLevelReg = "^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z]))|((?=.*[0-9])(?=.*[A-Z]))).*$";
+		if (!newPassword.matches(middlLevelReg)) {
+			throw new IllegalOperatorException("密码格式有误,请重新输入");
+		}
 		User sysUser = SystemSession.getUser();
 		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
-		Enterprise enterprise = user.getEnterprise();
 		if (!StringUtils.isEmpty(newPassword)) {
+			user.setPwdSecLevel(secLevel);
 			user = userService.updatePassword(user, password, newPassword);
-			user.setEnterprise(enterprise);
+			if (sysUser.getEnterprise() != null) {
+				user.setCurrentEnterprise(sysUser.getEnterprise().getUu());
+			}
 			session.setAttribute("user", user);
 			SystemSession.setUser(user);
 			assert logger != null;
@@ -120,16 +167,439 @@ public class UserController {
 			throw new IllegalOperatorException("新密码不能为空");
 	}
 
+	/**
+	 * 验证用户输入的邮箱地址是否正确
+	 *
+	 * @param userEmail 用户输入邮箱地址
+	 */
+	@RequestMapping(value = "/checkUserEmail", method = RequestMethod.GET)
+	public ResponseEntity<String> checkUserEmail(final String userEmail) {
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		if (!StringUtils.isEmpty(userEmail)) {
+			boolean result = user.getUserEmail().equals(userEmail);
+			if (result) {
+				return new ResponseEntity<>(HttpStatus.OK);
+			}
+		}
+		return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
+	}
+
+	/**
+	 * 发送邮箱验证码
+	 *
+	 * @param newUserEmail 用户输入新邮箱地址
+	 */
+	@RequestMapping(value = "/sendCheckCode", method = RequestMethod.GET)
+	public ResponseEntity<String> sendCheckCode(final String newUserEmail, final HttpSession session) {
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		Long checkTime = (Long)session.getAttribute("checkTime");
+		if (!StringUtils.isEmpty(checkTime)){
+			Long nowTime = System.currentTimeMillis();
+			if((nowTime-checkTime)<60 * 1000){
+				throw new IllegalOperatorException("验证码发送频繁...");
+			}
+		}
+		if (!StringUtils.isEmpty(newUserEmail)) {
+			String pageToken = (String) session.getAttribute("pageToken");
+			if (pageToken == null || pageToken.equals("")) {
+				throw new IllegalOperatorException("页面信息获取失败!");
+			}
+			// 发送邮件
+			ModelMap data = new ModelMap();
+			String checkCode = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
+			data.put("checkcode", checkCode);
+			try {
+				mailService.send("a4c45a22-436a-430c-9667-4edfd7d04a27", newUserEmail, data);
+				session.setAttribute("checkCode", checkCode);
+				session.setAttribute("checkTime", System.currentTimeMillis());
+				session.setAttribute("newUserEmail",newUserEmail);
+				assert logger != null;
+				logger.log("用户信息", "发送用户邮箱地址,UU:" + user.getUserUU());
+				return new ResponseEntity<>(HttpStatus.OK);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
+	}
+
+	/**
+	 * 校验验证码是否正确
+	 * @param checkCode 用户输入验证码
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping(value = "/validCheckCode", method = RequestMethod.GET)
+	public Map<String, Object> validCheckCode(final String checkCode, final String newUserEmail,final HttpServletRequest request) {
+		HttpSession session = request.getSession();
+		Map<String,Object> result = new HashMap<String,Object>();
+		if (!StringUtils.isEmpty(checkCode) && !StringUtils.isEmpty(newUserEmail)) {
+			Long checkTime = (Long) session.getAttribute("checkTime");
+			Long nowTime = System.currentTimeMillis();
+			String _checkCode = (String) session.getAttribute("checkCode");
+			String _newUserEmail = (String) session.getAttribute("newUserEmail");
+			// 验证码失效
+			if((nowTime-checkTime)>10 * 60 * 1000 || _checkCode == null) {
+				result.put("status", 2);
+				result.put("message", "验证码失效");
+				return result;
+			}
+			// 验证码错误
+			if (!_checkCode.equals(checkCode) || !_newUserEmail.equals(newUserEmail)) {
+				result.put("status", 0);
+				result.put("message", "验证码错误");
+				return result;
+			}
+			// 验证码正确
+			if (_checkCode.equals(checkCode)) {
+				result.put("status", 1);
+				result.put("message", "验证码正确");
+				return result;
+			}
+		}
+		result.put("status", 0);
+		result.put("message", "验证码错误");
+		return result;
+	}
+
+	/**
+	 * 修改用户邮箱
+	 * @param session
+	 * @param userEmail
+	 * @param newUserEmail
+	 * @return
+	 */
+	@RequestMapping(value = "/updateUserEmail", method = RequestMethod.POST)
+	public ResponseEntity<String> updateUserEmail(final HttpSession session, final String userEmail, final String newUserEmail,final String checkCode) {
+		if (userEmail!=null && userEmail.equals(newUserEmail)) {
+			throw new IllegalOperatorException("新邮箱地址与旧邮箱地址相同");
+		}
+		// 正则校验邮箱地址
+		if(!newUserEmail.matches("^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")){
+			throw new IllegalOperatorException("新邮箱地址格式不正确");
+		}
+		String _checkCode = (String) session.getAttribute("checkCode");
+		if(!_checkCode.equals(checkCode)){
+			throw new IllegalOperatorException("验证码错误");
+		}
+		String _newUserEmail = (String) session.getAttribute("newUserEmail");
+		if(!_newUserEmail.equals(newUserEmail)){
+			throw new IllegalOperatorException("邮箱地址错误");
+		}
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		if (!StringUtils.isEmpty(newUserEmail)) {
+			if (!userService.isEmailUseable(newUserEmail)) {
+				throw new IllegalOperatorException("邮箱已被注册...");
+			}
+			if(userEmail!=null && !userEmail.equals(user.getUserEmail())){
+				throw new IllegalOperatorException("旧邮箱地址校验错误");
+			}
+			user.setUserEmail(newUserEmail);
+			user = userService.updateUserEmail(user.getUserTel(),newUserEmail,user.getUserUU());
+			if(sysUser.getEnterprise()!=null){
+				user.setCurrentEnterprise(sysUser.getEnterprise().getUu());
+			}
+			session.setAttribute("user", user);
+			SystemSession.setUser(user);
+			assert logger != null;
+			logger.log("用户信息", "修改用户邮箱地址,UU:" + user.getUserUU());
+			return new ResponseEntity<>(HttpStatus.OK);
+		} else
+			throw new IllegalOperatorException("新邮箱地址不能为空");
+	}
+
+	/**
+	 * 验证原手机号输入是否正确
+	 * @param userTel
+	 * @return
+	 */
+	@RequestMapping(value = "/checkUserTel", method = RequestMethod.GET)
+	public ResponseEntity<String> checkUserTel(final String userTel) {
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		if (!StringUtils.isEmpty(userTel)) {
+			boolean result = user.getUserTel().equals(userTel);
+			if (result) {
+				assert logger != null;
+				logger.log("用户信息", "验证用户手机,UU:" + user.getUserUU());
+				return new ResponseEntity<>(HttpStatus.OK);
+			}
+		}
+		return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
+	}
+
+	/**
+	 * 发送手机验证码
+	 * @param newUserTel 用户输入新手机号
+	 * @param session
+	 */
+	@RequestMapping(value = "/sendTelCheckCode", method = RequestMethod.GET)
+	public ResponseEntity<String> sendTelCheckCode(final String newUserTel, final HttpSession session) {
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		Long checkTime = (Long)session.getAttribute("telCheckTime");
+		if (!StringUtils.isEmpty(checkTime)){
+			Long nowTime = System.currentTimeMillis();
+			if((nowTime-checkTime)<60 * 1000){
+				throw new IllegalOperatorException("验证码发送频繁...");
+			}
+		}
+		if (!StringUtils.isEmpty(newUserTel)) {
+			// 页面Token校验
+			String pageToken = (String) session.getAttribute("pageToken");
+			if (pageToken == null || pageToken.equals("")) {
+				throw new IllegalOperatorException("页面信息获取失败!");
+			}
+			String checkCode = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
+			try {
+				smsService.send("1eba04ae-f3d9-4105-ad32-0196309fabb3", newUserTel, new Object[] {checkCode});
+				session.setAttribute("telCheckCode", checkCode);
+				session.setAttribute("telCheckTime", System.currentTimeMillis());
+				session.setAttribute("newUserTel", newUserTel);
+				assert logger != null;
+				logger.log("用户信息", "发送手机验证码,UU:" + user.getUserUU());
+				return new ResponseEntity<>(HttpStatus.OK);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
+	}
+
+	/**
+	 * 校验手机验证码
+	 * @param telCheckCode
+	 * @param session
+	 * @return
+	 */
+	@RequestMapping(value = "/validTelCheckCode", method = RequestMethod.GET)
+	public Map<String, Object> validTelCheckCode(final String telCheckCode, final String newUserTel,final HttpSession session) {
+		Map<String, Object> result = new HashMap<String, Object>();
+		if (!StringUtils.isEmpty(telCheckCode) && !StringUtils.isEmpty(newUserTel)) {
+			Long checkTime = (Long) session.getAttribute("telCheckTime");
+			Long nowTime = System.currentTimeMillis();
+			String _checkCode = (String) session.getAttribute("telCheckCode");
+			String _newUserTel = (String) session.getAttribute("newUserTel");
+			// 验证码失效
+			if ((nowTime - checkTime) > 10 * 60 * 1000 || _checkCode == null) {
+				result.put("status", 2);
+				result.put("message", "验证码失效");
+				return result;
+			}
+			// 验证码错误
+			if (!_checkCode.equals(telCheckCode) || !_newUserTel.equals(newUserTel)) {
+				result.put("status",0);
+				result.put("message", "验证码错误");
+				return result;
+			}
+			// 验证码正确
+			if (_checkCode.equals(telCheckCode)) {
+				result.put("status", 1);
+				result.put("message", "验证码正确");
+				return result;
+			}
+		}
+		result.put("status", 0);
+		result.put("message", "验证码错误");
+		return result;
+	}
+
+	/**
+	 * 修改手机号
+	 * @param session
+	 * @param userTel
+	 * @param newUserTel
+	 * @return
+	 */
+	@RequestMapping(value = "/updateUserTel", method = RequestMethod.POST)
+	public ResponseEntity<String> updateUserTel(final HttpSession session, final String userTel, final String newUserTel,final String telCheckCode) {
+		if (userTel.equals(newUserTel)) {
+			throw new IllegalOperatorException("新手机号与旧手机号相同");
+		}
+		// 手机号码正则表达式校验
+		if(!newUserTel.matches("^[0-9]{8,11}$")){
+			throw new IllegalOperatorException("新手机号格式不正确...");
+		}
+		// 防止用户非法操作
+		String _checkCode = (String) session.getAttribute("telCheckCode");
+		if(!_checkCode.equals(telCheckCode)){
+			throw new IllegalOperatorException("验证码错误");
+		}
+		String _newUserTel = (String) session.getAttribute("newUserTel");
+		if(!_newUserTel.equals(newUserTel)){
+			throw new IllegalOperatorException("手机号错误");
+		}
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		if (!StringUtils.isEmpty(newUserTel)) {
+			if (!userService.isTelUseable(newUserTel)) {
+				throw new IllegalOperatorException("手机号不可用...");
+			}
+			user.setUserTel(newUserTel);
+			user = userService.updateUserTel(userTel,newUserTel,user.getUserUU());
+			if(sysUser.getEnterprise()!=null){
+				user.setCurrentEnterprise(sysUser.getEnterprise().getUu());
+			}
+			session.setAttribute("user", user);
+			SystemSession.setUser(user);
+			assert logger != null;
+			logger.log("用户信息", "修改用户手机号,UU:" + user.getUserUU());
+			return new ResponseEntity<>(HttpStatus.OK);
+		} else
+			throw new IllegalOperatorException("新手机号不能为空");
+	}
+
+	/**
+	 * 验证是否设置支付密码
+	 * @return
+	 */
+	@RequestMapping(value = "/checkHaveUserPay", method = RequestMethod.GET)
+	public ResponseEntity<Boolean> checkHaveUserPay() {
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("Content-Type", "application/text; charset=utf-8");
+		if (!StringUtils.isEmpty(user.getUserPay())) {
+			assert logger != null;
+			logger.log("用户信息", "是否设置支付密码,UU:" + user.getUserUU());
+			return new ResponseEntity<>(true, headers, HttpStatus.OK);
+		}
+		return new ResponseEntity<>(false, headers, HttpStatus.OK);
+	}
+
+	/**
+	 * 验证用户支付密码
+	 * @param userPay 用户输入的支付密码
+	 * @return
+	 */
+	@RequestMapping(value = "/checkUserPay", method = RequestMethod.GET)
+	public ResponseEntity<String> checkUserPay(final String userPay) {
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		if (!StringUtils.isEmpty(userPay)) {
+			boolean result = user.getUserPay().equals(Md5Utils.encode(userPay, user.getUserUU()));
+			if (result) {
+				return new ResponseEntity<>(HttpStatus.OK);
+			}
+			assert logger != null;
+			logger.log("用户信息", "验证用户支付密码,UU:" + user.getUserUU());
+		}
+		return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
+	}
+
+	/**
+	 * 修改用户支付密码
+	 * @param session
+	 * @param userPay
+	 * @param newUserPay
+	 * @return
+	 */
+	@RequestMapping(value = "/updateUserPay", method = RequestMethod.POST)
+	public ResponseEntity<String> updateUserPay(final HttpSession session, final String userPay, final String newUserPay) {
+		if (userPay != null && userPay.equals(newUserPay)) {
+			throw new IllegalOperatorException("新密码与旧密码相同");
+		}
+		// 新密码正则校验
+		if(!newUserPay.matches("^\\d{6}$")){
+			throw new IllegalOperatorException("新密码格式不正确...");
+		}
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
+		if (!StringUtils.isEmpty(newUserPay)) {
+			user = userService.updateUserPay(user, userPay, newUserPay);
+			if(sysUser.getEnterprise()!=null){
+				user.setCurrentEnterprise(sysUser.getEnterprise().getUu());
+			}
+			session.setAttribute("user", user);
+			SystemSession.setUser(user);
+			assert logger != null;
+			logger.log("用户信息", "修改用户支付密码,UU:" + user.getUserUU());
+			return new ResponseEntity<>(HttpStatus.OK);
+		} else
+			throw new IllegalOperatorException("新密码不能为空");
+	}
+
+	/**
+	 * 查询当前用户的密保问题
+	 * @return
+	 */
+	@RequestMapping(value = "/getUserQuestion", method = RequestMethod.GET)
+	public List<UserQuestion> getUserQuestion() {
+		User sysUser = SystemSession.getUser();
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("Content-Type", "application/json; charset=utf-8");
+		List<UserQuestion> questions = uqService.findUserQuestionByUserUUOrderBySortAsc(sysUser.getUserUU());
+		Map<String, List<UserQuestion>> result = new HashMap<String, List<UserQuestion>>();
+		result.put("questions", questions);
+		return questions;
+	}
+
+	/**
+	 * 设置密保问题
+	 * @param userQuestions
+	 * @return
+	 */
+	@RequestMapping(value = "/updateUserQuestion", method = RequestMethod.POST)
+	public ResponseEntity<String> updateUserQuestion(@RequestBody final List<UserQuestion> userQuestions) {
+		User sysUser = SystemSession.getUser();
+		for (UserQuestion uq : userQuestions) {
+			uq.setUser(sysUser);
+			uq.setUserUU(sysUser.getUserUU());
+			if(uq.getAnswer()==null && uq.getQuestion()==null && uq.getAnswer().length()>30){
+				throw new IllegalOperatorException("请按照要求输入信息...");
+			}
+			uqService.save(uq);
+		}
+		assert logger != null;
+		logger.log("用户信息", "设置密保问题,UU:" + sysUser.getUserUU());
+		return new ResponseEntity<>(HttpStatus.OK);
+	}
+
+	/**
+	 * 实名认证
+	 * @param userName
+	 * @param userIdcode
+	 * @param idImgUrl
+	 * @return
+	 */
+	@RequestMapping(value = "/updateRealAuth", method = RequestMethod.POST)
+	public ResponseEntity<String> updateRealAuth(final String userName, final String userIdcode, final String idImgUrl,HttpServletRequest request) {
+		User sysUser = SystemSession.getUser();
+		User user = userService.findUserByUserUU(sysUser.getUserUU());
+		if(user!=null){
+			user.setUserName(userName);
+			user.setUserIccode(userIdcode);
+			user.setIdImgUrl(idImgUrl);
+			user.setIdEnable((short)2);
+			user.setIdDate(new Date());
+			user = userService.saveRealAuth(user);
+			if(sysUser.getEnterprise()!=null){
+				user.setCurrentEnterprise(sysUser.getEnterprise().getUu());
+			}
+			request.getSession().setAttribute("user", user);
+			SystemSession.setUser(user);
+			assert logger != null;
+			logger.log("用户信息", "提交实名认证信息,UU:" + sysUser.getUserUU());
+			return new ResponseEntity<>(HttpStatus.OK);
+		}else{
+			throw new IllegalOperatorException("找不到用户...");
+		}
+	}
+
 	/**
 	 * 根据UU获取该企业所有人员信息
 	 * @param enuu 企业uu号
 	 * @return 完整的企业人员信息
 	 */
 	@RequestMapping(value = "/enterprise/info",method = RequestMethod.GET)
-	public Page<User> getEnterpriseAllUsersInfo(PageParams params, Long enuu){
+	public Page<User> getEnterpriseAllUsersInfo(final PageParams params,Long enuu){
 		PageInfo pageInfo = new PageInfo(params);
 		return userService.findUsersPageByEnUU(pageInfo,enuu);
 	}
+
 	/**
 	 * 通过关键词获取该企业所有人员信息
 	 * @param enuu 企业uu号
@@ -156,6 +626,7 @@ public class UserController {
 		}
 		return new ResponseEntity<String>(HttpStatus.OK);
 	}
+
 	/**
 	 * 删除用户
 	 *
@@ -191,7 +662,7 @@ public class UserController {
 	 */
 	@RequestMapping(value = "/searchUser", method = RequestMethod.GET)
 	@ResponseBody
-	public UserInfo getUser(String keyWord) {
+	public UserInfo getUser(final String keyWord) {
 		return userService.findUserByKeyWord(keyWord);
 	}
 
@@ -204,7 +675,7 @@ public class UserController {
 	 */
 	@RequestMapping(value = "/bindUser", method = RequestMethod.GET)
 	@ResponseBody
-	public ResponseEntity<String> bindUser(Long userUU) {
+	public ResponseEntity<String> bindUser(final Long userUU) {
 		userService.bindUserToMyEnterprise(userUU);
 		return new ResponseEntity<String>(HttpStatus.OK);
 	}
@@ -215,7 +686,7 @@ public class UserController {
 	 * @return
 	 */
 	@RequestMapping(value = "/telEnable", method = RequestMethod.GET)
-	public ResponseEntity<Boolean> telEnable(String tel) {
+	public ResponseEntity<Boolean> telEnable(final String tel) {
 		if (tel == null) {
 			throw new IllegalOperatorException("手机号不能为空!");
 		} else {
@@ -233,7 +704,7 @@ public class UserController {
 	 * @return
 	 */
 	@RequestMapping(value = "/emailEnable", method = RequestMethod.GET)
-	public ResponseEntity<Boolean> emailEnable(String email) {
+	public ResponseEntity<Boolean> emailEnable(final String email) {
 		if (email == null) {
 			throw new IllegalOperatorException("邮箱不能为空");
 		} else {
@@ -283,4 +754,48 @@ public class UserController {
 	public void deleteUserCacheEnterprise() {
 		userService.deleteUserCacheEnterprise(SystemSession.getUser());
 	}
+
+	/**
+	 * 获取页面token,防止恶意发送手机验证码
+	 * @param request
+	 * @return
+	 */
+	@RequestMapping(value = "/getPageToken", method = RequestMethod.GET)
+	public ResponseEntity<String> getPageToken(final HttpServletRequest request) {
+		String pageToken = StringUtil.uuid();
+		HttpSession session = request.getSession();
+		session.setAttribute("pageToken", pageToken);
+		return new ResponseEntity<String>(HttpStatus.OK);
+	}
+
+	/**
+	 * 分页获取实名认证
+	 * @param pageInfo
+	 * @param status
+	 * @return
+	 */
+	@RequestMapping(value = "/getPageStatusRealAuth", method = RequestMethod.GET)
+	@ApiOperation(value = "分页获取实名认证", httpMethod = "GET")
+	public Page<User> getPageStatusRealAuth(@ApiParam(required = true, value = "分页参数") PageParams pageInfo, @ApiParam(required = true, value = "用户状态") Short status) {
+		return userService.getPageStatusRealAuth(pageInfo, status);
+	}
+
+	/**
+	 * 审核实名认证
+	 * @param user
+	 * @return
+	 */
+	@RequestMapping(value = "/updateIdEnable", method = RequestMethod.POST)
+	public ResponseEntity<String> updateIdEnable(final User user) {
+		User oldUser = userService.findUserByUserUU(user.getUserUU());
+		oldUser.setIdEnable(user.getIdEnable());
+		oldUser.setIdRemarks(user.getIdRemarks());
+		User newUser = userService.saveRealAuth(oldUser);
+		if (!StringUtils.isEmpty(user.getIdRemarks())) {
+			smsService.send("bda635e5-156d-4e86-894b-a83071a678e8", newUser.getUserTel(), new Object[] {newUser.getIdRemarks()});
+		}
+		assert logger != null;
+		logger.log("用户信息", SystemSession.getUser().getUserUU()+"后台审核实名认证,UU:" +  newUser.getUserUU());
+		return new ResponseEntity<String>(HttpStatus.OK);
+	}
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/dao/EnterpriseDao.java

@@ -25,5 +25,5 @@ public interface EnterpriseDao extends JpaSpecificationExecutor<Enterprise>, Jpa
 	 * @param bussinessCode
 	 * @return
 	 */
-	public Enterprise findByEnBussinessCode(String bussinessCode);
+	public List<Enterprise> findByEnBussinessCode(String bussinessCode);
 }

+ 10 - 0
src/main/java/com/uas/platform/b2c/common/account/dao/SecQuestionDao.java

@@ -0,0 +1,10 @@
+package com.uas.platform.b2c.common.account.dao;
+
+import com.uas.platform.b2c.common.account.model.SecQuestion;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface SecQuestionDao extends JpaSpecificationExecutor<SecQuestion>,
+        JpaRepository<SecQuestion, Long> {
+
+}

+ 15 - 0
src/main/java/com/uas/platform/b2c/common/account/dao/UserLoginTimeDao.java

@@ -0,0 +1,15 @@
+package com.uas.platform.b2c.common.account.dao;
+
+
+import com.uas.platform.b2c.common.account.model.UserLoginTime;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserLoginTimeDao extends JpaSpecificationExecutor<UserLoginTime>, JpaRepository<UserLoginTime, Long> {
+
+    List<UserLoginTime> findByUserUUAndEnUU (Long userUU, Long enUU);
+}

+ 16 - 0
src/main/java/com/uas/platform/b2c/common/account/dao/UserQuestionDao.java

@@ -0,0 +1,16 @@
+package com.uas.platform.b2c.common.account.dao;
+
+import com.uas.platform.b2c.common.account.model.UserQuestion;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.QueryHints;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.QueryHint;
+import java.util.List;
+
+@Repository
+public interface UserQuestionDao extends JpaSpecificationExecutor<UserQuestion>, JpaRepository<UserQuestion, Long> {
+    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
+    public List<UserQuestion> findUserQuestionByUserUUOrderBySortAsc(Long userUU);
+}

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/model/Enterprise.java

@@ -18,7 +18,7 @@ import java.util.Date;
 @Entity
 @Table(name = "sec$enterprises")
 @Cacheable
-@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.uas.platform.b2c.model.Enterprise")
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.uas.platform.b2c.model.EnterpriseUas")
 public class Enterprise implements Serializable {
 
 	/**

+ 74 - 0
src/main/java/com/uas/platform/b2c/common/account/model/SecQuestion.java

@@ -0,0 +1,74 @@
+package com.uas.platform.b2c.common.account.model;
+
+import java.io.Serializable;
+import javax.persistence.Cacheable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+/**
+ * 密保问题
+ */
+@Entity
+@Table(name = "sec$secquestion")
+@Cacheable
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.uas.platform.b2b.model.User")
+public class SecQuestion implements Serializable {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    public SecQuestion() {
+    }
+
+    /**
+     * id
+     */
+    @Id
+    @Column(name = "sq_id")
+    @GeneratedValue
+    private Long id;
+
+    /**
+     * 问题内容
+     */
+    @Column(name = "sq_question")
+    private String question;
+
+    /**
+     * 问题类型
+     */
+    @Column(name = "sq_type")
+    private Long type;
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getQuestion() {
+        return question;
+    }
+
+    public Long getType() {
+        return type;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public void setQuestion(String question) {
+        this.question = question;
+    }
+
+    public void setType(Long type) {
+        this.type = type;
+    }
+}

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

@@ -38,7 +38,6 @@ public class UsageLog extends BufferedLogable implements Serializable {
 	@JoinColumn(name = "log_useruu", insertable = false, updatable = false)
 	private UserBaseInfo user;
 
-	@NotNull
 	@Column(name = "log_useruu")
 	private Long userUU;
 
@@ -214,7 +213,7 @@ public class UsageLog extends BufferedLogable implements Serializable {
 	}
 
 	public String getUserName() {
-		if(user.getUserName()!=null){
+		if(user.getUserName() != null && user.getUserName() != null){
 			return user.getUserName().substring(0,1)+"**";
 		}
 		return user.getUserName();
@@ -268,9 +267,10 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		if (strArray.length == 9) {
 			this.time = Long.parseLong(strArray[0]);
 			this.ip = strArray[1];
-			if (!strArray[2].equals("null"))
+			if (!"null".equals(strArray[2]))
 				this.enUU = Long.parseLong(strArray[2]);
-			this.userUU = Long.parseLong(strArray[3]);
+			if (!"null".equals(strArray[3]))
+				this.userUU = Long.parseLong(strArray[3]);
 			this.title = strArray[4];
 			this.message = strArray[5];
 			this.detail = StringUtils.hasText(strArray[6]) ? strArray[6] : null;

+ 130 - 5
src/main/java/com/uas/platform/b2c/common/account/model/User.java

@@ -2,6 +2,9 @@ package com.uas.platform.b2c.common.account.model;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import com.uas.platform.core.model.Constant;
+
+import java.util.*;
+
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
@@ -12,9 +15,6 @@ import org.springframework.util.CollectionUtils;
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
 import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
 
 /**
  * 用户信息
@@ -43,7 +43,6 @@ public class User implements Serializable {
 	 * uu号,ID
 	 */
 	@Id
-	@GeneratedValue
 	@Column(name = "user_uu")
 	private Long userUU;
 
@@ -63,7 +62,6 @@ public class User implements Serializable {
 	 * 邮箱
 	 */
 	@Column(name = "user_email", length = 50)
-	@NotNull
 	private String userEmail;
 
 	/**
@@ -114,6 +112,12 @@ public class User implements Serializable {
 	@Column(name = "user_type", length = 20)
 	private String userType;
 
+	/**
+	 * 支付密码
+	 */
+	@Column(name = "user_pay", length = 32)
+	private String userPay;
+
 	/**
 	 * 所属所有公司
 	 */
@@ -123,6 +127,14 @@ public class User implements Serializable {
 	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
 	private Set<Enterprise> enterprises;
 
+	/**
+	 * 所属公司的最后登陆时间
+	 */
+	@JoinColumn(name = "user_uu")
+	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
+	@OrderBy("login_time")
+	private Set<UserLoginTime> userLoginTimeSet;
+
 	/**
 	 * 所属当前登录公司
 	 */
@@ -152,6 +164,96 @@ public class User implements Serializable {
 	@Column(name = "user_imageurl")
 	private String imageUrl;
 
+	/**
+	 * 实名认证的身份证照片地址
+	 */
+	@Column(name = "user_idimgurl")
+	private String idImgUrl;
+
+	/**
+	 * 是否通过审核  1:通过  0:未认证  2:正在审核
+	 */
+	@Column(name = "user_idenable")
+	private Short idEnable;
+
+	/**
+	 * 实名认证申请时间
+	 */
+	@Column(name = "user_iddate")
+	private Date idDate;
+
+	/**
+	 * 账户安全等级
+	 */
+	@Column(name = "user_seclevel")
+	private Short secLevel;
+
+	/**
+	 * 密码安全等级(1、低,2、中,3、高)
+	 */
+	@Column(name = "user_pwdseclevel")
+	private Short pwdSecLevel;
+
+	/**
+	 * 最后一次登录时间
+	 */
+	@Column(name = "user_lastlogintime")
+	private Long lastLoginTime;
+
+	/**
+	 * 身份审核不通过备注
+	 */
+	@Column(name = "user_idRemarks")
+	private String idRemarks;
+
+	public Long getLastLoginTime() {
+		return lastLoginTime;
+	}
+
+	public void setLastLoginTime(Long lastLoginTime) {
+		this.lastLoginTime = lastLoginTime;
+	}
+
+	public Short getPwdSecLevel() {
+		return pwdSecLevel;
+	}
+
+	public void setPwdSecLevel(Short pwdSecLevel) {
+		this.pwdSecLevel = pwdSecLevel;
+	}
+
+	public Short getSecLevel() {
+		return secLevel;
+	}
+
+	public void setSecLevel(Short secLevel) {
+		this.secLevel = secLevel;
+	}
+
+	public Date getIdDate() {
+		return idDate;
+	}
+
+	public void setIdDate(Date idDate) {
+		this.idDate = idDate;
+	}
+
+	public Short getIdEnable() {
+		return idEnable;
+	}
+
+	public void setIdEnable(Short idEnable) {
+		this.idEnable = idEnable;
+	}
+
+	public String getIdImgUrl() {
+		return idImgUrl;
+	}
+
+	public void setIdImgUrl(String idImgUrl) {
+		this.idImgUrl = idImgUrl;
+	}
+
 	public String getImageUrl() {
 		return imageUrl;
 	}
@@ -256,6 +358,14 @@ public class User implements Serializable {
 		this.userIdcode = userIdcode;
 	}
 
+	public String getUserPay() {
+		return userPay;
+	}
+
+	public void setUserPay(String userPay) {
+		this.userPay = userPay;
+	}
+
 	@JsonIgnore
 	@JSONField(serialize = false)
 	public Set<Enterprise> getEnterprises() {
@@ -332,6 +442,14 @@ public class User implements Serializable {
 		this.ip = ip;
 	}
 
+	public Set<UserLoginTime> getUserLoginTimeSet() {
+		return userLoginTimeSet;
+	}
+
+	public void setUserLoginTimeSet(Set<UserLoginTime> userLoginTimeSet) {
+		this.userLoginTimeSet = userLoginTimeSet;
+	}
+
 	/**
 	 * 获取用户所属企业UU号
 	 *
@@ -365,4 +483,11 @@ public class User implements Serializable {
 		}
 	}
 
+	public String getIdRemarks() {
+		return idRemarks;
+	}
+
+	public void setIdRemarks(String idRemarks) {
+		this.idRemarks = idRemarks;
+	}
 }

+ 1 - 1
src/main/java/com/uas/platform/b2c/common/account/model/UserBaseInfo.java

@@ -18,7 +18,7 @@ import java.io.Serializable;
 public class UserBaseInfo implements Serializable {
 
 	/**
-	 * 
+	 *
 	 */
 	private static final long serialVersionUID = 1L;
 

+ 209 - 15
src/main/java/com/uas/platform/b2c/common/account/model/UserInfo.java

@@ -5,10 +5,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 用户简单信息,前台程序使用
@@ -24,6 +21,7 @@ public class UserInfo {
 		this.userName = user.getUserName();
 		this.userTel = user.getUserTel();
 		this.userSex = user.getUserSex();
+		this.pwdEnable = user.getPwdSecLevel()!=null && user.getPwdSecLevel()>1?true:false;
 		this.sys = user.isSys();
 		if (user.getRoles() != null && user.getRoles().size() > 0) {
 			StringBuffer sb = new StringBuffer();
@@ -36,22 +34,66 @@ public class UserInfo {
 		}
 		if (!CollectionUtils.isEmpty(user.getEnterprises())) {
 			Enterprise current = user.getEnterprise();
-			List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+			List<SimpleEnterpriseInfo> list = new ArrayList<SimpleEnterpriseInfo>();
 			for (Enterprise enterprise : user.getEnterprises()) {
-				Map<String, Object> map = new HashMap<String, Object>();
-				map.put("enName", enterprise.getEnName());
-				map.put("uu", enterprise.getUu());
-				map.put("isVendor",enterprise.getEnMallVendorStatus());
+				SimpleEnterpriseInfo simpleEnterpriseInfo= new SimpleEnterpriseInfo();
+				simpleEnterpriseInfo.setEnName(enterprise.getEnName());
+				simpleEnterpriseInfo.setUu(enterprise.getUu());
+				simpleEnterpriseInfo.setIsVendor(enterprise.getEnMallVendorStatus());
+				simpleEnterpriseInfo.setEnBussinessCode(enterprise.getEnBussinessCode());
+				simpleEnterpriseInfo.setEnAdminuu(enterprise.getEnAdminuu());
 				if(enterprise.getEnSaasStatus() != null && enterprise.getEnSaasStatus() == Status.ENABLED.value()) {
-					map.put("enSaasUrl", enterprise.getEnSaasUrl());
+					simpleEnterpriseInfo.setEnSaasUrl(enterprise.getEnSaasUrl());
 				}
 				if (enterprise.equals(current)){
-					map.put("current", true);
+					simpleEnterpriseInfo.setCurrent(true);
 				}
-				list.add(map);
+				for (UserLoginTime userLoginTime : user.getUserLoginTimeSet()){
+					if (userLoginTime.getEnUU().equals(enterprise.getUu())){
+						simpleEnterpriseInfo.setLastLoginTime(userLoginTime.getLoginTime());
+					}
+				}
+				list.add(simpleEnterpriseInfo);
 			}
+
+			Collections.sort(list,new Comparator(){
+				@Override
+				public int compare(Object o1, Object o2) {
+					SimpleEnterpriseInfo s1 = (SimpleEnterpriseInfo) o1;
+					SimpleEnterpriseInfo s2 = (SimpleEnterpriseInfo)o2;
+					return s1.getLastLoginTime().compareTo(s2.getLastLoginTime());
+				}
+			});
 			this.enterprises = list;
 		}
+		this.havePayPwd = user.getUserPay()==null || user.getUserPay().equals("") ?false:true;
+		this.idEnable = user.getIdEnable()==null?0:user.getIdEnable();
+		this.haveUserQuestion = haveUserQuestion;
+		this.lastLoginTime = user.getLastLoginTime();
+		this.secLevel = countSecLevel();
+	}
+
+	private Short countSecLevel(){
+		Short count = 0;
+		if(getIdEnable()!=null && getIdEnable()==1){
+			count++;
+		}
+		if(isPwdEnable()){
+			count++;
+		}
+		if(isHavePayPwd()){
+			count++;
+		}
+		if(getUserEmail()!=null){
+			count++;
+		}
+		if(getUserTel()!=null){
+			count++;
+		}
+		if(isHaveUserQuestion()){
+			count++;
+		}
+		return count;
 	}
 
 	public static Page<UserInfo> getUserInfo(Page<User> page) {
@@ -78,7 +120,69 @@ public class UserInfo {
 	
 	private boolean sys;
 
-	private List<Map<String, Object>> enterprises;
+	private boolean pwdEnable;
+
+	private Short idEnable;
+
+	private List<SimpleEnterpriseInfo> enterprises;
+
+	private boolean havePayPwd;
+
+	private boolean haveUserQuestion;
+
+	private Short secLevel;
+
+	private Long lastLoginTime;
+
+	private Set<UserLoginTime> userLoginTimeSet;
+
+	public Long getLastLoginTime() {
+		return lastLoginTime;
+	}
+
+	public void setLastLoginTime(Long lastLoginTime) {
+		this.lastLoginTime = lastLoginTime;
+	}
+
+	public Short getSecLevel() {
+		return secLevel;
+	}
+
+	public void setSecLevel(Short secLevel) {
+		this.secLevel = secLevel;
+	}
+
+	public boolean isHaveUserQuestion() {
+		return haveUserQuestion;
+	}
+
+	public void setHaveUserQuestion(boolean haveUserQuestion) {
+		this.haveUserQuestion = haveUserQuestion;
+	}
+
+	public boolean isHavePayPwd() {
+		return havePayPwd;
+	}
+
+	public void setHavePayPwd(boolean havePayPwd) {
+		this.havePayPwd = havePayPwd;
+	}
+
+	public Short getIdEnable() {
+		return idEnable;
+	}
+
+	public void setIdEnable(Short idEnable) {
+		this.idEnable = idEnable;
+	}
+
+	public boolean isPwdEnable() {
+		return pwdEnable;
+	}
+
+	public void setPwdEnable(boolean pwdEnable) {
+		this.pwdEnable = pwdEnable;
+	}
 
 	public Long getUserUU() {
 		return userUU;
@@ -128,11 +232,19 @@ public class UserInfo {
 		this.role = role;
 	}
 
-	public List<Map<String, Object>> getEnterprises() {
+	public Set<UserLoginTime> getUserLoginTimeSet() {
+		return userLoginTimeSet;
+	}
+
+	public void setUserLoginTimeSet(Set<UserLoginTime> userLoginTimeSet) {
+		this.userLoginTimeSet = userLoginTimeSet;
+	}
+
+	public List<SimpleEnterpriseInfo> getEnterprises() {
 		return enterprises;
 	}
 
-	public void setEnterprises(List<Map<String, Object>> enterprises) {
+	public void setEnterprises(List<SimpleEnterpriseInfo> enterprises) {
 		this.enterprises = enterprises;
 	}
 
@@ -145,3 +257,85 @@ public class UserInfo {
 	}
 
 }
+
+/**
+ * 返回给前端的简单企业信息数据
+ */
+class SimpleEnterpriseInfo{
+	String enName;
+	Long uu;
+	Short isVendor;
+	String enSaasUrl;
+	boolean current;
+	String enBussinessCode;
+	Long lastLoginTime;
+	Long enAdminuu;
+
+	public SimpleEnterpriseInfo(){
+		this.setLastLoginTime(0L);
+	}
+
+	public String getEnName() {
+		return enName;
+	}
+
+	public void setEnName(String enName) {
+		this.enName = enName;
+	}
+
+	public Long getUu() {
+		return uu;
+	}
+
+	public void setUu(Long uu) {
+		this.uu = uu;
+	}
+
+	public Short getIsVendor() {
+		return isVendor;
+	}
+
+	public void setIsVendor(Short isVendor) {
+		this.isVendor = isVendor;
+	}
+
+	public String getEnSaasUrl() {
+		return enSaasUrl;
+	}
+
+	public void setEnSaasUrl(String enSaasUrl) {
+		this.enSaasUrl = enSaasUrl;
+	}
+
+	public boolean isCurrent() {
+		return current;
+	}
+
+	public void setCurrent(boolean current) {
+		this.current = current;
+	}
+
+	public Long getLastLoginTime() {
+		return lastLoginTime;
+	}
+
+	public void setLastLoginTime(Long lastLoginTime) {
+		this.lastLoginTime = lastLoginTime;
+	}
+
+	public String getEnBussinessCode() {
+		return enBussinessCode;
+	}
+
+	public void setEnBussinessCode(String enBussinessCode) {
+		this.enBussinessCode = enBussinessCode;
+	}
+
+	public Long getEnAdminuu() {
+		return enAdminuu;
+	}
+
+	public void setEnAdminuu(Long enAdminuu) {
+		this.enAdminuu = enAdminuu;
+	}
+}

+ 89 - 0
src/main/java/com/uas/platform/b2c/common/account/model/UserLoginTime.java

@@ -0,0 +1,89 @@
+package com.uas.platform.b2c.common.account.model;
+
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "sec$userslogintime")
+public class UserLoginTime implements Serializable{
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+     * ID
+     */
+    @Id
+    @GeneratedValue
+    @Column(name = "id")
+    private Long id;
+
+    /**
+     * uu号
+     */
+    @Column(name = "user_uu")
+    private Long userUU;
+
+    /**
+     * enuu
+     */
+    @Column(name = "enuu")
+    private Long enUU;
+
+    /**
+     * 信息
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
+    @JoinColumn(name = "enuu", insertable = false, updatable = false)
+    private Enterprise enterprise;
+
+    /**
+     * 登陆时间
+     */
+    @Column(name = "login_time")
+    private Long loginTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+
+    public Long getEnUU() {
+        return enUU;
+    }
+
+    public void setEnUU(Long enUU) {
+        this.enUU = enUU;
+    }
+
+    public Long getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Long loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public Enterprise getEnterprise() {
+        return enterprise;
+    }
+
+    public void setEnterprise(Enterprise enterprise) {
+        this.enterprise = enterprise;
+    }
+}

+ 113 - 0
src/main/java/com/uas/platform/b2c/common/account/model/UserQuestion.java

@@ -0,0 +1,113 @@
+package com.uas.platform.b2c.common.account.model;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 用户密保问题
+ * @author liusw
+ */
+@Entity
+@Table(name = "sec$userquestion")
+@Cacheable
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.uas.platform.b2b.model.User")
+public class UserQuestion implements Serializable {
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    public UserQuestion() {
+    }
+
+    /**
+     * id
+     */
+    @Id
+    @Column(name = "uq_id")
+    @GeneratedValue
+    private Long id;
+
+    /**
+     * 用户uu
+     */
+    @OneToOne(cascade = { CascadeType.REFRESH })
+    @JoinColumn(name = "uq_useruu", insertable = false, updatable = false)
+    private User user;
+
+    /**
+     * 密保用户的UU号
+     */
+    @Column(name = "uq_useruu")
+    private Long userUU;
+
+
+    /**
+     * 密保问题
+     */
+    @Column(name = "uq_question")
+    private String question;
+
+    /**
+     * 密保答案
+     */
+    @Column(name = "uq_answer")
+    private String answer;
+
+    /**
+     * 排序
+     */
+    @Column(name = "uq_sort")
+    private Short sort;
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getQuestion() {
+        return question;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public Short getSort() {
+        return sort;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public void setQuestion(String question) {
+        this.question = question;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public void setSort(Short sort) {
+        this.sort = sort;
+    }
+
+    public Long getUserUU() {
+        return userUU;
+    }
+
+    public void setUserUU(Long userUU) {
+        this.userUU = userUU;
+    }
+}

+ 11 - 1
src/main/java/com/uas/platform/b2c/common/account/service/EnterpriseService.java

@@ -4,6 +4,7 @@ import com.uas.platform.b2c.common.account.controller.EnterpriseController;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.FormEnterprise;
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
 import com.uas.platform.b2c.trade.support.ResultMap;
 
 import java.util.List;
@@ -16,9 +17,11 @@ public interface EnterpriseService {
 	/**
 	 * 批量获取企业的信息
 	 * @param enuus uu号
-	 * @return List<Enterprise>
+	 * @return List<EnterpriseUas>
 	 */
 	List<Enterprise> getEnterpriseInfos(List<Long> enuus);
+
+	public UserBaseInfo getEnterpriseAdminInfo(Long uu);
 	
 	// 得到企业是否有需要结算单据状态
 	public Enterprise getReceiptStatus(Enterprise enter);
@@ -36,6 +39,13 @@ public interface EnterpriseService {
 	 */
 	ResultMap getCurrencyByRegisterAddress();
 
+	/**
+	 * 通过营业执照号码获取企业信息
+	 * @param bussinessCode
+	 * @return
+	 */
+	List<Enterprise> findByEnBussinessCode(String bussinessCode);
+
 	/**
 	 * 个人用户注册企业信息
 	 * @return 店铺信息

+ 38 - 0
src/main/java/com/uas/platform/b2c/common/account/service/SecQuestionService.java

@@ -0,0 +1,38 @@
+package com.uas.platform.b2c.common.account.service;
+
+import com.uas.platform.b2c.common.account.dao.SecQuestionDao;
+import com.uas.platform.b2c.common.account.model.SecQuestion;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import java.util.List;
+import org.springframework.data.domain.Page;
+
+public interface SecQuestionService {
+
+    /**
+     * 保存密保问题
+     * @param secQuestion
+     * @return
+     */
+    SecQuestion save(SecQuestion secQuestion);
+
+    /**
+     * 分页获取所有密保问题
+     * @return
+     */
+    Page<SecQuestion> getPageSecQuestion(PageParams pageInfo);
+
+    /**
+     * 根据id查询密保问题
+     * @param id
+     * @return
+     */
+    SecQuestion findById(Long id);
+
+    /**
+     * 根据id删除密保问题
+     * @param id
+     * @return
+     */
+    void delete(Long id);
+}

+ 24 - 0
src/main/java/com/uas/platform/b2c/common/account/service/UserQuestionService.java

@@ -0,0 +1,24 @@
+package com.uas.platform.b2c.common.account.service;
+
+import com.uas.platform.b2c.common.account.model.UserQuestion;
+
+import java.util.List;
+
+/**
+ * 密保问题
+ */
+public interface UserQuestionService {
+    /**
+     * 设置密保问题
+     * @param userQuestion
+     * @return
+     */
+    UserQuestion save(UserQuestion userQuestion);
+
+    /**
+     * 通过userUU查询当前用户密保问题
+     * @param userUU
+     * @return
+     */
+    List<UserQuestion> findUserQuestionByUserUUOrderBySortAsc(Long userUU);
+}

+ 50 - 1
src/main/java/com/uas/platform/b2c/common/account/service/UserService.java

@@ -5,10 +5,12 @@ import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.account.model.UserCacheEnterprise;
 import com.uas.platform.b2c.common.account.model.UserInfo;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import org.springframework.data.repository.query.Param;
 
 public interface UserService {
 
@@ -74,7 +76,12 @@ public interface UserService {
 	 * @return
 	 */
 	List<User> findAll();
-	
+
+	/**
+	 * 保存用户信息(邮箱,姓名)
+	 * @param user
+	 * @return
+	 */
 	User save(User user);
 
 	/**
@@ -120,4 +127,46 @@ public interface UserService {
 	 * 删除用户注册企业时的缓存数据
 	 */
 	void deleteUserCacheEnterprise(User user);
+
+	/**
+	 * 修改用户支付密码
+	 * @param user
+	 * @param userPay
+	 * @param newUserPay
+	 * @return
+	 */
+	User updateUserPay( User user, String userPay, String newUserPay);
+
+	/**
+	 * 保存用户实名认证信息
+	 * @param user
+	 * @return
+	 */
+	User saveRealAuth(User user);
+
+	/**
+	 * 分页获取实名认证信息
+	 * @param pageInfo
+	 * @param idEnable
+	 * @return
+	 */
+	Page<User> getPageStatusRealAuth(final PageParams pageInfo, Short idEnable);
+
+	/**
+	 * 修改手机号
+	 * @param oldTel
+	 * @param newTel
+	 * @param uu
+	 * @return
+	 */
+	User updateUserTel(String oldTel, String newTel, Long uu);
+
+	/**
+	 * 修改邮箱
+	 * @param tel
+	 * @param newEmail
+	 * @param uu
+	 * @return
+	 */
+	User updateUserEmail(String tel, String newEmail, Long uu);
 }

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

@@ -49,13 +49,23 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 	 * 批量获取企业的信息
 	 *
 	 * @param enuus uu号
-	 * @return List<Enterprise>
+	 * @return List<EnterpriseUas>
 	 */
 	@Override
 	public List<Enterprise> getEnterpriseInfos(List<Long> enuus) {
 		return enterpriseDao.findByUus(enuus);
 	}
 
+	@Override
+	public List<Enterprise> findByEnBussinessCode(String bussinessCode) {
+		return enterpriseDao.findByEnBussinessCode(bussinessCode);
+	}
+
+	@Override
+	public UserBaseInfo getEnterpriseAdminInfo(Long uu) {
+		return userBaseInfoDao.findUserByUserUU(enterpriseDao.findByUu(uu).getEnAdminuu());
+	}
+
 	@Override
 	public Enterprise getReceiptStatus(Enterprise enter) {
 		List<Receipt> receipts = receiptDao.findBySellerenuu(enter.getUu());
@@ -165,7 +175,7 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		try {
 			result = AccountUtils.applyAppForMall(detail);
 		}catch (Exception e){
-			return new ResultMap(CodeType.SYSTEM_ERROR, "注册失败");
+			return new ResultMap(CodeType.SYSTEM_ERROR, "账户中心异常,注册失败");
 		}
 		if (result.contains("errMsg") || !result.contains("enuu")){
 			return new ResultMap(CodeType.SYSTEM_ERROR, "注册失败");

+ 62 - 0
src/main/java/com/uas/platform/b2c/common/account/service/impl/SecQuestionServiceImpl.java

@@ -0,0 +1,62 @@
+package com.uas.platform.b2c.common.account.service.impl;
+
+import com.uas.account.entity.UserDetail;
+import com.uas.account.util.AccountUtils;
+import com.uas.platform.b2c.common.account.dao.SecQuestionDao;
+import com.uas.platform.b2c.common.account.model.SecQuestion;
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.account.service.SecQuestionService;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SecQuestionServiceImpl implements SecQuestionService {
+
+    @Autowired
+    private SecQuestionDao secQuestionDao;
+
+    @Override
+    public SecQuestion save(SecQuestion secQuestion) {
+        postToAccountCenter(secQuestion);
+        return secQuestionDao.save(secQuestion);
+    }
+
+    @Override
+    public Page<SecQuestion> getPageSecQuestion(PageParams pageInfo) {
+        final PageInfo info = new PageInfo(pageInfo);
+        //info.filter("idEnable", idEnable);
+        info.sorting(Direction.ASC,new String[]{"type"});
+        return secQuestionDao.findAll(new Specification<SecQuestion>() {
+            @Override
+            public Predicate toPredicate(Root<SecQuestion> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(info.getPredicates(root, query, cb));
+                return null;
+            }
+        }, info);
+    }
+
+    @Override
+    public SecQuestion findById(Long id) {
+        return secQuestionDao.findOne(id);
+    }
+
+    @Override
+    public void delete(Long id) {
+       secQuestionDao.delete(id);
+    }
+
+    public void postToAccountCenter(SecQuestion secQuestion){
+
+    }
+}

+ 42 - 0
src/main/java/com/uas/platform/b2c/common/account/service/impl/UserQuestionServiceImpl.java

@@ -0,0 +1,42 @@
+package com.uas.platform.b2c.common.account.service.impl;
+
+import com.uas.account.util.AccountUtils;
+import com.uas.platform.b2c.common.account.dao.UserQuestionDao;
+import com.uas.platform.b2c.common.account.model.UserQuestion;
+import com.uas.platform.b2c.common.account.service.UserQuestionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class UserQuestionServiceImpl implements UserQuestionService {
+
+    @Autowired
+    private UserQuestionDao userQuestionDao;
+
+    @Override
+    public UserQuestion save(UserQuestion userQuestion){
+        postToAccountCenter(userQuestion);
+        return userQuestionDao.save(userQuestion);
+    }
+
+    @Override
+    public List<UserQuestion> findUserQuestionByUserUUOrderBySortAsc(Long userUU) {
+        return userQuestionDao.findUserQuestionByUserUUOrderBySortAsc(userUU);
+    }
+
+    private void postToAccountCenter(UserQuestion question) {
+        com.uas.account.entity.UserQuestion accountUserQuestion = new com.uas.account.entity.UserQuestion();
+        accountUserQuestion.setAnswer(question.getAnswer());
+        accountUserQuestion.setQuestion(question.getQuestion());
+        accountUserQuestion.setId(question.getId());
+        accountUserQuestion.setUserUU(question.getUserUU());
+        accountUserQuestion.setSort(question.getSort());
+        try {
+            AccountUtils.saveUserQuestion(accountUserQuestion);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 120 - 17
src/main/java/com/uas/platform/b2c/common/account/service/impl/UserServiceImpl.java

@@ -12,25 +12,32 @@ import com.uas.platform.b2c.core.config.MessageConf;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.exception.SystemException;
-import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.util.AgentUtils;
 import com.uas.platform.core.util.encry.Md5Utils;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.servlet.http.HttpServletRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import javax.servlet.http.HttpServletRequest;
-import java.text.SimpleDateFormat;
-import java.util.*;
+import org.springframework.util.StringUtils;
 
 @Service
 public class UserServiceImpl implements UserService {
@@ -264,17 +271,18 @@ public class UserServiceImpl implements UserService {
 		if (result) {
 			User user1 = userDao.findOne(user.getUserUU());
 			user1.setUserPwd(Md5Utils.encode(newPassword, user1.getUserUU()));
+			user1.setPwdSecLevel(user.getPwdSecLevel());
 			if (user1.getEnterprise() == null)
 				user1.setCurrentEnterprise();// 随便绑定一个用户所属企业
 			Enterprise enterprise = user1.getEnterprise();
 			try {
-                //判断是否为个人账户
-                if (enterprise == null){
-                    AccountUtils.resetPassword(user1.getUserUU(), null, newPassword);
-                }else {
-                    AccountUtils.resetPassword(user1.getUserUU(), enterprise.getUu(), newPassword);
-                }
-				//user1 = userDao.save(user1);
+					//判断是否为个人账户
+					if (enterprise == null){
+							AccountUtils.resetPassword(user1.getUserUU(), null, newPassword);
+					}else {
+							AccountUtils.resetPassword(user1.getUserUU(), enterprise.getUu(), newPassword);
+					}
+				user1 = userDao.save(user1);
 			} catch (Exception e) {
 				throw new SystemException(e.getMessage());
 			}
@@ -343,7 +351,12 @@ public class UserServiceImpl implements UserService {
 		detail.setMobile(user.getUserTel());
 		detail.setName(user.getUserName());
 		detail.setSex(user.getUserSex());
-		AccountUtils.saveUser(user.getUserUU(), SystemSession.getUser().getEnterprise().getUu(), detail);
+		//判断是否个人用户
+		if(SystemSession.getUser().getEnterprise()==null){
+			AccountUtils.saveUser(user.getUserUU(), null, detail);
+		}else{
+			AccountUtils.saveUser(user.getUserUU(), SystemSession.getUser().getEnterprise().getUu(), detail);
+		}
 	}
 	@Override
 	public void removeUser(Long uu) {
@@ -395,4 +408,94 @@ public class UserServiceImpl implements UserService {
 		userCacheEnterpriseDao.delete(userCacheEnterpriseDao.findOne(user.getUserUU()));
         userCacheEnterpriseDao.flush();
 	}
+	@Override
+	public User updateUserPay(User user, String userPay, String newUserPay) {
+		boolean result =false;
+		User user1 = userDao.findOne(user.getUserUU());
+		//未设置和验证成功
+		if (user1.getUserPay()==null || user1.getUserPay().equals("")) {
+			user1.setUserPay(Md5Utils.encode(newUserPay, user1.getUserUU()));
+			try {
+				user1 = userDao.save(user1);
+			} catch (Exception e) {
+				throw new SystemException(e.getMessage());
+			}
+			return user1;
+		}else{//需要验证密码
+			result = user1.getUserPay().equals(Md5Utils.encode(userPay, user.getUserUU()));
+			if(result){
+				user1.setUserPay(Md5Utils.encode(newUserPay, user1.getUserUU()));
+				try {
+					user1 = userDao.save(user1);
+				} catch (Exception e) {
+					throw new SystemException(e.getMessage());
+				}
+				return user1;
+			}else{
+				throw new IllegalOperatorException("原密码验证失败");
+			}
+		}
+	}
+
+	@Override
+	public User saveRealAuth(User user) {
+		return userDao.save(user);
+	}
+
+	@Override
+	public Page<User> getPageStatusRealAuth(PageParams pageInfo, Short idEnable) {
+		final PageInfo info = new PageInfo(pageInfo);
+		info.filter("idEnable", idEnable);
+		return userDao.findAll(new Specification<User>() {
+			@Override
+			public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+				query.where(info.getPredicates(root, query, cb));
+				return null;
+			}
+		}, info);
+	}
+
+	@Override
+	public User updateUserTel(String oldTel, String newTel,Long uu) {
+		// 旧手机号是否正确
+		User user = userDao.findOne(uu);
+			if(!user.getUserTel().equals(oldTel)){
+				throw new IllegalOperatorException("旧手机号错误");
+			}
+			try {
+				if(!StringUtils.isEmpty(oldTel) && !StringUtils.isEmpty(newTel)) {
+					// 保存数据库
+					List<com.uas.account.entity.User> users = AccountUtils.updateTel(oldTel, newTel);
+					if (users != null && users.size() > 0) {
+						user.setUserTel(users.get(0).getUid());
+						user = userDao.save(user);
+						return user;
+					}
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			return null;
+		}
+
+	@Override
+	public User updateUserEmail(String tel, String newEmail, Long uu) {
+
+		try {
+			if(!StringUtils.isEmpty(tel) && !StringUtils.isEmpty(newEmail)) {
+				User user = userDao.findOne(uu);
+				// 从账户中心返回的数据
+				List<com.uas.account.entity.User> users = AccountUtils.updateEmail(tel,newEmail);
+				// 保存数据库
+				if (users != null && users.size() > 0) {
+					user.setUserEmail(users.get(0).getSecondUID());
+					user = userDao.save(user);
+					return user;
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		throw new IllegalOperatorException("数据更新失败...");
+	}
 }

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

@@ -40,4 +40,5 @@ public class UserController {
 		Long enuu = Long.valueOf(user.getSpaceDialectUID());
         userService.delete(uu, enuu);
     }
+
 }

+ 60 - 12
src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java

@@ -11,6 +11,7 @@ import com.uas.platform.core.model.Status;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -31,17 +32,67 @@ public class UserServiceImpl implements UserService {
 
     @Override
     public void save(User user) {
-        com.uas.platform.b2c.common.account.model.User u = userDao.findOne(Long.parseLong(user.getDialectUID()));
+        com.uas.platform.b2c.common.account.model.User u = null;
+        if (!StringUtils.isEmpty(user.getDialectUID())) {
+            u = userDao.findOne(Long.parseLong(user.getDialectUID()));
+        }
+        if (u == null && !StringUtils.isEmpty(user.getUid()) ){
+            List<com.uas.platform.b2c.common.account.model.User> users = userDao.findUserByUserTel(user.getUid());
+            if (!CollectionUtils.isEmpty(users)){
+                if (users.size() != 1 || !users.get(0).getUserUU().equals(user.getDialectUID())) {
+                    userDao.delete(users);
+                }else{
+                    u = users.get(0);
+                }
+            }
+        }
         if (null == u) {
             u = new com.uas.platform.b2c.common.account.model.User();
         }
-        u.setUserPwd(user.getPassword());
-        u.setUserName(user.getName());
-        u.setUserTel(user.getUid());
+        oneSave(user,u);
+//        if (null == user.getDialectUID() || "".equals(user.getDialectUID())){
+//            List<com.uas.platform.b2c.common.account.model.User> users = userDao.findUserByUserTel(user.getUid());
+//            if (!CollectionUtils.isEmpty(users)){
+//                for (com.uas.platform.b2c.common.account.model.User u:users){
+//                    oneSave(user,u);
+//                }
+//            }
+//        }else {
+//            com.uas.platform.b2c.common.account.model.User u = userDao.findOne(Long.parseLong(user.getDialectUID()));
+//            if (null == u) {
+//                u = new com.uas.platform.b2c.common.account.model.User();
+//                oneSave(user,u);
+//            }
+//        }
+
+    }
+    private void oneSave(User user , com.uas.platform.b2c.common.account.model.User u) {
+        if (user.getPassword() != null) {
+            u.setUserPwd(user.getPassword());
+        }
+        if (user.getName() != null) {
+            u.setUserName(user.getName());
+        }
+        if (user.getUid() != null) {
+            u.setUserTel(user.getUid());
+        }
         u.setEnable((short) 1);
-        u.setUserEmail(user.getSecondUID());
-        u.setUserUU(Long.valueOf(user.getDialectUID()));
-        Enterprise enterprise = enterpriseDao.findByUu(Long.valueOf(user.getSpaceDialectUID()));
+        if (user.getSecondUID() != null) {
+            u.setUserEmail(user.getSecondUID());
+        }
+        if (!StringUtils.isEmpty(user.getDialectUID())) {
+            u.setUserUU(Long.valueOf(user.getDialectUID()));
+        }
+        if (user.getPwdSecLevel() != null) {
+            u.setPwdSecLevel(user.getPwdSecLevel());
+        }
+        if (user.getLastLoginTime() != null) {
+            u.setLastLoginTime(user.getLastLoginTime());
+        }
+        Enterprise enterprise = null;
+        if (user.getSpaceDialectUID() != null){
+            enterprise = enterpriseDao.findByUu(Long.valueOf(user.getSpaceDialectUID()));
+        }
         if (null != enterprise) {
             u.setEnterprise(enterprise);
             if (null == enterprise.getEnAdminuu()) {
@@ -50,7 +101,6 @@ public class UserServiceImpl implements UserService {
                 logger.log("设置管理员", enterprise.getEnName() + ":" + enterprise.getUu() + ";" + u.getUserName() + ":" + u.getUserUU());
             }
         }
-
         boolean isMember = false;
         //将该成员添加至企业
         Set<Enterprise> ens = u.getEnterprises();
@@ -62,7 +112,6 @@ public class UserServiceImpl implements UserService {
                 }
             }
         }
-
         if (!isMember) {
             Set<Enterprise> enterprises = null;
             if (null == u.getEnterprises()) {
@@ -79,11 +128,10 @@ public class UserServiceImpl implements UserService {
         List<com.uas.platform.b2c.common.account.model.User> oldUsers = userDao.findUserByUserUU(u.getUserUU());
         userDao.save(u);
         if (oldUsers.size() > 0) {
-            logger.log("更新用户信息", user.getDialectUID() + "" + enterprise.getUu());
+            logger.log("更新用户信息", user.getDialectUID() + "" + (enterprise==null?"":enterprise.getUu()));
         } else {
-            logger.log("新增用户信息", user.getDialectUID() + ", " + enterprise.getUu());
+            logger.log("新增用户信息", user.getDialectUID() + ", " + (enterprise==null?"":enterprise.getUu()) );
         }
-
     }
 
     @Override

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

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

+ 10 - 10
src/main/java/com/uas/platform/b2c/common/search/constant/SearchUrl.java

@@ -10,23 +10,23 @@ public class SearchUrl {
     /**
      * 获取类目id
      */
-    public static final String KIND_ID_URL = "/search/kindIds/{keyword}";
+    public static final String KIND_ID_URL = "/search/kindIds?keyword={keyword}";
 
     /**
      * 获取类目的数据
      *
      */
-    public static final String KIND_INFO_URL = "/search/kinds/{keyword}?page={page}&size={size}";
+    public static final String KIND_INFO_URL = "/search/kinds?keyword={keyword}&page={page}&size={size}";
 
     /**
      * 搜索品牌的id
      */
-    public static final String BRAND_ID_URL = "/search/brandIds/{keyword}?page={page}&size={size}";
+    public static final String BRAND_ID_URL = "/search/brandIds?keyword={keyword}&page={page}&size={size}";
 
     /**
      * 搜索品牌的具体信息
      */
-    public static final String BRAND_INFO_URL = "/search/brands/{keyword}?page={page}&size={size}";
+    public static final String BRAND_INFO_URL = "/search/brands?keyword={keyword}&page={page}&size={size}";
 
 
     /**
@@ -59,38 +59,38 @@ public class SearchUrl {
     /**
      * 根据关键字联想
      */
-    public static final String SIMILAR_KEYWORD_URL = "/search/similarKeywords/{keyword}";
+    public static final String SIMILAR_KEYWORD_URL = "/search/similarKeywords?keyword={keyword}";
 
 
     /**
      * 根据关键字联想器件
      */
-    public static final String SIMILAR_COMPONENT_URL = "/search/similarComponents/{keyword}";
+    public static final String SIMILAR_COMPONENT_URL = "/search/similarComponents?keyword={keyword}";
 
 
     /**
      * 根据关键字联想品牌
      */
-    public static final String SIMILAR_BRAND_URL = "/search/similarBrands/{keyword}";
+    public static final String SIMILAR_BRAND_URL = "/search/similarBrands?keyword={keyword}";
 
 
     /**
      * 根据关键字联想类目
      */
-    public static final String SIMILAR_KIND_URL = "/search/similarKinds/{keyword}";
+    public static final String SIMILAR_KIND_URL = "/search/similarKinds?keyword={keyword}";
 
 
 
     /**
      * 获取某个信息的叶子节点
      */
-    public static final String SIMILAR_LEAF_KIND_URL = "/search/similarLeafKinds/{keyword}";
+    public static final String SIMILAR_LEAF_KIND_URL = "/search/similarLeafKinds?keyword={keyword}";
 
 
     /**
      * 获取类目的层级
      */
-    public static final String SIMILAR__KIND_LEVEL_URL = "/search/similarKindsByLevel?kindName={kindName}&level={level}";
+    public static final String SIMILAR__KIND_LEVEL_URL = "/search/similarKindsByLevel?keyword={kindName}&level={level}";
 
 
     /**

+ 50 - 2
src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java

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

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

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

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

@@ -1,15 +1,16 @@
 package com.uas.platform.b2c.common.search.rpc.service.Impl;
 
 
+import com.alibaba.fastjson.JSONArray;
 import com.uas.platform.b2c.common.search.constant.SearchUrl;
 import com.uas.platform.b2c.common.search.rpc.service.SearchService;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.search.exception.SearchException;
-import com.uas.search.model.CollectField;
-import com.uas.search.model.PageParams;
-import com.uas.search.model.SPage;
+import com.uas.platform.b2c.common.search.util.CollectField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.SPage;
 import org.apache.commons.collections.map.HashedMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -91,14 +92,14 @@ public class SearchServiceImpl implements SearchService{
     }
 
     @Override
-    public SPage<Map<String, List<Integer>>> getBrands(String keyword, Integer page, Integer size) throws SearchException {
+    public SPage<Map<String, Object>> getBrands(String keyword, Integer page, Integer size) throws SearchException {
         Map<String, Object> map = initSearchMap(keyword, page, size);
         String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.BRAND_INFO_URL, String.class, map);
         if(StringUtils.isEmpty(str)) {
             return null;
         }else {
             try {
-                SPage<Map<String, List<Integer>>> sPage = FastjsonUtils.fromJson(str, SPage.class);
+                SPage<Map<String, Object>> sPage = FastjsonUtils.fromJson(str, SPage.class);
                 return sPage;
             }catch (Exception e) {
                 e.printStackTrace();
@@ -215,13 +216,13 @@ public class SearchServiceImpl implements SearchService{
         }else {
             try {
                 List<String> reMapA = FastjsonUtils.fromJson(strA, List.class);
-                List<String> reMapC = FastjsonUtils.fromJson(strC, List.class);
-                List<String> reMapB = FastjsonUtils.fromJson(strB, List.class);
-                List<String> reMapK = FastjsonUtils.fromJson(strK, List.class);
+                List<Object> reMapC = FastjsonUtils.fromJsonArray(strC);
+                List<Object> reMapB = FastjsonUtils.fromJsonArray(strB);
+                List<Object> reMapK = FastjsonUtils.fromJsonArray(strK);
                 map.clear();
                 map.put("all",reMapA);
                 map.put("kind",reMapK);
-                map.put("componet",reMapC);
+                map.put("component",reMapC);
                 map.put("brand",reMapB);
                 return map;
             }catch (Exception e) {

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

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

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,100 @@
+package com.uas.platform.b2c.common.search.util;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class SPage<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private int totalPage;
+
+    private long totalElement;
+
+    private int page;
+
+    private int size;
+
+    private boolean first;
+
+    private boolean last;
+
+    private List<T> content;
+
+    public SPage() {
+        super();
+    }
+
+    public SPage(int totalPage, long totalElement, int page, int size, boolean first, boolean last) {
+        super();
+        this.totalPage = totalPage;
+        this.totalElement = totalElement;
+        this.page = page;
+        this.size = size;
+        this.first = first;
+        this.last = last;
+    }
+
+    public int getTotalPage() {
+        return totalPage;
+    }
+
+    public void setTotalPage(int totalPage) {
+        this.totalPage = totalPage;
+    }
+
+    public long getTotalElement() {
+        return totalElement;
+    }
+
+    public void setTotalElement(long totalElement) {
+        this.totalElement = totalElement;
+    }
+
+    public int getPage() {
+        return page;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    public void setSize(int size) {
+        this.size = size;
+    }
+
+    public boolean isFirst() {
+        return first;
+    }
+
+    public void setFirst(boolean first) {
+        this.first = first;
+    }
+
+    public boolean isLast() {
+        return last;
+    }
+
+    public void setLast(boolean last) {
+        this.last = last;
+    }
+
+    public List<T> getContent() {
+        return content;
+    }
+
+    public void setContent(List<T> content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "SPage [totalPage=" + totalPage + ", totalElement=" + totalElement + ", page=" + page + ", size=" + size
+                + ", first=" + first + ", last=" + last + ", content=" + content + "]";
+    }
+
+}

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

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

+ 5 - 0
src/main/java/com/uas/platform/b2c/core/constant/IntegerConstant.java

@@ -19,4 +19,9 @@ public class IntegerConstant {
      * 否Integer 类型
      */
     public static final Integer NO_SHORT = 0;
+
+    /**
+     * 默认单价的精确小数
+     */
+    public static final Integer PRICE_FRACTION = 6;
 }

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

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

@@ -44,246 +44,268 @@ import java.util.*;
  */
 public class SSOInterceptor extends AbstractSSOInterceptor {
 
-	private static final Logger logger = Logger.getLogger(SSOInterceptor.class);
+    private static final Logger logger = Logger.getLogger(SSOInterceptor.class);
 
-	@Autowired
-	private UserService userService;
-	@Autowired
-	private ResourceItemDao resourceItemDao;
-	@Autowired
-	private SigninLogService signinLogService;
-	@Value("#{sys.profile}")
-	private String profile;
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private ResourceItemDao resourceItemDao;
+    @Autowired
+    private SigninLogService signinLogService;
+    @Value("#{sys.profile}")
+    private String profile;
 
-	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
+    @Value("#{sys.enUU}")
+    private String enUU;
 
-	private HashMap<String, Collection<ConfigAttribute>> resourceMap;
-	private HashMap<Long, Collection<GrantedAuthority>> authorities;
+    private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
-	private User getUserByToken(SSOToken token) {
-		User authedUser = null;
-		if (token.getData() != null) {
-			com.uas.account.entity.User tokenUser = FlexJsonUtils.fromJson(token.getData(), com.uas.account.entity.User.class);
-			if (!StringUtils.isEmpty(tokenUser.getDialectUID())) {
-				// dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
-				authedUser = userService.findUserByUserUU(Long.parseLong(tokenUser.getDialectUID()));
-			} else if (!StringUtils.isEmpty(tokenUser.getUid())) {
-				// UID表示所有系统公认的唯一标识,这里统一使用手机号
-				authedUser = userService.findUserByUserTel(tokenUser.getUid());
-			} else {
-				logger.error(String.format("invalid user %s, please set uid or dialectUID", tokenUser.getName()));
-			}
-			if (authedUser != null && authedUser.getEnterprises() != null) {
-				// 企业资料在client系统自己的唯一标识,比如en_uu
-				if (tokenUser.getSpaceDialectUID() != null) {
-					authedUser.setCurrentEnterprise(Long.parseLong(tokenUser.getSpaceDialectUID()));
-				} else if (tokenUser.getSpaceUID() != null) {
-					for (Enterprise enterprise : authedUser.getEnterprises()) {
-						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
-						if (tokenUser.getSpaceUID().equals(enterprise.getEnBussinessCode())) {
-							authedUser.setEnterprise(enterprise);
-							break;
-						}
-					}
-				}
-			}
-		}
-		return authedUser;
-	}
+    private HashMap<String, Collection<ConfigAttribute>> resourceMap;
+    private HashMap<Long, Collection<GrantedAuthority>> authorities;
 
-	@Override
-	protected boolean onAuthenticateFailed(HttpServletRequest request, HttpServletResponse response) {
-		SystemSession.clear();
-		if (request.getRequestURI().endsWith(PathConstant.AUTHENTICATION_URL)) {
-			return true;
-		}
-		response.setStatus(HttpStatus.UNAUTHORIZED.value());
-		if (!isRedirectAble(request)) {
-			try {
-				printJson(response, new ModelMap("loginUrl", getLoginPage(request, response)));
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-		return false;
-	}
+    private User getUserByToken(SSOToken token) {
+        User authedUser = null;
+        if (token.getData() != null) {
+            com.uas.account.entity.User tokenUser = FlexJsonUtils.fromJson(token.getData(), com.uas.account.entity.User.class);
+            if (!StringUtils.isEmpty(tokenUser.getDialectUID())) {
+                // dialectUID表示client系统自己的唯一标识,比如user_uu,手机号没设置的情况下使用
+                authedUser = userService.findUserByUserUU(Long.parseLong(tokenUser.getDialectUID()));
+            } else if (!StringUtils.isEmpty(tokenUser.getUid())) {
+                // UID表示所有系统公认的唯一标识,这里统一使用手机号
+                authedUser = userService.findUserByUserTel(tokenUser.getUid());
+            } else {
+                logger.error(String.format("invalid user %s, please set uid or dialectUID", tokenUser.getName()));
+            }
+            if (authedUser != null && authedUser.getEnterprises() != null) {
+                // 企业资料在client系统自己的唯一标识,比如en_uu
+                if (tokenUser.getSpaceDialectUID() != null) {
+                    authedUser.setCurrentEnterprise(Long.parseLong(tokenUser.getSpaceDialectUID()));
+                } else if (tokenUser.getSpaceUID() != null) {
+                    for (Enterprise enterprise : authedUser.getEnterprises()) {
+                        // 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
+                        if (tokenUser.getSpaceUID().equals(enterprise.getEnBussinessCode())) {
+                            authedUser.setEnterprise(enterprise);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        return authedUser;
+    }
 
-	/**
-	 * 输出json格式
-	 * 
-	 * @param obj
-	 * @throws IOException
-	 */
-	protected void printJson(HttpServletResponse response, Object obj) throws IOException {
-		response.addHeader("Content-Type", "application/json; charset=UTF-8");
-		PrintWriter printWriter = response.getWriter();
-		printWriter.append(FlexJsonUtils.toJson(obj));
-		printWriter.flush();
-		printWriter.close();
-	}
+    @Override
+    protected boolean onAuthenticateFailed(HttpServletRequest request, HttpServletResponse response) {
+        SystemSession.clear();
+        if (request.getRequestURI().endsWith(PathConstant.AUTHENTICATION_URL)) {
+            return true;
+        }
+        response.setStatus(HttpStatus.UNAUTHORIZED.value());
+        if (!isRedirectAble(request)) {
+            try {
+                printJson(response, new ModelMap("loginUrl", getLoginPage(request, response)));
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
 
-	private String getLoginPage(HttpServletRequest request, HttpServletResponse response) throws IOException {
-		request.getSession().setAttribute(SSOConfig.SSOReferer, request.getHeader("Referer"));
-		SSOHelper.clearLogin(request, response);
-		String redirectUrl = SSOHelper.getRedirectRefererLoginUrl(request);
-		/*boolean cross = SSOHelper.isCrossDomain(request);
+    /**
+     * 输出json格式
+     *
+     * @param obj
+     * @throws IOException
+     */
+    protected void printJson(HttpServletResponse response, Object obj) throws IOException {
+        response.addHeader("Content-Type", "application/json; charset=UTF-8");
+        PrintWriter printWriter = response.getWriter();
+        printWriter.append(FlexJsonUtils.toJson(obj));
+        printWriter.flush();
+        printWriter.close();
+    }
+
+    private String getLoginPage(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        request.getSession().setAttribute(SSOConfig.SSOReferer, request.getHeader("Referer"));
+        SSOHelper.clearLogin(request, response);
+        String redirectUrl;
+        if ("prod".equals(profile)) {
+            redirectUrl = (SSOHelper.getRedirectLoginUrl(request, "https://www.usoftmall.com" + request.getRequestURI()));
+        } else {
+            if (null == request.getParameter("returnURL") || "".equals(request.getParameter("returnURL"))) {
+                redirectUrl = (SSOHelper.getRedirectLoginUrl(request,"http://192.168.253.12:23400" + request.getRequestURI()));
+            } else {
+                redirectUrl = (SSOHelper.getRedirectLoginUrl(request, request.getParameter("returnURL")));
+            }
+        }
+        //String redirectUrl = SSOHelper.getRedirectRefererLoginUrl(request);
+        /*boolean cross = SSOHelper.isCrossDomain(request);
 		if (cross) {
 			// 跨域代理界面
 			redirectUrl = request.getContextPath() + "/login/proxy";
 		}*/
-		return redirectUrl;
-	}
+        return redirectUrl;
+    }
 
-	@Override
-	protected void onAuthenticateSuccess(HttpServletRequest request, HttpServletResponse response) {
-		User user = (User) request.getSession().getAttribute("user");
-		SSOToken token = SSOHelper.attrToken(request);
-		// cookie变化的情况下,session可能还未变化
-		if (user == null || (user.getUserTel() != null && !token.getUid().equals(user.getUserTel()))) {
-			user = getUserByToken(token);
-			if (user != null) {
-				user.setIp(AgentUtils.getIp(request));
-				request.getSession().setAttribute("user", user);
-				setGrantedAuthorities(user);
-			}
-		}
-		if (user != null) {
-			SystemSession.setUser(user);
-			accessDecision(request, user);
-		}
-	}
+    @Override
+    protected void onAuthenticateSuccess(HttpServletRequest request, HttpServletResponse response) {
+        User user = (User) request.getSession().getAttribute("user");
+        SSOToken token = SSOHelper.attrToken(request);
+        // cookie变化的情况下,session可能还未变化
+        if (user == null || (user.getUserTel() != null && !token.getUid().equals(user.getUserTel()))) {
+            user = getUserByToken(token);
+            if (user != null) {
+                user.setIp(AgentUtils.getIp(request));
+                request.getSession().setAttribute("user", user);
+            }
+        }
+        setGrantedAuthorities(user);
+        if (user != null) {
+            SystemSession.setUser(user);
+            accessDecision(request, user);
+        }
+    }
 
-	/**
-	 * 权限验证
-	 */
-	private void accessDecision(HttpServletRequest request, User user) {
-		Collection<ConfigAttribute> configAttributes = getAttributes(request);
-		if (null == configAttributes || configAttributes.size() == 0 || user.isSys()) {
-			return;
-		}
-		Iterator<ConfigAttribute> iterator = configAttributes.iterator();
-		String needPermission = null;
-		if (!authorities.containsKey(user.getUserUU())) {
-			setGrantedAuthorities(user);
-		}
-		Collection<GrantedAuthority> userAuthorities = authorities.get(user.getUserUU());
-		while (iterator.hasNext()) {
-			ConfigAttribute configAttribute = iterator.next();
-			needPermission = configAttribute.getAttribute();
-			if (userAuthorities != null) {
-				for (GrantedAuthority ga : userAuthorities) {
-					if (needPermission.equals(ga.getAuthority())) {
-						return;
-					}
-				}
-			}
-		}
-		if (needPermission != null){
-			return;
-//			throw new AccessDeniedException("无法访问,没有 " + needPermission + " 权限!");
-		}
-	}
+    /**
+     * 权限验证
+     */
+    private void accessDecision(HttpServletRequest request, User user) {
+        Collection<ConfigAttribute> configAttributes = getAttributes(request);
+        if (null == configAttributes || configAttributes.size() == 0) {
+            return;
+        }
+        Iterator<ConfigAttribute> iterator = configAttributes.iterator();
+        String needPermission = null;
+        if (null == authorities || !authorities.containsKey(user.getUserUU())) {
+            setGrantedAuthorities(user);
+        }
+        Collection<GrantedAuthority> userAuthorities = authorities.get(user.getUserUU());
+        while (iterator.hasNext()) {
+            ConfigAttribute configAttribute = iterator.next();
+            needPermission = configAttribute.getAttribute();
+            if (userAuthorities != null) {
+                for (GrantedAuthority ga : userAuthorities) {
+                    if (needPermission.equals(ga.getAuthority())) {
+                        return;
+                    }
+                }
+            }
+        }
+        // 暂时在正式 过滤admin访问权限
+        if (needPermission != null) {
+            if ("prod".equals(profile)) {
+                if (!user.getEnterprise().getUu().toString().equals(enUU)) {
+                    if ("优软商城后台-运维".equals(needPermission)) {
+                        throw new AccessDeniedException("无法访问,没有 " + needPermission + " 权限!");
+                    }
+                }
+            }
+        }
+    }
 
-	@Override
-	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
-		try {
-			super.afterCompletion(request, response, handler, ex);
-		} finally {
-			SystemSession.clear();
-		}
-	}
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        try {
+            super.afterCompletion(request, response, handler, ex);
+        } finally {
+            SystemSession.clear();
+        }
+    }
 
-	/**
-	 * 加载资源,初始化资源变量
-	 * 
-	 */
-	private void loadResourceDefine() {
-		if (resourceMap == null) {
-			resourceMap = new HashMap<String, Collection<ConfigAttribute>>();
-			List<ResourceItem> resources = resourceItemDao.findAll();
-			for (ResourceItem resource : resources) {
-				Collection<ConfigAttribute> configAttributes = new ArrayList<ConfigAttribute>();
-				ConfigAttribute configAttribute = new SecurityConfig(resource.getName());
-				configAttributes.add(configAttribute);
-				resourceMap.put(resource.getMethod() + ":" + resource.getUrl(), configAttributes);
-			}
-		}
-	}
+    /**
+     * 加载资源,初始化资源变量
+     */
+    private void loadResourceDefine() {
+        if (resourceMap == null) {
+            resourceMap = new HashMap<String, Collection<ConfigAttribute>>();
+            List<ResourceItem> resources = resourceItemDao.findAll();
+            for (ResourceItem resource : resources) {
+                Collection<ConfigAttribute> configAttributes = new ArrayList<ConfigAttribute>();
+                ConfigAttribute configAttribute = new SecurityConfig(resource.getName());
+                configAttributes.add(configAttribute);
+                resourceMap.put(resource.getMethod() + ":" + resource.getUrl(), configAttributes);
+            }
+        }
+    }
 
-	/**
-	 * 根据路径获取访问权限的集合接口
-	 * 
-	 * @param request
-	 * @return
-	 * @throws IllegalArgumentException
-	 */
-	public Collection<ConfigAttribute> getAttributes(HttpServletRequest request) throws IllegalArgumentException {
-		if (resourceMap == null)
-			loadResourceDefine();
+    /**
+     * 根据路径获取访问权限的集合接口
+     *
+     * @param request
+     * @return
+     * @throws IllegalArgumentException
+     */
+    public Collection<ConfigAttribute> getAttributes(HttpServletRequest request) throws IllegalArgumentException {
+        if (resourceMap == null)
+            loadResourceDefine();
 
-		for (Iterator<String> iter = resourceMap.keySet().iterator(); iter.hasNext();) {
-			String resourceKey = iter.next();
-			String[] resourceParam = resourceKey.split(":");
-			String resourceMethod = resourceParam[0];
-			String resourceUrl = resourceParam[1];
-			AntPathRequestMatcher matcher = new AntPathRequestMatcher(resourceUrl);
-			if (null != resourceUrl && request.getMethod().equals(resourceMethod) && matcher.matches(request)) {
-				return resourceMap.get(resourceKey);
-			}
-		}
-		return null;
-	}
+        for (Iterator<String> iter = resourceMap.keySet().iterator(); iter.hasNext(); ) {
+            String resourceKey = iter.next();
+            String[] resourceParam = resourceKey.split(":");
+            String resourceMethod = resourceParam[0];
+            String resourceUrl = resourceParam[1];
+            AntPathRequestMatcher matcher = new AntPathRequestMatcher(resourceUrl);
+            if (null != resourceUrl && request.getMethod().equals(resourceMethod) && matcher.matches(request)) {
+                return resourceMap.get(resourceKey);
+            }
+        }
+        return null;
+    }
 
-	private void setGrantedAuthorities(User user) {
-		Set<GrantedAuthority> authSet = new HashSet<GrantedAuthority>();
-		user.setCurrentEnterpriseRoles();
-		Set<Role> roles = user.getRoles();
-		if (!CollectionUtils.isEmpty(roles)) {
-			for (Role role : roles) {
-				if (role.isSys()) {// 超级账号
-					user.setIssys(Constant.YES);
-					break;
-				}
-				Set<ResourceItem> resourceItems = role.getResourceItems();
-				if (!CollectionUtils.isEmpty(resourceItems)) {
-					for (ResourceItem res : resourceItems) {
-						authSet.add(new SimpleGrantedAuthority(res.getName()));
-					}
-				}
-			}
-		}
-		if (authorities == null) {
-			authorities = new HashMap<Long, Collection<GrantedAuthority>>();
-		}
-		authorities.put(user.getUserUU(), authSet);
-	}
+    private void setGrantedAuthorities(User user) {
+        Set<GrantedAuthority> authSet = new HashSet<GrantedAuthority>();
+        user.setCurrentEnterpriseRoles();
+        Set<Role> roles = user.getRoles();
+        if (!CollectionUtils.isEmpty(roles)) {
+            for (Role role : roles) {
+                if (role.isSys()) {// 超级账号
+                    user.setIssys(Constant.YES);
+                    break;
+                }
+                Set<ResourceItem> resourceItems = role.getResourceItems();
+                if (!CollectionUtils.isEmpty(resourceItems)) {
+                    for (ResourceItem res : resourceItems) {
+                        authSet.add(new SimpleGrantedAuthority(res.getName()));
+                    }
+                }
+            }
+        }
+        if (authorities == null) {
+            authorities = new HashMap<Long, Collection<GrantedAuthority>>();
+        }
+        authorities.put(user.getUserUU(), authSet);
+    }
 
-	@Override
-	protected void sendRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
-		boolean cross = SSOHelper.isCrossDomain(request);
-		if (cross) {
-			request.getSession().setAttribute("SSOReferer", request.getRequestURL());
-			if ("prod".equals(profile)){
-				response.sendRedirect(SSOHelper.getRedirectLoginUrl(request, "https://www.usoftmall.com"+request.getRequestURI()));
-			}else{
-				response.sendRedirect(SSOHelper.getRedirectLoginUrl(request, request.getParameter("returnURL"))+ "&baseUrl=http://192.168.253.121:3000/login/other" );
-			}
-		} else {
-			SSOHelper.clearRedirectLogin(request, response);
-		}
-	}
+    @Override
+    protected void sendRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        boolean cross = SSOHelper.isCrossDomain(request);
+        if (cross) {
+            request.getSession().setAttribute("SSOReferer", request.getRequestURL());
+            if ("prod".equals(profile)) {
+                response.sendRedirect(SSOHelper.getRedirectLoginUrl(request, "https://www.usoftmall.com" + request.getRequestURI()));
+            } else {
+                if (null == request.getParameter("returnURL") || "".equals(request.getParameter("returnURL"))) {
+                    response.sendRedirect(SSOHelper.getRedirectLoginUrl(request,"http://192.168.253.12:23400" + request.getRequestURI()));
+                } else {
+                    response.sendRedirect(SSOHelper.getRedirectLoginUrl(request, request.getParameter("returnURL")));
+                }
+            }
+        } else {
+            SSOHelper.clearRedirectLogin(request, response);
+        }
+    }
 
-	private SitePreference getDefaultSitePreferenceForDevice(Device device) {
-		if (device == null) {
-			return null;
-		}
-		if (device.isMobile()) {
-			return SitePreference.MOBILE;
-		}
-		if (device.isTablet()) {
-			return SitePreference.TABLET;
-		}
-		return SitePreference.NORMAL;
-	}
+    private SitePreference getDefaultSitePreferenceForDevice(Device device) {
+        if (device == null) {
+            return null;
+        }
+        if (device.isMobile()) {
+            return SitePreference.MOBILE;
+        }
+        if (device.isTablet()) {
+            return SitePreference.TABLET;
+        }
+        return SitePreference.NORMAL;
+    }
 
 }

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

+ 15 - 0
src/main/java/com/uas/platform/b2c/core/utils/StringUtilB2C.java

@@ -258,4 +258,19 @@ public class StringUtilB2C {
 	public static String getStr(Object obj) {
 		return StringUtils.isEmpty(obj) ? "" : String.valueOf(obj);
  	}
+
+	/**
+	 * 比较两个字符串是否相等
+	 *
+	 * @param a 字符串 a
+	 * @param b 字符串 b
+	 * @return
+	 */
+ 	public static Boolean equals(String a, String b) {
+		if (a == null) {
+			return b == null;
+		} else {
+			return a.equals(b);
+		}
+	}
 }

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

@@ -0,0 +1,49 @@
+package com.uas.platform.b2c.external.erp.commodity.service.impl;
+
+import com.uas.api.b2c_erp.seller.model.BankInfoERP;
+import com.uas.api.b2c_erp.seller.service.BankInfoService;
+import com.uas.platform.b2c.external.erp.commodity.util.ModelConverter;
+import com.uas.platform.b2c.fa.payment.dao.BankInfoDao;
+import com.uas.platform.b2c.fa.payment.model.BankInfo;
+import com.uas.platform.core.model.Status;
+import com.uas.platform.core.model.Type;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * Created by wangyc on 2017/11/10.
+ *
+ * @version 2017/11/10 13:52 wangyc
+ */
+public class BankInfoServiceImpl implements BankInfoService {
+
+    @Autowired
+    private com.uas.platform.b2c.fa.payment.service.BankInfoService bankInfoService;
+
+    @Autowired
+    private BankInfoDao bankInfoDao;
+
+    @Override
+    public BankInfoERP findOne() {
+        List<BankInfo> bankInfoList = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value());
+        if (CollectionUtils.isEmpty(bankInfoList)) {
+            return null;
+        }
+        BankInfo bankInfo = bankInfoList.get(0);
+        BankInfoERP bankInfoERP = ModelConverter.convert(bankInfo);
+        return bankInfoERP;
+    }
+
+    @Override
+    public void callback(String erpNum) {
+        List<BankInfo> bankInfoList = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value());
+        if (CollectionUtils.isEmpty(bankInfoList)) {
+            return;
+        }
+        BankInfo bankInfo = bankInfoList.get(0);
+        bankInfo.setErpNum(erpNum);
+        bankInfoDao.save(bankInfo);
+    }
+}

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

@@ -0,0 +1,154 @@
+package com.uas.platform.b2c.external.erp.commodity.service.impl;
+
+import com.uas.api.b2c_erp.seller.model.ProductDetailERP;
+import com.uas.api.b2c_erp.seller.service.ProductDetailERPService;
+import com.uas.platform.b2c.common.account.service.EnterpriseService;
+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.support.log.ErpB2cBufferedLogger;
+import com.uas.platform.b2c.external.erp.commodity.util.ModelConverter;
+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.dao.ProductDetailDao;
+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.core.logging.BufferedLoggerManager;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 针对ERP物料交易详情接口
+ *
+ * @version 2017/10/28 17:57 wangyc
+ */
+public class ProductDetailERPServiceImpl implements ProductDetailERPService {
+
+    @Autowired
+    private ProductDetailDao productDetailDao;
+
+    @Autowired
+    private ProductDao productDao;
+
+    @Autowired
+    private GoodsDao goodsDao;
+
+    @Autowired
+    private GoodsService goodsService;
+
+    @Autowired
+    private EnterpriseService enterpriseService;
+
+    private static final ErpB2cBufferedLogger logger = BufferedLoggerManager.getLogger(ErpB2cBufferedLogger.class);
+
+    private final Logger loggerInfo = Logger.getLogger(getClass());
+
+    @Autowired
+    private SysConf sysConf;
+
+    @Override
+    public boolean uploadProductDetailERP(List<ProductDetailERP> productDetailERPList) {
+        List<ProductDetail> productDetails = new ArrayList<ProductDetail>();
+        List<Product> productList = new ArrayList<Product>();
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        for (ProductDetailERP productDetailERP : productDetailERPList) {
+            ProductDetail productDetail = ModelConverter.convert(productDetailERP);
+
+            List<Product> products = productDao.getProductByEnUUAndProdNum(enuu, productDetail.getCode());
+            if (!CollectionUtils.isEmpty(products)) {
+                products.get(0).setErpReserve(productDetailERP.getReserve());
+                productList.add(products.get(0));
+
+                productDetail.setProductId(products.get(0).getId());
+            }
+            // 如果已存在物料交易信息删除之前那一条,保存新的物料交易信息
+            ProductDetail productDetailExist = productDetailDao.findByProductId(productDetail.getProductId());
+            if (productDetailExist != null) {
+                productDetailDao.delete(productDetailExist);
+            }
+            productDetails.add(productDetail);
+        }
+
+        productDao.save(productList);
+        productDetailDao.save(productDetails);
+        logger.log("物料交易详情", "初始化交易详情,企业:" + SystemSession.getUser().getEnterprise().getEnName() + ",数量:" + productDetails.size());
+        return true;
+    }
+
+    @Override
+    public String getCurrency() {
+        logger.log("物料详情", "获取币别,企业:" + SystemSession.getUser().getEnterprise().getEnName());
+        return enterpriseService.getCurrencyByRegisterAddress().getData().toString();
+    }
+
+    @Override
+    public void updateReserve(List<ProductDetailERP> productDetailERPList) {
+        List<Product> productList = new ArrayList<Product>();
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        for (ProductDetailERP productDetailERP : productDetailERPList) {
+            List<Product> products = productDao.getProductByEnUUAndProdNum(enuu, productDetailERP.getCode());// 获取对应商城物料信息
+            if (!CollectionUtils.isEmpty(products)) {
+//                ProductDetail productDetail = productDetailDao.findByProductId(products.get(0).getId());// 获取商城物料信息
+//                if (productDetail == null) {// 如果物料交易详情为空,新增物料交易详情
+//                    productDetail = new ProductDetail();
+//                    productDetail.setProductId(products.get(0).getId());
+//                }
+
+                if (products.get(0).getCmpUuId() != null) {// 如果为标准器件,更新在售商品信息
+                    Double b2cReserve = goodsDao.getSumReserveByEnUUAndUuidAndStatus(enuu, products.get(0).getCmpUuId(), Status.AVAILABLE.value());
+                    b2cReserve = b2cReserve == null ? 0 : b2cReserve;
+                    Double erpReserve = productDetailERP.getReserve();
+                    if (Double.compare(b2cReserve, erpReserve) > 0) {// 如果商城已上架数量大于erp空闲库存,下架部分在售商品
+                        BigDecimal b2cDecimal = BigDecimal.valueOf(b2cReserve);
+                        BigDecimal erpDecimal = BigDecimal.valueOf(erpReserve);
+                        BigDecimal subtractDecimal = b2cDecimal.subtract(erpDecimal);// 商城已上架数量、erp库存差值
+                        List<Goods> goods = goodsDao.findByEnUUAndUuidOrderByReserveAsc(enuu, products.get(0).getCmpUuId());// 获取该企业此物料上架商品信息(按库存从小到大排序)
+                        if (!CollectionUtils.isEmpty(goods)) {
+                            for (Goods good : goods) {
+                                if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) == 0) {// 差值等于此批次数量,直接下架此批次
+                                    goodsService.offShelfGoodsByProvider(good.getBatchCode());
+                                    break;
+                                }
+
+                                if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) < 0) {// 差值小于此批次数量,下架部分库存
+                                    Goods nowGood = goodsDao.findOne(good.getId());
+                                    good.setReserve(BigDecimal.valueOf(good.getReserve()).subtract(subtractDecimal).doubleValue());
+                                    good.setSelfSale(sysConf.getStoreid().equals(good.getStoreid())? IntegerConstant.B2C_SALE.toString() : IntegerConstant.SELF_SALE.toString());// 设置自营寄售
+                                    loggerInfo.info(SystemSession.getUser().getEnterprise().getEnName() + "更新库存: " + products.get(0).getProdNum() + ",self is" + good.getSelfSale());
+                                    // 如果调整后的库存小于最小起订量直接下架
+                                    if (good.getReserve() < good.getMinBuyQty()) {
+                                        goodsService.offShelfGoodsByProvider(good.getBatchCode());
+                                    } else {
+                                        goodsService.updateGoods(nowGood, good);
+                                        goodsService.updateComponentTradeInfos(nowGood.getUuid());
+                                    }
+                                    break;
+                                }
+
+                                if (Double.compare(subtractDecimal.doubleValue(), good.getReserve()) > 0) {// 差值大于此批次数量,下架次批次,并继续下一批次调整
+                                    goodsService.offShelfGoodsByProvider(good.getBatchCode());
+                                    subtractDecimal = subtractDecimal.subtract(BigDecimal.valueOf(good.getReserve()));
+                                }
+                            }
+                        }
+                    }
+                }
+
+                products.get(0).setErpReserve(productDetailERP.getReserve());
+                products.get(0).setProduceDate(productDetailERP.getProduceDate());
+                products.get(0).setPrice(productDetailERP.getPrice());
+                productList.add(products.get(0));
+            }
+        }
+        logger.log("物料详情", "更新物料库存信息,企业:" + SystemSession.getUser().getEnterprise().getEnName() + ",数量:" + productList.size());
+        productDao.save(productList);
+    }
+}

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

@@ -1,13 +1,17 @@
 package com.uas.platform.b2c.external.erp.commodity.util;
 
 import com.uas.api.b2c_erp.operation.model.OperationInfoUas;
+import com.uas.api.b2c_erp.seller.model.BankInfoERP;
 import com.uas.api.b2c_erp.seller.model.GoodsQtyPriceUas;
 import com.uas.api.b2c_erp.seller.model.GoodsSimpleUas;
+import com.uas.api.b2c_erp.seller.model.ProductDetailERP;
 import com.uas.api.domain.IPage;
 import com.uas.platform.b2c.external.erp.product.model.OperationInfo;
+import com.uas.platform.b2c.fa.payment.model.BankInfo;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.model.GoodsQtyPrice;
 import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
+import com.uas.platform.b2c.prod.commodity.model.ProductDetail;
 import com.uas.platform.b2c.prod.product.component.modal.ComponentGoods;
 import org.springframework.data.domain.Page;
 import org.springframework.util.CollectionUtils;
@@ -176,4 +180,38 @@ public class ModelConverter {
 		operationInfoUas.setUuid(operationInfo.getUuid());
 		return operationInfoUas;
 	}
+
+	/**
+	 * 转换ERP物料交易详情
+	 * @param productDetailERP
+	 * @return
+	 */
+	public static ProductDetail convert(ProductDetailERP productDetailERP) {
+		ProductDetail productDetail = new ProductDetail();
+		productDetail.setB2cMaxDelivery(productDetailERP.getB2cMaxDelivery());
+		productDetail.setB2cMinDelivery(productDetailERP.getB2cMinDelivery());
+		productDetail.setMaxDelivery(productDetailERP.getMaxDelivery());
+		productDetail.setMinDelivery(productDetailERP.getMinDelivery());
+		productDetail.setMinBuyQty(productDetailERP.getMinBuyQty());
+		productDetail.setMinPackQty(productDetailERP.getMinPackQty());
+		productDetail.setPackaging(productDetailERP.getPackaging());
+		productDetail.setPrice(productDetailERP.getPrice());
+		productDetail.setProduceDate(productDetailERP.getProduceDate());
+		// 暂时将ERP空闲库存放置在product中
+//		productDetail.setReserve(productDetailERP.getReserve());
+		productDetail.setCode(productDetailERP.getCode());
+		productDetail.setBreakUp(productDetailERP.getBreakUp());
+		return productDetail;
+	}
+
+	public static BankInfoERP convert(BankInfo bankInfo) {
+		BankInfoERP bankInfoERP = new BankInfoERP();
+		bankInfoERP.setCurrency(bankInfo.getCurrency());
+		bankInfoERP.setAccountname(bankInfo.getAccountname());
+		bankInfoERP.setBankname(bankInfo.getBankname());
+		bankInfoERP.setCreateTime(bankInfo.getCreateTime());
+		bankInfoERP.setEnuu(bankInfo.getEnuu());
+		bankInfoERP.setNumber(bankInfo.getNumber());
+		return bankInfoERP;
+	}
 }

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

@@ -0,0 +1,51 @@
+package com.uas.platform.b2c.external.erp.common.util;
+
+import com.uas.api.b2c_erp.baisc.model.EnterpriseUas;
+import com.uas.api.b2c_erp.baisc.model.UserBaseInfoUas;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
+
+/**
+ * Created by wangyc on 2017/11/23.
+ *
+ * @version 2017/11/23 11:20 wangyc
+ */
+public class ModelConverter {
+
+    /**
+     * 转换用户信息
+     * @param user
+     * @return
+     */
+    public static UserBaseInfoUas convert(UserBaseInfo user) {
+        UserBaseInfoUas userUas = new UserBaseInfoUas();
+        userUas.setUserName(user.getUserName());
+        userUas.setUserEmail(user.getUserEmail());
+        userUas.setUserTel(user.getUserTel());
+
+        return userUas;
+    }
+
+    /**
+     * 转换企业信息
+     * @param enterprise
+     * @return
+     */
+    public static EnterpriseUas convert(Enterprise enterprise) {
+        EnterpriseUas enterpriseUas = new EnterpriseUas();
+        enterpriseUas.setEnAddress(enterprise.getEnAddress());
+        enterpriseUas.setEnArea(enterprise.getEnArea());
+        enterpriseUas.setEnBussinessCode(enterprise.getEnBussinessCode());
+        enterpriseUas.setEnDeliverAddr(enterprise.getEnDeliverAddr());
+        enterpriseUas.setEnEmail(enterprise.getEnEmail());
+        enterpriseUas.setEnFax(enterprise.getEnFax());
+        enterpriseUas.setEnIndustry(enterprise.getEnIndustry());
+        enterpriseUas.setEnName(enterprise.getEnName());
+        enterpriseUas.setEnShortname(enterprise.getEnShortname());
+        enterpriseUas.setEnTel(enterprise.getEnTel());
+        enterpriseUas.setEnType(enterprise.getEnType());
+        enterpriseUas.setUu(enterprise.getUu());
+
+        return enterpriseUas;
+    }
+}

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

@@ -0,0 +1,188 @@
+package com.uas.platform.b2c.external.erp.order.service.impl;
+
+import com.uas.api.b2c_erp.buyer.model.B2cOrder;
+import com.uas.api.b2c_erp.buyer.model.B2cOrderDetail;
+import com.uas.api.b2c_erp.buyer.model.Payment;
+import com.uas.api.b2c_erp.buyer.service.B2cOrderService;
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
+import com.uas.platform.b2c.external.erp.order.util.ModelConverter;
+import com.uas.platform.b2c.fa.payment.model.BankInfo;
+import com.uas.platform.b2c.fa.payment.model.BankTransfer;
+import com.uas.platform.b2c.fa.payment.service.BankInfoService;
+import com.uas.platform.b2c.fa.payment.service.BankTransferService;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.model.GoodsHistory;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.trade.order.dao.OrderDao;
+import com.uas.platform.b2c.trade.order.model.Order;
+import com.uas.platform.b2c.trade.order.model.OrderDetail;
+import com.uas.platform.b2c.trade.order.service.OrderService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.model.Status;
+import com.uas.platform.core.model.Type;
+import com.uas.platform.core.persistence.criteria.LogicalExpression;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.util.CollectionUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by wangyc on 2017/10/31.
+ *
+ * @version 2017/10/31 15:44 wangyc
+ */
+public class B2cOrderServiceImpl implements B2cOrderService {
+
+    @Autowired
+    private OrderDao orderDao;
+
+    @Autowired
+    private GoodsHistoryDao goodsHistoryDao;
+
+    @Autowired
+    private ProductDao productDao;
+
+    @Autowired
+    SysConf sysConf;
+
+    @Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private BankTransferService bankTransferService;
+
+    @Autowired
+    private BankInfoService bankInfoService;
+
+    @Autowired
+    private UserDao userDao;
+
+    @Autowired
+    private EnterpriseDao enterpriseDao;
+
+    /**
+     * 成功标语
+     */
+    private static final String SUCCESS = "success";
+
+    @Override
+    public List<B2cOrder> getAllOrder() {
+        // 要获取的采购的状态
+        SimpleExpression status1 = PredicateUtils.eq("status", Status.TOBEPAID.value(), true);
+        SimpleExpression status2 = PredicateUtils.eq("status", Status.UNAVAILABLE_NOPAID.value(), true);
+        SimpleExpression status3 = PredicateUtils.eq("status", Status.INBOUND.value(), true);
+        SimpleExpression status4 = PredicateUtils.eq("status", Status.UNAVAILABLE_PERSONAL.value(), true);
+        SimpleExpression[] expressions = new SimpleExpression[] { status1, status2, status3, status4};
+        LogicalExpression purLogical = PredicateUtils.or(expressions);
+
+        // 采购单待上传的状态
+        SimpleExpression sendStatus = PredicateUtils.eq("sendstatus", Status.NOT_UPLOAD.value(), true);
+        // uu
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        SimpleExpression buyerenuu = PredicateUtils.eq("buyerenuu", enuu, true);
+        LogicalExpression statusUUAS = PredicateUtils.and(new SimpleExpression[] { sendStatus, buyerenuu});
+        final LogicalExpression allCondition = PredicateUtils.and(new LogicalExpression[] { purLogical, statusUUAS });
+
+        List<Order> orders = orderDao.findAll(new Specification<Order>() {
+            @Override
+            public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                query.where(allCondition.toPredicate(root, query, cb));
+                return null;
+            }
+        });
+
+        List<B2cOrder> b2cOrders = new ArrayList<B2cOrder>();
+        for (Order order : orders) {
+            boolean productExists = true;
+            Set<B2cOrderDetail> b2cOrderDetails = new HashSet<B2cOrderDetail>();
+            for (OrderDetail orderDetail : order.getOrderDetails()) {// 获取明细中购买型号所对应的erp对应企业中的物料编号
+                GoodsHistory goodsHistory = goodsHistoryDao.findNewByBatchCode(orderDetail.getBatchCode());
+                if (goodsHistory != null) {
+                    List<Product> products = productDao.findByEnUUAndCmpUuId(enuu, goodsHistory.getUuid());
+                    B2cOrderDetail b2cOrderDetail = ModelConverter.convertUas(orderDetail);
+                    if (!CollectionUtils.isEmpty(products)) {
+                        b2cOrderDetail.setProductCode(products.get(0).getProdNum());// 添加erp物料编号
+                    }
+                    b2cOrderDetails.add(b2cOrderDetail);
+                    // else {
+                    //     productExists = false;
+                    // }
+                }
+            }
+            if (productExists) {
+                B2cOrder b2cOrder = ModelConverter.convert(order);
+                // 设置卖方企业信息
+                Enterprise sellerEnter= enterpriseDao.findByUu(b2cOrder.getSellerenuu());
+                if (sellerEnter != null) {
+                    b2cOrder.setSellerEnter(com.uas.platform.b2c.external.erp.common.util.ModelConverter.convert(sellerEnter));
+                }
+                b2cOrder.setOrderDetails(b2cOrderDetails);
+                b2cOrders.add(b2cOrder);
+            }
+        }
+        return b2cOrders;
+    }
+
+    @Override
+    public boolean backOrder(long[] orderids) {
+        List<Order> orders = new ArrayList<Order>();
+        for (long orderid : orderids) {
+            Order order = orderDao.findOne(orderid);
+            if (order != null) {
+                order.setSendstatus(Status.DOWNLOADED.value());
+                orders.add(order);
+            }
+        }
+        orderDao.save(orders);
+        return true;
+    }
+
+    @Override
+    public boolean ensuryPay(Payment payment) {
+        BankTransfer bankTransfer = ModelConverter.convert(payment);
+        List<BankInfo> mallBankInfos = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.MALL.value(), Status.ALLOW.value(), sysConf.getEnUU());
+        if (!CollectionUtils.isEmpty(mallBankInfos)) {
+            bankTransfer.setJsonReceive(FastjsonUtils.toJson(mallBankInfos.get(0)));
+        }
+        // erp部分修改当前处理人信息
+        Order order = orderDao.findByOrderid(payment.getOrderid());
+        List<User> users = userDao.findUserByUserUU(order.getBuyeruu());
+        if (!SystemSession.getUser().getEnterprise().getUu().equals(order.getBuyerenuu())){
+            throw new IllegalOperatorException("警告!订单不能确认!您无权限操作");
+        }
+        if (!CollectionUtils.isEmpty(users)){
+            users.get(0).setCurrentEnterprise(order.getBuyerenuu());
+        }
+        SystemSession.setUser(users.get(0));
+        bankTransferService.save(bankTransfer, payment.getOrderid());
+        return true;
+    }
+
+    @Override
+    public String ensury(String orderid) {
+        Order order = orderDao.findByOrderid(orderid);
+        if (order != null) {
+            orderService.ensureOrderAccept(order.getId().toString());
+            return SUCCESS;
+        } else {
+            throw new IllegalOperatorException("警告!订单编号有误");
+        }
+    }
+}

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

@@ -1,11 +1,20 @@
 package com.uas.platform.b2c.external.erp.order.service.impl;
 
 import com.uas.api.b2c_erp.seller.model.Order;
+import com.uas.api.b2c_erp.seller.model.OrderDetail;
 import com.uas.api.b2c_erp.seller.service.OrderService;
 import com.uas.api.exception.B2CException;
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserBaseInfoDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.ErpB2cBufferedLogger;
 import com.uas.platform.b2c.external.erp.order.util.ModelConverter;
+import com.uas.platform.b2c.prod.commodity.dao.GoodsHistoryDao;
+import com.uas.platform.b2c.prod.commodity.dao.ProductDao;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.trade.order.dao.OrderDao;
 import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
 import com.uas.platform.b2c.trade.order.model.Purchase;
 import com.uas.platform.b2c.trade.order.service.PurchaseService;
@@ -15,14 +24,18 @@ import com.uas.platform.core.model.Status;
 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 org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.util.CollectionUtils;
 
 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;
 
 public class OrderServiceImpl implements OrderService {
@@ -32,7 +45,24 @@ public class OrderServiceImpl implements OrderService {
 	
 	@Autowired
 	private PurchaseService purchaseService;
-	
+
+	@Autowired
+	private GoodsHistoryDao goodsHistoryDao;
+
+	@Autowired
+	private ProductDao productDao;
+
+	@Autowired
+	private OrderDao orderDao;
+
+	@Autowired
+	private UserBaseInfoDao userBaseInfoDao;
+
+	@Autowired
+	private EnterpriseDao enterpriseDao;
+
+	private final Logger loggerInfo = Logger.getLogger(getClass());
+
 	private static final ErpB2cBufferedLogger logger = BufferedLoggerManager.getLogger(ErpB2cBufferedLogger.class);
 
 	@Override
@@ -46,9 +76,12 @@ public class OrderServiceImpl implements OrderService {
 	@Override
 	public List<Order> findAllUnReceived() {
 		// 要获取的采购的状态
-		SimpleExpression status1 = PredicateUtils.eq("status", Status.TOBECONFIRMED.value(), true);
+		SimpleExpression status1 = PredicateUtils.eq("status", Status.PAID.value(), true);
 		SimpleExpression status2 = PredicateUtils.eq("status", Status.CONFIRMED.value(), true);
-		SimpleExpression[] expressions = new SimpleExpression[] { status1, status2 };
+		SimpleExpression status3 = PredicateUtils.eq("status", Status.TOBECONFIRMED.value(), true);
+		SimpleExpression status4 = PredicateUtils.eq("status", Status.UNAVAILABLE_NOPAID.value(), true);
+		SimpleExpression status5 = PredicateUtils.eq("status", Status.UNAVAILABLE_PERSONAL.value(), true);
+		SimpleExpression[] expressions = new SimpleExpression[] { status1, status2, status3, status4, status5};
 		LogicalExpression purLogical = PredicateUtils.or(expressions);
 
 		// 采购单待上传的状态
@@ -56,10 +89,8 @@ public class OrderServiceImpl implements OrderService {
 		// uu
 		SimpleExpression sellerUU = PredicateUtils.eq("sellerenuu", SystemSession.getUser().getEnterprise().getUu(),
 				true);
-		SimpleExpression uasPurcid = PredicateUtils.isNotNull("uasPurcid");
 
-		LogicalExpression statusUUAS = PredicateUtils.and(new SimpleExpression[] { sendStatus, sellerUU, uasPurcid});
-		System.out.println(SystemSession.getUser().getEnterprise().getEnName() + SystemSession.getUser().getEnterprise().getUu());
+		LogicalExpression statusUUAS = PredicateUtils.and(new SimpleExpression[] { sendStatus, sellerUU});
 		final LogicalExpression allCondition = PredicateUtils.and(new LogicalExpression[] { purLogical, statusUUAS });
 
 		List<Purchase> purcs = purchaseDao.findAll(new Specification<Purchase>() {
@@ -69,22 +100,48 @@ public class OrderServiceImpl implements OrderService {
 				return null;
 			}
 		});
+
 		List<Order> orders = new ArrayList<Order>();
+		String sourceapp = "ERP";
+        Date startDate = new Date();
 		for (Purchase purchase : purcs) {
+			boolean codeExists = false;
 			Order order = ModelConverter.getOrder(purchase);
-			orders.add(order);
+			UserBaseInfo buyer = userBaseInfoDao.findUserByUserUU(purchase.getBuyeruu());
+			if (buyer != null) {// 设置买方用户信息
+				order.setBuyer(com.uas.platform.b2c.external.erp.common.util.ModelConverter.convert(buyer));
+			}
+
+			Enterprise enterprise = enterpriseDao.findByUu(purchase.getBuyerenuu());
+			if (enterprise != null) {// 设置买方企业信息
+				order.setBuyerEn(com.uas.platform.b2c.external.erp.common.util.ModelConverter.convert(enterprise));
+			}
+			for (OrderDetail orderDetail : order.getDetails()) {
+				List<Product> products = productDao.findByEnUUAndCmpUuIdAndSourceApp(SystemSession.getUser().getEnterprise().getUu(), orderDetail.getUuid(), sourceapp);//获取物料信息
+				if (!CollectionUtils.isEmpty(products)) {
+					orderDetail.setCode(products.get(0).getProdNum());// 设置物料编号,有物料编号才回传到ERP
+					codeExists = true;
+				}
+			}
+			if (codeExists) {
+				orders.add(order);
+			}
 		}
+        Date endDate = new Date();
+        loggerInfo.info(purcs.size() + "条处理历时" + (endDate.getTime() - startDate.getTime()) + "毫秒");
+        loggerInfo.info(" erp预下载订单数 " +  purcs.size() + ", 实际下载数 " +  orders.size());
+        logger.log("销售订单", "企业下载销售订单,企业:" + SystemSession.getUser().getEnterprise().getEnName() + "数量:" + orders.size());
 		return orders;
 	}
 
 	@Override
 	public void agree(long orderId) {
 		// TODO Auto-generated method stub
-		System.out.println("hi, i received " + orderId);
-		Purchase purchase = purchaseDao.findOne(orderId);
-		Long userUU = SystemSession.getUser().getUserUU();
-		logger.log("UAS接口", "采购单接收动作 id=" + orderId);
-		purchaseService.purToBeShiped(orderId);
+//		System.out.println("hi, i received " + orderId);
+//		Purchase purchase = purchaseDao.findOne(orderId);
+//		Long userUU = SystemSession.getUser().getUserUU();
+//		logger.log("UAS接口", "采购单接收动作 id=" + orderId);
+//		purchaseService.purToBeShiped(orderId);
 //		if (purchase == null) {
 //			throw new B2CException("没有传入有效的订单信息");
 //		}
@@ -116,6 +173,7 @@ public class OrderServiceImpl implements OrderService {
 
 	@Override
 	public Long findAdminuu() {
+		logger.log("销售订单", "获取企业商城管理员,企业:" + SystemSession.getUser().getEnterprise().getEnName());
 		return SystemSession.getUser().getEnterprise().getEnAdminuu();
 	}
 
@@ -123,9 +181,16 @@ 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;
 	}
+
 }

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

@@ -1,10 +1,14 @@
 package com.uas.platform.b2c.external.erp.order.util;
 
+import com.uas.api.b2c_erp.buyer.model.B2cOrder;
+import com.uas.api.b2c_erp.buyer.model.B2cOrderDetail;
+import com.uas.api.b2c_erp.buyer.model.Payment;
 import com.uas.api.b2c_erp.operation.model.OperationInfoUas;
 import com.uas.api.b2c_erp.seller.model.Order;
 import com.uas.api.b2c_erp.seller.model.OrderDetail;
 import com.uas.api.domain.IPage;
 import com.uas.platform.b2c.external.erp.product.model.OperationInfo;
+import com.uas.platform.b2c.fa.payment.model.BankTransfer;
 import com.uas.platform.b2c.trade.order.model.Purchase;
 import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
 import org.springframework.data.domain.Page;
@@ -28,13 +32,15 @@ public class ModelConverter {
     public static Order getOrder(Purchase purchase) {
 		Order order = new Order();
 		order.setCreateTime(purchase.getCreatetime());
-		order.setOrderid(purchase.getPurchaseid());
+		order.setOrderid(purchase.getOrderid());
 		order.setId(purchase.getId());
 		order.setShipAddress(purchase.getJsonAddress());
 		order.setTotal(purchase.getEnsurePrice());
 		order.setStatus(purchase.getStatus());
 		order.setTaxes(purchase.getTaxes());
 		order.setCurrency(purchase.getCurrency());
+		order.setSendType(purchase.getSendType());
+		order.setFare(purchase.getFare());
 		Set<PurchaseDetail> details = purchase.getPurchaseDetails();
 		if (!CollectionUtils.isEmpty(details)) {
 			List<OrderDetail> orderDetails = new ArrayList<OrderDetail>();
@@ -66,6 +72,7 @@ public class ModelConverter {
 		orderDetail.setTax(detail.getTax());
 		orderDetail.setCurrency(detail.getCurrencyName());
 		orderDetail.setStatus(detail.getStatus());
+		orderDetail.setPublisheruu(detail.getSellPublishuu());
 		return orderDetail;
 	}
 
@@ -104,4 +111,69 @@ public class ModelConverter {
 		operationInfoUas.setUuid(operationInfo.getUuid());
 		return operationInfoUas;
 	}
+
+	/**
+	 * 商城订单明细转为ERP采购单明细
+	 * @param orderDetail
+	 * @return
+	 */
+	public static B2cOrderDetail convertUas(com.uas.platform.b2c.trade.order.model.OrderDetail orderDetail) {
+		B2cOrderDetail b2cOrderDetail = new B2cOrderDetail();
+		b2cOrderDetail.setPrice(orderDetail.getPrice());
+		b2cOrderDetail.setBatchCode(orderDetail.getBatchCode());
+		b2cOrderDetail.setCmpCode(orderDetail.getCmpCode());
+		b2cOrderDetail.setDetailid(orderDetail.getDetailid());
+		b2cOrderDetail.setDetno(orderDetail.getDetno());
+		b2cOrderDetail.setImg(orderDetail.getImg());
+		b2cOrderDetail.setNumber(orderDetail.getNumber());
+		b2cOrderDetail.setTax(orderDetail.getTax());
+		b2cOrderDetail.setTaxes(orderDetail.getTaxes());
+		b2cOrderDetail.setUnitprice(orderDetail.getTaxUnitprice());
+		b2cOrderDetail.setUuid(orderDetail.getUuid());
+		b2cOrderDetail.setBrandNameCn(orderDetail.getBrandNameCn());
+		b2cOrderDetail.setBrName(orderDetail.getBrName());
+
+		return b2cOrderDetail;
+	}
+
+	/**
+	 * 商城订单转为erp采购单
+	 * @param order
+	 * @return
+	 */
+	public static B2cOrder convert(com.uas.platform.b2c.trade.order.model.Order order) {
+		B2cOrder b2cOrder = new B2cOrder();
+		b2cOrder.setId(order.getId());
+		b2cOrder.setCurrency(order.getCurrency());
+		b2cOrder.setTaxes(order.getTaxes());
+		b2cOrder.setBuyerenuu(order.getBuyerenuu());
+		b2cOrder.setBuyeruu(order.getBuyeruu());
+		b2cOrder.setCreattime(order.getCreattime());
+		b2cOrder.setDeliverytype(order.getDeliverytype());
+		b2cOrder.setJsonAddress(order.getJsonAddress());
+		b2cOrder.setLgtId(order.getLgtId());
+		b2cOrder.setOrderid(order.getOrderid());
+		b2cOrder.setPaytype(order.getPaytype());
+		b2cOrder.setPrice(order.getEnsurePrice());
+		b2cOrder.setFare(order.getFare());
+		b2cOrder.setQty(order.getQty());
+		b2cOrder.setSellerenuu(order.getSellerenuu());
+		b2cOrder.setStatus(order.getStatus());
+
+		return b2cOrder;
+	}
+
+	/**
+	 * 将ERP付款信息转换为商城付款信息
+	 * @param payment
+	 * @return
+	 */
+	public static BankTransfer convert(Payment payment) {
+		BankTransfer bankTransfer = new BankTransfer();
+		bankTransfer.setJsonPament(payment.getJsonPament());
+		bankTransfer.setTotal(payment.getTotal());
+		bankTransfer.setTranferCreateTime(payment.getTransferTime());
+		bankTransfer.setImgUrl(payment.getImgUrl());
+		return bankTransfer;
+	}
 }

+ 186 - 0
src/main/java/com/uas/platform/b2c/external/erp/prod/service/impl/ProdServiceImpl.java

@@ -0,0 +1,186 @@
+package com.uas.platform.b2c.external.erp.prod.service.impl;
+
+import com.uas.api.b2c_erp.seller.model.Prod;
+import com.uas.api.b2c_erp.seller.service.ProdService;
+import com.uas.platform.b2c.core.constant.IntegerConstant;
+import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.support.log.ErpB2cBufferedLogger;
+import com.uas.platform.b2c.external.erp.product.util.ModelConverter;
+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.dao.ProductPrivateDao;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.commodity.service.ReleaseProductByBatchService;
+import com.uas.platform.b2c.prod.store.dao.StoreInDao;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import org.apache.log4j.Logger;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by wangyc on 2017/10/26.
+ *
+ * @version 2017/10/26 11:34 wangyc
+ */
+public class ProdServiceImpl implements ProdService {
+
+    @Autowired
+    private ProductDao productDao;
+
+    @Autowired
+    private ProductService productService;
+
+    @Autowired
+    private StoreInDao storeInDao;
+
+    @Autowired
+    private GoodsDao goodsDao;
+
+    @Autowired
+    private ProductPrivateDao productPrivateDao;
+
+    @Autowired
+    private ReleaseProductByBatchService releaseProductByBatchService;
+
+    private static final ErpB2cBufferedLogger logger = BufferedLoggerManager.getLogger(ErpB2cBufferedLogger.class);
+
+    private final Logger loggerOut = Logger.getLogger(getClass());
+
+    @Override
+    public String uploadProducts(List<Prod> prods) {
+        List<Product> products = new ArrayList<Product>();
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        for (Prod prod : prods) {
+            if (StringUtils.isEmpty(prod.getPr_orispeccode()) || StringUtils.isEmpty(prod.getPr_brand())) {
+                List<Product> productList = productDao.findByEnUUAndPcmpcodeAndPbrandenAndB2cEnabledAndSourceApp(enuu,prod.getPr_orispeccode(),prod.getPr_brand(),IntegerConstant.YES_SHORT,"ERP");
+                if (!CollectionUtils.isEmpty(productList)) {
+                    Product product = ModelConverter.convert(prod);
+                    Product existProduct = productList.get(0);
+                    BeanUtils.copyProperties(product, productList.get(0), "id");
+                    existProduct.setCmpUuId(null);// 将已存在的变更过物料uuid置为null,以便后续进行重新匹配
+                    products.add(existProduct);
+                } else {
+                    List<Product> productExists = productDao.getProductByEnUUAndProdNum(enuu, prod.getPr_code());
+                    Product product = ModelConverter.convert(prod);
+                    if (!CollectionUtils.isEmpty(productExists)) {
+                        Product existProduct = productExists.get(0);
+                        BeanUtils.copyProperties(product, productExists.get(0), "id");
+                        existProduct.setCmpUuId(null);// 将已存在的变更过物料uuid置为null,以便后续进行重新匹配
+                        products.add(existProduct);
+                    } else {
+                        products.add(product);
+                    }
+                }
+            } else {
+                List<Product> productExists = productDao.getProductByEnUUAndProdNum(enuu, prod.getPr_code());
+                Product product = ModelConverter.convert(prod);
+                if (!CollectionUtils.isEmpty(productExists)) {
+                    Product existProduct = productExists.get(0);
+                    BeanUtils.copyProperties(product, productExists.get(0), "id");
+                    existProduct.setCmpUuId(null);// 将已存在的变更过物料uuid置为null,以便后续进行重新匹配
+                    products.add(existProduct);
+                } else {
+                    products.add(product);
+                }
+            }
+            ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(prod.getPr_id());
+            if (null == productPrivate) {
+                productPrivate = new ProductPrivate();
+                productPrivate.setPrId(prod.getPr_id());
+            }
+            productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
+            // 统计现在有多少在售信息
+            int batchCount = goodsDao.findCountByProductid(prod.getPr_id());
+            productPrivate.setBatchCount(batchCount);
+            productPrivateDao.save(productPrivate);
+        }
+        productDao.save(products);// 保存上传的物料
+
+        logger.log("物料资料",  SystemSession.getUser().getEnterprise().getEnName() + "上传物料资料,数量:" + prods.size());
+        return "success";
+    }
+
+    @Override
+    public void callMatch() {
+        loggerOut.info("开始匹配");
+        Date start = new Date();
+        productService.matchAll();// 匹配上传的物料
+        Date end = new Date();
+        loggerOut.info("匹配完成, 历时" + (start.getTime() - end.getTime())/1000 + "秒");
+        logger.log("物料资料", "ERP匹配上传物料,企业:" + SystemSession.getUser().getEnterprise().getEnName());
+    }
+
+    @Override
+    public List<Prod> downloadProducts() {
+        List<Prod> prods = new ArrayList<Prod>();
+        List<Product> products = productDao.findBySourceAppAndB2cDownStatusAndEnUUAndCmpUuIdIsNotNull("ERP", Status.NOT_UPLOAD.value(), SystemSession.getUser().getEnterprise().getUu());
+        if (!CollectionUtils.isEmpty(products)) {
+            for (Product product : products) {
+                Prod prod = new Prod();
+                prod.setPr_uuid(product.getCmpUuId());
+                prod.setPr_id(product.getSourceId());
+                prods.add(prod);
+            }
+        }
+        logger.log("物料资料", "ERP下载更新物料资料,企业:" + SystemSession.getUser().getEnterprise().getEnName());
+        return prods;
+    }
+
+    @Override
+    public void refreshDownloadstatus(List<String> codes){
+        List<Product> products = new ArrayList<Product>();
+        Long enuu = SystemSession.getUser().getEnterprise().getUu();
+        for (String code : codes) {
+            Product product = productDao.getProductByEnUUAndProdNum(enuu, code).get(0);
+            product.setB2cDownStatus(Status.DOWNLOADED.value());
+            products.add(product);
+        }
+        logger.log("物料资料", "ERP回调修改物料资料下载状态,企业:" + SystemSession.getUser().getEnterprise().getEnName());
+        productDao.save(products);
+    }
+
+    @Override
+    public String returnStoreUrl() {
+        String url = "";
+        List<StoreIn> storeIn = storeInDao.findByEnUU(SystemSession.getUser().getEnterprise().getUu());
+        if (!CollectionUtils.isEmpty(storeIn)) {
+            return url = "/store/" + storeIn.get(0).getUuid();
+        }
+        logger.log("物料资料", "ERP获取店铺路径,企业:" + SystemSession.getUser().getEnterprise().getEnName());
+        return url;
+    }
+
+    @Override
+    public String setB2cEnable(String pr_code, Integer isEnable) {
+        List<Product> productList = productDao.getProductByEnUUAndProdNum(SystemSession.getUser().getEnterprise().getUu(),pr_code);
+        if (!CollectionUtils.isEmpty(productList)) {
+            for (Product product : productList) {
+                ProductPrivate productPrivate = releaseProductByBatchService.findByPrId(product.getId());
+                if (null == productPrivate) {
+                    productPrivate = new ProductPrivate();
+                    productPrivate.setPrId(product.getId());
+                }
+                if (isEnable.equals(IntegerConstant.YES_SHORT)) {
+                    productPrivate.setB2cEnabled(IntegerConstant.YES_SHORT);
+                } else {
+                    productPrivate.setB2cEnabled(IntegerConstant.NO_SHORT);
+                }
+                // 统计现在有多少在售信息
+                int batchCount = goodsDao.findCountByProductid(product.getId());
+                productPrivate.setBatchCount(batchCount);
+                productPrivateDao.save(productPrivate);
+            }
+        }
+        return "success";
+    }
+}

+ 2 - 1
src/main/java/com/uas/platform/b2c/external/erp/product/service/impl/OperationInfoServiceImpl.java

@@ -36,7 +36,8 @@ public class OperationInfoServiceImpl implements OperationInfoService {
     @Autowired
     private CreateNumberService createNumberService;
 
-    public static SysConf sysConf = new SysConf();
+    @Autowired
+    private SysConf sysConf;
 
     @Autowired
     private UserBaseInfoDao userBaseInfoDao;

+ 41 - 4
src/main/java/com/uas/platform/b2c/external/erp/product/util/ModelConverter.java

@@ -3,8 +3,14 @@ package com.uas.platform.b2c.external.erp.product.util;
 import com.uas.api.b2c_erp.baisc.model.*;
 import com.uas.api.b2c_erp.operation.model.OperationInfoUas;
 import com.uas.api.b2c_erp.seller.model.GoodsSimpleUas;
+import com.uas.api.b2c_erp.seller.model.Prod;
 import com.uas.api.domain.IPage;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.external.erp.product.model.OperationInfo;
+import com.uas.platform.b2c.prod.commodity.model.Product;
+import com.uas.platform.b2c.prod.commodity.model.ProductPrivate;
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandSubmit;
@@ -16,13 +22,11 @@ import com.uas.platform.b2c.prod.product.kind.model.*;
 import com.uas.platform.b2c.prod.product.property.model.Property;
 import com.uas.platform.b2c.prod.product.property.model.PropertyValue;
 import com.uas.platform.b2c.prod.product.property.model.PropertyValueSubmit;
+import com.uas.platform.core.model.Constant;
 import org.springframework.data.domain.Page;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 /**
  * erp<==>商城对象转换类
@@ -499,4 +503,37 @@ public class ModelConverter {
 		operationInfoUas.setUuid(operationInfo.getUuid());
 		return operationInfoUas;
 	}
+
+	/**
+	 * 转为平台的产品
+	 *
+	 * @return
+	 */
+	public static Product convert(Prod prod) {
+		Product product = new Product();
+		product.setProdNum(prod.getPr_code());
+		product.setEnUU(SystemSession.getUser().getEnterprise().getUu());
+		product.setUserUU(SystemSession.getUser().getUserUU());
+		product.setProdName(prod.getPr_detail());
+		product.setSpec(prod.getPr_spec());
+		product.setUnit(prod.getPr_unit());
+		product.setSourceId(prod.getPr_id());
+		product.setBrand(prod.getPr_brand());
+		if (prod.getPr_orispeccode() != null) {
+			product.setCmpCode(prod.getPr_orispeccode());
+		} else {
+			product.setCmpCode(prod.getPr_spec());
+		}
+		int i = Constant.NO;
+		product.setStandard(i);// 默认设置为非标准,到平台做匹配更新
+		Enterprise enter = SystemSession.getUser().getEnterprise();
+		// erp上传的数据默认赋值给标准信息
+		product.setPbrand(product.getBrand());
+		product.setPcmpcode(product.getCmpCode());
+		product.setKind(product.getProdName());
+		product.setSourceApp("ERP");
+		product.setErpDate(new Date());
+		product.setB2cDownStatus(Status.NOT_UPLOAD.value());
+		return product;
+	}
 }

+ 4 - 3
src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.fa.payment.model.Installment;
 import com.uas.platform.b2c.fa.payment.service.InstallmentService;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -55,8 +56,8 @@ public class InstallmentController {
      * @param purchaseId 采购单id
      */
     @RequestMapping(value = "/{purchaseId}", method = RequestMethod.DELETE)
-    public void deleteInstallment(@PathVariable("purchaseId") Long purchaseId) {
-        installmentService.deleteInstallment(purchaseId);
+    public ResultMap deleteInstallment(@PathVariable("purchaseId") Long purchaseId) {
+        return installmentService.deleteInstallment(purchaseId);
     }
 
     /**
@@ -65,7 +66,7 @@ public class InstallmentController {
      * @return
      */
     @RequestMapping(value = "/{purchaseId}/validate", method = RequestMethod.GET)
-    public String validateEnableInstallment(@PathVariable("purchaseId") Long purchaseId) {
+    public ResultMap validateEnableInstallment(@PathVariable("purchaseId") Long purchaseId) {
         return installmentService.validationEnableInstallment(purchaseId);
     }
 }

+ 14 - 0
src/main/java/com/uas/platform/b2c/fa/payment/model/BankInfo.java

@@ -119,6 +119,12 @@ public class BankInfo implements Serializable{
 	@Column(name = "binfo_dissociative")
 	private Integer dissociative;
 
+	/**
+	 * 如果为erp同步科目,此项纪录erp科目编号
+	 */
+	@Column(name = "binfo_erpnum")
+	private String erpNum;
+
 	public Long getId() {
 		return id;
 	}
@@ -244,6 +250,14 @@ public class BankInfo implements Serializable{
 		this.dissociative = dissociative;
 	}
 
+	public String getErpNum() {
+		return erpNum;
+	}
+
+	public void setErpNum(String erpNum) {
+		this.erpNum = erpNum;
+	}
+
 	@Override
 	public String toString() {
 		return "BankInfo [id=" + id + ", useruu=" + useruu + ", enuu=" + enuu

+ 3 - 2
src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentService.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.fa.payment.service;
 
 import com.uas.platform.b2c.fa.payment.model.BankTransfer;
 import com.uas.platform.b2c.fa.payment.model.Installment;
+import com.uas.platform.b2c.trade.support.ResultMap;
 
 /**
  * 分期支付service
@@ -39,14 +40,14 @@ public interface InstallmentService {
      * 删除分期信息
      * @param purchaseId
      */
-    void deleteInstallment(Long purchaseId);
+    ResultMap deleteInstallment(Long purchaseId);
 
     /**
      * 验证卖家是否能够设置分期信息
      * @param purchaseId
      * @return
      */
-    String validationEnableInstallment(Long purchaseId);
+    ResultMap validationEnableInstallment(Long purchaseId);
 
     /**
      * 采购单改价后更新分期信息

+ 1 - 0
src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankTransferServiceImpl.java

@@ -400,6 +400,7 @@ public class BankTransferServiceImpl implements BankTransferService {
 							}
 						}
 						purchase.setStatusPaid(userUU);
+                        purchase.setSendstatus(com.uas.platform.b2c.core.constant.Status.NOT_UPLOAD.value());
 					}
 				}
 				purchaseDao.save(purchases);

+ 55 - 26
src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java

@@ -21,6 +21,8 @@ import com.uas.platform.b2c.trade.order.dao.PurchaseDetailDao;
 import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.b2c.trade.order.model.Purchase;
 import com.uas.platform.b2c.trade.order.model.PurchaseDetail;
+import com.uas.platform.b2c.trade.support.CodeType;
+import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.util.mq.MessageType;
 import org.apache.commons.collections.CollectionUtils;
@@ -238,8 +240,12 @@ public class InstallmentServiceImpl implements InstallmentService{
     }
 
     @Override
-    public void deleteInstallment(Long purchaseId) {
-        validatePurchase(purchaseId);
+    public ResultMap deleteInstallment(Long purchaseId) {
+        ResultMap resultMap = validatePurchase(purchaseId);// 验证采购订单
+        if (1 != resultMap.getCode()) {// 验证错误
+            return resultMap;
+        }
+
         Purchase purchase = purchaseDao.findOne(purchaseId);
         Order order = orderDao.findByOrderid(purchase.getOrderid());
 
@@ -254,6 +260,7 @@ public class InstallmentServiceImpl implements InstallmentService{
         purchaseDao.save(purchase);
 
         installmentDao.delete(installment.getId());
+        return resultMap;
     }
 
     @Override
@@ -316,17 +323,27 @@ public class InstallmentServiceImpl implements InstallmentService{
     }
 
     @Override
-    public String validationEnableInstallment(Long purchaseId) {
-        validatePurchase(purchaseId);// 验证采购单、订单信息
-        validateBankInfo(Type.SUP.value(), Status.ALLOW.value());// 验证银行账户信息
-        validateInstallmentStore();// 验证是否设置分期权限
-        return "success";
+    public ResultMap validationEnableInstallment(Long purchaseId) {
+        ResultMap resultMap = validatePurchase(purchaseId);// 验证采购单、订单信息 return error code 5 7 6
+        if (1 != resultMap.getCode()) {
+            return resultMap;
+        }
+
+        resultMap = validateBankInfo(Type.SUP.value(), Status.ALLOW.value());// 验证银行账户信息 return error code 3
+        if (1 != resultMap.getCode()) {
+            return resultMap;
+        }
+
+        resultMap = validateInstallmentStore();// 验证是否设置分期权限 return error code 13
+        return resultMap;
     }
 
-    void validateInstallmentStore() {
+    ResultMap validateInstallmentStore() {
         InstallmentStore installmentStore = installmentStoreDao.findByEnuuAndEnable(SystemSession.getUser().getEnterprise().getUu(), (short) 1);
-        if (installmentStore == null)
-            throw new IllegalOperatorException("当前企业没有设置分期功能权限,如有需要请联系客服");
+        if (installmentStore == null) {
+            return new ResultMap(CodeType.NO_AUTHORITY.code(), "当前企业没有设置分期功能权限,如有需要请联系客服");
+        }
+        return ResultMap.success(null);
     }
 
     /**
@@ -334,32 +351,44 @@ public class InstallmentServiceImpl implements InstallmentService{
      * @param type
      * @param status
      */
-    void validateBankInfo(Integer type, Integer status) {
+    ResultMap validateBankInfo(Integer type, Integer status) {
         List<BankInfo> bankInfos = bankInfoService.getEnterpriseBankInfoContainsStatus(type, status);
-        if (CollectionUtils.isEmpty(bankInfos))
-            throw new IllegalOperatorException("当前企业没有设置收款账户,请在 结算中心--收款账户信息 管理您的收款账户信息");
+        if (CollectionUtils.isEmpty(bankInfos)) {
+            return new ResultMap(CodeType.NOT_COMPLETE_INFO.code(), "当前企业没有设置收款账户,请在 结算中心--收款账户信息 管理您的收款账户信息");
+        }
+        return ResultMap.success(null);
     }
 
     /**
      * 验证采购单、订单信息
      * @param purchaseId
      */
-    void validatePurchase(Long purchaseId) {
-        if (SystemSession.getUser().getEnterprise() == null)
-            throw new IllegalOperatorException("当前账户为个人账户,请选择企业后再执行此操作");
+    ResultMap validatePurchase(Long purchaseId) {
+        if (SystemSession.getUser().getEnterprise() == null) {
+            return new ResultMap(CodeType.ERROR_STATE.code(), "当前账户为个人账户,请选择企业后再执行此操作");
+        }
 
         Purchase purchase = purchaseDao.findOne(purchaseId);
-        if (purchase == null)
-            throw new IllegalOperatorException("订单不存在,请重新确认订单信息");
-        if (!SystemSession.getUser().getEnterprise().getUu().equals(purchase.getSellerenuu()))
-            throw new IllegalOperatorException("此订单不属于当前企业,请重新确认订单信息");
-        if (Status.TOBECONFIRMED.value() != purchase.getStatus().intValue())
-            throw new IllegalOperatorException("此订单状态不为待付款,不可修改分期信息");
+        if (purchase == null) {
+            return new ResultMap(CodeType.NOT_EXiST.code(), "订单不存在,请重新确认订单信息");
+        }
+
+        if (!SystemSession.getUser().getEnterprise().getUu().equals(purchase.getSellerenuu())) {
+            return new ResultMap(CodeType.NOT_PERMIT.code(), "此订单不属于当前企业,请重新确认订单信息");
+        }
+
+        if (Status.TOBECONFIRMED.value() != purchase.getStatus().intValue()) {
+            return new ResultMap(CodeType.ERROR_STATE.code(), "此订单状态不为待付款,不可修改分期信息");
+        }
 
         Order order = orderDao.findByOrderid(purchase.getOrderid());
-        if (order == null)
-            throw new IllegalOperatorException("订单不存在,请重新确认订单信息");
-        if (Status.TOBEPAID.value() != order.getStatus().intValue() && Status.TOBECONFIRMED.value() != order.getStatus().intValue())
-            throw new IllegalOperatorException("此订单状态不为待付款,不可修改分期信息");
+        if (order == null) {
+            return new ResultMap(CodeType.NOT_EXiST.code(), "订单不存在,请重新确认订单信息");
+        }
+        if (Status.TOBEPAID.value() != order.getStatus().intValue() && Status.TOBECONFIRMED.value() != order.getStatus().intValue()) {
+            return new ResultMap(CodeType.ERROR_STATE.code(), "此订单状态不为待付款,不可修改分期信息");
+        }
+
+        return ResultMap.success(null);
     }
 }

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

+ 9 - 0
src/main/java/com/uas/platform/b2c/fa/settlement/service/BillSubmitService.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.fa.settlement.service;
 
 import com.uas.platform.b2c.fa.settlement.model.BillSubmit;
+import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.core.model.PageInfo;
 import org.springframework.data.domain.Page;
 
@@ -37,4 +38,12 @@ public interface BillSubmitService {
      * @return
      */
     List<BillSubmit> auditBillSubmit(String ids);
+
+
+    /**
+     * 管理平台确认收款新增发票申请
+     * @param order 订单信息
+     * @return
+     */
+    BillSubmit saveByAdmin(Order order);
 }

+ 39 - 1
src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/BillSubmitServiceImpl.java

@@ -2,6 +2,7 @@ package com.uas.platform.b2c.fa.settlement.service.impl;
 
 import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.fa.settlement.dao.BillDao;
 import com.uas.platform.b2c.fa.settlement.dao.BillSubmitDao;
 import com.uas.platform.b2c.fa.settlement.model.Bill;
@@ -107,7 +108,7 @@ public class BillSubmitServiceImpl implements BillSubmitService {
         return billSubmitDao.save(billSubmits);
     }
 
-    // 初始化发票申请
+    // 初始化发票申请(用户发起用)
     public BillSubmit createBillSubmit(Bill bill, List<Order> orders, Long buyerEnuu) {
         Long buyeruu = SystemSession.getUser().getUserUU();
         // 发票基本信息
@@ -156,6 +157,43 @@ public class BillSubmitServiceImpl implements BillSubmitService {
         return billSubmit;
     }
 
+    @Override
+    public BillSubmit saveByAdmin(Order order) {
+        Bill bill = billDao.findOne(order.getInvoiceid());
+        if (bill == null) {
+            throw new IllegalOperatorException("买家选择需要开票,但发票信息不存在,请重新确认");
+        }
+
+        // 发票基本信息
+        BillSubmit billSubmit = new BillSubmit();
+        billSubmit.setInvoicetitle(bill.getHead());
+        billSubmit.setInvoiceid(bill.getId());
+        billSubmit.setInvoiceAddress(bill.getArea() + "," + bill.getDetailAddress());
+        billSubmit.setInvoicetype(bill.getKind());
+        billSubmit.setCreateTime(new Date());
+        billSubmit.setReceiverName(bill.getName());
+        billSubmit.setRecTel(bill.getTelephone());
+        billSubmit.setStatus(Status.SUBMITTED.value());
+        billSubmit.setSubmituu(order.getBuyeruu());
+        if (order.getBuyerenuu() != null)
+            billSubmit.setSubmitEnuu(order.getBuyerenuu());
+
+        billSubmit.setSellername(order.getSellername());
+        billSubmit.setSellerenuu(order.getSellerenuu());
+
+        order.setInvoicetype(bill.getKind());
+        order.setInvoiceAddress(FastjsonUtils.toJson(bill));
+        order.setInvoiceid(bill.getId());
+        order.setInvoicetitle(bill.getHead());
+        order.setVatBillStatus(Status.TOBEMAKE_BILL.value());
+        orderDao.save(order);
+
+        billSubmit.setPrice(order.getPrice());
+        billSubmit.setOrderids(order.getOrderid());
+
+        return billSubmitDao.save(billSubmit);
+    }
+
     @Override
     public Page<BillSubmit> getAll(final PageInfo pageInfo, String keyword, String invoicetype , String status, String role) {
         if (Type.BUYER.name().equals(role)) {

+ 53 - 0
src/main/java/com/uas/platform/b2c/logistics/constant/TipType.java

@@ -0,0 +1,53 @@
+package com.uas.platform.b2c.logistics.constant;
+
+/**
+ * 提示类型码
+ * @author hulh 10点16分
+ */
+public enum TipType {
+	/**
+	 * {@code 1201 适用于普通订单}
+	 */
+	TIP_LOGISTICS(101, "配送规则提示");
+
+
+	TipType(int value, String phrase) {
+		this.value = value;
+		this.phrase = phrase;
+	}
+	private final int value;
+
+	private final String phrase;
+
+	public int getValue() {
+		return this.value;
+	}
+
+	public String getPhrase() {
+		return this.phrase;
+	}
+
+	/**
+	 * @param statusCode 状态的编码
+	 * @return 状态
+	 * @throws IllegalArgumentException
+	 *             如果statusCode不存在的话
+	 */
+	public static TipType valueOf(int statusCode) {
+		for (TipType status : values()) {
+			if (status.value == statusCode) {
+				return status;
+			}
+		}
+		throw new IllegalArgumentException("没有与编号 [" + statusCode + "]匹配的类型");
+	}
+
+	/**
+	 * 返回状态码的编号
+	 * @return
+	 */
+	@Override
+	public String toString() {
+		return Integer.toString(value);
+	}
+}

+ 9 - 0
src/main/java/com/uas/platform/b2c/logistics/controller/DistributionRuleController.java

@@ -90,6 +90,15 @@ public class DistributionRuleController {
 		return distributionRuleService.findCountRule();
 	}
 
+	/**
+	 * 返回当前enuu启用配送规则总数
+	 * @return
+	 */
+	@RequestMapping(value = "/active/count", method = RequestMethod.GET)
+	public ResultMap findActiveRuleCount(){
+		return distributionRuleService.findCountActiveRule();
+	}
+
 	/**
 	 * 查找配送规则名是否存在
 	 * @param id

+ 36 - 0
src/main/java/com/uas/platform/b2c/logistics/controller/TipRecordController.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.logistics.controller;
+
+import com.uas.platform.b2c.logistics.model.TipRecord;
+import com.uas.platform.b2c.logistics.service.TipRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 提示记录Controller
+ * @author hulh
+ */
+@RestController
+@RequestMapping("/tip/record")
+public class TipRecordController {
+
+	@Autowired
+	private TipRecordService tipRecordService;
+
+	/**
+	 * 根据当前userUu查询配送规则提示
+	 */
+	@RequestMapping(value = "/rule", method = RequestMethod.GET)
+	public TipRecord findTipRecordOfRule() {
+		return tipRecordService.findByUserUuOfRule();
+	}
+
+	/**
+	 * 根据当前userUu切换配送规则提示
+	 */
+	@RequestMapping(value = "/rule/close", method = RequestMethod.PUT)
+	public TipRecord turnTipRecordOfRule() {
+		return tipRecordService.turnTipRecordOfRule();
+	}
+}

+ 8 - 0
src/main/java/com/uas/platform/b2c/logistics/dao/DistributionRuleDao.java

@@ -33,6 +33,14 @@ public interface DistributionRuleDao extends JpaSpecificationExecutor<Distributi
 	@Query(value = "select count(1) from DistributionRule d where d.enuu = :enuu")
 	int findCountByEnuu(@Param("enuu") Long enuu);
 
+	/**
+	 * 根据enuu查询启用的配送规则数
+	 * @param enuu
+	 * @return
+	 */
+	@Query(value = "select count(1) from DistributionRule d where d.enuu = :enuu and d.active = 1")
+	int findCountByEnuuAndActive(@Param("enuu") Long enuu);
+
 	/**
 	 * 根据enuu获取所有的配送规则
 	 * @param enuu

+ 31 - 0
src/main/java/com/uas/platform/b2c/logistics/dao/TipRecordDao.java

@@ -0,0 +1,31 @@
+package com.uas.platform.b2c.logistics.dao;
+
+import com.uas.platform.b2c.logistics.model.TipRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 提示记录dao层
+ */
+@Repository
+public interface TipRecordDao extends JpaSpecificationExecutor<TipRecord>, JpaRepository<TipRecord, Long> {
+
+	/**
+	 * 根据类型返回提示记录
+	 * @param useruu
+	 * @param type
+	 * @return
+	 */
+	List<TipRecord> findByUseruuAndTypeOrderByTipAgainDesc(Long useruu, Integer type);
+
+	/**
+	 * 根据类型返回不再提示记录
+	 * @param useruu
+	 * @param type
+	 * @return
+	 */
+	List<TipRecord> findByUseruuAndTypeAndTipAgainOrderByTipAgainDesc(Long useruu, Integer type, Short tipAgain);
+}

+ 84 - 0
src/main/java/com/uas/platform/b2c/logistics/model/TipRecord.java

@@ -0,0 +1,84 @@
+package com.uas.platform.b2c.logistics.model;
+
+import javax.persistence.*;
+
+/**
+ * 提示记录
+ * @author hulh
+ */
+@Entity
+@Table(name = "tip_record")
+public class TipRecord {
+
+	/**
+	 * 主键id
+	 */
+	@Id
+	@GeneratedValue
+	@Column(name = "tip_id")
+	private Long id;
+
+	/**
+	 * 用户uu
+	 */
+	@Column(name = "tip_uu")
+	private Long useruu;
+
+	/**
+	 * 企业enuu
+	 */
+	@Column(name = "tip_enuu")
+	private Long enuu;
+
+	/**
+	 * 是否再提示 1 再提示 0 不再提示
+	 */
+	@Column(name = "tip_again")
+	private Short tipAgain;
+
+	/**
+	 * 提示类型
+	 */
+	@Column(name = "tip_type")
+	private Integer type;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getUseruu() {
+		return useruu;
+	}
+
+	public void setUseruu(Long useruu) {
+		this.useruu = useruu;
+	}
+
+	public Long getEnuu() {
+		return enuu;
+	}
+
+	public void setEnuu(Long enuu) {
+		this.enuu = enuu;
+	}
+
+	public Short getTipAgain() {
+		return tipAgain;
+	}
+
+	public void setTipAgain(Short tipAgain) {
+		this.tipAgain = tipAgain;
+	}
+
+	public Integer getType() {
+		return type;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+}

+ 24 - 0
src/main/java/com/uas/platform/b2c/logistics/model/UsableRuleInfo.java

@@ -1,10 +1,34 @@
 package com.uas.platform.b2c.logistics.model;
 
+import com.uas.platform.b2c.core.constant.Type;
+
 /**
  * Created by hulh on 2017/9/13.
  * 适用的配送规则简要信息
  */
 public class UsableRuleInfo {
+
+	/**
+	 * 单例实现共用的上门自提配送规则
+	 */
+	private static volatile UsableRuleInfo TAKE_SELF_RULE = null;
+	private static final String TAKE_SELF_NAME = "上门自提免运费";
+
+	public static UsableRuleInfo getTakeSelfRule(){
+		if (TAKE_SELF_RULE == null){
+			synchronized (UsableRuleInfo.class){
+				if (TAKE_SELF_RULE == null){
+					TAKE_SELF_RULE = new UsableRuleInfo();
+					TAKE_SELF_RULE.setMethod(Type.Delivery_BySelf_Code.value());
+					TAKE_SELF_RULE.setRuleName(TAKE_SELF_NAME);
+					TAKE_SELF_RULE.setFare(0d); //运费默认为0
+					TAKE_SELF_RULE.setFareType((short)1); //运费类型默认为统一运费
+				}
+			}
+		}
+		return TAKE_SELF_RULE;
+	}
+
 	/**
 	 * 配送id
 	 */

+ 7 - 0
src/main/java/com/uas/platform/b2c/logistics/service/DistributionRuleService.java

@@ -58,6 +58,13 @@ public interface DistributionRuleService {
 	 */
 	ResultMap findCountRule();
 
+	/**
+	 * 返回当前enuu下启用配送规则总数
+	 * @return
+	 */
+	ResultMap findCountActiveRule();
+
+
 	/**
 	 * 查找是否已存在该名称
 	 * @param id

+ 22 - 0
src/main/java/com/uas/platform/b2c/logistics/service/TipRecordService.java

@@ -0,0 +1,22 @@
+package com.uas.platform.b2c.logistics.service;
+
+import com.uas.platform.b2c.logistics.model.TipRecord;
+
+/**
+ * 提示记录Service
+ * @author hulh
+ */
+public interface TipRecordService {
+
+	/**
+	 * 根据userUu查询配送规则提示记录
+	 * @return
+	 */
+	TipRecord findByUserUuOfRule();
+
+	/**
+	 * 根据userUu查询配送规则提示记录
+	 * @return
+	 */
+	TipRecord turnTipRecordOfRule();
+}

+ 21 - 20
src/main/java/com/uas/platform/b2c/logistics/service/impl/AddressServiceImpl.java

@@ -75,48 +75,48 @@ public class AddressServiceImpl implements AddressService {
 		Long useruu = address.getUseruu();
 		int type = address.getType();
 		List<Address> addresses = null;
-		if(useruu != null) {
+		if (Type.Address_Shipping_Code.value() == address.getType()) {
 			addresses = addressDao.findByUseruuAndEnuuAndTypeAndUsetypeOrderByNumAsc(useruu, address.getEnuu(), type, (short)1);
-		}else {
+		} else {
 			addresses = addressDao.findByEnuuAndTypeAndUsetypeOrderByNumAsc(address.getEnuu(), type, (short)2);
 		}
 		int num = 1;
-		long modifyId = address.getId().longValue();
-		int modifyNum = address.getNum().intValue();
-		if (setTop){
+		long modifyId = address.getId();
+		int modifyNum = address.getNum();
+		if (setTop) {
 			for (Address add : addresses) {
-				if (add.getId().longValue() == modifyId) {
+				if (add.getId() == modifyId) {
 					add.setNum(1);
 				} else {
 					// 这里拿到的已经是排序了的,直接依次设置num即可
 					add.setNum(++num);
 				}
 			}
-		}else {
-			if (modifyNum == 1){ //取消默认地址
+		} else {
+			if (modifyNum == 1) { //取消默认地址
 				for (Address add : addresses) { //空出默认地址位置
 					add.setNum(++num);
 				}
-			}else {
+			} else {
 				int firstNum = addresses.get(0).getNum();
-				if (firstNum == 1){ //有默认地址情况
+				if (firstNum == 1) { //有默认地址情况
 					num++; //空出默认地址位置
 					for (Address add : addresses) {
-						if (add.getNum() != 1){
-							if (add.getId().longValue() != modifyId){
+						if (add.getNum() != 1) {
+							if (add.getId() != modifyId) {
 								//不是修改的地址或者默认地址,则重新排序
 								add.setNum(++num);
-							}else {
+							} else {
 								add.setNum(2);
 							}
 						}
 					}
-				}else { //没有默认地址情况
+				} else { //没有默认地址情况
 					num++; //空出默认地址位置
 					for (Address add : addresses) {
-						if (add.getId().longValue() != modifyId){
+						if (add.getId() != modifyId) {
 							add.setNum(++num);
-						}else {
+						} else {
 							add.setNum(2);
 						}
 					}
@@ -148,6 +148,7 @@ public class AddressServiceImpl implements AddressService {
 					num =addressDao.getCountByUseruuTypeUsetypeAndDissociative(user.getUserUU(),address.getType(), address.getUsetype(), Type.PERSONAL.value());
 				}
 			}else {
+				address.setUseruu(user.getUserUU());
 				address.setEnuu(user.getEnterprise().getUu());
 				address.setUsetype((short)2);
 				num = addressDao.getCountByEnuuAndTypeAndUsetype(user.getEnterprise().getUu(), address.getType(), address.getUsetype());
@@ -156,13 +157,13 @@ public class AddressServiceImpl implements AddressService {
 		}
 		Long modifyId = address.getId();
 		Address add = save(address);
-		if (modifyId == null && add.getNum().intValue() == 1){
+		if (modifyId == null && add.getNum() == 1){
 			isSetTop = true;
 		}
 		if(modifyId == null || isSetTop) { //只有新增加的地址 或者需要被置顶的地址 才需要重新排序。
 			setTop(add.getId(), isSetTop);
 		}
-		if (address.getNum().intValue() == 1 && !isSetTop) { //取消默认地址的时候需要重新排序
+		if (address.getNum() == 1 && !isSetTop) { //取消默认地址的时候需要重新排序
 			setTop(add.getId(), isSetTop);
 		}
 		return add;
@@ -173,9 +174,9 @@ public class AddressServiceImpl implements AddressService {
 		List<Address> address = new ArrayList<Address>();
 		if (send) {
 			if (enuu != null) {
-				address = addressDao.findByUseruuAndEnuuAndTypeAndUsetypeOrderByNumAsc(useruu, enuu, Type.Address_Sending_Code.value(), (short)1);
+				address = addressDao.findByEnuuAndTypeAndUsetypeOrderByNumAsc(enuu, Type.Address_Sending_Code.value(), (short)2);
 			} else {
-				address = addressDao.findByUseruuAndTypeAndUsetypeAndDissociative(useruu, Type.Address_Sending_Code.value(), (short)1, Type.PERSONAL.value());
+				address = addressDao.findByUseruuAndTypeAndUsetypeAndDissociative(useruu, Type.Address_Sending_Code.value(), (short)2, Type.PERSONAL.value());
 			}
 		} else {
 			if (enuu != null) {

+ 42 - 11
src/main/java/com/uas/platform/b2c/logistics/service/impl/DistributionRuleServiceImpl.java

@@ -4,15 +4,15 @@ import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.constant.ShortConstant;
 import com.uas.platform.b2c.core.constant.SplitChar;
+import com.uas.platform.b2c.core.constant.Type;
 import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.logistics.dao.AddressTakeSelfDao;
 import com.uas.platform.b2c.logistics.dao.DistributionRuleDao;
-import com.uas.platform.b2c.logistics.model.DistributionRule;
-import com.uas.platform.b2c.logistics.model.RuleQtyArea;
-import com.uas.platform.b2c.logistics.model.RuleQtyFare;
-import com.uas.platform.b2c.logistics.model.UsableRuleInfo;
+import com.uas.platform.b2c.logistics.model.*;
 import com.uas.platform.b2c.logistics.service.DistributionRuleService;
 import com.uas.platform.b2c.prod.store.dao.StoreInDao;
 import com.uas.platform.b2c.prod.store.model.StoreIn;
+import com.uas.platform.b2c.prod.store.model.StoreStatus;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.core.exception.IllegalOperatorException;
@@ -47,6 +47,9 @@ public class DistributionRuleServiceImpl implements DistributionRuleService{
 	@Autowired
 	private StoreInDao storeInDao;
 
+	@Autowired
+	private AddressTakeSelfDao takeSelfDao;
+
 	@Autowired
 	private SysConf sysConf;
 
@@ -225,6 +228,26 @@ public class DistributionRuleServiceImpl implements DistributionRuleService{
 		return ResultMap.success(count);
 	}
 
+	/**
+	 * 查询已设置配送规则的数量,启用的,返回是否显示提示
+	 * @return
+	 */
+	@Override
+	public ResultMap findCountActiveRule() {
+		Long enuu = SystemSession.getUser().getEnterprise().getUu();
+		List<StoreIn> storeList = storeInDao.findByEnUU(enuu);
+		int count = distributionRuleDao.findCountByEnuuAndActive(enuu);
+		if (!CollectionUtils.isEmpty(storeList)){
+			StoreIn storeIn = storeList.get(0);
+			if (count == 0 && storeIn.getStatus() == StoreStatus.OPENED){
+				return ResultMap.success(true);
+			}else {
+				return ResultMap.success(false);
+			}
+		}
+		return ResultMap.success(false);
+	}
+
 	/**
 	 * 根据配送规则名称查询是否已存在
 	 * @param id
@@ -287,12 +310,14 @@ public class DistributionRuleServiceImpl implements DistributionRuleService{
 			throw new IllegalOperatorException("配送规则信息丢失,请刷新后重试");
 		}
 		for (UsableRuleInfo info : ruleList){
-			DistributionRule rule = distributionRuleDao.findOne(info.getId());
-			if (rule == null){
-				throw new IllegalOperatorException("配送规则信息丢失,请刷新后重试");
+			if (info.getId() != null && info.getMethod() != Type.Delivery_BySelf_Code.value()){
+				DistributionRule rule = distributionRuleDao.findOne(info.getId());
+				if (rule == null){
+					throw new IllegalOperatorException("配送规则信息丢失,请刷新后重试");
+				}
+				Double fare = getFareOfRule(rule, price);
+				info.setFare(fare);
 			}
-			Double fare = getFareOfRule(rule, price);
-			info.setFare(fare);
 		}
 		return ruleList;
 	}
@@ -332,7 +357,8 @@ public class DistributionRuleServiceImpl implements DistributionRuleService{
 		List<UsableRuleInfo> ruleInfoList = new ArrayList<>();
 		List<Integer> methodList = new ArrayList<>();
 		for (DistributionRule rule : allRuleList){
-			if (!methodList.contains(rule.getShippingMethod())){
+			if (!methodList.contains(rule.getShippingMethod()) &&
+					!rule.getShippingMethod().equals(Type.Delivery_BySelf_Code.value())){
 				List<RuleQtyArea> qtyArea = rule.getAreas();
 				//转化分段地区信息
 				Map<String, Map<String, List<String>>> resultMap = convertArea(qtyArea);
@@ -347,10 +373,15 @@ public class DistributionRuleServiceImpl implements DistributionRuleService{
 					ruleInfoList.add(info);
 				}
 			}
-			if (methodList.size() == 3){
+			if (methodList.size() == 2){
 				break;
 			}
 		}
+		List<AddressTakeSelf> takeSelfList = takeSelfDao.findByEnuuAndActiveOrderByCreatetimeDesc(store.getEnUU(), ShortConstant.YES_SHORT);
+		if (!CollectionUtils.isEmpty(takeSelfList)){
+			UsableRuleInfo takeRule = UsableRuleInfo.getTakeSelfRule();
+			ruleInfoList.add(takeRule);
+		}
 		return ruleInfoList;
 	}
 

+ 11 - 15
src/main/java/com/uas/platform/b2c/logistics/service/impl/InvoiceFPurchaseServiceImpl.java

@@ -5,8 +5,11 @@ import com.uas.api.b2c_erp.seller.model.Invoice;
 import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.TradeLog;
-import com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus;
 import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.support.log.TradeBufferedLogger;
+import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.core.utils.StringUtilB2C;
 import com.uas.platform.b2c.logistics.dao.InvoiceFPurchaseDao;
 import com.uas.platform.b2c.logistics.dao.LogisticsCompanyCodeDao;
 import com.uas.platform.b2c.logistics.dao.LogisticsDao;
@@ -15,18 +18,15 @@ import com.uas.platform.b2c.logistics.model.InvoiceFPurchaseDetail;
 import com.uas.platform.b2c.logistics.model.Logistics;
 import com.uas.platform.b2c.logistics.service.InvoiceFPurchaseService;
 import com.uas.platform.b2c.logistics.service.LogisticsOldService;
+import com.uas.platform.b2c.prod.commodity.service.ProductService;
+import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
+import com.uas.platform.b2c.trade.aftersale.model.AfterSaleStatus;
 import com.uas.platform.b2c.trade.order.dao.OrderDao;
 import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
 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.prod.commodity.service.ProductService;
-import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
-import com.uas.platform.b2c.core.support.SystemSession;
-import com.uas.platform.b2c.core.support.log.TradeBufferedLogger;
-import com.uas.platform.b2c.core.utils.NumberUtil;
-import com.uas.platform.b2c.core.utils.StringUtilB2C;
 import com.uas.platform.b2c.trade.support.CodeType;
 import com.uas.platform.b2c.trade.support.ResultMap;
 import com.uas.platform.b2c.trade.util.TradeLogUtil;
@@ -42,7 +42,6 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.NumberUtils;
 import org.springframework.util.StringUtils;
 
 import javax.management.OperationsException;
@@ -50,12 +49,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 @Service
 public class InvoiceFPurchaseServiceImpl implements InvoiceFPurchaseService {
@@ -112,7 +106,7 @@ public class InvoiceFPurchaseServiceImpl implements InvoiceFPurchaseService {
 	@Override
 	public InvoiceFPurchase createInvoiceFPurchase(Long puid) {
 		Purchase purchase = purchaseDao.findOne(puid);
-		if (purchase.getStatus() != Status.TOBESHIPPED.value()) {
+		if (purchase.getStatus() != Status.TOBESHIPPED.value() && purchase.getStatus() != Status.CONFIRMED.value()) {
 			throw new IllegalAccessError(
 					"采购单" + purchase.getPurchaseid() + "的状态是" + Status.valueOf(purchase.getStatus()).getPhrase() + ",不能转出货");
 		}
@@ -363,6 +357,7 @@ public class InvoiceFPurchaseServiceImpl implements InvoiceFPurchaseService {
 //			}
 			order.setJsonSdAddress(inFpu.getJsonSdAddress());
 			order.setStatusInBound(userUU);
+            order.setSendstatus(Status.NOT_UPLOAD.value());// 将订单设置为未下载状态,以便erp下载
 			for (OrderDetail detail : order.getOrderDetails()) {
 				detail.setStatusInBound(userUU);
 			}
@@ -481,6 +476,7 @@ public class InvoiceFPurchaseServiceImpl implements InvoiceFPurchaseService {
 		logisticsInfo.put("companyName", invoice.getCompanyName());
 		logisticsInfo.put("number", invoice.getCompanyNumber());
 		jsonObject.put("logisticsInfo", logisticsInfo);
+		jsonObject.put("sendType", purchase.getSendType());
 		saveInvoiceFPurchaseList(jsonObject, invoiceFpurc.getId());
 
 //		Logistics logist = new Logistics();

+ 63 - 0
src/main/java/com/uas/platform/b2c/logistics/service/impl/TipRecordServiceImpl.java

@@ -0,0 +1,63 @@
+package com.uas.platform.b2c.logistics.service.impl;
+
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.constant.ShortConstant;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.logistics.constant.TipType;
+import com.uas.platform.b2c.logistics.dao.TipRecordDao;
+import com.uas.platform.b2c.logistics.model.TipRecord;
+import com.uas.platform.b2c.logistics.service.TipRecordService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author hulh
+ */
+@Service
+public class TipRecordServiceImpl implements TipRecordService {
+
+	@Autowired
+	private TipRecordDao tipRecordDao;
+
+	@Override
+	public TipRecord findByUserUuOfRule() {
+		User user = SystemSession.getUser();
+		List<TipRecord> recordList =  tipRecordDao.findByUseruuAndTypeOrderByTipAgainDesc(user.getUserUU(),
+				TipType.TIP_LOGISTICS.getValue());
+		if (CollectionUtils.isEmpty(recordList)){
+			return newOneRecord(user);
+		}
+
+		return recordList.get(0);
+	}
+
+	@Override
+	public TipRecord turnTipRecordOfRule() {
+		User user = SystemSession.getUser();
+		List<TipRecord> recordList =  tipRecordDao.findByUseruuAndTypeOrderByTipAgainDesc(user.getUserUU(),
+				TipType.TIP_LOGISTICS.getValue());
+		if (CollectionUtils.isEmpty(recordList)){
+			throw new IllegalOperatorException("操作异常");
+		}
+		TipRecord record = recordList.get(0);
+		if (record.getTipAgain() == 1)
+			return record;
+		record.setTipAgain(ShortConstant.YES_SHORT);
+		return tipRecordDao.save(record);
+	}
+
+	@Transactional
+	private TipRecord newOneRecord(User user){
+		TipRecord record = new TipRecord();
+		record.setEnuu(user.getEnterprise().getUu());
+		record.setUseruu(user.getUserUU());
+		record.setType(TipType.TIP_LOGISTICS.getValue());
+		record.setTipAgain(ShortConstant.NO_SHORT);
+		return tipRecordDao.save(record);
+	}
+}

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

@@ -26,4 +26,24 @@ public class DoubleConstant {
      * 最小包装量的最大值
      */
     public static final Double maxMinPackageQty = 999999d;
+
+    /**
+     * 最小价格
+     */
+    public static final Double minPrice = 0.000001d;
+
+    /**
+     * 最大价格
+     */
+    public static final Double maxPrice = 10000d;
+
+    /**
+     * 最小的浮动率 值
+     */
+    public static final Double minFluctuateRate = 0.01d;
+
+    /**
+     * 最大的浮动率 值
+     */
+    public static final Double maxFluctuateRate = 2d;
 }

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

@@ -0,0 +1,39 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ * 产品导入错误信息常量
+ *
+ * @author hulh
+ */
+public enum  ErrorInfoConstant {
+    REPEAT_INFO("产品库已存在该产品"),
+    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列:包装方式不能为空"),
+    PERSON_PACKAGE_EMPTY_INFO("C列:规格信息不能为空"),
+    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;
+    }
+}

+ 40 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/constant/GoodStatusEnum.java

@@ -0,0 +1,40 @@
+package com.uas.platform.b2c.prod.commodity.constant;
+
+/**
+ * goods 的一些状态
+ *
+ * Created by yujia on 2018/1/20.
+ */
+public enum GoodStatusEnum {
+
+    discard("612-614", "废弃"),
+
+    IN_USE("601-602-613", "正在使用");
+
+    private String status;
+
+    private String message;
+
+    GoodStatusEnum(String status, String message) {
+        this.status = status;
+        this.message = message;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public GoodStatusEnum setStatus(String status) {
+        this.status = status;
+        return this;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public GoodStatusEnum setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+}

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

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

@@ -0,0 +1,38 @@
+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 INIT_TAG = "类型1";
+
+    /**
+     * 商城单位
+     */
+    public static final String UNIT = "PCS";
+
+    /**
+     * erp 标识
+     */
+    public static final String ERP = "ERP";
+
+    /**
+     * 币别
+     */
+    public static final String RMB = "RMB";
+
+    /**
+     * 无物料
+     */
+    public static final String DEFAULTPACKAGING = "无";
+}

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

@@ -0,0 +1,127 @@
+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 SPECIFICATION = 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;
+
+    /**
+     * 个人导入表的最大列数
+     */
+    public static final int TOTAL_COLUMN_PERSON = 3;
+
+    /**
+     * 个人用户可能直接用导入失败的表格进行导入
+     */
+    public static final int MAX_TOTAL_COLUMN_PERSON = 4;
+}

+ 107 - 6
src/main/java/com/uas/platform/b2c/prod/commodity/controller/GoodsController.java

@@ -95,9 +95,9 @@ public class GoodsController {
 		PageInfo info = new PageInfo(params);
 		Long enUU = SystemSession.getUser().getEnterprise().getUu();
 		info.filter("enUU", enUU);
-		if (status.equals("AVAILABLE")) {
+		if ("AVAILABLE".equals(status)) {
 			info.filter("status", Status.AVAILABLE.value());
-		} else if (status.equals("UNAVAILABLE")) {
+		} else if ("UNAVAILABLE".equals(status)) {
 			info.filter("status", Status.UNAVAILABLE.value());
 		}
 		Page<Goods> page = goodsService.findPageByStatus(info, keyword);
@@ -116,9 +116,9 @@ public class GoodsController {
     @RequestMapping(value = "/saling/admin", method = RequestMethod.GET)
 	public Page<Goods> findSalingGoodsAdmin(PageParams params, String status, String keyword) {
 		PageInfo info = new PageInfo(params);
-		if (status.equals("AVAILABLE")) {
+		if ("AVAILABLE".equals(status)) {
 			info.filter("status", Status.AVAILABLE.value());
-		} else if (status.equals("UNAVAILABLE")) {
+		} else if ("UNAVAILABLE".equals(status)) {
 			info.filter("status", Status.UNAVAILABLE.value());
 		}
 		Page<Goods> page = goodsService.findPageByStatus(info, keyword);
@@ -214,7 +214,8 @@ public class GoodsController {
     @RequestMapping(value = "/simple/byUuidAndCurrency", method = RequestMethod.GET, params = "_status=available")
 	@ResponseBody
 	public List<GoodsSimple> findSimpleAvailableByUuid(String uuid, String currencyName) {
-		if (StringUtils.isEmpty(currencyName) || "without".equals(currencyName)) {// 不进行币别筛选
+		// 不进行币别筛选
+		if (StringUtils.isEmpty(currencyName) || "without".equals(currencyName)) {
 			logger.log("商品批次", "根据商品uuid获取有效的商品批次", "uuid: " + uuid);
 			return goodsService.findSimpleAvailableByUuid(uuid);
 		} else {
@@ -284,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);
+	}
+
     /**
      * 下架所有已失效产品(需要登陆状态)
      *
@@ -313,6 +335,7 @@ public class GoodsController {
 	public Goods findByBatchCode(@PathVariable String batchCode) {
 		batchCode = StringUtilB2C.decodeValue(batchCode);
 		Goods goods = goodsService.findGoodsByBatchCode(batchCode);
+		goodsService.addVisitCount(batchCode);
 		logger.log("商品批次", "根据批次号获取商品信息", "批次号:" + batchCode);
 		return goods;
 	}
@@ -637,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);
+	}
+
     /**
      * 下架当前企业的所有的商品信息
      *
@@ -648,4 +685,68 @@ public class GoodsController {
 		logger.log("商品管理", "下架该公司所有商品");
 		return goodsService.downAllGoodsByEnterprise(eName);
 	}
+
+	/**
+	 * 根据产品id获取对应的商家信息列表
+	 * @return
+	 */
+	@RequestMapping(value = "/by/productId", method = RequestMethod.GET)
+	public List<Goods> getGoodsByProductId(Long id){
+		return goodsService.getGoodsByProductId(id);
+	}
+
+	/**
+	 * 将goods转为在售状态
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/turn/sale", method = RequestMethod.PUT)
+	public ResultMap turnGoodsToSale(Long id){
+		return goodsService.turnToSale(id);
+	}
+
+	@RequestMapping(value = "/isRecommend/{id}", method = RequestMethod.GET)
+	public ResultMap isRecommendGoods(@PathVariable("id") Long id) {
+		return goodsService.isRecommendGoods(id);
+	}
+
+    /**
+     * 删除在售商品的信息
+     * @return
+     */
+	@RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE)
+	public Goods deleteGoods(@PathVariable("id") Long id) {
+        return goodsService.deleteGoods(id);
+    }
+
+	/**
+	 * 修正正式系统的数据
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/arrange", method = RequestMethod.GET)
+    public String arrangeGoods() {
+		return goodsService.arrangeGoods();
+	}
+
+	/**
+	 *	获取删除 的信息
+	 *
+	 * @param productid
+	 * @return
+	 */
+	@RequestMapping(value = "/{productid}/deleteMessage", method = RequestMethod.GET)
+	public ResultMap getDeleteProductMessage(@PathVariable("productid") Long productid) {
+		return goodsService.getDeleteProductMessage(productid);
+	}
+
+	/**
+	 * 修正正式系统的分段价格数据
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/data/modify", method = RequestMethod.GET)
+	public String modifyData() {
+		return  goodsService.modifyData();
+	}
 }

+ 139 - 17
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -1,11 +1,12 @@
 package com.uas.platform.b2c.prod.commodity.controller;
 
-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.service.ProductService;
+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.prod.commodity.facade.ProductFacade;
+import com.uas.platform.b2c.prod.commodity.model.*;
+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.trade.support.ResultMap;
 import com.uas.platform.core.model.PageInfo;
@@ -43,6 +44,9 @@ public class ProductController {
 
 	private final ProductFacade productFacade;
 
+	@Autowired
+	private GoodsService goodsService;
+
 	private final Logger logger = Logger.getLogger(getClass());
 
     /**
@@ -66,11 +70,25 @@ public class ProductController {
      * @return all products
      */
     @RequestMapping(method = RequestMethod.GET, params = "_status=all")
-	Page<Product> getAllProducts(PageParams page, String keyword, String type) {
+	Page<V_ProductPrivate> getAllProducts(PageParams page, String keyword, String type) {
 		PageInfo info = new PageInfo(page);
 		return productService.getAllProducts(info, keyword, type);
 	}
 
+	/**
+	 * 查看个人产品库
+	 *
+	 * @param page    the page 一页数据
+	 * @param keyword the keyword 搜索关键字
+	 * @param type    the type 类型
+	 * @return all products
+	 */
+	@RequestMapping(value = "/person", method = RequestMethod.GET, params = "_status=all")
+	Page<V_ProductPerson> getAllProductsByPerson(PageParams page, String keyword, String type) {
+		PageInfo info = new PageInfo(page);
+		return productService.getAllProductsByPerson(info, keyword, type);
+	}
+
     /**
      * 批量导出产品表
      *
@@ -81,7 +99,7 @@ public class ProductController {
      * @return model and view
      * @throws UnsupportedEncodingException the unsupported encoding exception
      */
-    @RequestMapping(value = "/template/download/type", method = RequestMethod.POST)
+    @RequestMapping(value = "/template/download/type", method = RequestMethod.GET)
 	public ModelAndView exportProductsStandard(@RequestParam("type") String type, @RequestParam(required = false, value = "isAjax", defaultValue = "false")Boolean isAjax, HttpServletRequest request, @RequestParam(value = "keyword", required = false) String keyword) throws UnsupportedEncodingException {
 		HttpSession session = request.getSession();
 		ModelAndView modelAndView = new ModelAndView();
@@ -96,14 +114,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;
@@ -116,13 +134,13 @@ public class ProductController {
      * @param ids the ids
      */
     @RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
-	public void deleteBatch(@PathVariable("ids") String ids) {
+	public void deleteBatch(@PathVariable("ids") String ids , Integer isPerson) {
 		String[] idstrs = ids.split(SplitChar.COMMA);
 		List<Long> idsLong = new ArrayList<Long>();
 		for (String id : idstrs) {
 			idsLong.add(Long.parseLong(id));
 		}
-		productService.deleteBatch(idsLong);
+		productService.deleteBatch(idsLong, isPerson);
 	}
 
     /**
@@ -197,19 +215,123 @@ public class ProductController {
 		return productService.updateMatch(json);
 	}
 
+	/**
+	 * 统计数量
+	 *
+	 * @param isPerson 是否个人
+	 * @return
+	 */
+	@RequestMapping(value = "/count", method = RequestMethod.GET)
+	public Map<String, Integer> getProductCount(Integer isPerson){
+		logger.info("统计个人或企业非标与标准数量");
+		return productService.getProductCount(isPerson);
+	}
+
+
 	/**
 	 * 批量删除所有的非标的产品
 	 */
 	@RequestMapping(value = "/unstandard", method = RequestMethod.DELETE)
-	private ResultMap deleteUnstandardByBatch() {
-		 return productService.deleteBatch(ProductConstant.NSTANDARD);
+	private ResultMap deleteUnstandardByBatch(Integer isPerson) {
+		 return productService.deleteBatch(ProductConstant.NSTANDARD, isPerson);
 	}
 
 	/**
 	 * 批量删除所有的标准的产品
 	 */
 	@RequestMapping(value = "/standard", method = RequestMethod.DELETE)
-	private ResultMap deleteStandardByBatch() {
-		return productService.deleteBatch(ProductConstant.STANDARD);
+	private ResultMap deleteStandardByBatch(Integer isPerson) {
+		return productService.deleteBatch(ProductConstant.STANDARD, isPerson);
+	}
+
+	/**
+	 * 匹配非标产品,非标上架版本
+	 * @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 V_ProductPrivate getProducts(@PathVariable("id") Long id) {
+		return productService.getProductById(id);
+	}
+
+	/**
+	 * 通过物料id获取物料交易详情
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/detail/{id}", method = RequestMethod.GET)
+	private ProductDetail getbyProductId(@PathVariable("id") Long id) {
+		return productService.findByProductId(id);
+	}
+
+	/**
+	 * 提交申请
+	 * @param jsonObject
+	 * @return
+	 */
+	@RequestMapping(value = "/validition", method = RequestMethod.POST)
+	private ResultMap validitionStandard(@RequestBody JSONObject jsonObject) {
+		return productService.validitonStandard(jsonObject);
+	}
+
+	/**
+	 * 保存物料交易详情
+	 * @param productId
+	 * @param goods
+	 * @return
+	 */
+	@RequestMapping(value = "/savedetail/{productId}", method = RequestMethod.POST)
+	public ProductDetail saveDetail(@PathVariable("productId") Long productId, @RequestBody Goods goods) {
+		return productService.saveDetail(productId, goods);
+	}
+
+	/**
+	 * 用户批量上架
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/batch", method = RequestMethod.PUT)
+	public ResultMap batchPutOn(Integer standard, String ids) {
+		return productService.batchPutOn(standard, ids);
 	}
 }

+ 40 - 18
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ReleaseProductByBatchController.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.prod.commodity.controller;
 
 import com.uas.platform.b2c.common.base.model.FileUpload;
+import com.uas.platform.b2c.core.constant.IntegerConstant;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
@@ -105,13 +106,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());
         }
@@ -152,6 +155,18 @@ public class ReleaseProductByBatchController {
         return releaseProductByBatchService.publishByBatch(batch);
     }
 
+    /**
+     * 通过batch批量导入个人产品库
+     *
+     * @param batch the batch 发布的批次号
+     * @return string
+     */
+    @RequestMapping(value = "/batchRelease/person", method = RequestMethod.POST)
+    public String batchReleasePerson(String batch) {
+        logger.log("批量上架模块", "批量导入个人产品库:" + batch + "的内容");
+        return releaseProductByBatchService.publishByBatchPerson(batch);
+    }
+
     /**
      * 通过发布者的UU查询所有的产品的信息
      *
@@ -188,7 +203,7 @@ public class ReleaseProductByBatchController {
      * @return model map
      */
     @RequestMapping(value = "/release/excel", method = RequestMethod.POST)
-    public ModelMap releaseByExcel(FileUpload uploadItem, @RequestParam("selfSale") Boolean selfSale, String currency) {
+    public ModelMap releaseByExcel(FileUpload uploadItem, @RequestParam("selfSale") Boolean selfSale, String currency, Integer isPerson) {
         ModelMap map = new ModelMap();
         String fileName = uploadItem.getFile().getOriginalFilename();
         String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
@@ -201,9 +216,9 @@ 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);
+            map = releaseProductByBatchService.releaseByWorkbook(workbook, selfSale, currency, isPerson);
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -234,7 +249,7 @@ public class ReleaseProductByBatchController {
      * @return model and view
      */
     @RequestMapping(value = "/release/failure/xls", method = RequestMethod.GET)
-    public ModelAndView exportOrderses(String batch, HttpServletRequest request, @RequestParam(defaultValue = "false") Boolean isAjax, String currency) {
+    public ModelAndView exportOrderses(String batch, HttpServletRequest request, @RequestParam(defaultValue = "false") Boolean isAjax, String currency, Integer isPerson) {
         ModelAndView modelAndView = new ModelAndView();
         HttpSession session = request.getSession();
         Object loading = session.getAttribute("load-error-ing");
@@ -255,12 +270,16 @@ public class ReleaseProductByBatchController {
         }
         modelAndView.addObject("data", releaseProductByBatchService.findFailureReleaseProductByBatch(batch));
         String url ="";
-        if(Currency.USD.equals(currency)) {
-            url = "classpath:jxls-tpl/trade/releaseByBatchError-usd";
-        }else {
-            url = "classpath:jxls-tpl/trade/releaseByBatchError-rmb";
+        if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
+            url = "classpath:jxls-tpl/trade/releaseByBatchError-person";
+        } else {
+            if (Currency.USD.equals(currency)) {
+                url = "classpath:jxls-tpl/trade/releaseByBatchError-usd";
+            } 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;
@@ -273,15 +292,18 @@ public class ReleaseProductByBatchController {
      * @return model and view
      */
     @RequestMapping(value = "/release/template", method = RequestMethod.GET)
-    public ModelAndView exportOrderses(String currency) {
+    public ModelAndView exportOrderses(String currency, Integer isPerson) {
         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", "优软商城库存上传模板"));
-        }
-
         logger.log("商品批次", "下载批量上架商品的Excel模板");
+        if (null != isPerson && isPerson.intValue() == IntegerConstant.YES_SHORT.intValue()) {
+            modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/trade/releaseByBatch-person", "个人产品导入模板-优软商城"));
+            return 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", "产品导入模板-优软商城"));
+        }
         return modelAndView;
     }
 }

+ 55 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/controller/UASBatchPutOnPropertyController.java

@@ -0,0 +1,55 @@
+package com.uas.platform.b2c.prod.commodity.controller;
+
+import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
+import com.uas.platform.b2c.prod.commodity.model.UASBatchPutOnProperty;
+import com.uas.platform.b2c.prod.commodity.service.UASBatchPutOnPropertyService;
+import com.uas.platform.b2c.trade.support.ResultMap;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * UAS批量上架的参数设置
+ *
+ * @author yuj 2018-01-19 14:05
+ */
+@RestController
+@RequestMapping(value = "/UASBatchPutOnProperty")
+public class UASBatchPutOnPropertyController {
+
+    private final UASBatchPutOnPropertyService uasBatchPutOnPropertyService;
+
+    private static final UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+    @Autowired
+    public UASBatchPutOnPropertyController(UASBatchPutOnPropertyService uasBatchPutOnPropertyService) {
+        this.uasBatchPutOnPropertyService = uasBatchPutOnPropertyService;
+    }
+
+    /**
+     * 保存用户配置的信息
+     *
+     * @param property 传入的数据
+     * @return
+     */
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public ResultMap save(@RequestBody UASBatchPutOnProperty property) {
+        ResultMap resultMap = uasBatchPutOnPropertyService.save(property);
+        logger.log("UAS批量上架", "保存批量上架的配置信息");
+        return resultMap;
+    }
+
+    /**
+     * 获取的商城的配置信息
+     *
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.GET)
+    public UASBatchPutOnProperty getUASBatchPutOnProperty() {
+        logger.log("UAS批量上架", "获取配置信息");
+        return uasBatchPutOnPropertyService.get();
+    }
+}

+ 200 - 2
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;
@@ -409,7 +411,7 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      * @param storeUuid 店铺UUID
      * @return the set
      */
-    @Query(value = "select distinct g.kindUuid from Goods g where g.storeid = :storeUuid and g.status=601")
+    @Query(value = "select distinct g.kindUuid from Goods g where g.storeid = :storeUuid and g.status=601 and g.kindUuid is not null")
 	Set<Long> findAllKindsByStoreUuid(@Param("storeUuid") String storeUuid);
 
     /**
@@ -468,6 +470,34 @@ 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);
 
+    /**
+     * 查询物料id和指定状态的商品
+     *
+     * @param id
+     * @param statusList
+     * @return
+     */
+    @Query(value = "select g from Goods g where g.productid =:productId and g.status in :status order by g.id desc")
+    List<Goods> findByProductIdInStatus(@Param("productId") Long id, @Param("status") List<Integer> statusList);
+
+	/**
+	 * 根据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 +505,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);
 
     /**
@@ -495,4 +525,172 @@ public interface GoodsDao extends JpaSpecificationExecutor<Goods>, JpaRepository
      * @return list
      */
     List<Goods> findByEnUU(Long enuu);
+
+    /**
+     * 根据企业uu和器件uuid获取goods信息
+     * @return
+     */
+    List<Goods> findByEnUUAndUuidOrderByReserveAsc(Long enuu, String uuid);
+
+
+    /**
+     * 根据企业uu和器件uuid和状态获取商品总库存
+     * @param enuu
+     * @param uuid
+     * @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);
+
+	/**
+	 * 根据以下条件查找对应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);
+
+    /**
+     * 根据产品编号获取相同标签的信息
+     * @param productid
+     * @param tag
+     * @return
+     */
+    @Query(value = "select g from Goods g where g.productid =:productid and g.tag =:tag")
+    List<Goods> findGoodsByProductidAndTag(@Param("productid") Long productid, @Param("tag") String tag);
+
+    /**
+     * 根据productid 获取已经存在标签
+     *
+     * @param productid
+     * @return
+     */
+    @Query(value = "select g.tag from Goods g where g.productid =:productid")
+    List<String> findTagByProductid(@Param("productid") Long productid);
+
+    /**
+     *
+     * @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();
+
+    /**
+     * 统计某一物料的在售数量
+     * @return
+     */
+    @Query(value = "select count(1) from Goods g where g.productid = :prid")
+    int findCountByProductid(@Param("prid") Long prid);
+
+    /**
+     * 分页获取产品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();
+
+    /**
+     * 产品点击次数加一
+     * @param batchCode
+     * @return
+     */
+    @Modifying
+    @Transactional
+    @Query( nativeQuery = true, value = "update trade$goods set go_visit_count = ifnull(go_visit_count, 0) + 1 where go_batchcode = :batchCode")
+    public void addVisitCount(@Param("batchCode") String batchCode);
+
+    /**
+     * 根据以下字段返回结果数
+     * @param enUU
+     * @param brandEn
+     * @param code
+     * @param tag
+     * @return
+     */
+    @Query(value = "select count(1) from Goods g where g.enUU = :enUU and g.brandNameEn = :brandEn and g.code = :code and g.tag = :tag")
+    int findCountByTagInGoods(@Param("enUU") Long enUU, @Param("brandEn") String brandEn, @Param("code") String code, @Param("tag") String tag);
+
+    /**
+     * 分页获取库存的信息
+     *
+     * @param start 起始值
+     * @param length 结束值
+     * @return List<Goods>
+     */
+    @Query(value = "select * from trade$goods order by go_id desc limit :start, :length", nativeQuery = true)
+    List<Goods> findGoodsByPage(@Param("start") Long start, @Param("length") Long length);
+
+    /**
+     * 获取数据总的在售信息
+     *
+     * @return
+     */
+    @Query(value = "select count(1) from Goods")
+    Long getCountGoods();
 }

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

@@ -48,7 +48,7 @@ public interface GoodsHistoryDao extends JpaSpecificationExecutor<GoodsHistory>,
      * @param batchCode the batch code 批次号
      * @return the goods history
      */
-    @Query(value = "select g from GoodsHistory g where g.batchCode = :batchCode and g.operateDate = (select max(c.operateDate) from GoodsHistory c where c.batchCode = :batchCode)")
+    @Query(value = "select * from trade$goods_history where go_batchcode = :batchCode order by log_operate_date desc LIMIT 0, 1", nativeQuery = true)
 	GoodsHistory findNewByBatchCode(@Param("batchCode") String batchCode);
 
     /**

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