Browse Source

Merge branch 'dev-mysql' into feature-newHome

# Conflicts:
#	src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
#	src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
#	src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
wangdy 8 years ago
parent
commit
6c1c48d83b
100 changed files with 2739 additions and 1102 deletions
  1. 33 1
      pom.xml
  2. 2 1
      src/main/java/com/uas/platform/b2c/advertise/ad/api/CarouselsController.java
  3. 2 1
      src/main/java/com/uas/platform/b2c/advertise/ad/service/CarouselService.java
  4. 24 4
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/CarouselsServiceImpl.java
  5. 25 2
      src/main/java/com/uas/platform/b2c/common/account/controller/AuthenticationController.java
  6. 11 2
      src/main/java/com/uas/platform/b2c/common/account/controller/EnterpriseController.java
  7. 21 0
      src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java
  8. 34 30
      src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java
  9. 15 0
      src/main/java/com/uas/platform/b2c/common/account/dao/UserLoginTimeDao.java
  10. 4 4
      src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java
  11. 19 4
      src/main/java/com/uas/platform/b2c/common/account/model/User.java
  12. 100 15
      src/main/java/com/uas/platform/b2c/common/account/model/UserInfo.java
  13. 89 0
      src/main/java/com/uas/platform/b2c/common/account/model/UserLoginTime.java
  14. 3 0
      src/main/java/com/uas/platform/b2c/common/account/service/EnterpriseService.java
  15. 5 0
      src/main/java/com/uas/platform/b2c/common/account/service/impl/EnterpriseServiceImpl.java
  16. 5 10
      src/main/java/com/uas/platform/b2c/common/account/service/impl/UserServiceImpl.java
  17. 16 8
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java
  18. 7 8
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  19. 3 3
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  20. 232 221
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  21. 32 0
      src/main/java/com/uas/platform/b2c/common/search/util/CollectField.java
  22. 235 0
      src/main/java/com/uas/platform/b2c/common/search/util/PageParams.java
  23. 100 0
      src/main/java/com/uas/platform/b2c/common/search/util/SPage.java
  24. 96 0
      src/main/java/com/uas/platform/b2c/common/search/util/Sort.java
  25. 2 2
      src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
  26. 23 10
      src/main/java/com/uas/platform/b2c/external/erp/commodity/service/impl/ProductDetailERPServiceImpl.java
  27. 8 12
      src/main/java/com/uas/platform/b2c/external/erp/order/service/impl/OrderServiceImpl.java
  28. 2 1
      src/main/java/com/uas/platform/b2c/external/erp/prod/service/impl/ProdServiceImpl.java
  29. 4 3
      src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentController.java
  30. 3 2
      src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentService.java
  31. 55 26
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java
  32. 9 0
      src/main/java/com/uas/platform/b2c/fa/settlement/service/BillSubmitService.java
  33. 39 1
      src/main/java/com/uas/platform/b2c/fa/settlement/service/impl/BillSubmitServiceImpl.java
  34. 53 0
      src/main/java/com/uas/platform/b2c/logistics/constant/TipType.java
  35. 9 0
      src/main/java/com/uas/platform/b2c/logistics/controller/DistributionRuleController.java
  36. 36 0
      src/main/java/com/uas/platform/b2c/logistics/controller/TipRecordController.java
  37. 8 0
      src/main/java/com/uas/platform/b2c/logistics/dao/DistributionRuleDao.java
  38. 31 0
      src/main/java/com/uas/platform/b2c/logistics/dao/TipRecordDao.java
  39. 84 0
      src/main/java/com/uas/platform/b2c/logistics/model/TipRecord.java
  40. 24 0
      src/main/java/com/uas/platform/b2c/logistics/model/UsableRuleInfo.java
  41. 7 0
      src/main/java/com/uas/platform/b2c/logistics/service/DistributionRuleService.java
  42. 22 0
      src/main/java/com/uas/platform/b2c/logistics/service/TipRecordService.java
  43. 42 11
      src/main/java/com/uas/platform/b2c/logistics/service/impl/DistributionRuleServiceImpl.java
  44. 63 0
      src/main/java/com/uas/platform/b2c/logistics/service/impl/TipRecordServiceImpl.java
  45. 0 46
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  46. 39 41
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  47. 11 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/api/BrandController.java
  48. 14 1
      src/main/java/com/uas/platform/b2c/prod/product/brand/controller/BrandMapController.java
  49. 7 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
  50. 20 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/BrandTemp.java
  51. 2 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandMapService.java
  52. 6 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandService.java
  53. 44 4
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandMapServiceImpl.java
  54. 5 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandServiceImpl.java
  55. 12 0
      src/main/java/com/uas/platform/b2c/prod/product/component/api/ComponentController.java
  56. 10 44
      src/main/java/com/uas/platform/b2c/prod/product/component/controller/ComponentSubmitController.java
  57. 6 0
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentCrawlDao.java
  58. 8 0
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentDao.java
  59. 8 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java
  60. 7 0
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentService.java
  61. 9 8
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentSubmitService.java
  62. 2 2
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentGoodsServiceImpl.java
  63. 7 2
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentServiceImpl.java
  64. 329 301
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentSubmitServiceImpl.java
  65. 9 0
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/OrderServiceImpl.java
  66. 7 0
      src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseServiceImpl.java
  67. 1 1
      src/main/java/com/uas/platform/b2c/trade/order/status/OrderStatus.java
  68. 1 1
      src/main/java/com/uas/platform/b2c/trade/order/status/PurchaseStatus.java
  69. 17 0
      src/main/java/com/uas/platform/b2c/trade/presale/model/Cart.java
  70. 4 1
      src/main/java/com/uas/platform/b2c/trade/rate/service/impl/RateServiceImpl.java
  71. 6 1
      src/main/java/com/uas/platform/b2c/trade/support/CodeType.java
  72. 2 2
      src/main/resources/dev/sys.properties
  73. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatch-rmb.xls
  74. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-rmb.xls
  75. BIN
      src/main/resources/jxls-tpl/trade/releaseByBatchError-usd.xls
  76. BIN
      src/main/resources/jxls-tpl/trade/releasebyBatch-usd.xls
  77. 2 2
      src/main/resources/test/sys.properties
  78. 1 1
      src/main/webapp/resources/css/commonComponent.css
  79. 5 1
      src/main/webapp/resources/css/erp/align.css
  80. BIN
      src/main/webapp/resources/img/tour/1.gif
  81. BIN
      src/main/webapp/resources/img/tour/2.gif
  82. BIN
      src/main/webapp/resources/img/tour/3.gif
  83. BIN
      src/main/webapp/resources/img/tour/4.gif
  84. BIN
      src/main/webapp/resources/img/tour/4.png
  85. BIN
      src/main/webapp/resources/img/tour/5.gif
  86. BIN
      src/main/webapp/resources/img/tour/5.png
  87. 6 6
      src/main/webapp/resources/js/admin/controllers/product/UploadComponentCrawlCtrl.js
  88. 23 6
      src/main/webapp/resources/js/common/controllers/commonCtrls.js
  89. 95 0
      src/main/webapp/resources/js/common/directives.js
  90. 68 22
      src/main/webapp/resources/js/common/module/chat_web_module.js
  91. 1 1
      src/main/webapp/resources/js/common/query/chat.js
  92. 4 0
      src/main/webapp/resources/js/common/query/enterprise.js
  93. 15 0
      src/main/webapp/resources/js/common/query/logisticsPort.js
  94. 1 1
      src/main/webapp/resources/js/sale/app.js
  95. 1 1
      src/main/webapp/resources/js/usercenter/app.js
  96. 25 25
      src/main/webapp/resources/js/usercenter/controllers/forstore/account_manager_ctrl.js
  97. 225 194
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_cart_ctrl.js
  98. 1 0
      src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_home_ctrl.js
  99. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/order_detail_ctrl.js
  100. 35 4
      src/main/webapp/resources/js/usercenter/controllers/forstore/order_pay_ctrl.js

+ 33 - 1
pom.xml

@@ -316,7 +316,18 @@
 		<dependency>
 			<groupId>org.apache.poi</groupId>
 			<artifactId>poi</artifactId>
-			<version>3.9</version>
+			<version>3.17</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.poi</groupId>
+					<artifactId>poi</artifactId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<!-- BeeCloud支付集成SDK -->
 		<dependency>
@@ -432,6 +443,27 @@
 			<artifactId>classmate</artifactId>
 			<version>1.1.0</version>
 		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+		</dependency>
+		<!--Hutool POI工具类(对MS Office操作)-->
+		<!--<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.17</version>
+		</dependency>-->
+		<dependency>
+			<groupId>com.xiaoleilu</groupId>
+			<artifactId>hutool-poi</artifactId>
+			<version>3.2.2</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.apache.poi</groupId>
+					<artifactId>poi-ooxml</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
 	</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);
     }
 }

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

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

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

@@ -1,7 +1,9 @@
 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.service.UserService;
@@ -10,6 +12,7 @@ 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;
@@ -27,6 +30,9 @@ public class AuthenticationController {
 	@Autowired
 	private UserQuestionService userQuestionService;
 
+	@Autowired
+	private UserLoginTimeDao userLoginTimeDao;
+
 	@RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseBody
 	@ResponseStatus(value = HttpStatus.OK)
@@ -75,9 +81,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);
 		}
 	}

+ 11 - 2
src/main/java/com/uas/platform/b2c/common/account/controller/EnterpriseController.java

@@ -3,9 +3,8 @@ package com.uas.platform.b2c.common.account.controller;
 import com.uas.account.entity.UserSpaceDetail;
 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.core.support.SystemSession;
 import com.uas.platform.b2c.prod.store.service.StoreInService;
@@ -52,6 +51,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);
+	}
+
 	/**
 	 * 修改企业基本资料
 	 *

+ 21 - 0
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -2,9 +2,11 @@ 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.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 +26,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 +49,9 @@ public class SecurityController {
 	private UserService userService;
 	@Autowired
 	private SigninLogService signinLogService;
+	@Autowired
+	private UserLoginTimeDao userLoginTimeDao;
+
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
 	/**
@@ -281,6 +288,20 @@ public class SecurityController {
 						// 企业资料在所有系统公认的唯一标识,这里使用商业登记证号
 						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;
 						}
 					}

+ 34 - 30
src/main/java/com/uas/platform/b2c/common/account/controller/UserController.java

@@ -116,26 +116,27 @@ 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(final HttpSession session, final String password, final String newPassword,final Short secLevel) {
+	public ResponseEntity<String> updatePassword(final HttpSession session, final String password, final String newPassword, final Short secLevel) {
 		if (password.equals(newPassword)) {
 			throw new IllegalOperatorException("新密码与旧密码相同");
 		}
-		if(newPassword.length()<8 || newPassword.matches("^[0-9]*$") || newPassword.matches("^[A-Za-z]*$")){
-			throw new IllegalOperatorException("密码强度不够,请重新输入");
-		}
-		if(newPassword.length()>20){
-			throw new IllegalOperatorException("密码超过20位,请重新输入");
+		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());
 		if (!StringUtils.isEmpty(newPassword)) {
 			user.setPwdSecLevel(secLevel);
 			user = userService.updatePassword(user, password, newPassword);
-			if(sysUser.getEnterprise()!=null){
+			if (sysUser.getEnterprise() != null) {
 				user.setCurrentEnterprise(sysUser.getEnterprise().getUu());
 			}
 			session.setAttribute("user", user);
@@ -176,7 +177,7 @@ public class UserController {
 		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
 		Long checkTime = (Long)session.getAttribute("checkTime");
 		if (!StringUtils.isEmpty(checkTime)){
-			Long nowTime = new Date().getTime();
+			Long nowTime = System.currentTimeMillis();
 			if((nowTime-checkTime)<60 * 1000){
 				throw new IllegalOperatorException("验证码发送频繁...");
 			}
@@ -186,14 +187,14 @@ public class UserController {
 			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", new Date().getTime());
+				session.setAttribute("checkTime", System.currentTimeMillis());
 				session.setAttribute("newUserEmail",newUserEmail);
 				assert logger != null;
 				logger.log("用户信息", "发送用户邮箱地址,UU:" + user.getUserUU());
@@ -217,22 +218,22 @@ public class UserController {
 		Map<String,Object> result = new HashMap<String,Object>();
 		if (!StringUtils.isEmpty(checkCode) && !StringUtils.isEmpty(newUserEmail)) {
 			Long checkTime = (Long) session.getAttribute("checkTime");
-			Long nowTime = new Date().getTime();
+			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", "验证码正确");
@@ -256,7 +257,7 @@ public class UserController {
 		if (userEmail!=null && userEmail.equals(newUserEmail)) {
 			throw new IllegalOperatorException("新邮箱地址与旧邮箱地址相同");
 		}
-		//正则校验邮箱地址
+		// 正则校验邮箱地址
 		if(!newUserEmail.matches("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+")){
 			throw new IllegalOperatorException("新邮箱地址格式不正确");
 		}
@@ -322,13 +323,13 @@ public class UserController {
 		User user = userService.findUserPwdByUserUU(sysUser.getUserUU());
 		Long checkTime = (Long)session.getAttribute("telCheckTime");
 		if (!StringUtils.isEmpty(checkTime)){
-			Long nowTime = new Date().getTime();
+			Long nowTime = System.currentTimeMillis();
 			if((nowTime-checkTime)<60 * 1000){
 				throw new IllegalOperatorException("验证码发送频繁...");
 			}
 		}
 		if (!StringUtils.isEmpty(newUserTel)) {
-			//页面Token校验
+			// 页面Token校验
 			String pageToken = (String) session.getAttribute("pageToken");
 			if (pageToken == null || pageToken.equals("")) {
 				throw new IllegalOperatorException("页面信息获取失败!");
@@ -337,7 +338,7 @@ public class UserController {
 			try {
 				smsService.send("1eba04ae-f3d9-4105-ad32-0196309fabb3", newUserTel, new Object[] {checkCode});
 				session.setAttribute("telCheckCode", checkCode);
-				session.setAttribute("telCheckTime", new Date().getTime());
+				session.setAttribute("telCheckTime", System.currentTimeMillis());
 				session.setAttribute("newUserTel", newUserTel);
 				assert logger != null;
 				logger.log("用户信息", "发送手机验证码,UU:" + user.getUserUU());
@@ -360,22 +361,22 @@ public class UserController {
 		Map<String, Object> result = new HashMap<String, Object>();
 		if (!StringUtils.isEmpty(telCheckCode) && !StringUtils.isEmpty(newUserTel)) {
 			Long checkTime = (Long) session.getAttribute("telCheckTime");
-			Long nowTime = new Date().getTime();
+			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", "验证码正确");
@@ -399,11 +400,11 @@ public class UserController {
 		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("验证码错误");
@@ -418,6 +419,7 @@ public class UserController {
 			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());
@@ -481,7 +483,7 @@ public class UserController {
 		if (userPay != null && userPay.equals(newUserPay)) {
 			throw new IllegalOperatorException("新密码与旧密码相同");
 		}
-		//新密码正则校验
+		// 新密码正则校验
 		if(!newUserPay.matches("^\\d{6}$")){
 			throw new IllegalOperatorException("新密码格式不正确...");
 		}
@@ -765,10 +767,12 @@ public class UserController {
 	 * @return
 	 */
 	@RequestMapping(value = "/updateIdEnable", method = RequestMethod.POST)
-	public ResponseEntity<String> updateIdEnable(final User user,HttpServletRequest request) {
-		User newUser = userService.saveRealAuth(user);
+	public ResponseEntity<String> updateIdEnable(final User user) {
+		User oldUser = userService.findUserByUserUU(user.getUserUU());
+		oldUser.setIdEnable(user.getIdEnable());
+		User newUser = userService.saveRealAuth(oldUser);
 		assert logger != null;
-		logger.log("用户信息", SystemSession.getUser().getUserUU()+"后台审核实名认证,UU:" + newUser.getUserUU());
+		logger.log("用户信息", SystemSession.getUser().getUserUU()+"后台审核实名认证,UU:" +  newUser.getUserUU());
 		return new ResponseEntity<String>(HttpStatus.OK);
 	}
 }

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

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

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

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

@@ -2,7 +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.Date;
+
+import java.util.*;
+
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
@@ -13,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;
 
 /**
  * 用户信息
@@ -128,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;
+
 	/**
 	 * 所属当前登录公司
 	 */
@@ -426,6 +433,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号
 	 *

+ 100 - 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.*;
 
 /**
  * 用户简单信息,前台程序使用
@@ -37,20 +34,34 @@ 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());
 				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;
@@ -111,7 +122,7 @@ public class UserInfo {
 
 	private Short idEnable;
 
-	private List<Map<String, Object>> enterprises;
+	private List<SimpleEnterpriseInfo> enterprises;
 
 	private boolean havePayPwd;
 
@@ -121,6 +132,8 @@ public class UserInfo {
 
 	private Long lastLoginTime;
 
+	private Set<UserLoginTime> userLoginTimeSet;
+
 	public Long getLastLoginTime() {
 		return lastLoginTime;
 	}
@@ -217,11 +230,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;
 	}
 
@@ -234,3 +255,67 @@ public class UserInfo {
 	}
 
 }
+
+/**
+ * 返回给前端的简单企业信息数据
+ */
+class SimpleEnterpriseInfo{
+	String enName;
+	Long uu;
+	Short isVendor;
+	String enSaasUrl;
+	boolean current;
+	Long lastLoginTime;
+
+	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;
+	}
+}

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

+ 3 - 0
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;
@@ -19,6 +20,8 @@ public interface EnterpriseService {
 	 * @return List<EnterpriseUas>
 	 */
 	List<Enterprise> getEnterpriseInfos(List<Long> enuus);
+
+	public UserBaseInfo getEnterpriseAdminInfo(Long uu);
 	
 	// 得到企业是否有需要结算单据状态
 	public Enterprise getReceiptStatus(Enterprise enter);

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

@@ -56,6 +56,11 @@ public class EnterpriseServiceImpl implements EnterpriseService{
 		return enterpriseDao.findByUus(enuus);
 	}
 
+	@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());

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

@@ -439,12 +439,7 @@ public class UserServiceImpl implements UserService {
 
 	@Override
 	public User saveRealAuth(User user) {
-		User sysUser = userDao.findOne(user.getUserUU());
-		if(sysUser==null){
-			throw new IllegalOperatorException("找不到用户");
-		}
-		sysUser.setIdEnable(user.getIdEnable());
-		return userDao.save(sysUser);
+		return userDao.save(user);
 	}
 
 	@Override
@@ -462,14 +457,14 @@ public class UserServiceImpl implements UserService {
 
 	@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());
@@ -489,9 +484,9 @@ public class UserServiceImpl implements UserService {
 		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);

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

@@ -66,23 +66,31 @@ public class UserServiceImpl implements UserService {
 //        }
 
     }
-    private void oneSave(User user , com.uas.platform.b2c.common.account.model.User u){
-        u.setUserPwd(user.getPassword());
-        u.setUserName(user.getName());
-        u.setUserTel(user.getUid());
+    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());
+        if (user.getSecondUID() != null) {
+            u.setUserEmail(user.getSecondUID());
+        }
         if (!StringUtils.isEmpty(user.getDialectUID())) {
             u.setUserUU(Long.valueOf(user.getDialectUID()));
         }
-        if (user.getPwdSecLevel()!=null) {
+        if (user.getPwdSecLevel() != null) {
             u.setPwdSecLevel(user.getPwdSecLevel());
         }
-        if(user.getLastLoginTime()!=null){
+        if (user.getLastLoginTime() != null) {
             u.setLastLoginTime(user.getLastLoginTime());
         }
         Enterprise enterprise = null;
-        if(user.getSpaceDialectUID()!=null){
+        if (user.getSpaceDialectUID() != null){
             enterprise = enterpriseDao.findByUu(Long.valueOf(user.getSpaceDialectUID()));
         }
         if (null != enterprise) {

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

@@ -2,16 +2,15 @@ package com.uas.platform.b2c.common.search.rpc.service.Impl;
 
 
 import com.alibaba.fastjson.JSONArray;
-import com.uas.platform.b2c.common.search.constant.SearchParam;
 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;
@@ -93,14 +92,14 @@ public class SearchServiceImpl implements SearchService{
     }
 
     @Override
-    public SPage<Map<String, Object>> getBrands(String keyword, Integer page, Integer size) throws SearchException {
+    public SPage<Map<String, List<Integer>>> 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, Object>> sPage = FastjsonUtils.fromJson(str, SPage.class);
+                SPage<Map<String, List<Integer>>> sPage = FastjsonUtils.fromJson(str, SPage.class);
                 return sPage;
             }catch (Exception e) {
                 e.printStackTrace();
@@ -110,7 +109,7 @@ public class SearchServiceImpl implements SearchService{
     }
 
     @Override
-    public Map<String, Object> getComponentIds(String keyword, SearchParam var2) throws SearchException {
+    public Map<String, Object> getComponentIds(String keyword, PageParams var2) throws SearchException {
         Map<String, Object> map = new HashedMap();
         map.put("keyword", keyword);
         map.put("params", FlexJsonUtils.toJsonDeep(var2));
@@ -346,7 +345,7 @@ public class SearchServiceImpl implements SearchService{
     }
 
     @Override
-    public Map<String, Object> getGoodsIds(String keyword, SearchParam var2) throws SearchException {
+    public Map<String, Object> getGoodsIds(String keyword, PageParams var2) throws SearchException {
         Map<String, Object> map = new HashedMap();
         map.put("keyword", keyword);
         map.put("params", FlexJsonUtils.toJsonDeep(var2));

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

@@ -7,9 +7,9 @@ package com.uas.platform.b2c.common.search.rpc.service;
  */
 import com.uas.platform.b2c.common.search.constant.SearchParam;
 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;

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

@@ -1,5 +1,6 @@
 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;
@@ -20,10 +21,10 @@ 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;
@@ -71,51 +72,55 @@ public class SearcherServiceImpl implements SearcherService {
 	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;
 
-	/**
-	 * 智能搜索品牌
-	 *
-	 * @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,1,1024*1024*1024);
-		} catch (SearchException e) {
-			throwSystemException(e);
-		}
-		map.put("brands", brands.getContent());// 结果集
-		map.put("total", brands.getTotalElement());// 结果总数
-		return map;
-	}
+    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, List<Integer>>> 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;
+    }
 
 	/**
 	 * 首字母搜索器件
@@ -246,190 +251,196 @@ public class SearcherServiceImpl implements SearcherService {
 			map.put("components", components);// 当前页器件内容
 		}
 
-		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())) == null ? null: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 SearchParam convertPageParams(PageParams params) {
-		PageInfo pageinfo = new PageInfo(params);
-		SearchParam pageParams = new SearchParam();
-		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(SearchParam.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>> 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>> 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 int deleteSearchHistoryByuserUUAndenUU() {

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

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

@@ -157,9 +157,9 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
             if (user != null) {
                 user.setIp(AgentUtils.getIp(request));
                 request.getSession().setAttribute("user", user);
-                setGrantedAuthorities(user);
             }
         }
+        setGrantedAuthorities(user);
         if (user != null) {
             SystemSession.setUser(user);
             accessDecision(request, user);
@@ -176,7 +176,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
         }
         Iterator<ConfigAttribute> iterator = configAttributes.iterator();
         String needPermission = null;
-        if (!authorities.containsKey(user.getUserUU())) {
+        if (null == authorities || !authorities.containsKey(user.getUserUU())) {
             setGrantedAuthorities(user);
         }
         Collection<GrantedAuthority> userAuthorities = authorities.get(user.getUserUU());

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

@@ -3,9 +3,12 @@ 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;
@@ -13,8 +16,8 @@ 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 org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 
@@ -44,7 +47,12 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
     @Autowired
     private EnterpriseService enterpriseService;
 
-    private static final Logger logger = LoggerFactory.getLogger(ProductDetailERPServiceImpl.class);
+    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) {
@@ -53,21 +61,25 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
         for (ProductDetailERP productDetailERP : productDetailERPList) {
             ProductDetail productDetail = ModelConverter.convert(productDetailERP);
 
+            List<Product> products = productDao.getProductByEnUUAndProdNum(enuu, productDetail.getCode());
+            if (!CollectionUtils.isEmpty(products)) {
+                productDetail.setProductId(products.get(0).getId());
+            }
+            // 如果已存在物料交易信息删除之前那一条,保存新的物料交易信息
             ProductDetail productDetailExist = productDetailDao.findByProductId(productDetail.getProductId());
             if (productDetailExist != null) {
-                List<Product> products = productDao.getProductByEnUUAndProdNum(enuu, productDetail.getCode());
-                if (!CollectionUtils.isEmpty(products)) {
-                    productDetail.setProductId(products.get(0).getId());
-                }
-                productDetails.add(productDetail);
+                productDetailDao.delete(productDetailExist);
             }
+            productDetails.add(productDetail);
         }
         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();
     }
 
@@ -75,7 +87,6 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
     public void updateReserve(List<ProductDetailERP> productDetailERPList) {
         List<ProductDetail> productDetails = new ArrayList<ProductDetail>();
         Long enuu = SystemSession.getUser().getEnterprise().getUu();
-        logger.info("size : " + productDetailERPList.size());
         for (ProductDetailERP productDetailERP : productDetailERPList) {
             List<Product> products = productDao.getProductByEnUUAndProdNum(enuu, productDetailERP.getCode());// 获取对应商城物料信息
             if (!CollectionUtils.isEmpty(products)) {
@@ -104,6 +115,8 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
                                 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());
                                     goodsService.updateGoods(nowGood, good);
                                     goodsService.updateComponentTradeInfos(nowGood.getUuid());
                                     break;
@@ -124,7 +137,7 @@ public class ProductDetailERPServiceImpl implements ProductDetailERPService {
                 }
             }
         }
-
+        logger.log("物料详情", "更新物料库存信息,企业:" + SystemSession.getUser().getEnterprise().getEnName() + ",数量:" + productDetails.size());
         productDetailDao.save(productDetails);
     }
 }

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

@@ -33,7 +33,6 @@ 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;
@@ -103,10 +102,8 @@ public class OrderServiceImpl implements OrderService {
 
 		List<Order> orders = new ArrayList<Order>();
 		String sourceapp = "ERP";
-		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		loggerInfo.info(String.format(" erp总共下载订单数 %s", orders.size()));
+        Date startDate = new Date();
 		for (Purchase purchase : purcs) {
-			Date startDate = new Date();
 			boolean codeExists = false;
 			Order order = ModelConverter.getOrder(purchase);
 			UserBaseInfo buyer = userBaseInfoDao.findUserByUserUU(purchase.getBuyeruu());
@@ -128,10 +125,11 @@ public class OrderServiceImpl implements OrderService {
 			if (codeExists) {
 				orders.add(order);
 			}
-
-			Date endDate = new Date();
-			loggerInfo.info(String.format("处理历时" + (endDate.getTime() - startDate.getTime()) + "毫秒"));
 		}
+        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;
 	}
 
@@ -174,6 +172,7 @@ public class OrderServiceImpl implements OrderService {
 
 	@Override
 	public Long findAdminuu() {
+		logger.log("销售订单", "获取企业商城管理员,企业:" + SystemSession.getUser().getEnterprise().getEnName());
 		return SystemSession.getUser().getEnterprise().getEnAdminuu();
 	}
 
@@ -181,14 +180,11 @@ public class OrderServiceImpl implements OrderService {
 	public boolean backOrder(long[] orderids) {
 		for (long orderid : orderids) {
 			Purchase purchase = purchaseDao.findOne(orderid);
-//			if (Status.CONFIRMED.value() == purchase.getStatus()) {// 将确认收款的订单生成出货单
-//				purchaseService.purToBeShiped(orderid);
-//			}
-
 			purchase.setSendstatus(Status.DOWNLOADED.value());
 			purchaseDao.save(purchase);
-
 		}
+		logger.log("销售订单", "回写已下载订单,企业:" + SystemSession.getUser().getEnterprise().getEnName() + "数量:" + orderids.length);
 		return true;
 	}
+
 }

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

@@ -39,7 +39,6 @@ public class ProdServiceImpl implements ProdService {
 
     private static final ErpB2cBufferedLogger logger = BufferedLoggerManager.getLogger(ErpB2cBufferedLogger.class);
 
-    // TODO
     private final Logger loggerOut = Logger.getLogger(getClass());
 
     @Override
@@ -71,6 +70,7 @@ public class ProdServiceImpl implements ProdService {
         productService.matchAll();// 匹配上传的物料
         Date end = new Date();
         loggerOut.info("匹配完成, 历时" + (start.getTime() - end.getTime())/1000 + "秒");
+        logger.log("物料资料", "ERP匹配上传物料,企业:" + SystemSession.getUser().getEnterprise().getEnName());
     }
 
     @Override
@@ -109,6 +109,7 @@ public class ProdServiceImpl implements ProdService {
         if (!CollectionUtils.isEmpty(storeIn)) {
             return url = "/store/" + storeIn.get(0).getUuid();
         }
+        logger.log("物料资料", "ERP获取店铺路径,企业:" + SystemSession.getUser().getEnterprise().getEnName());
         return url;
     }
 }

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

+ 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);
 
     /**
      * 采购单改价后更新分期信息

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

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

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

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

+ 0 - 46
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java

@@ -57,7 +57,6 @@ import com.uas.platform.core.persistence.criteria.SimpleExpression;
 import com.uas.platform.core.util.StringUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
-import org.apache.log4j.Logger;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -183,8 +182,6 @@ public class GoodsServiceImpl implements GoodsService {
 	@Autowired
 	private ProductDetailDao productDetailDao;
 
-	private final Logger logger = Logger.getLogger(getClass());
-
 	@Autowired
 	public GoodsServiceImpl(KindService kindService, StoreInDao storeInDao, StoreInService storeInService, ProductStandardPutOnInfoDao productStandardPutOnInfoDao, ProductDao productDao, BrowsingHistoryService browsingHistoryService, RecommendProductService recommendProductService) {
 		this.kindService = kindService;
@@ -1875,7 +1872,6 @@ public class GoodsServiceImpl implements GoodsService {
 	@Override
 	public ResultMap offShelfGoodsByProvider(String batchCodes) {
 		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		logger.info(String.format("%s 商城测试下架时间记录1", dateFormat.format(new Date())));
 		if (StringUtils.isEmpty(batchCodes)) {
 			return new ResultMap(CodeType.NO_INFO.code(), "待下架批次号字符串不能为空");
 		}
@@ -1887,11 +1883,8 @@ public class GoodsServiceImpl implements GoodsService {
 		List<String> batchCodeList = new ArrayList<>();
 
 		String storeUuid = "";
-		logger.info(String.format("%s 商城测试下架时间记录2", dateFormat.format(new Date())));
 		for (String batchCode : batchCodeArr) {
-			logger.info(String.format("%s 商城测试下架时间记录 调用下架方法开始", dateFormat.format(new Date())));
 			ResultMap resultMap = offShelfOneGoodsByProvider(batchCode);
-			logger.info(String.format("%s 商城测试下架时间记录  调用下架方法结束", dateFormat.format(new Date())));
 			if (resultMap.isSuccess()) {
 				Goods goods = (Goods) resultMap.getData();
 				uuids.add(goods.getUuid());
@@ -1901,17 +1894,13 @@ public class GoodsServiceImpl implements GoodsService {
 			}
 		}
 		for (String uuid : uuids) {
-			logger.info(String.format("%s 商城测试下架时间记录 更新器件库存信息 开始", dateFormat.format(new Date())));
 			updateComponentTradeInfos(uuid);
-			logger.info(String.format("%s 商城测试下架时间记录 更新器件库存信息 结束", dateFormat.format(new Date())));
 		}
 
 		if (!StringUtils.isEmpty(storeUuid)) {
-			logger.info(String.format("%s 商城测试下架时间记录 更新推荐库存信息开始", dateFormat.format(new Date())));
 			List<String> list = Arrays.asList(batchCodeArr);
 			Set<String> batchCodeSet = new HashSet<>(list);
 			recommendProductService.deleteProductsWhenSellerUpdateReserve(storeUuid, batchCodeSet);
-			logger.info(String.format("%s 商城测试下架时间记录 更新推荐库存信息结束", dateFormat.format(new Date())));
 		}
 
 		if (batchCodeList.size() == 0) {
@@ -1929,7 +1918,6 @@ public class GoodsServiceImpl implements GoodsService {
 	@Transactional
 	public ResultMap offShelfOneGoodsByProvider(String batchCode) {
 		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-		logger.info(String.format("%s 商城测试下架时间记录 进入下架方法", dateFormat.format(new Date())));
 		if (StringUtils.isEmpty(batchCode)) {
 			return new ResultMap(CodeType.NO_INFO.code(), "待下架批次号不能为空");
 		}
@@ -1948,26 +1936,11 @@ public class GoodsServiceImpl implements GoodsService {
 		}
 		goods.setStatus(Status.REMOVED.value());
 
-		logger.info(String.format("%s 商城测试下架时间记录 转历史库存 开始", dateFormat.format(new Date())));
 		GoodsHistory goodsHist = goodsHistoryService.converTGoodsHist(goods,
 				GoodsHistory.OperateType.Down.getPhrase());
-		logger.info(String.format("%s 商城测试下架时间记录 转历史库存 结束", dateFormat.format(new Date())));
 		goodsHist.setMessage(goodsHist.getMessage() + "该批次下架");
 		goodsHistoryService.save(goodsHist);
 
-//		ProductStandardPutOnInfo standardPutOnInfo = productStandardPutOnInfoDao.findOne(goods.getStandprodid());
-//		if(standardPutOnInfo != null) {
-//			standardPutOnInfo.setStatus(Status.REMOVED.value());
-//			standardPutOnInfo.setAvailableOnSale(NumberUtil.add(standardPutOnInfo.getAvailableOnSale(), standardPutOnInfo.getOnSaleQty()));
-//			standardPutOnInfo.setOnSaleQty(0.0d);
-//			productStandardPutOnInfoDao.save(standardPutOnInfo);
-//
-//			Product product = productDao.findOne(standardPutOnInfo.getProductid());
-//			product.setAvailableOnSale(standardPutOnInfo.getAvailableOnSale());
-//			product.setOnSaleQty(standardPutOnInfo.getOnSaleQty());
-//			productDao.save(product);
-//		}
-
 		//下架对应的批次
 		goodsDao.deleteByBatchCode(goods.getBatchCode());
 		return ResultMap.success(goods);
@@ -2291,28 +2264,11 @@ public class GoodsServiceImpl implements GoodsService {
 			histories.add(goodsHistory);
 			goodsUpdate.add(goods);
 
-//			ProductStandardPutOnInfo standardPutOnInfo = productStandardPutOnInfoDao.findOne(goods.getStandprodid());
-//			if(standardPutOnInfo != null) {
-//				standardPutOnInfo.setStatus(Status.REMOVED.value());
-//				standardPutOnInfo.setAvailableOnSale(NumberUtil.add(standardPutOnInfo.getAvailableOnSale(), standardPutOnInfo.getOnSaleQty()));
-//				standardPutOnInfo.setOnSaleQty(0.0d);
-//				productStandardPutOnInfoList.add(standardPutOnInfo);
-//
-//				Product product = productDao.findOne(standardPutOnInfo.getProductid());
-//				product.setAvailableOnSale(standardPutOnInfo.getAvailableOnSale());
-//				product.setOnSaleQty(standardPutOnInfo.getOnSaleQty());
-//				products.add(product);
-//			}else {
-//				throw new IllegalOperatorException("找不到对应的标准上架产品信息");
-//			}
-//			productStandardPutOnInfoService.updateAvailableQty(goods.getStandprodid(), goods.getReserve());
             uuids.add(goods.getUuid());
 		}
 
 		goodsDao.delete(goodsUpdate);
         goodsHistoryDao.save(histories);
-//		productDao.save(products);
-//		productStandardPutOnInfoDao.save(productStandardPutOnInfoList);
         for (String uuid : uuids) {
             updateComponentTradeInfos(uuid);
         }
@@ -2374,8 +2330,6 @@ public class GoodsServiceImpl implements GoodsService {
 		orderService.save(orders);
 		cartService.saveCart(carts);
 		browsingHistoryService.saveGoodsBrowsingHistoryList(browsingHistoryList);
-//		productStandardPutOnInfoService.save(putOnInfo);
-//		productService.save(product);
 		goodsHistoryService.save(goodsHistory);
 		return ResultMap.success(null);
 	}

+ 39 - 41
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java

@@ -296,13 +296,15 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 							// 输入负数
 							releaseProductByBatch.setMinBuyQty(releaseProductByBatch.getMinPackage());
 						}else {
-							Double rel_reserve = releaseProductByBatch.getReserve() == null ? 0 : releaseProductByBatch.getReserve();
-							int relVal = minBuy.compareTo(rel_reserve);
-							if(relVal > 0) {
-								releaseProductByBatch.setMinBuyQty(releaseProductByBatch.getReserve());
-							}else {
-								releaseProductByBatch.setMinBuyQty(minBuy);
-							}
+                            //临时隐藏,因为上架的文件的修改,导致这个逻辑暂时不用 2017-12-12
+//							Double rel_reserve = releaseProductByBatch.getReserve() == null ? 0 : releaseProductByBatch.getReserve();
+//							int relVal = minBuy.compareTo(rel_reserve);
+//							if(relVal > 0) {
+//								releaseProductByBatch.setMinBuyQty(releaseProductByBatch.getReserve());
+//							}else {
+//								releaseProductByBatch.setMinBuyQty(minBuy);
+//							}
+                            releaseProductByBatch.setMinBuyQty(minBuy);
 							if((releaseProductByBatch.getBreakUp() != null) && !releaseProductByBatch.getBreakUp()) {
 								double v = releaseProductByBatch.getMinBuyQty() % releaseProductByBatch.getMinPackage();
 								if(NumberUtil.compare(v, 0.0) != 0) {
@@ -359,7 +361,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					// 分段数量
 					List<GoodsQtyPrice> prices = new ArrayList<GoodsQtyPrice>();
 					Double[] priceMaxMinPrice = {Double.MAX_VALUE, Double.MIN_VALUE}; //最小价格,最大价格
-					for (int i = 0; i < 3; i++) {
+					for(int i = 0; i < 3; i++) {
 						//起始量必须等于最小起定量
 						readSectionPrice(row.getCell(12 + 2 * i), row.getCell(13 + 2 * i),
 								prices, releaseProductByBatch, r, (12 + 2 * i), priceMaxMinPrice, i);
@@ -462,37 +464,23 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	 * 分析分段的价格
  	 */
 	private List<GoodsQtyPrice> setPricesQty(List<GoodsQtyPrice> prices, ReleaseProductByBatch productByBatch) {
-		GoodsQtyPrice[] array = new GoodsQtyPrice[prices.size()];
-		prices.toArray(array);
-		Arrays.sort(array, new Comparator<GoodsQtyPrice>() {
-			@Override
-			public int compare(GoodsQtyPrice o1, GoodsQtyPrice o2) {
-				return NumberUtil.compare(o1.getEnd(), o2.getEnd());
-			}
-		});
-		List<GoodsQtyPrice> prices1 = Arrays.asList(array);
 		List<GoodsQtyPrice> prices2 = new ArrayList<>();
-		for (int j = 0; j < prices1.size(); j++) {
-			GoodsQtyPrice price = prices1.get(j);
-			if(j == 0) {
-				if(NumberUtil.compare(price.getEnd(), DoubleConstant.minReserve) > -1) {
-					price.setStart(DoubleConstant.minReserve);
-					prices2.add(price);
-				}
-			}else if (j < prices1.size() - 1) {
-				GoodsQtyPrice qtyPrice = prices1.get(j - 1);
-				if(NumberUtil.compare(qtyPrice.getEnd(), price.getEnd()) < 0 ) {
-					price.setStart(NumberUtil.add(qtyPrice.getEnd(), 1.0d));
-					prices2.add(price);
+		for (int j = 0; j < prices.size(); j++) {
+			GoodsQtyPrice price = prices.get(j);
+			if(j == prices.size() - 1) {
+				if(NumberUtil.compare(price.getStart(), DoubleConstant.maxReserve) > 0) {
+					productByBatch.addErrmsg("12:分段数量超过了我们设置的最大值");
 				}
-			}else if (j == prices1.size() - 1) {
 				price.setEnd(DoubleConstant.maxReserve);
-				if(prices1.size() == 1) {
-					price.setStart(DoubleConstant.minReserve);
+				prices2.add(price);
+			}else if(j < prices.size() - 1) {
+				GoodsQtyPrice qtyPrice = prices.get(j + 1);
+				if(NumberUtil.compare(qtyPrice.getStart(), price.getStart()) > 0) {
+					price.setEnd(NumberUtil.sub(qtyPrice.getStart(), 1.0d));
+					prices2.add(price);
 				}else {
-					price.setStart(NumberUtil.add(prices1.get(j - 1).getEnd(), 1.0d));
+					productByBatch.addErrmsg("8-12:后一个分段数量的起始值必须大于前一个分段的起始值");
 				}
-				prices2.add(price);
 			}
 		}
 		return prices2;
@@ -697,19 +685,29 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 	private void readSectionPrice(Cell cellQty, Cell cellPrice, List<GoodsQtyPrice> prices,
 			ReleaseProductByBatch releaseProductByBatch, int r, int num, Double[] priceMaxMinPrice, int i) {
 		// 先跟据币别判断对应的价格是否有空值
-		Object endQtyCellValue = readWorkBookCell(cellQty, Cell.CELL_TYPE_STRING, r, num);
-		releaseProductByBatch.setFragmentQty(StringUtilB2C.getStr(endQtyCellValue), i);
+		Object startQtyCellValue = readWorkBookCell(cellQty, Cell.CELL_TYPE_STRING, r, num);
+		releaseProductByBatch.setFragmentQty(StringUtilB2C.getStr(startQtyCellValue), i);
 
 		Object priceCellValue = readWorkBookCell(cellPrice, Cell.CELL_TYPE_NUMERIC, r, num + 1);
 		releaseProductByBatch.setFragmentPrice(StringUtilB2C.getStr(priceCellValue), i);
-		if ((endQtyCellValue != null)&&(isNumber(endQtyCellValue.toString())) && (NumberUtil.compare(Double.valueOf(endQtyCellValue.toString()), 0.0d) > 0)) {
-			Double end = Double.valueOf(endQtyCellValue.toString());
+		if ((startQtyCellValue != null)&&(isNumber(startQtyCellValue.toString())) && (NumberUtil.compare(Double.valueOf(startQtyCellValue.toString()), 0.0d) > 0)) {
+			Double start = Double.valueOf(startQtyCellValue.toString());
 			GoodsQtyPrice qtyPrice = new GoodsQtyPrice();
 			// 分段结束值 与最小库存比较
-			if (NumberUtil.compare(end, DoubleConstant.minReserve) < 0) {
-				return ;
+			if(releaseProductByBatch.getMinBuyQty() != null) {
+				if ((NumberUtil.compare(start, releaseProductByBatch.getMinBuyQty()) < 0) && (i != 0)) {
+					releaseProductByBatch.addErrmsg((num + 1) + ":分段数量必须大于起订量");
+				}else if((i == 0) && (NumberUtil.compare(start, releaseProductByBatch.getMinBuyQty()) > 0)) {
+					releaseProductByBatch.addErrmsg((num + 1) + ":分段数量必须小于等于起订量");
+				}
+			}
+			if(NumberUtil.compare(start, DoubleConstant.minReserve) < 0) {
+				releaseProductByBatch.addErrmsg((num + 1) + ":分段数量必须大于" + 1);
+			}else if(NumberUtil.compare(start, DoubleConstant.maxReserve) > 0){
+				releaseProductByBatch.addErrmsg((num + 1) + ":分段数量必须小于" + DoubleConstant.maxReserve);
 			}
-			qtyPrice.setEnd(end);
+
+			qtyPrice.setStart(start);
 
 			Double price = null;
 			if((priceCellValue != null)&&(isNumber(priceCellValue.toString()))) {

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

@@ -1,5 +1,6 @@
 package com.uas.platform.b2c.prod.product.brand.api;
 
+import com.uas.platform.b2c.core.support.log.ControllerUsageLog;
 import com.uas.platform.b2c.prod.product.brand.modal.Brand;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandMostSimpleInfo;
@@ -243,4 +244,14 @@ public class BrandController {
 	public List<BrandMostSimpleInfo> getBatchBrands(@RequestBody List<Long> batchIds) {
 		return brandService.getBatchBrandMostSimpleInfs(batchIds);
 	}
+
+	/**
+	 * 获取搜索量最高的2个品牌
+	 * @return 品牌信息
+	 */
+	@RequestMapping(value = "/mostSearchBrands", method = RequestMethod.GET)
+	@ControllerUsageLog(module = "品牌查询接口", detail = "获取搜索量最高的2个品牌")
+	public List<Brand> getMostSearchBrands() {
+		return brandService.getMostSearchBrands();
+	}
 }

+ 14 - 1
src/main/java/com/uas/platform/b2c/prod/product/brand/controller/BrandMapController.java

@@ -97,9 +97,22 @@ public class BrandMapController {
 		return mapService.deleteOneMap(id);
 	}
 
+	/**
+	 * 初始化品牌映射数据
+	 */
 	@RequestMapping(value = "/initMap", method = RequestMethod.POST)
-	public void initAllBrandMap(){
+	public void initAllBrandMap() {
 		logger.log("品牌映射", "品牌映射初始化");
 		mapService.initBrandMap();
 	}
+
+	/**
+	 * 根据enuu初始化品牌映射数据
+	 * @param enuu
+	 */
+	@RequestMapping(value = "/initMap/{enuu}", method = RequestMethod.GET)
+	public void initBrandMapByEnUU(@PathVariable Long enuu) {
+		logger.log("品牌映射", "品牌映射初始化");
+		mapService.initBrandMapByEnUU(enuu);
+	}
 }

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

@@ -82,6 +82,13 @@ public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository
 	@Transactional
 	@Query( nativeQuery = true, value = "update product$brand b set b.br_visit_count = ifnull(b.br_visit_count, 0) + 1 where b.br_uuid = :uuid")
 
+    /**
+     * 获取搜索量最高的2个品牌
+     * @return
+     */
+    @Query(nativeQuery = true , value = "select b from product$brand b order by br_search_count desc LIMIT 2)")
+    public List<Brand> findMostSearchBrands();
+
     public void addVisitCount(@Param("uuid") String uuid);
     /**
      * 分页根据首字母获取品牌信息

+ 20 - 0
src/main/java/com/uas/platform/b2c/prod/product/brand/modal/BrandTemp.java

@@ -29,6 +29,26 @@ public class BrandTemp {
 	@Column(name = "name_sd")
 	private String nameSd;
 
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (o == null || getClass() != o.getClass()) return false;
+
+		BrandTemp temp = (BrandTemp) o;
+
+		if (nameCd != null ? !nameCd.equals(temp.nameCd) : temp.nameCd != null)
+			return false;
+		return nameSd != null ? nameSd.equals(temp.nameSd) : temp.nameSd == null;
+
+	}
+
+	@Override
+	public int hashCode() {
+		int result = nameCd != null ? nameCd.hashCode() : 0;
+		result = 31 * result + (nameSd != null ? nameSd.hashCode() : 0);
+		return result;
+	}
+
 	public Long getId() {
 		return id;
 	}

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

@@ -38,4 +38,6 @@ public interface BrandMapService {
 	Object deleteOneMap(Long id);
 
 	void initBrandMap();
+
+	void initBrandMapByEnUU(Long enuu);
 }

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

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

+ 44 - 4
src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandMapServiceImpl.java

@@ -30,10 +30,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.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * 品牌映射服务的实现类
@@ -181,4 +178,47 @@ public class BrandMapServiceImpl implements BrandMapService{
 			}
 		}
 	}
+
+	@Override
+	public void initBrandMapByEnUU(Long enuu) {
+		List<BrandTemp> originalList = brandTempDao.getAllBySdNameNotNull();
+		Set<BrandTemp> convertList = new LinkedHashSet<>(originalList.size());
+		for (BrandTemp temp : originalList){
+			if (!temp.getNameCd().equals(temp.getNameSd())) { //相同的不记录
+				convertList.add(temp);
+			}
+		}
+		List<BrandMap> resultList = new ArrayList<>();
+
+		List<StoreIn> storeList = storeInDao.findByEnUU(enuu);
+		if (CollectionUtils.isEmpty(storeList)){
+			throw new IllegalOperatorException("对应的店铺信息丢失,请刷新重新");
+		}else{
+			StoreIn store = storeList.get(0);
+			for (BrandTemp temp : convertList){
+				List<Brand> brandList = brandDao.findByNameEn(temp.getNameSd());
+				if (!CollectionUtils.isEmpty(brandList)){
+					Brand brand = brandList.get(0);
+					BrandMap map = new BrandMap();
+					map.setNameStandardEn(temp.getNameSd());
+					map.setNameStandardCn(brand.getNameCn());
+					map.setBrandid(brand.getId());
+					map.setUuid(brand.getUuid());
+					map.setNameChildEn(temp.getNameCd());
+					map.setNameChildCn(temp.getNameCd());
+					map.setEnuu(store.getEnUU());
+					map.setEnName(store.getStoreName());
+					map.setType(store.getType());
+
+					User user = SystemSession.getUser();
+					map.setUserUU(user.getUserUU());
+					map.setOperateName(user.getUserName());
+					map.setOperateTime(new Date());
+
+					resultList.add(map);
+				}
+			}
+			brandMapDao.save(resultList);
+		}
+	}
 }

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

@@ -413,6 +413,11 @@ public class BrandServiceImpl implements BrandService {
 		return brandMostSimpleInfoDao.findBatchBrands(batchIds);
 	}
 
+	@Override
+	public List<Brand> getMostSearchBrands() {
+		return brandDao.findMostSearchBrands();
+	}
+
 	@Override
 	public void addVisitCount(String uuid) {
 		brandDao.addVisitCount(uuid);

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

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.prod.product.component.api;
 
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.support.log.ControllerUsageLog;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
 import com.uas.platform.b2c.prod.product.component.modal.Component;
@@ -277,4 +278,15 @@ public class ComponentController {
 	public List<ComponentInfo> getBatchBrands(@RequestBody List<Long> batchIds) {
 		return componentService.getBatchComponents(batchIds);
 	}
+
+
+	/**
+	 * 获取搜索量最高的2个器件
+	 * @return 品牌信息
+	 */
+	@RequestMapping(value = "/mostSearchComponent", method = RequestMethod.GET)
+	@ControllerUsageLog(module = "品牌查询接口", detail = "获取搜索量最高的2个器件")
+	public List<Component> getMostSearchBrands() {
+		return componentService.getMostSearchComponent();
+	}
 }

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

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

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

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

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

@@ -121,6 +121,14 @@ public interface ComponentDao extends JpaSpecificationExecutor<Component>, JpaRe
 	@Query("select count(1) from Component")
 	public Integer findAllCount();
 
+	/**
+	 * 获取搜索量最高的2个器件
+	 * @return
+	 */
+	@Query(nativeQuery = true , value = "select c from product$component c order by cmp_search_count desc LIMIT 2)")
+	public List<Component> findMostSearchComponent();
+
+
 	/**
 	 * 器件点击次数加一
 	 * @param uuid

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

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

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

@@ -217,4 +217,11 @@ public interface ComponentService {
 	 * @return
 	 */
 	public void addVisitCount(String uuid);
+
+	/**
+	 * 获取搜索量最高的2个器件
+	 * @return 品牌信息
+	 */
+	public List<Component> getMostSearchComponent();
+
 }

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

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

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

@@ -10,8 +10,8 @@ import com.uas.platform.b2c.prod.product.kind.service.KindService;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
-import com.uas.search.model.PageParams;
-import com.uas.search.model.PageParams.FilterField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.PageParams.FilterField;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;

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

@@ -31,8 +31,8 @@ import com.uas.platform.core.model.Type;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.SimpleExpression;
-import com.uas.search.model.PageParams;
-import com.uas.search.model.PageParams.FilterField;
+import com.uas.platform.b2c.common.search.util.PageParams;
+import com.uas.platform.b2c.common.search.util.PageParams.FilterField;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -549,4 +549,9 @@ public class ComponentServiceImpl implements ComponentService {
 	public void addVisitCount(String uuid) {
 		componentDao.addVisitCount(uuid);
 	}
+
+	@Override
+	public List<Component> getMostSearchComponent() {
+		return componentDao.findMostSearchComponent();
+	}
 }

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

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

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

@@ -29,6 +29,7 @@ import com.uas.platform.b2c.fa.settlement.dao.BillDao;
 import com.uas.platform.b2c.fa.settlement.dao.BillInfoDao;
 import com.uas.platform.b2c.fa.settlement.model.Bill;
 import com.uas.platform.b2c.fa.settlement.model.BillInfo;
+import com.uas.platform.b2c.fa.settlement.service.BillSubmitService;
 import com.uas.platform.b2c.logistics.dao.AddressDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFOrderDao;
 import com.uas.platform.b2c.logistics.dao.InvoiceFPurchaseDao;
@@ -193,6 +194,8 @@ public class OrderServiceImpl implements OrderService {
     private InstallmentDao installmentDao;
     @Autowired
     private InstallmentDetailDao installmentDetailDao;
+    @Autowired
+    private BillSubmitService billSubmitService;
 
     /**
      * 保存订单信息
@@ -1431,6 +1434,12 @@ public class OrderServiceImpl implements OrderService {
                 }
                 purchase.setSendstatus(Status.NOT_UPLOAD.value());
                 purchaseDao.save(purchase);
+
+                // 如果买家需要开发票,则生成发票申请
+                if (Type.Bill_No.value() != newOrder.getInvoicetype().intValue()) {
+                    billSubmitService.saveByAdmin(newOrder);
+                }
+
                 //发送短信,异常不作处理
                 try {
                     sendMessage(purchase);

+ 7 - 0
src/main/java/com/uas/platform/b2c/trade/order/service/impl/PurchaseServiceImpl.java

@@ -24,6 +24,7 @@ import com.uas.platform.b2c.fa.settlement.dao.BillDao;
 import com.uas.platform.b2c.fa.settlement.dao.BillInfoDao;
 import com.uas.platform.b2c.fa.settlement.model.Bill;
 import com.uas.platform.b2c.fa.settlement.model.BillInfo;
+import com.uas.platform.b2c.fa.settlement.service.BillSubmitService;
 import com.uas.platform.b2c.logistics.dao.*;
 import com.uas.platform.b2c.logistics.model.*;
 import com.uas.platform.b2c.logistics.service.InvoiceFPurchaseService;
@@ -152,6 +153,8 @@ public class PurchaseServiceImpl implements PurchaseService {
     private InstallmentDetailDao installmentDetailDao;
 	@Autowired
 	private InstallmentService installmentService;
+	@Autowired
+	private BillSubmitService billSubmitService;
 
 	@Override
 	public Purchase save(Purchase purchase) {
@@ -708,6 +711,10 @@ public class PurchaseServiceImpl implements PurchaseService {
         if (statusList.contains(purchase.getStatus())) {
             if (isReceived) {
                 purchase.setStatusComfirmed(userUU);
+				// 如果买家需要开发票,则生成发票申请
+				if (Type.Bill_No.value() != newOrder.getInvoicetype().intValue()) {
+					billSubmitService.saveByAdmin(newOrder);
+				}
             } else {
                 purchase.setStatusToBePaidAgain(userUU);
             }

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/order/status/OrderStatus.java

@@ -14,7 +14,7 @@ public enum OrderStatus {
 	/**
 	 * {@code tobepaid 待付款}
 	 */
-	TOBEPAID("tobepaid", "503-504"), //504时已付款但商城未收款,这种情况视为未付款
+	TOBEPAID("tobepaid", "503-504-524-525"), //504时已付款但商城未收款,这种情况视为未付款
 
 	/**
 	 * {@code tobedeliver 待发货}

+ 1 - 1
src/main/java/com/uas/platform/b2c/trade/order/status/PurchaseStatus.java

@@ -10,7 +10,7 @@ public enum PurchaseStatus {
 	/**
 	 * {@code tobeconfirmed 意向订单}
 	 */
-	TOBECONFIRMED("tobeconfirmed", "501-504"),
+	TOBECONFIRMED("tobeconfirmed", "501-504-524-525"),
 	/**
 	 * {@code comfirmed 待发货}
 	 */

+ 17 - 0
src/main/java/com/uas/platform/b2c/trade/presale/model/Cart.java

@@ -1,8 +1,10 @@
 package com.uas.platform.b2c.trade.presale.model;
 
+import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.core.utils.NumberUtil;
 import com.uas.platform.b2c.prod.commodity.model.Goods;
 import com.uas.platform.b2c.prod.commodity.model.GoodsSimple;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
 import com.uas.platform.b2c.prod.store.model.StoreType;
 import com.uas.platform.b2c.trade.presale.status.cartStatus;
 import com.uas.platform.core.model.Status;
@@ -148,6 +150,13 @@ public class Cart {
 	@Column(name = "cart_store_uuid")
 	private String storeUuid;
 
+	/**
+	 * 店铺企业信息
+	 */
+	@OneToOne(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
+	@JoinColumn(name = "cart_store_uuid", referencedColumnName = "st_uuid" ,insertable = false, updatable = false)
+	private StoreIn storeEnterprise;
+
 	/**
 	 * 店铺名称
 	 */
@@ -556,6 +565,14 @@ public class Cart {
 		return this;
 	}
 
+	public StoreIn getStoreEnterprise() {
+		return storeEnterprise;
+	}
+
+	public void setStoreEnterprise(StoreIn storeEnterprise) {
+		this.storeEnterprise = storeEnterprise;
+	}
+
 	@Override
 	public String toString() {
 		return "Cart [id=" + id + ", uu=" + uu + ", enuu=" + enuu + ", uuid=" + uuid + ", batchCode=" + batchCode

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

@@ -107,7 +107,10 @@ public class RateServiceImpl implements RateService{
             String[] idArray = ids.split(SplitChar.HYPHEN);
             for (String id : idArray) {
                 Order order = orderDao.findByOrderid(id);
-                if(order.getRateStatus() == 523 || order.getRateStatus() == 522){continue;}
+                if (null == order){
+                    continue;
+                }
+                if (order.getRateStatus() == 523 || order.getRateStatus() == 522) { continue;}
                 rateGoodsDao.delete(rateGoodsDao.findByOrderId(order.getOrderid()));
                 for (OrderDetail orderDetail : order.getOrderDetails()){
                     RateGoods rateGoods = new RateGoods();

+ 6 - 1
src/main/java/com/uas/platform/b2c/trade/support/CodeType.java

@@ -58,7 +58,12 @@ public enum CodeType {
 	/**
 	 * 超时请求
 	 */
-	TIME_OUT(12, "TIME_OUT");
+	TIME_OUT(12, "TIME_OUT"),
+
+	/**
+	 * 无操作权限
+	 */
+	NO_AUTHORITY(13, "NO_AUTHORITY");
 
 	private int code;
 

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

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

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


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


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


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


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

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

+ 1 - 1
src/main/webapp/resources/css/commonComponent.css

@@ -547,7 +547,7 @@ div.tip{
     font-size: 12px;
     cursor: pointer;
 }
-.com-sub-pager .pagination li:first-child a, .pagination li:last-child a{
+.com-sub-pager .pagination li:first-child a, .com-sub-pager .pagination li:last-child a{
     font-size: 20px;
 }
 .com-sub-pager ul.pagination.ng-table-pagination > li > a > span {

+ 5 - 1
src/main/webapp/resources/css/erp/align.css

@@ -1,3 +1,7 @@
 .user_content .user_right {
-    margin-right: 90px;
+    float: none!important;
+    margin: 0 auto;
+}
+.wrap {
+    width: 100%;
 }

BIN
src/main/webapp/resources/img/tour/1.gif


BIN
src/main/webapp/resources/img/tour/2.gif


BIN
src/main/webapp/resources/img/tour/3.gif


BIN
src/main/webapp/resources/img/tour/4.gif


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


BIN
src/main/webapp/resources/img/tour/5.gif


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


+ 6 - 6
src/main/webapp/resources/js/admin/controllers/product/UploadComponentCrawlCtrl.js

@@ -95,8 +95,8 @@ define(['app/app'], function(app) {
 				file: file,
 				method: 'POST'
 			}).success(function(data) {
-				if(data[0].version == -1) {
-					var kindContrastId = data[0].b2cKiId;
+				if(data.code == 405) {
+					var kindContrastId = data.data;
 					$modal.open({
 						animation: true,
 						size: 'md',
@@ -115,8 +115,8 @@ define(['app/app'], function(app) {
 						return;
 					});
 				} else {
-					toaster.pop('success', '提示', '提交成功');
-					window.location.reload();
+					toaster.pop('success', '提示', '成功上传' + data.data + '条');
+					// window.location.reload();
 				}
 			}).error(function(response) {
 				toaster.pop('error', '提示', response);
@@ -130,8 +130,8 @@ define(['app/app'], function(app) {
 				file: myFile,
 				method: 'POST'
 			}).success(function(data) {
-				toaster.pop('success', '提示', '提交成功');
-				window.location.reload();
+				toaster.pop('success', '提示', '成功上传' + data.data + '条');
+				// window.location.reload();
 			}).error(function(response) {
 				toaster.pop('error', '提示', response);
 			});

+ 23 - 6
src/main/webapp/resources/js/common/controllers/commonCtrls.js

@@ -131,7 +131,14 @@ define([ 'app/app' ], function(app) {
 						}
 					}
 					$scope.userInfo = data;
-					// 增加收藏功能的代码
+                    $scope.sortEnterprises = $scope.userInfo.enterprises || [];
+                    if ($scope.sortEnterprises.length) {
+                        $scope.sortEnterprises.sort(function (a, b) {
+                            return b.lastLoginTime - a.lastLoginTime;
+                        })
+                    }
+
+                    // 增加收藏功能的代码
 					$rootScope.userInfo = data;
 					$rootScope.brandCount = 0;
 					$rootScope.componentCount = 0;
@@ -956,7 +963,7 @@ define([ 'app/app' ], function(app) {
 	}]);
 
 	// Web Chat侧边栏的Controller
-	app.controller('WebChatCtrl', ['$scope', '$interval', 'AuthenticationService', 'ChatBusinessLayer', 'toaster', function($scope, $interval, AuthenticationService, ChatBusinessLayer, toaster) {
+	app.controller('WebChatCtrl', ['$scope', '$interval', 'AuthenticationService', 'ChatBusinessLayer', 'toaster','$rootScope', function($scope, $interval, AuthenticationService, ChatBusinessLayer, toaster ,$rootScope) {
 		$scope.userInfo = null;
 		$scope.countData = 0;
 		$scope.goWebChat = goWebChat;
@@ -975,6 +982,12 @@ define([ 'app/app' ], function(app) {
 		}
 
 		function accessRealTimeData(param) {
+			//先调一次
+            ChatBusinessLayer.accessUnreadMessageCount(param).then(function (count) {
+                $scope.countData = count;
+            }, function () {
+                $scope.countData = 0;
+            });
 			$interval(function () {
 				ChatBusinessLayer.accessUnreadMessageCount(param).then(function (count) {
 					$scope.countData = count;
@@ -995,16 +1008,20 @@ define([ 'app/app' ], function(app) {
 			}
 
 			//获得窗口的垂直位置
-			var iTop = (window.screen.availHeight - 30 - 600) / 2;
+			var iTop = (window.screen.availHeight - 30 - 780) / 2;
 			//获得窗口的水平位置
 			var iLeft = (window.screen.availWidth - 10 - 1030) / 2;
-			var newTab = window.open('', '即时对话框', 'height=600, width=1030, top=' + iTop + ', left=' + iLeft + ', toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');
-
+			var newTab = window.open('', '即时对话框', 'height=750, width=1000, top=' + iTop + ', left=' + iLeft + ', toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');
+			newTab.close();
+            var newTab = window.open('', '即时对话框', 'height=750, width=1000, top=' + iTop + ', left=' + iLeft + ', toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');
 			var chatInfoDto = { userPhone: $scope.param.phone, enUU: $scope.param.enUU };
+			if (!chatInfoDto.enUU){
+				chatInfoDto = {userPhone: $scope.param.phone};
+			}
 			ChatBusinessLayer.visitWebChat(chatInfoDto, 'LIST').then(function (gid) {
 				console.log(gid);
 				//newTab.location.href = 'http://192.168.253.31:20220/chat/visit?gid=' + gid;
-				newTab.location.href = 'http://im.ubtob.com/chat/visit?gid=' + gid;
+				newTab.location.href = 'https://im.ubtob.com/chat/visit?gid=' + gid;
 			}, function (error) {
 				console.log(error);
 				newTab.close();

+ 95 - 0
src/main/webapp/resources/js/common/directives.js

@@ -867,4 +867,99 @@ define(['angular', 'showdown', 'angular-toaster'], function(angular) {
 			}
 		};
 	}]);
+	/*global angular */
+	/**
+	 * uiTour directive
+	 *
+	 * @example:
+	 *   <ul ui-tour="currentStep">
+	 *     <li target="#someId">
+	 *       First Tooltip
+	 *       <a ng-click="currentStep=currentStep+1">Next</a>
+	 *     </li>
+	 *     <li target=".items:eq(2)" name="two">
+	 *       Second Tooltip
+	 *       <a ng-click="currentStep=currentStep-1">Prev</a>
+	 *     </li>
+	 *     <li target=".items:eq(2)">
+	 *       Third Tooltip
+	 *       <a ng-click="currentStep='two'">Go directly to 'two'</a>
+	 *       <a ng-click="currentStep=0">Done</a>
+	 *     </li>
+	 *   </ul>
+	 */
+	angular.module('ui.tour', [])
+
+		.directive('uiTour', ['$timeout', '$parse', function($timeout, $parse){
+			return {
+				link: function($scope, $element, $attributes) {
+					var model = $parse($attributes.uiTour);
+
+					// Watch model and change steps
+					$scope.$watch($attributes.uiTour, function(newVal, oldVal){
+						if (angular.isNumber(newVal)) {
+							showStep(newVal)
+						} else {
+							if (angular.isString(newVal)) {
+								var stepNumber = 0,
+									children = $element.children()
+								angular.forEach(children, function(step, index) {
+									if (angular.element(step).attr('name') === newVal)
+										stepNumber = index+1;
+								});
+								model.assign($scope, stepNumber);
+							} else {
+								model.assign($scope, newVal && 1 || 0);
+							}
+						}
+					});
+
+					// Show step
+					function showStep(stepNumber) {
+						var elm, at, children = $element.children().removeClass('active');
+						elm = children.eq(stepNumber - 1);
+						if (stepNumber) {
+							at = elm.attr('at');
+							$timeout(function(){
+								var target = angular.element(elm.attr('target'))[0];
+
+
+								if (elm.attr('overlay') !== undefined) {
+									$('.tour-overlay').addClass('active').css({
+										// marginLeft: target.offsetLeft + target.offsetWidth / 2 - 150,
+										// marginTop: target.offsetTop + target.offsetHeight / 2 - 150
+									}).addClass('in');
+								}
+								// offset = {};
+                                //
+								// offset.top = target.offsetTop;
+								// offset.left = target.offsetLeft;
+
+								elm.addClass('active');
+
+								// if (at.indexOf('bottom') > -1) {
+								// 	offset.top += target.offsetHeight;
+								// } else if (at.indexOf('top') > -1) {
+								// 	offset.top -= elm[0].offsetHeight;
+								// } else {
+								// 	offset.top += target.offsetHeight / 2 - elm[0].offsetHeight / 2;
+								// }
+								// if (at.indexOf('left') > -1) {
+								// 	offset.left -= elm[0].offsetWidth;
+								// } else if (at.indexOf('right') > -1) {
+								// 	offset.left += target.offsetWidth;
+								// } else {
+								// 	offset.left += target.offsetWidth / 2 - elm[0].offsetWidth / 2;
+								// }
+                                //
+								// elm.css(offset);
+							});
+						} else {
+							$('.tour-overlay').removeClass('in');
+								$('.tour-overlay').removeClass('active');
+						}
+					}
+				}
+			};
+		}]);
 });

+ 68 - 22
src/main/webapp/resources/js/common/module/chat_web_module.js

@@ -19,6 +19,25 @@ define([ 'common/query/chat', 'common/query/enterprise' ], function() {
 			}
 			return param;
 		}
+
+		function getAdminInfo(enUU) {
+			/*Enterprise.getEnterpriseAdminInfo({enuu : enUU}, function(data) {
+				var phone = data.userTel;
+				if (!/^1\d{10}$/.test(phone)){
+					return phone;
+				}
+			},function(response) {
+				return;
+			});
+*/
+			var promise = Enterprise.getEnterpriseAdminInfo({enuu : enUU}, {}).$promise;
+
+			return promise.then(function (data) {
+				return data.userTel;
+			}, function () {
+				return 0;
+			});
+		}
 		
 		function accessUnreadMessageCount(param) {
 			var promise = Chat.countUnReadSessionsWhenUserQuery(param, {}).$promise;
@@ -51,10 +70,10 @@ define([ 'common/query/chat', 'common/query/enterprise' ], function() {
 		 * @param type			聊天类型
 		 */
 		function visitWebChat(chatInfoDto, type) {
-			if (!chatInfoDto || !type || !chatInfoDto.enUU || (type === 'CHAT' && !chatInfoDto.otherEnUU)) return {};
+			if (!chatInfoDto || !type || (type === 'CHAT' && !chatInfoDto.otherEnUU)) return {};
 			chatInfoDto.type = type;
 
-			var promise = getEnterpriseInfo(chatInfoDto.enUU).then(function (enterprise) {
+			var promise = getEnterpriseInfo(chatInfoDto.enUU ? chatInfoDto.enUU : 0).then(function (enterprise) {
 				if (enterprise && enterprise.enUU) {
 					chatInfoDto.enterprise = enterprise;
 				} else {
@@ -91,9 +110,10 @@ define([ 'common/query/chat', 'common/query/enterprise' ], function() {
 		this.visitWebChat = visitWebChat;
 		this.getParamsFromUserInfo = getParamsFromUserInfo;
 		this.accessUnreadMessageCount = accessUnreadMessageCount;
+		this.getAdminInfo = getAdminInfo;
 	}]);
 
-	module.controller('ChatContactCtrl', ['$rootScope', 'ChatBusinessLayer', 'toaster', function ($rootScope, ChatBusinessLayer, toaster) {
+	module.controller('ChatContactCtrl', ['$rootScope', 'ChatBusinessLayer', 'toaster','Enterprise', function ($rootScope, ChatBusinessLayer, toaster, Enterprise) {
 
 		var vm = this;
 		vm.param = {};
@@ -114,30 +134,56 @@ define([ 'common/query/chat', 'common/query/enterprise' ], function() {
 		 * @param userType	联系人用户类型
 		 */
 		function contactWithOther(phone, enUU, userType) {
-			console.log(phone, enUU, userType);
 			//获得窗口的垂直位置
-			var iTop = (window.screen.availHeight - 30 - 600) / 2;
+			var iTop = (window.screen.availHeight - 30 - 780) / 2;
 			//获得窗口的水平位置
 			var iLeft = (window.screen.availWidth - 10 - 1030) / 2;
-			var newTab = window.open('', '即时对话框', 'height=600, width=1030, top=' + iTop + ', left=' + iLeft + ', toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no'),
-				chatInfoDto = {
-				userPhone: vm.param.phone,
-				enUU: vm.param.enUU,
-				userType: userType == vm.UserType.STORE ? vm.UserType.ENTERPRISE : vm.UserType.STORE,
-				toPhone: phone,
-				otherEnUU: enUU,
-				otherUserType: userType
-			};
-			ChatBusinessLayer.visitWebChat(chatInfoDto, 'CHAT').then(function (gid) {
-				//newTab.location.href = 'http://192.168.253.31:20220/chat/visit?gid='  gid;
-				newTab.location.href = 'http://im.ubtob.com/chat/visit?gid=' + gid;
-			}, function (error) {
-				console.log(error);
-				newTab.close();
-				toaster.pop('warning', '对方没有开通客服系统,请联系官方客服!');
-			});
+			if (!/^1\d{10}$/.test(phone)){
+				ChatBusinessLayer.getAdminInfo(enUU).then(function (userTel) {
+					phone = userTel;
+					/*if (!/^1\d{10}$/.test(phone)){
+						toaster.pop('warning', '该店铺暂无管理员电话号码!');
+						return;
+					}*/
+					console.log(phone, enUU, userType,iTop,iLeft);
+					startChat(phone,enUU,userType,iTop,iLeft);
+				});
+			}else {
+                startChat(phone,enUU,userType,iTop,iLeft);
+			}
 		}
 
+		var startChat= function (phone,enUU,userType,iTop,iLeft) {
+            if ($rootScope.newTab){
+                $rootScope.newTab.close();
+            }
+            var newTab = window.open('', '即时对话框', 'height=750, width=1000, top=' + iTop + ', left=' + iLeft + ', toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');
+            newTab.close();
+            var newTab = window.open('', '即时对话框', 'height=750, width=1000, top=' + iTop + ', left=' + iLeft + ', toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');
+			var chatInfoDto = {
+                    userPhone: vm.param.phone,
+                    enUU: vm.param.enUU,
+                    userType: userType == vm.UserType.STORE ? vm.UserType.ENTERPRISE : vm.UserType.STORE,
+                    toPhone: phone,
+                    otherEnUU: enUU,
+                    otherUserType: userType
+                };
+            ChatBusinessLayer.visitWebChat(chatInfoDto, 'CHAT').then(function (gid) {
+                if (!gid || gid == ''){
+                    newTab.close();
+                    toaster.pop('warning', '您暂未开通聊天帐号!');
+                    return;
+                }
+                //newTab.location.href = 'http://192.168.253.121:20220/chat/visit?gid=' +  gid;
+                newTab.location.href = 'https://im.ubtob.com/chat/visit?gid=' + gid;
+            }, function (error) {
+                console.log(error);
+                newTab.close();
+                toaster.pop('warning', '对方没有开通客服系统,请联系官方客服!');
+            });
+            $rootScope.newTab = newTab;
+        }
+
 	}]);
 
 });

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

@@ -1,7 +1,7 @@
 define([ 'ngResource' ], function() {
 	angular.module('ChatService', [ 'ngResource' ]).factory('Chat', ['$resource', function($resource) {
 
-		var address = 'http://im.ubtob.com/';
+		var address = 'https://im.ubtob.com/';
 		//var address = 'http://192.168.253.31:20220/';
 
 		return $resource('api/chat/infos', {}, {

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

@@ -152,6 +152,10 @@ define([ 'angular', 'ui-bootstrap', 'ngResource' ], function(angular) {
             getEnterpriseDetailInfo : {
                 url : 'basic/enterprise/:enuu/detailInfo',
                 method : 'GET'
+            },
+            getEnterpriseAdminInfo : {
+                url : 'basic/enterprise/:enuu/admin',
+                method : 'GET'
             },
 			getAllUsersByEnuu : {
 				url : 'basic/user/enterprise/info',

+ 15 - 0
src/main/webapp/resources/js/common/query/logisticsPort.js

@@ -107,6 +107,10 @@ define([ 'ngResource' ], function() {
 				url: 'trade/distributionRule/count',
 				method: 'GET'
 			},
+			findCountOfActiveRule : {
+				url: 'trade/distributionRule/active/count',
+				method: 'GET'
+			},
 			checkRuleName : {
 				url: 'trade/distributionRule/checkName',
 				method: 'GET'
@@ -126,5 +130,16 @@ define([ 'ngResource' ], function() {
 				method: 'POST'
 			}
 		})
+	}]).factory('TipRecord', ['$resource', function ($resource) {
+		return $resource('tip/record', {}, {
+			findTipRecordOfRule : {
+				url: 'tip/record/rule',
+				method: 'GET'
+			},
+			turnTipRecordOfRule : {
+				url: 'tip/record/rule/close',
+				method: 'PUT'
+			}
+		})
 	}]);
 });

+ 1 - 1
src/main/webapp/resources/js/sale/app.js

@@ -57,7 +57,7 @@ define([ 'angularAMD', 'ngRoute', 'ui-bootstrap', 'ngLocal', 'common/services',
 	    $scope.userInfo = {};
 	    AuthenticationService.getAuthentication().success(function(data){
 	    	$scope.userInfo = data;
-	    	
+
 			//增加收藏功能的代码
 			$rootScope.userInfo = data;
 			$rootScope.brandCount = 0;

+ 1 - 1
src/main/webapp/resources/js/usercenter/app.js

@@ -705,7 +705,7 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'commo
 			if (!status || status == '') {
 				status = 501;
 			}
-			if (status == 501 || status == 503 || status == 504) {
+			if (status == 501 || status == 503 || status == 504 || status == 524 || status == 525) {
 				return '待付款';
 			} else if (status == 505 || status == 406 || status == 407 || status == 403 || status == 408) {
 				return '待发货';

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

@@ -10,6 +10,7 @@ define(['app/app'], function (app) {
         function ($scope, $rootScope, ngTableParams, BaseService,
             ShippingAddress, $modal, Enterprise, User, toaster, $http,
             $stateParams) {
+          document.title = '账户管理-优软商城';
           $rootScope.active = 'account_manager';
           $scope.tab = 'base';
           $scope.userInfo = $rootScope.userInfo;
@@ -670,12 +671,12 @@ define(['app/app'], function (app) {
             });
           };
 
-          //对新密码进行校验
+          // 对新密码进行校验
           $scope.checkSuccess1 = false;
           $scope.checkFailed1 = false;
           $scope.checkNewPassword = function (newPassword) {
-            var reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/;
-            if (newPassword == null || !reg.test(newPassword)) {
+            var middlLevelReg = /^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z]))|((?=.*[0-9])(?=.*[A-Z]))).*$/;
+            if (newPassword == null || !middlLevelReg.test(newPassword)) {
               //toaster.pop('error', '错误', '密码为8-20字符的英文、数字混合');
               $scope.checkSuccess1 = false;
               $scope.checkFailed1 = true;
@@ -690,7 +691,7 @@ define(['app/app'], function (app) {
             $scope.checkPasswordLevel(newValue);
           });
 
-          //密码强度校验
+          // 密码强度校验
           $scope.secLevel = 0;
           $scope.checkPasswordLevel = function (newPassword) {
             $scope.checkFailed1 = false;
@@ -698,20 +699,18 @@ define(['app/app'], function (app) {
               $scope.secLevel = 0;
               return false;
             }
-            //不足8位,或仅有数字,或仅有英文
-            if (newPassword.length < 8 || /^[0-9]*$/.test(newPassword)
-                || /^[A-Za-z]*$/.test(newPassword)) {
-              $scope.secLevel = 1;
-              return false;
-            }
-            if (/^[A-Z0-9]{8,20}$/.test(newPassword) || /^[a-z0-9]{8,20}$/.test(
-                    newPassword)) {//达到8位,且 仅有数字+英文小写 或 仅有数字+英文大写
-              $scope.secLevel = 2;
-              return false;
-            }
-            if (/^(?=.*[0-9].*)(?=.*[A-Z].*)(?=.*[a-z].*).{8,20}$/.test(
-                    newPassword)) {
+            // 密码强度中的正则
+            var middlLevelReg = /^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z]))|((?=.*[0-9])(?=.*[A-Z]))).*$/;
+            // 密码强度高的正则
+            var heightLevelReg = /^(?=.{8,20})(((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]))|((?=.*[0-9])((?=.*[a-zA-Z]))(?=.*[^a-zA-Z0-9]))).*$/;
+            if(heightLevelReg.test(newPassword)){
               $scope.secLevel = 3;
+              return true;
+            }else if(middlLevelReg.test(newPassword)){
+              $scope.secLevel = 2;
+              return true;
+            }else{
+              $scope.secLevel = 1;
               return false;
             }
           }
@@ -730,25 +729,26 @@ define(['app/app'], function (app) {
             $scope.checkFailed2 = true;
           }
 
-          //修改密码
+          // 修改密码
           $scope.ok = function () {
-            //原密码校验
+            // 原密码校验
             if(!$scope.checkSuccess){
               $scope.checkPassword($scope.user.password);
             }
-            //新密码校验
+            // 新密码校验
             $scope.checkNewPassword($scope.user.newPassword);
-            //再次输入密码校验
+            // 再次输入密码校验
             $scope.checkNewPassword1();
             if(!$scope.checkSuccess || !$scope.checkSuccess1 || !$scope.checkSuccess2){
                 return;
             }
-            if ($scope.user.newPassword == $scope.user.password) {
-              toaster.pop('error', '错误', '新密码与原密码相同');
+            // 密码强度校验
+            if(!$scope.checkPasswordLevel($scope.user.newPassword)){
+              toaster.pop('error', '错误', '密码强度不够,请重新输入');
               return;
             }
-            if ($scope.secLevel <= 1) {
-              toaster.pop('error', '错误', '密码强度不够,请重新输入');
+            if ($scope.user.newPassword == $scope.user.password) {
+              toaster.pop('error', '错误', '新密码与原密码相同');
               return;
             }
             if ($scope.user.newPassword == $scope.user.newPassword1) {//验证重复密码相等

+ 225 - 194
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_cart_ctrl.js

@@ -43,47 +43,47 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		$scope.isChooseAll = false;
 
 		$scope.loadData = function (){
-			Cart.getPageInfo($scope.pageInfo, function(data) {
-				$scope.isDataLoading = false;
-				$scope.total = data.totalElements;
-				$scope.pageNum = data.totalPages;
+				Cart.getPageInfo($scope.pageInfo, function(data) {
+					$scope.isDataLoading = false;
+					$scope.total = data.totalElements;
+					$scope.pageNum = data.totalPages;
 
-				angular.forEach(data.content, function (cart) {
-					cart.buyCurrency = cart.currencyName.indexOf("RMB") > -1 ? "RMB" : "USD";
-					cart.isSelect = false;
-					//计算分段和统计一下价格
-					$scope.getPrice(cart);
-
-					//便于后期循环
-					$scope.carts.push(cart);
-					$scope.disabledAddAndSub(cart);
-					$scope.countByPage += 1;
-					var isContain = false;
-					for (var i = 0; i < $scope.cartMap.length; i++) {
-						if(angular.equals($scope.cartMap[i].name, cart.storeName)) {
-							$scope.cartMap[i].arr.push(cart);
-							isContain = true;
+					angular.forEach(data.content, function (cart) {
+						cart.buyCurrency = cart.currencyName.indexOf("RMB") > -1 ? "RMB" : "USD";
+						cart.isSelect = false;
+						//计算分段和统计一下价格
+						$scope.getPrice(cart);
+
+						//便于后期循环
+						$scope.carts.push(cart);
+						$scope.disabledAddAndSub(cart);
+						$scope.countByPage += 1;
+						var isContain = false;
+						for (var i = 0; i < $scope.cartMap.length; i++) {
+							if(angular.equals($scope.cartMap[i].name, cart.storeName)) {
+								$scope.cartMap[i].arr.push(cart);
+								isContain = true;
+							}
 						}
-					}
-					if(!isContain) {
-						var obj = {};
-						obj.name = cart.storeName;
-						obj.arr = [];
-						obj.arr.push(cart);
-						$scope.cartMap.push(obj);
-					}
-				});
-				$scope.cartIsEmpty = !$scope.carts.length ? true : false;
-				//设置全选的复选框
-				$scope.isChooseAll = $scope.isAllSelect($scope.carts);
+						if(!isContain) {
+							var obj = {};
+							obj.name = cart.storeName;
+							obj.arr = [];
+							obj.arr.push(cart);
+							$scope.cartMap.push(obj);
+						}
+					});
+					$scope.cartIsEmpty = !$scope.carts.length ? true : false;
+					//设置全选的复选框
+					$scope.isChooseAll = $scope.isAllSelect($scope.carts);
 
-				//设置店铺复选框的状态
-				angular.forEach($scope.cartMap, function (store) {
-					$scope.selectedStore[store.name] = $scope.isAllSelect(store.arr);
+					//设置店铺复选框的状态
+					angular.forEach($scope.cartMap, function (store) {
+						$scope.selectedStore[store.name] = $scope.isAllSelect(store.arr);
+					});
+				},function() {
+					toaster.pop('error', "提示", "获取购物车信息失败,请刷新页面");
 				});
-			},function() {
-				toaster.pop('error', "提示", "获取购物车信息失败,请刷新页面");
-			});
 		};
 
 		$scope.loadData();
@@ -120,7 +120,7 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			//计算总价格
 			$scope.calculateAmount($scope.selectedStoreCarts);
 		};
-
+		
 		// 减少按钮,每次减minPackQty
 		$scope.reduce = function(cart){
 			if(cart.status == 1) {
@@ -139,7 +139,7 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			//计算总价格
 			$scope.calculateAmount($scope.selectedStoreCarts);
 		};
-
+				
 		//根据搜索词过滤购物车信息,对类目、品牌、器件筛选
 		$scope.cartFilterCurrency = function(cartGroup) {
 			var result = false;
@@ -167,8 +167,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 
 		$scope.closeTable = function() {
 			console.log('0kds');
-		};
-		// //监听点击的位置,隐藏价格梯度的信息
+        };
+        // //监听点击的位置,隐藏价格梯度的信息
 		// document.onclick = function(event) {
 		// 	$scope.$apply(function () {
 		// 		angular.forEach($scope.carts, function (cart) {
@@ -181,9 +181,9 @@ define(["app/app", 'jquery-summernote'], function(app) {
 
 		//查看价格分段。
 		$scope.togglePrice = function (cart) {
-			cart.display = cart.display == 'block' ? 'none' : 'block';
-		};
-		// 统计已勾选批次
+            cart.display = cart.display == 'block' ? 'none' : 'block';
+        };
+        // 统计已勾选批次
 		var creatSelectArr = function(){
 			var arr = [];
 			angular.forEach($scope.carts, function(cart) {
@@ -220,20 +220,46 @@ define(["app/app", 'jquery-summernote'], function(app) {
 
 		// 输入购买量限制
 		$scope.blurNum = function (c) {
+			// c.inputError = 0;
+			// c.noInputError = 0;
 			if(isNaN(c.number)) {
 				toaster.pop('info','提示','请输入数字');
 				c.number = c.goods.minBuyQty;
 			}
 			c.number = Number(c.number);
 			if (c.number < c.goods.minBuyQty || !c.number) {
-				toaster.pop("info", "提示", "该商品最少购买" + c.goods.minBuyQty + "件");
-				c.number = c.goods.minBuyQty;
+				// toaster.pop("info", "提示", "该商品最少购买" + c.goods.minBuyQty + "件");
+				if (c.goods.breakUp) {
+					toaster.pop('info','提示','最小起订量为' + c.goods.minBuyQty);
+					// c.noInputError = 1;
+					c.number = c.goods.minBuyQty;
+					// $timeout(function () {
+					// 	c.noInputError = 1;
+					// }, 3000);
+				} else {
+					// c.inputError = 1;
+					toaster.pop('info','提示','最小起订量为' + c.goods.minBuyQty);
+					c.number = c.goods.minBuyQty;
+					// $timeout(function () {
+					// 	c.inputError = 0;
+					// }, 3000);
+				}
 			}else if(c.number > c.goods.reserve){
-				toaster.pop("info", "提示", "库存不足");
+				// toaster.pop("info", "提示", "库存不足");
 				if(c.goods.breakUp) {
+					toaster.pop("info", "提示", "库存不足");
+					// c.noInputError = 2;
 					c.number = c.goods.reserve;
+					// $timeout(function () {
+					// 	c.noInputError = 0;
+					// }, 3000);
 				}else {
+					// c.inputError = 2;
+					toaster.pop("info", "提示", "库存不足")
 					c.number = Number(NumberService.sub(c.goods.reserve, c.goods.reserve % c.goods.minPackQty));
+					// $timeout(function () {
+					// 	c.inputError = 0;
+					// }, 3000);
 				}
 				if(Number(c.number) < Number(c.goods.minBuyQty)) {
 					c.number = c.goods.minBuyQty;
@@ -242,8 +268,13 @@ define(["app/app", 'jquery-summernote'], function(app) {
 				if(!c.goods.breakUp) {
 					var remander = c.number % c.goods.minPackQty;
 					if(remander != 0) {
+						// c.inputError = 3;
+						toaster.pop("info", "提示", "不支持拆包且包装量为" + c.goods.minPackQty);
 						c.number = NumberService.sub(c.number, c.number % c.goods.minPackQty);
 						c.number = NumberService.add(c.number, c.goods.minPackQty);
+						// $timeout(function () {
+						// 	c.inputError = 0;
+						// }, 3000);
 					}
 					if(Number(c.number) > Number(c.goods.reserve)) {
 						c.number = NumberService.sub(c.goods.reserve, c.goods.reserve % c.goods.minPackQty);
@@ -328,8 +359,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 						return ;
 					}
 				}
-				$scope.totalMoneyInfo.countBT++;
-				$scope.selectedStoreCarts.push(cart);
+                $scope.totalMoneyInfo.countBT++;
+                $scope.selectedStoreCarts.push(cart);
 			}else {//取消勾选
 				$scope.totalMoneyInfo.countBT--;
 				$scope.selectedStoreCarts = $scope.selectedStoreCarts.filter(function(item) {
@@ -373,36 +404,36 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			}
 		};
 
-		// 清空失效产品
-		$scope.deleteInvalid = function(){
+        // 清空失效产品
+        $scope.deleteInvalid = function(){
 			var arr = [];
-			angular.forEach($scope.carts, function(cart){
-				if(cart.status == 1){
-					arr.push(cart.id);
-				}
-			});
-			if(arr.length <= 0) {
-				toaster.pop('warning', '提示', '购物车内目前没有失效的产品');
-				return ;
-			}
-			var ids = angular.toJson(arr);
-			$modal.open({
-				templateUrl : 'static/view/common/modal/invalid_delete_modal.html',
-				controller : 'cartDeleteCtrl',
-				size : 'md',
-				resolve : {
-					description : function () {
-						return '是否删除购物车内的无效商品';
-					},
-					ids : function () {
-						return ids;
-					}
-				}
-			}).result.then(function () {
+            angular.forEach($scope.carts, function(cart){
+                if(cart.status == 1){
+                    arr.push(cart.id);
+                }
+            });
+            if(arr.length <= 0) {
+                toaster.pop('warning', '提示', '购物车内目前没有失效的产品');
+                return ;
+            }
+            var ids = angular.toJson(arr);
+            $modal.open({
+                templateUrl : 'static/view/common/modal/invalid_delete_modal.html',
+                controller : 'cartDeleteCtrl',
+                size : 'md',
+                resolve : {
+                    description : function () {
+                        return '是否删除购物车内的无效商品';
+                    },
+                    ids : function () {
+                        return ids;
+                    }
+                }
+            }).result.then(function () {
 				afterDeleteRefreshInfo(arr);
 			}, function () {
-			});
-		};
+            });
+        };
 
 		var afterDeleteRefreshInfo = function (arr) {
 			if(arr.length < 1) {
@@ -446,22 +477,22 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			$scope.calculateAmount($scope.selectedStoreCarts);
 		}
 
-		$scope.deleteById = function(id){
-			var arr = [];
-			if(id != null){
-				arr.push(id);
-			}else {
-				angular.forEach($scope.carts, function(cart){
-					if(cart.isSelect){
-						arr.push(cart.id);
-					}
-				});
-			}
-			if(arr.length <= 0) {
+        $scope.deleteById = function(id){
+            var arr = [];
+            if(id != null){
+                arr.push(id);
+            }else {
+                angular.forEach($scope.carts, function(cart){
+                    if(cart.isSelect){
+                        arr.push(cart.id);
+                    }
+                });
+            }
+            if(arr.length <= 0) {
 				toaster.pop('warning', '提示', '请选择需要删除的商品');
 				return ;
 			}
-			var ids = angular.toJson(arr);
+            var ids = angular.toJson(arr);
 			$modal.open({
 				templateUrl : 'static/view/common/modal/delete_modal.html',
 				controller : 'cartDeleteCtrl',
@@ -470,9 +501,9 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					description : function () {
 						return '是否删除此商品';
 					},
-					ids : function () {
-						return ids;
-					}
+                    ids : function () {
+                        return ids;
+                    }
 				}
 			}).result.then(function () {
 				afterDeleteRefreshInfo(arr);
@@ -499,8 +530,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 				});
 				return !contain;
 			});
-		};
-		//判断是空对象
+        };
+        //判断是空对象
 		$scope.isNullObject = function(obj) {
 			var isObject = true;
 			for(var k in obj) {
@@ -538,8 +569,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					cart.contactSeller = false;
 				};
 			});
-		};
-		/**
+        };
+        /**
 		 * 监听点击的位置,隐藏相应的状态框
 		 * @param event
 		 */
@@ -576,8 +607,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					if(!isThisTag) {
 						$scope.carts[i].contactSeller = false;
 					}
-				}
-			});
+                }
+            });
 		};
 
 
@@ -599,23 +630,23 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		$scope.setAllCartCheck = function(checked) {
 			$scope.selectedStoreCarts = [];
 			angular.forEach($scope.cartMap, function(store) {
-				if(store.arr && store.arr.length > 0) {
-					var storeChecked = false;
-					angular.forEach(store.arr, function (cart) {
-						if(cart.status != 1 && checked) {//购物车的信息是否有效【是否下架】
-							cart.isSelect = checked;
-							storeChecked = true;
-							$scope.selectedStoreCarts.push(cart);
+					if(store.arr && store.arr.length > 0) {
+						var storeChecked = false;
+						angular.forEach(store.arr, function (cart) {
+							if(cart.status != 1 && checked) {//购物车的信息是否有效【是否下架】
+								cart.isSelect = checked;
+								storeChecked = true;
+								$scope.selectedStoreCarts.push(cart);
+							}else {
+								cart.isSelect = false;
+							}
+						});
+						if(storeChecked) {
+							$scope.selectedStore[store.name] = checked;//店铺的复选框也需要同步
 						}else {
-							cart.isSelect = false;
+							$scope.selectedStore[store.name] = false;//如果没有执行过storeChecked = true,则该店铺代表所有的都没有勾选
 						}
-					});
-					if(storeChecked) {
-						$scope.selectedStore[store.name] = checked;//店铺的复选框也需要同步
-					}else {
-						$scope.selectedStore[store.name] = false;//如果没有执行过storeChecked = true,则该店铺代表所有的都没有勾选
 					}
-				}
 
 			});
 		};
@@ -634,8 +665,8 @@ define(["app/app", 'jquery-summernote'], function(app) {
 				}
 			}
 			return !isAlldisabled&&isAllChecked;
-		};
-		/**
+        };
+        /**
 		 * 店铺选中状态信息
 		 */
 		$scope.selectedStore = {};
@@ -780,17 +811,17 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			SessionService.set("buyNow",false);
 			var jsonOrderDetails = angular.toJson(result);
 			Order.saveByGroup({}, jsonOrderDetails, function(result){
-				if(result.code == 1) {
+                if(result.code == 1) {
 					if(result.message) {
 						toaster.pop('info', result.message);
 					}
-					$state.go('order_pay', {orderid :  enIdFilter(result.data.orderid)});
-				}else if(result.code == 7){
-					toaster.pop('info', '提示', "选中的购物车信息已经失效,将为您刷新界面之后重新操作");
+                    $state.go('order_pay', {orderid :  enIdFilter(result.data.orderid)});
+                }else if(result.code == 7){
+                    toaster.pop('info', '提示', "选中的购物车信息已经失效,将为您刷新界面之后重新操作");
 					$timeout(function () {
 						window.location.reload();
 					}, 1500);
-				}else {
+                }else {
 					toaster.pop('info', '提示', result.message);
 				}
 			}, function(res){
@@ -838,41 +869,41 @@ define(["app/app", 'jquery-summernote'], function(app) {
 			}
 
 		};
-		// 移入收藏后删除购物车操作
+        // 移入收藏后删除购物车操作
 		$scope.collectDelete = function(id){
-			var arr = [];
-			if(id != null){
-				arr.push(id);
-			}else {
-				angular.forEach($scope.carts, function(cart){
-					if(cart.isSelect){
-						arr.push(cart.id);
-					}
-				});
-			}
-			var ids = angular.toJson(arr);
-			Cart.deleteById({ids : ids}, function(data){
-				$rootScope.countCart = $rootScope.countCart - arr.length;
-
-				//更新选中的购物车信息
-				$scope.selectedStoreCarts = $scope.arrayFilterId($scope.selectedStoreCarts, arr);
-				//更新购物车信息
-				$scope.carts = $scope.arrayFilterId($scope.carts, arr);
-				//判断是否全部删除,如果全部删除,就将全选置为取消状态。
-				if($scope.carts.length == 0) {
-					$scope.isChooseAll = false;
+            var arr = [];
+            if(id != null){
+                arr.push(id);
+            }else {
+                angular.forEach($scope.carts, function(cart){
+                    if(cart.isSelect){
+                        arr.push(cart.id);
+                    }
+                });
+            }
+            var ids = angular.toJson(arr);
+            Cart.deleteById({ids : ids}, function(data){
+                $rootScope.countCart = $rootScope.countCart - arr.length;
+
+                //更新选中的购物车信息
+                $scope.selectedStoreCarts = $scope.arrayFilterId($scope.selectedStoreCarts, arr);
+                //更新购物车信息
+                $scope.carts = $scope.arrayFilterId($scope.carts, arr);
+                //判断是否全部删除,如果全部删除,就将全选置为取消状态。
+                if($scope.carts.length == 0) {
+                    $scope.isChooseAll = false;
 					$scope.cartIsEmpty = true;
-				}
+                }
 
-				//更新map中购物车信息
-				var deleteStoreName = [];
+                //更新map中购物车信息
+                var deleteStoreName = [];
 				angular.forEach($scope.cartMap, function(store) {
-					if(store.arr && store.arr.length > 0) {
-						store.arr = $scope.arrayFilterId(store.arr, arr)
-						if(!store.arr || !store.arr.length || store.arr.length == 0) {
-							deleteStoreName.push(store.name);
+						if(store.arr && store.arr.length > 0) {
+							store.arr = $scope.arrayFilterId(store.arr, arr)
+							if(!store.arr || !store.arr.length || store.arr.length == 0) {
+								deleteStoreName.push(store.name);
+							}
 						}
-					}
 				});
 				//删除$scope.cartMap多余的部分。
 				angular.forEach(deleteStoreName, function(storeName) {
@@ -881,27 +912,27 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					});
 				});
 
-				//计算总金额
-				$scope.calculateAmount($scope.selectedStoreCarts);
+                //计算总金额
+                $scope.calculateAmount($scope.selectedStoreCarts);
 
-			}, function (res) {
-				toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
-			});
+            }, function (res) {
+                toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
+            });
 
 
 		};
-		// 移入收藏
-		$scope.collect = function(uuid, id) {
+        // 移入收藏
+        $scope.collect = function(uuid, id) {
 			if(uuid){
-				ComponentActive.getSimpleInfoByUuid({uuid: uuid}, { }, function(data){
-					var obj = {'componentid': data.id, 'kind': 2};
-					collectionService.saveEntity({ }, obj, function(data) {
-						$scope.collectDelete(id);
-						toaster.pop('success', '收藏成功');
-					}, function(response) {
-						toaster.pop('error', '收藏失败');
-					})
-				});
+                ComponentActive.getSimpleInfoByUuid({uuid: uuid}, { }, function(data){
+                    var obj = {'componentid': data.id, 'kind': 2};
+                    collectionService.saveEntity({ }, obj, function(data) {
+                        $scope.collectDelete(id);
+                        toaster.pop('success', '收藏成功');
+                    }, function(response) {
+                        toaster.pop('error', '收藏失败');
+                    })
+                });
 			}else{
 				var uuids = [];
 				angular.forEach($scope.cartMap, function(store){
@@ -915,14 +946,14 @@ define(["app/app", 'jquery-summernote'], function(app) {
 					toaster.pop('info', '你还未选择任何产品');
 					return;
 				}
-				collectionService.saveStores({ }, uuids, function(response){
+                collectionService.saveStores({ }, uuids, function(response){
 					if(response.data == "success"){
-						$scope.collectDelete();
-						toaster.pop('success', '收藏成功');
+                        $scope.collectDelete();
+                        toaster.pop('success', '收藏成功');
 					}
 				},function () {
-					toaster.pop('error', '收藏失败');
-				})
+                    toaster.pop('error', '收藏失败');
+                })
 			}
 		}
 
@@ -968,32 +999,32 @@ define(["app/app", 'jquery-summernote'], function(app) {
 		}
 	}]);
 
-	/**
-	 * 删除的逻辑
-	 */
+    /**
+     * 删除的逻辑
+     */
 	app.register.controller('cartDeleteCtrl', ['$scope', 'description', 'Cart', '$modalInstance', 'toaster', 'ids', function ($scope, description, Cart, $modalInstance, toaster,ids) {
 
-		$scope.confirmDelete = function () {
-			Cart.deleteById({ids : ids}, function(data){
-				toaster.pop('success', '成功删除');
-				$modalInstance.close()
-			}, function (res) {
-				toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
-			});
-		};
-
-		$scope.confirmDeleteInvalid = function () {
-			Cart.deleteById({ids : ids}, function(data){
-				toaster.pop('success', '成功清除购物车内的无效产品');
-				$modalInstance.close()
-			}, function (res) {
-				toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
-			});
-		};
-
-		$scope.cancleDelete = function () {
-			$modalInstance.dismiss();
-		}
+        $scope.confirmDelete = function () {
+            Cart.deleteById({ids : ids}, function(data){
+                toaster.pop('success', '成功删除');
+                $modalInstance.close()
+            }, function (res) {
+                toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
+            });
+        };
+
+        $scope.confirmDeleteInvalid = function () {
+            Cart.deleteById({ids : ids}, function(data){
+                toaster.pop('success', '成功清除购物车内的无效产品');
+                $modalInstance.close()
+            }, function (res) {
+                toaster.pop('error', '系统错误', '购物车信息删除失败' + res.data);
+            });
+        };
+
+        $scope.cancleDelete = function () {
+            $modalInstance.dismiss();
+        }
 
 	}]);
 

+ 1 - 0
src/main/webapp/resources/js/usercenter/controllers/forstore/buyer_home_ctrl.js

@@ -6,6 +6,7 @@ define(['app/app', 'calendar'], function(app) {
     app.register.controller('homeCtrl', ['$scope', '$rootScope', 'Recommendation', 'ShippingAddress', 'Bill', '$q', 'toaster', '$modal', 'Goods', 'StoreInfo', function ($scope, $rootScope, Recommendation, ShippingAddress, Bill, $q, toaster, $modal, Goods, StoreInfo) {
         $rootScope.active = 'home';
         document.title='买家中心-优软商城';
+        $scope.userInfo = $rootScope.userInfo;
         var getRecommendComps = function (userUU, usedFor, pageable) {
             Recommendation.getRecommendComps({page: pageable.page, size: pageable.size}, function (data) {
                 $scope.recommendComps = data.content;

+ 1 - 1
src/main/webapp/resources/js/usercenter/controllers/forstore/order_detail_ctrl.js

@@ -88,7 +88,7 @@ define(['app/app'], function(app) {
 				}
 			});
 
-			if (status == 501 || status == 503 || status == 504) {
+			if (status == 501 || status == 503 || status == 504 || status == 524 || status == 525) {
 				$scope.steps.step1 = true;
 				$scope.steps.time1 = $scope.getTimeOfStatus(status);
 			} else if (status == 505 || status == 406 || status == 407 || status == 403 || status == 408) {

+ 35 - 4
src/main/webapp/resources/js/usercenter/controllers/forstore/order_pay_ctrl.js

@@ -416,25 +416,56 @@ define(['app/app'], function(app) {
 
 		// 输入购买量限制
 		$scope.blurNum = function (detail) {
+			// detail.inputError = 0;
+			// detail.noInputError = 0;
 			detail.number = Number(detail.number);
 			if (detail.number < detail.goodsHistory.minBuyQty || !detail.number) {
-				toaster.pop("info", "提示", "该商品最少购买" + detail.goodsHistory.minBuyQty + "件");
-				detail.number = detail.goodsHistory.minBuyQty;
+				// toaster.pop("info", "提示", "该商品最少购买" + detail.goodsHistory.minBuyQty + "件");
+				if(detail.goodsHistory.breakUp) {
+					// detail.noInputError = 1;
+					toaster.pop('info','提示','最小起订量为' + detail.goodsHistory.minBuyQty);
+					detail.number = detail.goodsHistory.minBuyQty;
+					// $timeout(function () {
+					// 	c.noInputError = 0;
+					// }, 3000);
+				}else{
+					// detail.inputError = 1;
+					toaster.pop('info','提示','最小起订量为' + detail.goodsHistory.minBuyQty);
+					detail.number = detail.goodsHistory.minBuyQty;
+					// $timeout(function () {
+					// 	detail.inputError = 0;
+					// },3000);
+				}
 			}else if(detail.number > detail.goodsHistory.reserve){
 				if(detail.goodsHistory.breakUp) {
+					// detail.noInputError = 2;
+					toaster.pop('info','提示','库存不足');
 					detail.number = detail.goodsHistory.reserve;
+					// $timeout(function () {
+					// 	c.noInputError = 0;
+					// }, 3000);
 				}else{
-					detail.number = Number(NumberService.sub(detail.goodsHistory.reserve, detail.goodsHistory.reserve %detail.goodsHistory.minPackQty));
+					// detail.inputError = 2;
+					toaster.pop('info','提示','库存不足');
+					detail.number = Number(NumberService.sub(detail.goodsHistory.reserve, detail.goodsHistory.reserve % detail.goodsHistory.minPackQty));
+					// $timeout(function () {
+					// 	detail.inputError = 0;
+					// },3000);
 				}
-				toaster.pop('info', '提示','库存不足');
+				// toaster.pop('info', '提示','库存不足');
 			}else {
 				if(!detail.goodsHistory.breakUp) {
 					var remandar = detail.number % detail.goodsHistory.minPackQty;
 					if(remandar != 0) {
+						// detail.inputError = 3;
+						toaster.pop("info", "提示", "不支持拆包且包装量为" + detail.goodsHistory.minPackQty);
 						detail.number = Number(NumberService.add(NumberService.sub(detail.number, detail.number % detail.goodsHistory.minPackQty), detail.goodsHistory.minPackQty));
 						if(detail.number > detail.goodsHistory.reserve) {
 							detail.number = NumberService.sub(detail.goodsHistory.reserve, detail.goodsHistory.reserve % detail.goodsHistory.minPackQty);
 						}
+						// $timeout(function () {
+						// 	detail.inputError = 0;
+						// },3000);
 					}
 				}
 			}

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