Bladeren bron

更新主分支上的代码,因不能正常登入

wangcz 8 jaren geleden
bovenliggende
commit
fc62ceb27f
100 gewijzigde bestanden met toevoegingen van 3992 en 143 verwijderingen
  1. 7 3
      .gitignore
  2. 7 0
      pom.xml
  3. 15 0
      src/main/java/com/uas/platform/b2c/advertise/ad/model/RecommendProduct.java
  4. 6 2
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/AdvantageCommodityServiceImpl.java
  5. 4 3
      src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/RecommendProductServiceImpl.java
  6. 51 12
      src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java
  7. 60 0
      src/main/java/com/uas/platform/b2c/common/account/controller/UsageLogController.java
  8. 44 0
      src/main/java/com/uas/platform/b2c/common/account/model/UsageLog.java
  9. 6 5
      src/main/java/com/uas/platform/b2c/common/account/v2/controller/UserController.java
  10. 1 1
      src/main/java/com/uas/platform/b2c/common/account/v2/service/UserService.java
  11. 3 3
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/EnterpriseServiceImpl.java
  12. 10 10
      src/main/java/com/uas/platform/b2c/common/account/v2/service/impl/UserServiceImpl.java
  13. 10 0
      src/main/java/com/uas/platform/b2c/common/base/service/SendMessageService.java
  14. 9 2
      src/main/java/com/uas/platform/b2c/common/base/service/impl/FileClientImpl.java
  15. 7 5
      src/main/java/com/uas/platform/b2c/common/base/service/impl/RestMailServiceImpl.java
  16. 7 5
      src/main/java/com/uas/platform/b2c/common/base/service/impl/RestSmsServiceImpl.java
  17. 11 1
      src/main/java/com/uas/platform/b2c/common/base/service/impl/SendMessageServiceImpl.java
  18. 19 0
      src/main/java/com/uas/platform/b2c/common/keyword/Readme.md
  19. 101 0
      src/main/java/com/uas/platform/b2c/common/keyword/controller/KeyWordController.java
  20. 18 0
      src/main/java/com/uas/platform/b2c/common/keyword/dao/KeyWordDao.java
  21. 49 0
      src/main/java/com/uas/platform/b2c/common/keyword/model/KeyWord.java
  22. 42 0
      src/main/java/com/uas/platform/b2c/common/keyword/service/KeyWordService.java
  23. 69 0
      src/main/java/com/uas/platform/b2c/common/keyword/service/impl/KeyWordServiceImpl.java
  24. 16 1
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  25. 19 0
      src/main/java/com/uas/platform/b2c/common/search/dao/SearchHistoryDao.java
  26. 86 0
      src/main/java/com/uas/platform/b2c/common/search/model/SearchHistory.java
  27. 16 5
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  28. 1 1
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  29. 2 2
      src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java
  30. 35 5
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  31. 11 1
      src/main/java/com/uas/platform/b2c/core/config/MicroServicesConf.java
  32. 28 0
      src/main/java/com/uas/platform/b2c/core/config/SysConf.java
  33. 1 1
      src/main/java/com/uas/platform/b2c/core/constant/EncodingRulesConstant.java
  34. 32 0
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  35. 10 0
      src/main/java/com/uas/platform/b2c/core/constant/Type.java
  36. 79 0
      src/main/java/com/uas/platform/b2c/core/filter/KeyWordFilter.java
  37. 23 3
      src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
  38. 79 0
      src/main/java/com/uas/platform/b2c/core/support/BodyReaderHttpServletRequestWrapper.java
  39. 61 0
      src/main/java/com/uas/platform/b2c/core/support/HttpHelper.java
  40. 12 0
      src/main/java/com/uas/platform/b2c/core/support/log/UsageBufferedLogger.java
  41. 99 0
      src/main/java/com/uas/platform/b2c/core/utils/KeyWordFilterUtil.java
  42. 1 1
      src/main/java/com/uas/platform/b2c/external/erp/order/api/PurchaseController.java
  43. 14 0
      src/main/java/com/uas/platform/b2c/fa/payment/controller/BankInfoController.java
  44. 71 0
      src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentController.java
  45. 71 0
      src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentStoreController.java
  46. 1 1
      src/main/java/com/uas/platform/b2c/fa/payment/controller/YseReturnController.java
  47. 29 0
      src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDao.java
  48. 36 0
      src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDetailDao.java
  49. 32 0
      src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentStoreDao.java
  50. 43 1
      src/main/java/com/uas/platform/b2c/fa/payment/model/BankTransfer.java
  51. 156 0
      src/main/java/com/uas/platform/b2c/fa/payment/model/Installment.java
  52. 175 0
      src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentDetail.java
  53. 116 0
      src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentStore.java
  54. 57 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentService.java
  55. 46 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentStoreService.java
  56. 0 1
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankInfoServiceImpl.java
  57. 109 22
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/BankTransferServiceImpl.java
  58. 365 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentServiceImpl.java
  59. 98 0
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/InstallmentStoreServiceImpl.java
  60. 11 5
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/PaymentServiceImpl.java
  61. 15 0
      src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java
  62. 55 10
      src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java
  63. 16 1
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  64. 10 3
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ReleaseProductByBatchServiceImpl.java
  65. 24 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/api/BrandController.java
  66. 105 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/controller/BrandMapController.java
  67. 11 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
  68. 13 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandMapDao.java
  69. 10 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandMostSimpleInfoDao.java
  70. 17 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandTempDao.java
  71. 28 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/Brand.java
  72. 233 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/BrandMap.java
  73. 55 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/BrandTemp.java
  74. 75 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/MapOperator.java
  75. 41 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandMapService.java
  76. 17 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandService.java
  77. 184 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandMapServiceImpl.java
  78. 40 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandServiceImpl.java
  79. 12 8
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandSubmitServiceImpl.java
  80. 35 2
      src/main/java/com/uas/platform/b2c/prod/product/common/api/CommonCountController.java
  81. 7 0
      src/main/java/com/uas/platform/b2c/prod/product/common/service/CommonCountService.java
  82. 5 0
      src/main/java/com/uas/platform/b2c/prod/product/common/service/impl/CommonCountServiceImpl.java
  83. 2 2
      src/main/java/com/uas/platform/b2c/prod/product/component/api/ComponentController.java
  84. 62 0
      src/main/java/com/uas/platform/b2c/prod/product/component/api/ComponentCrawlController.java
  85. 16 0
      src/main/java/com/uas/platform/b2c/prod/product/component/dao/ComponentCrawlDao.java
  86. 38 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java
  87. 32 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentCrawl.java
  88. 40 0
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentCrawlService.java
  89. 2 1
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentService.java
  90. 77 0
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentCrawlServiceImpl.java
  91. 3 2
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentServiceImpl.java
  92. 28 0
      src/main/java/com/uas/platform/b2c/prod/product/kind/model/Kind.java
  93. 14 0
      src/main/java/com/uas/platform/b2c/prod/store/controller/StoreInController.java
  94. 1 1
      src/main/java/com/uas/platform/b2c/prod/store/model/StoreIn.java
  95. 10 0
      src/main/java/com/uas/platform/b2c/prod/store/service/StoreInService.java
  96. 19 0
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreInServiceImpl.java
  97. 0 4
      src/main/java/com/uas/platform/b2c/prod/store/task/ViolationsAutoFinish.java
  98. 22 0
      src/main/java/com/uas/platform/b2c/trade/order/controller/OrderController.java
  99. 15 2
      src/main/java/com/uas/platform/b2c/trade/order/controller/PurchaseController.java
  100. 6 5
      src/main/java/com/uas/platform/b2c/trade/order/dao/OrderDao.java

+ 7 - 3
.gitignore

@@ -3,7 +3,7 @@
 .settings/
 bin/
 tmp/
-test/
+# test/
 *.tmp
 *.bak
 *.swp
@@ -34,7 +34,7 @@ test/
 # Java
 ## Compiled class file
 *.class
-test/
+#test/
 
 ## Log file
 *.log
@@ -57,4 +57,8 @@ pom.xml.next
 release.properties
 dependency-reduced-pom.xml
 buildNumber.properties
-/src/test/
+# /src/test/
+/src/test/java/com/uas/platform/b2c/RegistForMall.java
+/src/test/java/com/uas/platform/b2c/testForRestTemplate.java
+/.gitignore
+/src/test/java/com/uas/platform/b2c/testAaa.java

+ 7 - 0
pom.xml

@@ -44,10 +44,17 @@
 		</profile>
 	</profiles>
 	<dependencies>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+			<version>3.0.1</version>
+			<scope>test</scope>
+		</dependency>
 		<dependency>
 			<groupId>javax.servlet</groupId>
 			<artifactId>servlet-api</artifactId>
 		</dependency>
+
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>

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

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.advertise.ad.model;
 
+import com.uas.platform.b2c.core.constant.Status;
+
 import java.util.Date;
 
 /**
@@ -117,9 +119,22 @@ public class RecommendProduct {
 	 */
 	private String storeUuid;
 
+	/**
+	 * 售罄状态
+	 */
+	private Integer status;
+
 	public RecommendProduct() {
 	}
 
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
 	public String getId() {
 		return id;
 	}

+ 6 - 2
src/main/java/com/uas/platform/b2c/advertise/ad/service/impl/AdvantageCommodityServiceImpl.java

@@ -3,6 +3,7 @@ package com.uas.platform.b2c.advertise.ad.service.impl;
 import com.uas.platform.b2c.advertise.ad.model.AdvantageCommodity;
 import com.uas.platform.b2c.advertise.ad.service.AdvantageCommodityService;
 import com.uas.platform.b2c.core.config.MicroServicesConf;
+import com.uas.platform.b2c.core.config.MicroServicesConfMulti;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.utils.JacksonUtils;
 import com.uas.platform.b2c.trade.support.CodeType;
@@ -26,21 +27,24 @@ public class AdvantageCommodityServiceImpl implements AdvantageCommodityService
 
 	private final MicroServicesConf conf;
 
+	private final MicroServicesConfMulti confMulti;
+
 	private final RestTemplate restTemplate;
 
 	private final SysConf sysConf;
 
 	@Autowired
-	public AdvantageCommodityServiceImpl(MicroServicesConf conf, RestTemplate restTemplate, SysConf sysConf) {
+	public AdvantageCommodityServiceImpl(MicroServicesConf conf, RestTemplate restTemplate, SysConf sysConf, MicroServicesConfMulti confMulti) {
 		this.conf = conf;
 		this.restTemplate = restTemplate;
 		this.sysConf = sysConf;
+		this.confMulti = confMulti;
 	}
 
 	@Override
 	public List<AdvantageCommodity> findByStoreUuid(String storeUuid) {
 		if (StringUtils.hasText(storeUuid)) {
-			String url = conf.getRequestUrl(20100, "/store-cms/advantages?storeUuid=" + storeUuid);
+			String url = confMulti.getRecommendUrl( "/store-cms/advantages?storeUuid=" + storeUuid);
 			String result = restTemplate.getForEntity(url, String.class).getBody();
 			if (StringUtils.hasText(result)) {
 				return JacksonUtils.fromJsonArray(result, AdvantageCommodity.class);

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

@@ -70,9 +70,10 @@ public class RecommendProductServiceImpl implements RecommendProductService {
 		message.setBatchCodes(batchCodes);
 		System.out.println(JacksonUtils.toJson(message));
 
-		String topic = "recommend-products-delete" + "-" + ("prod".equals(profile) ? "prod" : "test");
-
-		kafkaTemplate.send(topic, "batchCode", JacksonUtils.toJson(message));
+		/*String topic = "recommend-products-delete" + "-" + ("prod".equals(profile) ? "prod" : "test");
+		kafkaTemplate.send(topic, "batchCode", JacksonUtils.toJson(message));*/
+		String url = conf.getRecommendUrl("/api/recommend/products/delete");
+		restTemplate.postForObject(url, JacksonUtils.toJson(message), String.class);
 	}
 
 	@Override

+ 51 - 12
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -1,5 +1,7 @@
 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.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.SigninLog;
 import com.uas.platform.b2c.common.account.model.User;
@@ -22,10 +24,7 @@ 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.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -60,21 +59,24 @@ public class SecurityController {
 	@RequestMapping(value = "/logout", method = RequestMethod.GET, headers = "Accept=application/json")
 	@ResponseStatus(value = HttpStatus.OK)
 	@ResponseBody
-	public ModelMap logout(HttpServletRequest request, HttpServletResponse response, HttpSession session, String returnUrl)
+	public String logout(HttpServletRequest request, HttpServletResponse response, HttpSession session, String returnUrl)
 			throws IOException {
+		String callback =request.getParameter("jsoncallback");
+		response.setContentType("text/html;charset=UTF-8");
 		session.invalidate();
 		SSOHelper.clearLogin(request, response);
 		SystemSession.clear();
 		if (StringUtils.isEmpty(returnUrl)) {
 			returnUrl = request.getHeader("Referer");
 		}
-		boolean cross = SSOHelper.isCrossDomain(request);
+		return "successCallback({success:'1'})";
+		/*boolean cross = SSOHelper.isCrossDomain(request);
 		if (cross) {
 			request.getSession().setAttribute(SSOConfig.SSOReferer, returnUrl);
 			// 跨域情况,需要再次询问账户中心
-			returnUrl = "/logout/proxy";
-		}
-		return new ModelMap("content", returnUrl);
+			returnUrl = request.getContextPath() + "/logout/proxy";
+		}*/
+		//return new ModelMap("content", returnUrl);
 	}
 
 	/**
@@ -96,12 +98,14 @@ public class SecurityController {
 		} else {
 			redirectUrl = SSOHelper.getRedirectLoginUrl(request, returnUrl);
 		}
-		boolean cross = SSOHelper.isCrossDomain(request);
+		/*boolean cross = SSOHelper.isCrossDomain(request);
 		if (cross) {
 			// 跨域代理界面
 			redirectUrl = request.getContextPath() + "/login/proxy";
-		}
-		return new ModelMap("content", redirectUrl);
+		}*/
+		ModelMap map = new ModelMap("content", redirectUrl);
+		map.put("baseUrl","/login/other");
+		return map;
 	}
 	/**
 	 * 获取跳转注册的url
@@ -167,6 +171,7 @@ public class SecurityController {
 	public ModelMap afterCrossLogin(HttpServletRequest request, HttpServletResponse response, String replyTxt) {
 		if (!StringUtils.isEmpty(replyTxt)) {
 			Object returnUrl = request.getSession().getAttribute(SSOConfig.SSOReferer);
+//			returnUrl = returnUrl.toString().replaceAll("platform-b2c/","").replaceAll("login/proxy","SSRProxy/loginProxy");
 			SSOConfig config = SSOHelper.getSSOService().getConfig();
 			AuthToken token = SSOHelper.ok(request, response, replyTxt, config.getClientPublicKey(), config.getCenterPublicKey());
 			if (token != null) {
@@ -182,12 +187,45 @@ public class SecurityController {
 					SystemSession.setUser(user);
 					log(request, user);
 				}
+				returnUrl = returnUrl.toString().contains("10.10.0.10") ? "/" : returnUrl;
 				return new ModelMap("returnUrl", returnUrl);
 			}
 		}
 		return null;
 	}
 
+	/**
+	 * 其他地点登录后 同步登录状态
+	 * @param request
+	 * @param response
+	 */
+	@RequestMapping(value = "/login/other")
+	@ResponseBody
+	public String afterCrossLogin(HttpServletRequest request, HttpServletResponse response, UserView userView) {
+		String callback =request.getParameter("jsoncallback");
+		response.setContentType("text/html;charset=UTF-8");
+		if (userView != null && userView.getUid() != null) {
+ 				SSOToken tk = new SSOToken();
+				tk.setUid(userView.getUid());
+				tk.setTime(System.currentTimeMillis());
+				tk.setData(JSON.toJSONString(userView));
+				SSOHelper.setSSOCookie(request, response, tk, true);
+				User user = getUserByToken(tk);
+				if (user != null) {
+					if (!user.getUserPwd().equals(FlexJsonUtils.fromJson(tk.getData(), com.uas.account.entity.User.class).getPassword())){
+						return "successCallback({success:'0'})";
+					}
+					user.setIp(AgentUtils.getIp(request));
+					request.getSession().setAttribute("user", user);
+					SystemSession.setUser(user);
+					log(request, user);
+				}
+
+			return "successCallback({success:'1'})";
+		}
+		return "successCallback({success:'0'})";
+	}
+
 	/**
 	 * 获取跨域登录的参数
 	 * 
@@ -214,6 +252,7 @@ public class SecurityController {
 			logoutUrl = SSOHelper.getRedirectLogoutUrl(request, String.valueOf(request.getSession().getAttribute("SSOReferer")));
 		}
 		model.addAttribute("logoutUrl", logoutUrl);
+		model.addAttribute("baseUrl","/logout");
 		return model;
 	}
 

+ 60 - 0
src/main/java/com/uas/platform/b2c/common/account/controller/UsageLogController.java

@@ -0,0 +1,60 @@
+package com.uas.platform.b2c.common.account.controller;
+
+import com.uas.platform.b2c.common.account.model.UsageLog;
+import com.uas.platform.b2c.common.account.service.UsageLogService;
+import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.wordnik.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 用户操作日志请求
+ * @author suntg
+ * @version 2017年11月8日16:38:52 初始化建立
+ */
+@RestController
+@RequestMapping(value = "/log/usage")
+public class UsageLogController {
+
+	@Autowired
+	private UsageLogService usageLogService;
+
+	private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	/**
+	 * 根据分页信息获取
+	 * @return
+	 */
+	@RequestMapping(method = RequestMethod.GET)
+	public Page<UsageLog> getAllByPage(PageParams params,@ApiParam(required = true, value = "用户名") String userName) {
+		PageInfo info = new PageInfo(params);
+		if (userName!=null && !userName.equals("")) {
+			info.filter("user.userName", userName);
+		}
+		if(info.getSort() == null)
+			info.sorting("time", Sort.Direction.DESC);
+		return usageLogService.findAllByPageInfo(info);
+	}
+
+	/**
+	 * 根据用户UU号分页获取
+	 * @return
+	 */
+	@RequestMapping(value = "/{uu}",method = RequestMethod.GET)
+	public Page<UsageLog> getByUserUuByPage(PageParams params, @PathVariable("uu") Long userUu) {
+		PageInfo info = new PageInfo(params);
+		info.filter("userUU", userUu);
+		if(info.getSort() == null)
+			info.sorting("time", Sort.Direction.DESC);
+		return usageLogService.findAllByPageInfo(info);
+	}
+}

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

@@ -84,6 +84,24 @@ public class UsageLog extends BufferedLogable implements Serializable {
 	@Column(name = "rel_key")
 	private Long key;
 
+	/**
+	 * 电话
+	 */
+	@Column(name = "user_tel")
+	private String userTel;
+
+	/**
+	 * 邮箱
+	 */
+	@Column(name = "user_email")
+	private String userEmail;
+
+	/**
+	 * 姓名
+	 */
+	@Column(name = "user_name")
+	private String userName;
+
 	@JsonIgnore
 	@JSONField(serialize = false)
 	public Long getId() {
@@ -166,6 +184,8 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		this.key = key;
 	}
 
+	@JsonIgnore
+	@JSONField(serialize = false)
 	public UserBaseInfo getUser() {
 		return user;
 	}
@@ -174,6 +194,18 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		this.user = user;
 	}
 
+	public String getUserTel() {
+		return user.getUserTel();
+	}
+
+	public String getUserEmail() {
+		return user.getUserEmail();
+	}
+
+	public String getUserName() {
+		return user.getUserName();
+	}
+
 	public UsageLog() {
 
 	}
@@ -190,6 +222,18 @@ public class UsageLog extends BufferedLogable implements Serializable {
 		this.ip = SystemSession.getUser().getIp();
 	}
 
+	public UsageLog(String title, String message, String detail, String code, Long key, Long enuu, Long useruu) {
+		this.enUU = enuu;
+		this.title = title;
+		this.message = message;
+		this.detail = detail;
+		this.code = code;
+		this.key = key;
+		this.time = new Date().getTime();
+		this.userUU = useruu;
+		this.ip = SystemSession.getUser().getIp();
+	}
+
 	public UsageLog(String title, String message, Long userUU, String ip, String code, Long key) {
 		this.enUU = 0L;
 		this.title = title;

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

@@ -4,7 +4,6 @@ import com.uas.account.entity.User;
 import com.uas.platform.b2c.common.account.v2.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -32,11 +31,13 @@ public class UserController {
     /**
      * 删除用户
      *
-     * @param uu
+     * @param
      */
-	@RequestMapping(value = "/removeUser/{uu}", method = RequestMethod.POST)
+	@RequestMapping(value = "/removeUser", method = RequestMethod.POST)
     @ResponseBody
-    public void removeUser(@PathVariable Long uu) {
-        userService.delete(uu);
+    public void removeUser(User user) {
+		Long uu = Long.valueOf(user.getDialectUID());
+		Long enuu = Long.valueOf(user.getSpaceDialectUID());
+        userService.delete(uu, enuu);
     }
 }

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

@@ -17,5 +17,5 @@ public interface UserService {
      *
      * @param uu
      */
-    void delete(Long uu);
+    void delete(Long uu, Long enuu);
 }

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

@@ -47,9 +47,9 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         enterprise.setUu(Long.valueOf(userSpace.getDialectUID()));
         enterpriseDao.save(enterprise);
         if(null != oldenterprise) {
-            logger.log("更新企业信息", enterprise.getUu()+"time: " + sdf.format(new Date()));
+            logger.log("更新企业信息", enterprise.getUu()+"time: " + sdf.format(new Date()), enterprise.getUu(), 0L);
         } else {
-            logger.log("新增企业信息", enterprise.getUu()+"time: " + sdf.format(new Date()));
+            logger.log("新增企业信息", enterprise.getUu()+"time: " + sdf.format(new Date()), enterprise.getUu(), 0L);
         }
     }
 
@@ -62,7 +62,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
                 if(!CollectionUtils.isEmpty(users)) {
                     enterprise.setEnAdminuu(users.get(0).getUserUU());
                     enterpriseDao.save(enterprise);
-                    logger.log("更换管理员", enterprise.getEnName()+"," +users.get(0).getUserName() + "time:" + sdf.format(new Date()));
+                    logger.log("更换管理员", enterprise.getEnName()+"," +users.get(0).getUserName() + "time:" + sdf.format(new Date()), enterprise.getUu(), enterprise.getEnAdminuu());
                 }
             }
         }

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

@@ -5,7 +5,6 @@ import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.v2.service.UserService;
-import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Status;
@@ -48,32 +47,33 @@ public class UserServiceImpl implements UserService {
         List<com.uas.platform.b2c.common.account.model.User> oldUsers = userDao.findUserByUserUU(u.getUserUU());
         userDao.save(u);
         if(oldUsers.size() > 0) {
-            logger.log("更新用户信息", user.getDialectUID() + "time: " + sdf.format(new Date()));
+            logger.log("更新用户信息", user.getDialectUID() + "time: " + sdf.format(new Date()), enterprise.getUu(), u.getUserUU());
         } else {
             if(null != enterprise && null == enterprise.getEnAdminuu()) {
                 enterprise.setEnAdminuu(u.getUserUU());
                 enterpriseDao.save(enterprise);
-                logger.log("设置管理员", enterprise.getEnName() + "," + u.getUserName() + "time: " + sdf.format(new Date()));
+                logger.log("设置管理员", enterprise.getEnName() + "," + u.getUserName() + "time: " + sdf.format(new Date()), enterprise.getUu(), u.getUserUU());
             }
-            logger.log("新增用户信息", user.getDialectUID() + "time: " + sdf.format(new Date()));
+            logger.log("新增用户信息", user.getDialectUID() + "time: " + sdf.format(new Date()), enterprise.getUu(), u.getUserUU());
         }
     }
 
 
     @Override
-    public void delete(Long uu) {
+    public void delete(Long uu, Long enuu) {
         com.uas.platform.b2c.common.account.model.User user = userDao.findOne(uu);
-        if(null != user) {
-            if (user.getEnterprises().contains(SystemSession.getUser().getEnterprise())) {
-                user.removeEnterprise(SystemSession.getUser().getEnterprise());
+        Enterprise enterprise = enterpriseDao.findByUu(enuu);
+        if(null != user && null != enterprise) {
+            if (user.getEnterprises().contains(enterprise)) {
+                user.removeEnterprise(enterprise);
                 if (user.getEnterprises().size() != 0) {
                     user.setEnable((short) Status.DISABLED.value());
-                    logger.log("删除用户", "禁用" + user.getUserUU());
+                    logger.log("删除用户", "禁用" + user.getUserUU(), 0L, 0L);
                     userDao.save(user);
                 }
                 if (user.getEnterprises().size() == 0) {
                     userDao.delete(user);
-                    logger.log("删除用户", "删除" + user.getUserUU());
+                    logger.log("删除用户", "删除" + user.getUserUU(), 0L, 0L);
                 }
             }
         }

+ 10 - 0
src/main/java/com/uas/platform/b2c/common/base/service/SendMessageService.java

@@ -27,4 +27,14 @@ public interface SendMessageService {
 	 * @param type 消息类型
 	 */
 	public void sendMessageForOrderSucess(String sellername, int num, String userPhone, MessageType type);
+
+	/**
+	 * 分期付款后发送信息给卖家
+	 * @param enName 卖家企业名称
+	 * @param uuName 买家姓名
+	 * @param amount 付款金额
+	 * @param userPhone 发送手机号
+	 * @param type 消息类型
+	 */
+	public void sendMessageForInstallmentPay(String enName, String uuName, Double amount, String userPhone, MessageType type);
 }

+ 9 - 2
src/main/java/com/uas/platform/b2c/common/base/service/impl/FileClientImpl.java

@@ -6,6 +6,7 @@ import com.uas.dfs.domain.MetaData;
 import com.uas.dfs.service.FileClient;
 import com.uas.platform.b2c.common.base.constant.FileClientConstant;
 import com.uas.platform.b2c.core.config.SysConf;
+import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.http.*;
@@ -26,6 +27,8 @@ public class FileClientImpl implements FileClient {
 
     private final SysConf sysConf;
 
+    private final Logger logger = Logger.getLogger(getClass());
+
     @Autowired
     public FileClientImpl(RestTemplate restTemplate, SysConf sysConf) {
         this.restTemplate = restTemplate;
@@ -56,9 +59,13 @@ public class FileClientImpl implements FileClient {
 
         };
         form.add("file", arrayResource);
-
         HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(form, headers);
-        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(sysConf.getUploadFileUrl() + FileClientConstant.FILE_UPLOAD, requestEntity, JSONObject.class);
+        ResponseEntity<JSONObject> responseEntity = null;
+        try {
+            responseEntity = restTemplate.postForEntity(sysConf.getUploadFileUrl() + FileClientConstant.FILE_UPLOAD, requestEntity, JSONObject.class);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
         return responseEntity.getBody().getString("path");
     }
 

+ 7 - 5
src/main/java/com/uas/platform/b2c/common/base/service/impl/RestMailServiceImpl.java

@@ -7,6 +7,7 @@ import com.uas.message.mail.domain.MailLog;
 import com.uas.message.mail.service.MailService;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
@@ -31,17 +32,18 @@ public class RestMailServiceImpl implements MailService {
     /**
      * 邮件服务主机地址
      */
-    private static final String MAIL_CONSOLE_HOST = "http://10.10.100.23:28029/";
+    @Value("#{sys.messageServiceIp ?: 'http://message.ubtob.com/'}")
+    private String MAIL_CONSOLE_HOST;
 
     /**
      * 发送邮件给单个人url
      */
-    private static final String MAIL_SEND_URL = MAIL_CONSOLE_HOST  + "mail/send";
+    private String MAIL_SEND_URL = "mail/send";
 
     /**
      * 发送邮件给多个人 url
      */
-    private static final String MAIL_SEND_MANY_URL = MAIL_CONSOLE_HOST + "mail/send/o2m";
+    private String MAIL_SEND_MANY_URL = "mail/send/o2m";
 
     @Autowired
     public RestMailServiceImpl(RestTemplate restTemplate) {
@@ -86,7 +88,7 @@ public class RestMailServiceImpl implements MailService {
         object.put("params", params);
 
         HttpEntity<String> formEntity = new HttpEntity<String>(object.toJSONString(), headers);
-        ResponseEntity<MailLog> responseEntity = restTemplate.postForEntity(MAIL_SEND_URL, formEntity, MailLog.class);
+        ResponseEntity<MailLog> responseEntity = restTemplate.postForEntity(MAIL_CONSOLE_HOST + MAIL_SEND_URL, formEntity, MailLog.class);
         return responseEntity.getBody();
     }
 
@@ -110,7 +112,7 @@ public class RestMailServiceImpl implements MailService {
         object.put("params", params);
 
         HttpEntity<String> formEntity = new HttpEntity<String>(object.toJSONString(), headers);
-        ResponseEntity<String> responseEntity = restTemplate.postForEntity(MAIL_SEND_MANY_URL, formEntity, String.class);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(MAIL_CONSOLE_HOST + MAIL_SEND_MANY_URL, formEntity, String.class);
         List<MailLog> mailLogs = FastjsonUtils.fromJsonArray(responseEntity.getBody(), MailLog.class);
         return mailLogs;
     }

+ 7 - 5
src/main/java/com/uas/platform/b2c/common/base/service/impl/RestSmsServiceImpl.java

@@ -8,6 +8,7 @@ import com.uas.message.sms.domain.SmsLog;
 import com.uas.message.sms.service.SmsService;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
@@ -33,17 +34,18 @@ public class RestSmsServiceImpl implements SmsService {
     /**
      * 短信服务主机地址
      */
-    private static final String SMS_CONSOLE_HOST = "http://10.10.100.23:28029/";
+    @Value("#{sys.messageServiceIp ?: 'http://message.ubtob.com/'}")
+    private String SMS_CONSOLE_HOST;
 
     /**
      * 发送短信给单个人url
      */
-    private static final String SMS_SEND_URL = SMS_CONSOLE_HOST  + "sms/send";
+    private static final String SMS_SEND_URL = "sms/send";
 
     /**
      * 发送短信给多个人 url
      */
-    private static final String SMS_SEND_MANY_URL = SMS_CONSOLE_HOST + "sms/send/o2m";
+    private static final String SMS_SEND_MANY_URL = "sms/send/o2m";
 
     @Autowired
     public RestSmsServiceImpl(RestTemplate restTemplate) {
@@ -85,7 +87,7 @@ public class RestSmsServiceImpl implements SmsService {
         object.put("params", params);
 
         HttpEntity<String> formEntity = new HttpEntity<String>(object.toJSONString(), headers);
-        ResponseEntity<SmsLog> responseEntity = restTemplate.postForEntity(SMS_SEND_URL, formEntity, SmsLog.class);
+        ResponseEntity<SmsLog> responseEntity = restTemplate.postForEntity(SMS_CONSOLE_HOST + SMS_SEND_URL, formEntity, SmsLog.class);
         return responseEntity.getBody();
     }
 
@@ -109,7 +111,7 @@ public class RestSmsServiceImpl implements SmsService {
         object.put("params", params);
 
         HttpEntity<String> formEntity = new HttpEntity<String>(object.toJSONString(), headers);
-        ResponseEntity<String> responseEntity = restTemplate.postForEntity(SMS_SEND_MANY_URL, formEntity, String.class);
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(SMS_CONSOLE_HOST + SMS_SEND_MANY_URL, formEntity, String.class);
         List<SmsLog> mailLogs = FastjsonUtils.fromJsonArray(responseEntity.getBody(), SmsLog.class);
         return mailLogs;
     }

+ 11 - 1
src/main/java/com/uas/platform/b2c/common/base/service/impl/SendMessageServiceImpl.java

@@ -58,5 +58,15 @@ public class SendMessageServiceImpl implements SendMessageService {
 		}
 	}
 
-
+	@Override
+	public void sendMessageForInstallmentPay(String enName, String uuName, Double amount, String userPhone, MessageType type) {
+		try {
+			Set<String> userPhones = new HashSet<>();
+			userPhones.add(userPhone);
+			Object[] obj = {enName, uuName, amount};
+			smsService.sendAll("154fa7d4-adef-4318-80a4-60389a43ecaf",userPhones,obj);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
 }

+ 19 - 0
src/main/java/com/uas/platform/b2c/common/keyword/Readme.md

@@ -0,0 +1,19 @@
+## name
+
+keyword
+
+## 名称
+
+通用模块
+
+## 创建人
+
+liusw
+
+## 创建时间
+
+2017年11月7日14:30:35
+
+## 说明
+
+非法关键词过滤

+ 101 - 0
src/main/java/com/uas/platform/b2c/common/keyword/controller/KeyWordController.java

@@ -0,0 +1,101 @@
+package com.uas.platform.b2c.common.keyword.controller;
+
+import com.uas.platform.b2c.common.keyword.model.KeyWord;
+import com.uas.platform.b2c.common.keyword.service.KeyWordService;
+import com.uas.platform.b2c.core.filter.KeyWordFilter;
+import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageParams;
+import com.wordnik.swagger.annotations.ApiOperation;
+import com.wordnik.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/keyword")
+public class KeyWordController {
+
+    @Autowired
+    private KeyWordService keyWordService;
+
+    private static final UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+    /**
+     * 保存关键词
+     * @param keyWord
+     * @return
+     */
+    @RequestMapping(value = "/saveKeyWord", method = RequestMethod.PUT)
+    public ResponseEntity<String> saveKeyWord(@RequestBody KeyWord keyWord) {
+        keyWord = keyWordService.saveKeyWord(keyWord);
+        KeyWordFilter.keyworsSet = keyWordService.getAllKeyWordContent();
+        logger.log("非法关键词", "保存关键词", "关键词: " + keyWord);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+    /**
+     * 分页获取关键词
+     * @param pageInfo
+     * @return
+     */
+    @RequestMapping(value = "/getKeyWordPageInfo", method = RequestMethod.GET)
+    @ApiOperation(value = "分页获取关键词", httpMethod = "GET")
+    public Page<KeyWord> getKeyWordPageInfo(@ApiParam(required = true, value = "分页参数") PageParams pageInfo,String keyword) {
+        logger.log("非法关键词", "分页获取关键词", "分页获取关键词 ");
+        return keyWordService.getKeyWordPageInfo(pageInfo,keyword);
+    }
+
+    /**
+     * 根据id获取关键词
+     * @param id
+     * @return
+     */
+    @RequestMapping(value = "/getOneKeyWord/{id}", method = RequestMethod.GET)
+    @ResponseBody
+    public KeyWord getOneKeyWord(@PathVariable("id") Long id) {
+        logger.log("非法关键词", "根据id获取关键词", "关键词id:"+id);
+        return keyWordService.getOneKeyWord(id);
+    }
+
+    /**
+     * 根据id删除关键词
+     * @param id
+     * @return
+     */
+    @RequestMapping(value = "/deleteKeyWord/{id}", method = RequestMethod.DELETE)
+    public ResponseEntity<String> deleteKeyWord(@PathVariable("id") Long id) {
+        keyWordService.deleteKeyWord(id);
+        KeyWordFilter.keyworsSet = keyWordService.getAllKeyWordContent();
+        logger.log("非法关键词", "根据id删除关键词", "关键词id:"+id);
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+
+    /**
+     * 批量添加关键词
+     * @param keywords
+     * @return
+     */
+    @RequestMapping(value = "/batchAddKeyWord", method = RequestMethod.PUT)
+    public ResponseEntity<String> batchAddKeyWord(@RequestBody String keywords) {
+        //截取json字符串
+        keywords = keywords.substring(keywords.indexOf(":")+2,keywords.lastIndexOf('\"'));
+        //去掉空格
+        keywords = keywords.replace(" ","");
+        String[] str = keywords.split(",");
+        KeyWord keyWord = new KeyWord();
+        for(String s:str){
+            keyWord.setId(null);
+            keyWord.setContent(s);
+            keyWordService.saveKeyWord(keyWord);
+        }
+        KeyWordFilter.keyworsSet = keyWordService.getAllKeyWordContent();
+        return new ResponseEntity<String>(HttpStatus.OK);
+    }
+}

+ 18 - 0
src/main/java/com/uas/platform/b2c/common/keyword/dao/KeyWordDao.java

@@ -0,0 +1,18 @@
+package com.uas.platform.b2c.common.keyword.dao;
+
+import com.uas.platform.b2c.common.keyword.model.KeyWord;
+import java.util.Set;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+/**
+ * 非法关键词dao层
+ * @author liusw
+ */
+public interface KeyWordDao extends JpaSpecificationExecutor<KeyWord>,
+        JpaRepository<KeyWord, Long> {
+
+    @Query(value="select k.content from KeyWord k")
+    Set<String> getAllKeyWordContent();
+}

+ 49 - 0
src/main/java/com/uas/platform/b2c/common/keyword/model/KeyWord.java

@@ -0,0 +1,49 @@
+package com.uas.platform.b2c.common.keyword.model;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 非法关键词
+ * @author liusw
+ * @version 2017/11/17 liusw 创建
+ */
+@Entity
+@Table(name = "sec$keyword")
+public class KeyWord implements Serializable {
+    /**
+     * 序列号
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @Id
+    @Column(name = "kw_id")
+    @GeneratedValue
+    private Long id;
+
+    @Column( name = "kw_content")
+    private String content;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+}

+ 42 - 0
src/main/java/com/uas/platform/b2c/common/keyword/service/KeyWordService.java

@@ -0,0 +1,42 @@
+package com.uas.platform.b2c.common.keyword.service;
+
+import com.uas.platform.b2c.common.keyword.model.KeyWord;
+import com.uas.platform.core.model.PageParams;
+import java.util.Set;
+import org.springframework.data.domain.Page;
+
+public interface KeyWordService {
+
+    /**
+     * 分页获取关键词
+     * @param pageInfo
+     * @return
+     */
+    Page<KeyWord> getKeyWordPageInfo(PageParams pageInfo,String keyword);
+
+    /**
+     * 根据id获取关键词信息
+     * @param id
+     * @return
+     */
+    KeyWord getOneKeyWord(Long id);
+
+    /**
+     * 根据id删除关键词
+     * @param id
+     */
+    void deleteKeyWord(Long id);
+
+    /**
+     * 保存关键词
+     * @param keyWord
+     * @return
+     */
+    KeyWord saveKeyWord(KeyWord keyWord);
+
+    /**
+     * 获取所有的关键词
+     * @return
+     */
+    Set<String> getAllKeyWordContent();
+}

+ 69 - 0
src/main/java/com/uas/platform/b2c/common/keyword/service/impl/KeyWordServiceImpl.java

@@ -0,0 +1,69 @@
+package com.uas.platform.b2c.common.keyword.service.impl;
+
+import com.uas.platform.b2c.common.keyword.dao.KeyWordDao;
+import com.uas.platform.b2c.common.keyword.model.KeyWord;
+import com.uas.platform.b2c.common.keyword.service.KeyWordService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import java.util.Set;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+@Service("keyWordService")
+public class KeyWordServiceImpl implements KeyWordService{
+
+    @Autowired
+    private KeyWordDao keyWordDao;
+
+    @Override
+    public Page<KeyWord> getKeyWordPageInfo(PageParams pageInfo,String keyword) {
+        final PageInfo info = new PageInfo(pageInfo);
+        if (StringUtils.hasText(keyword)) {
+            info.filter("content", keyword, true);
+        }
+        info.sorting(Direction.DESC,new String[]{"id"});
+        return keyWordDao.findAll(new Specification<KeyWord>() {
+            @Override
+            public Predicate toPredicate(Root<KeyWord> root, CriteriaQuery<?> query,
+                    CriteriaBuilder cb) {
+                query.where(info.getPredicates(root, query, cb));
+                return null;
+            }
+        },info);
+    }
+
+    @Override
+    public KeyWord getOneKeyWord(Long id) {
+        if(id==null){
+            throw new IllegalOperatorException("关键词不存在");
+        }
+        return keyWordDao.getOne(id);
+    }
+
+    @Override
+    public void deleteKeyWord(Long id) {
+        if(id==null){
+            throw new IllegalOperatorException("关键词不存在");
+        }
+        keyWordDao.delete(id);
+    }
+
+    @Override
+    public KeyWord saveKeyWord(KeyWord keyWord) {
+        return keyWordDao.save(keyWord);
+    }
+
+    @Override
+    public Set<String> getAllKeyWordContent() {
+        return keyWordDao.getAllKeyWordContent();
+    }
+}

+ 16 - 1
src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java

@@ -1,6 +1,8 @@
 package com.uas.platform.b2c.common.search.controller;
 
 import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.search.dao.SearchHistoryDao;
+import com.uas.platform.b2c.common.search.model.SearchHistory;
 import com.uas.platform.b2c.common.search.service.SearcherService;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
@@ -61,6 +63,9 @@ public class SearcherController {
 	@Autowired
 	private StockInOutHistService stockInOutHistService;
 
+	@Autowired
+	private SearchHistoryDao searchHistoryDao;
+
 	/**
 	 * 作搜索展示跳转
 	 * 
@@ -252,7 +257,7 @@ public class SearcherController {
 	@RequestMapping(value = "/similarKeywords", method = RequestMethod.GET)
 	@ResponseBody
 	public List<String> getSimilarKeywords(String keyword) {
-		return searcherService.getSimilarKeywords(keyword);
+		return (List<String>) searcherService.getSimilarKeywords(keyword).get("all");
 	}
 
 	/**
@@ -343,4 +348,14 @@ public class SearcherController {
 		return result;
 	}
 
+	@RequestMapping(value = "/searchHistory", method = RequestMethod.GET)
+	@ResponseBody
+	public List<SearchHistory> getSearchHistory(HttpServletRequest request){
+		SystemSession.setUser((User)request.getSession().getAttribute("user"));
+		if (null == SystemSession.getUser()){
+			return null;
+		}else{
+			return searchHistoryDao.findByUserUUAndUserEnuuOrderBySearchTimeDesc(SystemSession.getUser().getUserUU(),SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
+		}
+	}
 }

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

@@ -0,0 +1,19 @@
+package com.uas.platform.b2c.common.search.dao;
+
+import com.uas.platform.b2c.common.search.model.SearchHistory;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SearchHistoryDao extends JpaSpecificationExecutor<SearchHistory>,JpaRepository<SearchHistory,Long>{
+    /**
+     * 通过uuid和enuu查找记录
+     * @return
+     */
+    List<SearchHistory> findByUserUUAndUserEnuuOrderBySearchTimeDesc(Long userUU,Long userEnuu);
+
+    List<SearchHistory> findByKeywordAndUserUUAndUserEnuu(String keyword,Long userUU,Long userEnuu);
+}

+ 86 - 0
src/main/java/com/uas/platform/b2c/common/search/model/SearchHistory.java

@@ -0,0 +1,86 @@
+package com.uas.platform.b2c.common.search.model;
+
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 搜索记录
+ */
+@Entity
+@Table(name = "sec$searchHis")
+public class SearchHistory implements Serializable{
+
+    /**
+     * ID
+     */
+    @Id
+    @GeneratedValue
+    @Column(name = "id")
+    private Long id;
+
+    /**
+     * 个人uu
+     */
+    @Column(name = "user_uu")
+    private Long userUU;
+
+    /**
+     * 企业uu
+     */
+    @Column(name = "user_enuu")
+    private Long userEnuu;
+
+    /**
+     * 关键词
+     */
+    @Column(name = "keyword")
+    private String keyword;
+
+    /**
+     * 搜索时间
+     */
+    @Column(name = "searchtime")
+    private Date searchTime;
+
+    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 getUserEnuu() {
+        return userEnuu;
+    }
+
+    public void setUserEnuu(Long userEnuu) {
+        this.userEnuu = userEnuu;
+    }
+
+    public String getKeyword() {
+        return keyword;
+    }
+
+    public void setKeyword(String keyword) {
+        this.keyword = keyword;
+    }
+
+    public Date getSearchTime() {
+        return searchTime;
+    }
+
+    public void setSearchTime(Date searchTime) {
+        this.searchTime = searchTime;
+    }
+}

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

@@ -203,16 +203,27 @@ public class SearchServiceImpl implements SearchService{
     }
 
     @Override
-    public List<String> getSimilarKeywords(String keyword) throws SearchException {
+    public Map<String,Object> getSimilarKeywords(String keyword) throws SearchException {
         Map<String, Object> map = new HashedMap();
         map.put("keyword", keyword);
-        String str = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.SIMILAR_KEYWORD_URL, String.class, map);
-        if(StringUtils.isEmpty(str)) {
+        String strA = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.SIMILAR_KEYWORD_URL, String.class, map);
+        String strC = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.SIMILAR_COMPONENT_URL, String.class, map);
+        String strB = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.SIMILAR_BRAND_URL, String.class, map);
+        String strK = restTemplate.getForObject(sysConf.getSearchUrl() + SearchUrl.SIMILAR_KIND_URL, String.class, map);
+        if(StringUtils.isEmpty(strC) && StringUtils.isEmpty(strB) && StringUtils.isEmpty(strK)) {
             return null;
         }else {
             try {
-                List<String> reMap = FastjsonUtils.fromJson(str, List.class);
-                return reMap;
+                List<String> reMapA = FastjsonUtils.fromJson(strA, List.class);
+                List<String> reMapC = FastjsonUtils.fromJson(strC, List.class);
+                List<String> reMapB = FastjsonUtils.fromJson(strB, List.class);
+                List<String> reMapK = FastjsonUtils.fromJson(strK, List.class);
+                map.clear();
+                map.put("all",reMapA);
+                map.put("kind",reMapK);
+                map.put("componet",reMapC);
+                map.put("brand",reMapB);
+                return map;
             }catch (Exception e) {
                 e.printStackTrace();
                 return null;

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

@@ -33,7 +33,7 @@ public interface SearchService {
 
     List<Map<String, Object>> getBrandsBySearchComponent(String keyword, String kindId) throws SearchException;
 
-    List<String> getSimilarKeywords(String keyword) throws SearchException;
+    Map<String,Object> getSimilarKeywords(String keyword) throws SearchException;
 
     List<Map<String, Object>> getSimilarComponents(String keyword) throws SearchException;
 

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

@@ -58,7 +58,7 @@ public interface SearcherService {
 	 * @throws InterruptedException
 	 * @throws IOException
 	 */
-	public ModelMap searchComponentGoods(String keyword, PageParams page);
+	public ModelMap searchComponentGoods(String keyword, PageParams page , HttpServletRequest request);
     /**
      * 批次搜索数量统计
      *
@@ -104,7 +104,7 @@ public interface SearcherService {
 	 * @param keyword 关键词
 	 * @return 联想词
 	 */
-	public List<String> getSimilarKeywords(String keyword);
+	public Map<String,Object> getSimilarKeywords(String keyword);
 
 	/**
 	 * 根据输入的原厂型号获取联想词

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

@@ -1,8 +1,12 @@
 package com.uas.platform.b2c.common.search.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.common.search.dao.SearchHistoryDao;
+import com.uas.platform.b2c.common.search.model.SearchHistory;
 import com.uas.platform.b2c.common.search.rpc.service.SearchService;
 import com.uas.platform.b2c.common.search.service.SearcherService;
+import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentGoodsDao;
@@ -53,6 +57,9 @@ public class SearcherServiceImpl implements SearcherService {
 	@Autowired
 	private BrandDao brandDao;
 
+	@Autowired
+	private SearchHistoryDao searchHistoryDao;
+
 	private Logger logger = LoggerFactory.getLogger(getClass());
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
@@ -142,7 +149,28 @@ public class SearcherServiceImpl implements SearcherService {
 	 */
 	@SuppressWarnings("unchecked")
 	@Override
-	public ModelMap searchComponentGoods(String keyword, PageParams page) {
+	public ModelMap searchComponentGoods(String keyword, PageParams page , HttpServletRequest request) {
+		if (this.deviceResolver.resolveDevice(request).isMobile()) {
+			SystemSession.setUser((User)request.getSession().getAttribute("user"));
+			if (null != SystemSession.getUser() && null!= SystemSession.getUser().getUserUU()){
+				SearchHistory searchHistory = null;
+				List<SearchHistory> searchHistories = searchHistoryDao.findByKeywordAndUserUUAndUserEnuu(keyword,SystemSession.getUser().getUserUU(),SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
+				if (searchHistories.size()>0){
+					searchHistory = searchHistories.get(0);
+				}else {
+					searchHistory = new SearchHistory();
+				}
+				searchHistory.setKeyword(keyword);
+				searchHistory.setSearchTime(new Date(System.currentTimeMillis()));
+				searchHistory.setUserUU(SystemSession.getUser().getUserUU());
+				searchHistory.setUserEnuu(SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
+				searchHistoryDao.save(searchHistory);
+				searchHistories = searchHistoryDao.findByUserUUAndUserEnuuOrderBySearchTimeDesc(SystemSession.getUser().getUserUU(),SystemSession.getUser().getEnterprise() != null ?SystemSession.getUser().getEnterprise().getUu():null);
+				if (searchHistories.size()>10){
+					searchHistoryDao.delete(searchHistories.subList(10,searchHistories.size()));
+				}
+			}
+		}
 		ModelMap map = new ModelMap();
 		Map<String,Object> results = null;
 		//Map<String, Object> results = new HashMap<>();
@@ -279,15 +307,17 @@ public class SearcherServiceImpl implements SearcherService {
 	}
 
 	@Override
-	public List<String> getSimilarKeywords(String keyword) {
-		List<String> result = new ArrayList<>();
+	public Map<String,Object> getSimilarKeywords(String keyword) {
+		Map<String,Object> result = null;
 		try {
 			result = searchService.getSimilarKeywords(keyword);
 		} catch (SearchException e) {
 			throwSystemException(e);
 		}
-		if (result.size() > 8) {
-			result = result.subList(0,8);
+		for (Entry<String, Object> entry : result.entrySet()) {
+			if(((List)entry.getValue()).size()>8){
+				entry.setValue(((List)entry.getValue()).subList(0,8));
+			}
 		}
 		return result;
 	}

+ 11 - 1
src/main/java/com/uas/platform/b2c/core/config/MicroServicesConf.java

@@ -28,6 +28,12 @@ public class MicroServicesConf {
 	@Value("#{sys.floorMicroServiceIp ?: '10.10.0.30'}")
 	private String floorMicroServiceIp;
 
+	/**
+	 * profile
+	 */
+	@Value("#{sys.profile}")
+	private String profile;
+
 	/**
 	 * 轮播
 	 */
@@ -71,7 +77,11 @@ public class MicroServicesConf {
 	}
 
 	public String getRequestUrlForNews(String requestUrl) {
-		return String.format("http://%s%s", this.newsMicroServiceIp, requestUrl);
+		if ("prod".equals(profile)){
+			return String.format("http://%s%s", this.newsMicroServiceIp, requestUrl);
+		}else {
+			return String.format("http://%s:%d%s", this.microServiceIp, 20210, requestUrl);
+		}
 	}
 
 	public String getRequestUrlForFloor(int port, String requestUrl) {

+ 28 - 0
src/main/java/com/uas/platform/b2c/core/config/SysConf.java

@@ -94,6 +94,12 @@ public class SysConf {
 	@Value("#{sys.storeid}")
 	private String storeid;
 
+	/**
+	 * 银盛支付接口地址
+	 */
+	@Value("#{sys.yes_gateway}")
+	private String yesGateway;
+
 	/**
 	 * 银盛支付后台通知地址
 	 */
@@ -142,6 +148,12 @@ public class SysConf {
 	@Value("#{sys.searchUrl}")
 	private String searchUrl;
 
+	/**
+	 * 搜索的地址
+	 */
+	@Value("#{sys.searchUrl}")
+	private String messageServiceIp;
+
 	public Boolean getRebuildIndexesOnRefresh() {
 		return rebuildIndexesOnRefresh;
 	}
@@ -305,4 +317,20 @@ public class SysConf {
 		this.searchUrl = searchUrl;
 		return this;
 	}
+
+	public String getMessageServiceIp() {
+		return messageServiceIp;
+	}
+
+	public void setMessageServiceIp(String messageServiceIp) {
+		this.messageServiceIp = messageServiceIp;
+	}
+
+	public String getYesGateway() {
+		return yesGateway;
+	}
+
+	public void setYesGateway(String yesGateway) {
+		this.yesGateway = yesGateway;
+	}
 }

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

@@ -136,7 +136,7 @@ public class EncodingRulesConstant {
 	/**
 	 * 交易流水号 YS + 8位时间戳 + 8位编码
 	 */
-	public static final String YSEPAY = "YS_TIMESTAP_NUMBER";
+	public static final String YSEPAY = "TIMESTAP_NUMBER";
 
 	/**
 	 * 爬虫任务表CCT + 8 位时间戳 + 8 位编码

+ 32 - 0
src/main/java/com/uas/platform/b2c/core/constant/Status.java

@@ -179,6 +179,18 @@ public enum Status {
 	 * {@code 503 待付款}
 	 */
 	TOBEPAID(503, "待付款"),
+	/**
+	 * {@code 525 卖家取消申请待确认}
+	 */
+	CANCELTOBECONFIRMED(525, "卖家取消申请待确认"),
+	/**
+	 * {@code 524 待继续分期付款}
+	 */
+	TOBEPAIDAGAGIN(524, "待继续分期付款"),
+	/**
+	 * {@code 523 付款中}
+	 */
+	PAIDING(523, "付款中"),
 	/**
 	 * {@code 504 已付款}
 	 */
@@ -373,6 +385,26 @@ public enum Status {
 	 * {@code 814 爬取失败}
 	 */
 	CROWLED_FAILED(814, "任务失败"),
+
+	/**
+	 * {@code 815, 正常}
+	 */
+	ACTIVE(815, "正常"),
+
+	/**
+	 * {@code 816, 即将停产}
+	 */
+	DISCONTINUED(816, "即将停产"),
+
+	/**
+	 * {@code 817, 停产}
+	 */
+	OBSOLETE(817, "停产"),
+
+	/**
+	 * {@code 818, 新品}
+	 */
+	PRELIMINARY(818, "新品"),
 	/**
 	 * {@code 1669 待入库 <b>待入库</b>}
 	 */

+ 10 - 0
src/main/java/com/uas/platform/b2c/core/constant/Type.java

@@ -251,6 +251,16 @@ public enum Type {
 	 */
 	ENTERPRISING(1602, "ENTERPRISING"),
 
+	/**
+	 * 付款给平台
+	 */
+	PAIDTOPLATFORM(1603, "PAIDTOPLATFORM"),
+
+	/**
+	 * 付款给卖家
+	 */
+	PAIDTOVENDOR(1604, "PAIDTOVENDOR"),
+
 	/**
 	 * {@code 1666 企业入库 <b>企业入库</b>}
 	 */

+ 79 - 0
src/main/java/com/uas/platform/b2c/core/filter/KeyWordFilter.java

@@ -0,0 +1,79 @@
+package com.uas.platform.b2c.core.filter;
+
+import com.uas.platform.b2c.common.keyword.service.KeyWordService;
+import com.uas.platform.b2c.core.support.BodyReaderHttpServletRequestWrapper;
+import java.io.IOException;
+import java.util.Set;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+import org.springframework.web.context.support.XmlWebApplicationContext;
+
+/**
+ * 非法关键字过滤
+ * @author liusw
+ */
+public class KeyWordFilter implements Filter {
+
+    public static Set<String> keyworsSet = null;
+
+    /**
+     * hessian 请求路径前缀
+     */
+    private static String HESSIAN_URI_PREFIX = "/api/service/";
+
+    private Logger logger = Logger.getLogger(this.getClass());
+
+    @Override
+    public void destroy() {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException,
+            ServletException {
+        HttpServletRequest req = (HttpServletRequest) arg0;
+        HttpServletResponse response = (HttpServletResponse) arg1;
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        String contentType = req.getContentType();
+        String method = req.getMethod();
+        String uri = req.getRequestURI();
+        // POST请求 或 PUT请求,并且不是附件上传请求,并且不是hessian请求
+        if(("POST".equals(method) || "PUT".equals(method)) &&
+                (StringUtils.isEmpty(contentType) || !contentType.contains("multipart")) &&
+                !uri.startsWith(HESSIAN_URI_PREFIX)){
+            //注入Service
+            ServletContext sc = req.getSession().getServletContext();
+            XmlWebApplicationContext cxt = (XmlWebApplicationContext) WebApplicationContextUtils.getWebApplicationContext(sc);
+            KeyWordService keyWordService= null;
+            if(cxt != null && cxt.getBean("keyWordService") != null && keyWordService == null)
+                keyWordService = (KeyWordService) cxt.getBean("keyWordService");
+            if(keyworsSet == null){
+                keyworsSet = keyWordService.getAllKeyWordContent();
+            }
+            //request包装类  改写getParameterValues和getInputStream
+            ServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(req);
+            arg2.doFilter(requestWrapper, response);
+        }else{
+            arg2.doFilter(req, response);
+        }
+    }
+
+
+
+    @Override
+    public void init(FilterConfig arg0) throws ServletException {
+        // TODO Auto-generated method stub
+    }
+}

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

@@ -12,10 +12,13 @@ import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.sso.SSOConfig;
 import com.uas.sso.SSOHelper;
 import com.uas.sso.SSOToken;
+import com.uas.sso.common.SSOProperties;
+import com.uas.sso.common.util.HttpUtil;
 import com.uas.sso.web.spring.AbstractSSOInterceptor;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
 import org.springframework.mobile.device.Device;
 import org.springframework.mobile.device.DeviceResolver;
@@ -49,6 +52,8 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 	private ResourceItemDao resourceItemDao;
 	@Autowired
 	private SigninLogService signinLogService;
+	@Value("#{sys.profile}")
+	private String profile;
 
 	private final DeviceResolver deviceResolver = new LiteDeviceResolver();
 
@@ -121,11 +126,11 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 		request.getSession().setAttribute(SSOConfig.SSOReferer, request.getHeader("Referer"));
 		SSOHelper.clearLogin(request, response);
 		String redirectUrl = SSOHelper.getRedirectRefererLoginUrl(request);
-		boolean cross = SSOHelper.isCrossDomain(request);
+		/*boolean cross = SSOHelper.isCrossDomain(request);
 		if (cross) {
 			// 跨域代理界面
 			redirectUrl = request.getContextPath() + "/login/proxy";
-		}
+		}*/
 		return redirectUrl;
 	}
 
@@ -208,7 +213,7 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 	/**
 	 * 根据路径获取访问权限的集合接口
 	 * 
-	 * @param object
+	 * @param request
 	 * @return
 	 * @throws IllegalArgumentException
 	 */
@@ -253,6 +258,21 @@ public class SSOInterceptor extends AbstractSSOInterceptor {
 		authorities.put(user.getUserUU(), authSet);
 	}
 
+	@Override
+	protected void sendRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
+		boolean cross = SSOHelper.isCrossDomain(request);
+		if (cross) {
+			request.getSession().setAttribute("SSOReferer", request.getRequestURL());
+			if ("prod".equals(profile)){
+				response.sendRedirect(SSOHelper.getRedirectLoginUrl(request, "https://www.usoftmall.com"+request.getRequestURI()));
+			}else{
+				response.sendRedirect(SSOHelper.getRedirectLoginUrl(request, request.getParameter("returnURL"))+ "&baseUrl=http://192.168.253.121:3000/login/other" );
+			}
+		} else {
+			SSOHelper.clearRedirectLogin(request, response);
+		}
+	}
+
 	private SitePreference getDefaultSitePreferenceForDevice(Device device) {
 		if (device == null) {
 			return null;

+ 79 - 0
src/main/java/com/uas/platform/b2c/core/support/BodyReaderHttpServletRequestWrapper.java

@@ -0,0 +1,79 @@
+package com.uas.platform.b2c.core.support;
+
+import com.uas.platform.b2c.core.filter.KeyWordFilter;
+import com.uas.platform.b2c.core.utils.KeyWordFilterUtil;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.util.Enumeration;
+import java.util.Set;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+/**
+ * 用于将request重新进行封装
+ *
+ * @author liusw
+ */
+public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
+    private final byte[] body;
+
+    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        body = HttpHelper.getBodyString(request).getBytes(Charset.forName("UTF-8"));
+    }
+
+    @Override
+    public String[] getParameterValues(String name) {
+        String[] result = super.getParameterValues(name);
+        if(result!=null &&result.length>0){
+            Set<String> keywords = null;
+            for(int i=0;i<result.length;i++){
+                if(KeyWordFilter.keyworsSet!=null){
+                    keywords = KeyWordFilterUtil.getSensitiveWord(result[i], 0,KeyWordFilterUtil.initKeyWord(
+                            KeyWordFilter.keyworsSet));
+                    if(keywords!=null && keywords.size()>0){
+                        for(String s : keywords){
+                            result[i] = result[i].replaceAll(s,"*");
+                        }
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return new BufferedReader(new InputStreamReader(getInputStream()));
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
+        return new ServletInputStream() {
+            @Override
+            public int read() throws IOException {
+                return bais.read();
+            }
+        };
+    }
+
+    @Override
+    public String getHeader(String name) {
+        return super.getHeader(name);
+    }
+
+    @Override
+    public Enumeration<String> getHeaderNames() {
+        return super.getHeaderNames();
+    }
+
+    @Override
+    public Enumeration<String> getHeaders(String name) {
+        return super.getHeaders(name);
+    }
+}

+ 61 - 0
src/main/java/com/uas/platform/b2c/core/support/HttpHelper.java

@@ -0,0 +1,61 @@
+package com.uas.platform.b2c.core.support;
+
+import com.uas.platform.b2c.core.filter.KeyWordFilter;
+import com.uas.platform.b2c.core.utils.KeyWordFilterUtil;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.util.Set;
+import javax.servlet.ServletRequest;
+
+/**
+ * 获取请求Body
+ *
+ * @author liusw
+ */
+public class HttpHelper {
+
+    public static String getBodyString(ServletRequest request) {
+        StringBuilder sb = new StringBuilder();
+        InputStream inputStream = null;
+        BufferedReader reader = null;
+        try {
+            inputStream = request.getInputStream();
+            reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));
+            String line = "";
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        String body = sb.toString();
+        if(KeyWordFilter.keyworsSet!=null){
+            Set<String> keywords = KeyWordFilterUtil.getSensitiveWord(body, 0,KeyWordFilterUtil.initKeyWord(
+                    KeyWordFilter.keyworsSet));
+            if(keywords!=null && keywords.size()>0) {
+                for (String s : keywords) {
+                    body = body.replaceAll(s,"*");
+                }
+            }
+        }
+        return body;
+    }
+}

+ 12 - 0
src/main/java/com/uas/platform/b2c/core/support/log/UsageBufferedLogger.java

@@ -31,6 +31,18 @@ public class UsageBufferedLogger extends BufferedLogger<UsageLog> {
 		log(new UsageLog(title, message, null, null, null));
 	}
 
+	/**
+	 * 未登录记录平台使用日志
+	 *
+	 * @param title
+	 *            消息标题
+	 * @param message
+	 *            消息
+	 */
+	public void log(String title, String message, Long enuu, Long useruu) {
+		log(new UsageLog(title, message, null, null, null, enuu, useruu));
+	}
+
 	/**
 	 * 记录平台密码找回日志
 	 * 

+ 99 - 0
src/main/java/com/uas/platform/b2c/core/utils/KeyWordFilterUtil.java

@@ -0,0 +1,99 @@
+package com.uas.platform.b2c.core.utils;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 敏感词DFA算法实现
+ */
+public class KeyWordFilterUtil {
+    public static int minMatchTYpe = 1;      //最小匹配规则
+    public static int maxMatchType = 2;      //最大匹配规则
+
+    public static Set<String> getSensitiveWord(String txt , int matchType,Map nowMap) {
+        Set<String> sensitiveWordList = new HashSet<String>();
+
+        for (int i = 0; i < txt.length(); i++) {
+            int length = CheckSensitiveWord(txt,i, matchType,nowMap);    //判断是否包含敏感字符
+            if (length > 0) {    //存在,加入list中
+                sensitiveWordList.add(txt.substring(i, i + length));
+                i = i + length - 1;    //减1的原因,是因为for会自增
+            }
+        }
+        return sensitiveWordList;
+    }
+    /**
+     * 检查文字中是否包含敏感字符
+     */
+    public static int CheckSensitiveWord(String txt,int beginIndex,int matchType,Map nowMap){
+        boolean  flag = false;    //敏感词结束标识位:用于敏感词只有1位的情况
+        int matchFlag = 0;     //匹配标识数默认为0
+        char word = 0;
+        for(int i = beginIndex; i < txt.length() ; i++){
+            word = txt.charAt(i);
+            nowMap = (Map) nowMap.get(word);     //获取指定key
+            if(nowMap != null){     //存在,则判断是否为最后一个
+                matchFlag++;     //找到相应key,匹配标识+1
+                if("1".equals(nowMap.get("isEnd"))){       //如果为最后一个匹配规则,结束循环,返回匹配标识数
+                    flag = true;       //结束标志位为true
+                    if(KeyWordFilterUtil.minMatchTYpe == matchType){    //最小规则,直接返回,最大规则还需继续查找
+                        break;
+                    }
+                }
+            }
+            else{     //不存在,直接返回
+                break;
+            }
+        }
+        if(matchFlag < 2 || !flag){        //长度必须大于等于1,为词
+            matchFlag = 0;
+        }
+        return matchFlag;
+    }
+
+    /**
+     * 初始化敏感词
+     * @param keyWordSet
+     * @return
+     */
+    public static Map initKeyWord(Set<String> keyWordSet){
+        HashMap sensitiveWordMap = null;
+        try {
+            sensitiveWordMap = new HashMap(keyWordSet.size());     //初始化敏感词容器,减少扩容操作
+            String key = null;
+            Map nowMap = null;
+            Map<String, String> newWorMap = null;
+            //迭代keyWordSet
+            Iterator<String> iterator = keyWordSet.iterator();
+            while(iterator.hasNext()){
+                key = iterator.next();    //关键字
+                nowMap = sensitiveWordMap;
+                for(int i = 0 ; i < key.length() ; i++){
+                    char keyChar = key.charAt(i);       //转换成char型
+                    Object wordMap = nowMap.get(keyChar);       //获取
+
+                    if(wordMap != null){        //如果存在该key,直接赋值
+                        nowMap = (Map) wordMap;
+                    }
+                    else{     //不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个
+                        newWorMap = new HashMap<String,String>();
+                        newWorMap.put("isEnd", "0");     //不是最后一个
+                        nowMap.put(keyChar, newWorMap);
+                        nowMap = newWorMap;
+                    }
+
+                    if(i == key.length() - 1){
+                        nowMap.put("isEnd", "1");    //最后一个
+                    }
+                }
+            }
+            //spring获取application,然后application.setAttribute("sensitiveWordMap",sensitiveWordMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return sensitiveWordMap;
+    }
+}

+ 1 - 1
src/main/java/com/uas/platform/b2c/external/erp/order/api/PurchaseController.java

@@ -229,7 +229,7 @@ public class PurchaseController {
      */
     @RequestMapping(value = "/{id}/ensurePaid", method = RequestMethod.PUT)
 	public Purchase ensurePaid(@PathVariable Long id) {
-		return purchaseService.ensurePaid(id);
+		return purchaseService.ensurePaid(id, null);
 	}
 
     /**

+ 14 - 0
src/main/java/com/uas/platform/b2c/fa/payment/controller/BankInfoController.java

@@ -99,6 +99,20 @@ public class BankInfoController {
 		return bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value());
 	}
 
+	/**
+	 * 获取供应商审核通过的信息
+	 * 2016年3月15日 下午5:16:00
+	 *
+	 * @return list
+	 * @author yujia
+	 */
+	@RequestMapping(value="/sale/enterprise/{enuu}", method=RequestMethod.GET, params = {"type=sup", "status=104"})
+	@ApiOperation(value = "获取供应商审核通过的信息", httpMethod = "GET")
+	public List<BankInfo> getSaleBankInfoAudit(@PathVariable("enuu") Long enuu) {
+		logger.log("银行账户信息", "获取供应商银行账户信息");
+		return bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value(), enuu);
+	}
+
 	/**
 	 * 获取供应商账户信息
 	 * 2016年3月15日 下午5:16:00

+ 71 - 0
src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentController.java

@@ -0,0 +1,71 @@
+package com.uas.platform.b2c.fa.payment.controller;
+
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 分期消息controller
+ * @author wangyc
+ *
+ * @version 2017/9/7 8:56 wangyc
+ */
+@RestController
+@RequestMapping(value = "/trade/installments")
+public class InstallmentController {
+
+    private final InstallmentService installmentService;
+
+    @Autowired
+    public InstallmentController(InstallmentService installmentService) {
+        this.installmentService = installmentService;
+    }
+
+    /**
+     * 新增分期信息
+     * @param json 分期信息及采购单号
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.POST)
+    public Installment createInstallment(@RequestBody String json) {
+        JSONObject jsonObject = FastjsonUtils.fromJson(json, JSONObject.class);
+        Installment installment = FastjsonUtils.fromJson(jsonObject.get("installment").toString(), Installment.class);
+        Long purchaseId = jsonObject.getLong("purchaseId");
+        return installmentService.createInstallment(installment, purchaseId);
+    }
+
+    /**
+     * 更新分期信息
+     * @param json 分期信息及采购单号
+     * @return
+     */
+    @RequestMapping(method = RequestMethod.PUT)
+    public Installment updateInstallment(@RequestBody String json) {
+        JSONObject jsonObject = FastjsonUtils.fromJson(json, JSONObject.class);
+        Installment installment = FastjsonUtils.fromJson(jsonObject.get("installment").toString(), Installment.class);
+        Long purchaseId = jsonObject.getLong("purchaseId");
+        return installmentService.updateInstallment(installment, purchaseId);
+    }
+
+    /**
+     * 删除分期信息
+     * @param purchaseId 采购单id
+     */
+    @RequestMapping(value = "/{purchaseId}", method = RequestMethod.DELETE)
+    public void deleteInstallment(@PathVariable("purchaseId") Long purchaseId) {
+        installmentService.deleteInstallment(purchaseId);
+    }
+
+    /**
+     * 验证是否能启用分期信息
+     * @param purchaseId 采购单id
+     * @return
+     */
+    @RequestMapping(value = "/{purchaseId}/validate", method = RequestMethod.GET)
+    public String validateEnableInstallment(@PathVariable("purchaseId") Long purchaseId) {
+        return installmentService.validationEnableInstallment(purchaseId);
+    }
+}

+ 71 - 0
src/main/java/com/uas/platform/b2c/fa/payment/controller/InstallmentStoreController.java

@@ -0,0 +1,71 @@
+package com.uas.platform.b2c.fa.payment.controller;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+import com.uas.platform.b2c.fa.payment.service.InstallmentStoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 分期权限店铺controller
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:21 wangyc
+ */
+@RestController
+@RequestMapping("trade/installment-stores")
+public class InstallmentStoreController {
+
+    private final InstallmentStoreService installmentStoreService;
+
+    @Autowired
+    public InstallmentStoreController(InstallmentStoreService installmentStoreService) {
+        this.installmentStoreService = installmentStoreService;
+    }
+
+    /**
+     * 分期权限店铺的保存功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/{storeUuid}", method = RequestMethod.POST)
+    public InstallmentStore saveStore(@PathVariable("storeUuid") String storeUuid) {
+        return installmentStoreService.saveStore(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺的删除功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/{storeUuid}", method = RequestMethod.DELETE)
+    public void deleteStore(@PathVariable("storeUuid") String storeUuid) {
+        installmentStoreService.deleteStore(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺的禁用功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/disable/{storeUuid}", method = RequestMethod.PUT)
+    public InstallmentStore capsOFF(@PathVariable("storeUuid") String storeUuid) {
+        return installmentStoreService.capsOFF(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺的启用功能
+     * @param storeUuid 店铺uuid
+     */
+    @RequestMapping(value = "/enable/{storeUuid}", method = RequestMethod.PUT)
+    public InstallmentStore capsON(@PathVariable("storeUuid") String storeUuid) {
+        return installmentStoreService.capsON(storeUuid);
+    }
+
+    /**
+     * 分期权限店铺开启分期功能的验证
+     */
+    @RequestMapping(value = "/capsOFFVerify", method = RequestMethod.GET)
+    public String capsOFFVerify() {
+        return installmentStoreService.capsOFFVerify();
+    }
+}

+ 1 - 1
src/main/java/com/uas/platform/b2c/fa/payment/controller/YseReturnController.java

@@ -30,7 +30,7 @@ public class YseReturnController {
      * @param request  the request
      * @param response the response
      */
-    @RequestMapping(method = RequestMethod.POST)
+    @RequestMapping
     @ApiOperation(value = "成功之后回调请求,跳转至前端的跳转页面 ", httpMethod = "POST")
     public void returnUrl(HttpServletRequest request, HttpServletResponse response) {
         String paymentId = request.getParameter("out_trade_no");

+ 29 - 0
src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDao.java

@@ -0,0 +1,29 @@
+package com.uas.platform.b2c.fa.payment.dao;
+
+import com.uas.platform.b2c.fa.payment.model.Installment;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 分期支付dao
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:10 wangyc
+ */
+@Repository
+public interface InstallmentDao extends JpaSpecificationExecutor<Installment>, JpaRepository<Installment, Long>{
+
+    /**
+     * 通过采购单id获取分期信息
+     * @param purchaseId
+     * @return
+     */
+    Installment findByPurchaseId(Long purchaseId);
+
+    /**
+     * 通过采购单id删除分期信息
+     * @param purchaseId
+     */
+    void deleteByPurchaseId(Long purchaseId);
+}

+ 36 - 0
src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentDetailDao.java

@@ -0,0 +1,36 @@
+package com.uas.platform.b2c.fa.payment.dao;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentDetail;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 分期明细dao
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:12 wangyc
+ */
+@Repository
+public interface InstallmentDetailDao extends JpaSpecificationExecutor<InstallmentDetail>, JpaRepository<InstallmentDetail, Long>{
+
+    /**
+     * 通过分期信息id和序号获取分期明细信息
+     * @param installmentId
+     * @param detno
+     * @return
+     */
+    InstallmentDetail findByInstallmentIdAndDetno(Long installmentId, Short detno);
+
+    /**
+     * 根据分期信息id和序号删除序号大于该序号的分期明细
+     * @param installmentId
+     * @param detno
+     */
+    @Modifying
+    @Query(value = "delete from trade$installment_detail where insd_installmentid =:installmentId and insd_detno >:detno", nativeQuery = true)
+    void deleteGtDetno(@Param("installmentId") Long installmentId, @Param("detno") Short detno);
+}

+ 32 - 0
src/main/java/com/uas/platform/b2c/fa/payment/dao/InstallmentStoreDao.java

@@ -0,0 +1,32 @@
+package com.uas.platform.b2c.fa.payment.dao;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 分期店铺权限dao
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:24 wangyc
+ */
+@Repository
+public interface InstallmentStoreDao extends JpaSpecificationExecutor<InstallmentStore>, JpaRepository<InstallmentStore, Long> {
+
+    /**
+     * 通过企业uu获取拥有分期权限店铺
+     *
+     * @param enuu 企业uu
+     * @param enable 是否启用
+     * @return
+     */
+    InstallmentStore findByEnuuAndEnable(Long enuu, Short enable);
+
+    /**
+     * 通过店铺uuid获取权限信息
+     * @param storeUuid
+     * @return
+     */
+    InstallmentStore findByStoreUuid(String storeUuid);
+}

+ 43 - 1
src/main/java/com/uas/platform/b2c/fa/payment/model/BankTransfer.java

@@ -30,6 +30,24 @@ public class BankTransfer {
 	@Column(name = "banktf_sn", unique = true)
 	private String banktranssn;
 
+	/**
+	 * 转账类型(转账给卖家,转账给平台)
+	 */
+	@Column(name = "banktf_type")
+	private String type;
+
+	/**
+	 * 对应分期明细id
+	 */
+	@Column(name = "banktf_installdetailid")
+	private Long installmentDetailId;
+
+	/**
+	 * 对应分期金额数组
+	 */
+	@Transient
+	private String pricesArr;
+
 	/**
 	 * 状态 TOBEMADEOUTANINVOICE(512, "待开发票"), MADEOUTANINVOICE(513, "已开发票"),
 	 */
@@ -69,7 +87,7 @@ public class BankTransfer {
 	/**
 	 * 凭证图片
 	 */
-	@Column(name = "banktf_imgUrl", length = 2000)
+	@Column(name = "banktf_imgUrl", length = 4000)
 	private String imgUrl;
 
 	/**
@@ -151,6 +169,30 @@ public class BankTransfer {
 		this.banktranssn = banktranssn;
 	}
 
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public Long getInstallmentDetailId() {
+		return installmentDetailId;
+	}
+
+	public void setInstallmentDetailId(Long installmentDetailId) {
+		this.installmentDetailId = installmentDetailId;
+	}
+
+	public String getPricesArr() {
+		return pricesArr;
+	}
+
+	public void setPricesArr(String pricesArr) {
+		this.pricesArr = pricesArr;
+	}
+
 	public Long getCollectenuu() {
 		return collectenuu;
 	}

+ 156 - 0
src/main/java/com/uas/platform/b2c/fa/payment/model/Installment.java

@@ -0,0 +1,156 @@
+package com.uas.platform.b2c.fa.payment.model;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * 分期信息
+ * @author wangyc
+ *
+ * @version 2017/9/6 16:09 wangyc
+ */
+@Entity
+@Table(name = "trade$installment")
+public class Installment {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "ins_id")
+    private Long id;
+
+    /**
+     * 订单号
+     */
+    @Column(name = "ins_ordernum")
+    private String orderNum;
+
+    /**
+     * 订单id
+     */
+    @Column(name = "ins_orderid")
+    private Long orderId;
+
+    /**
+     * 采购单id
+     */
+    @Column(name = "insss_purchaseid")
+    private Long purchaseId;
+
+    /**
+     * 卖家企业uu
+     */
+    @Column(name = "ins_sellerenuu")
+    private Long sellerenuu;
+
+    /**
+     * 订单总金额
+     */
+    @Column(name = "ins_price")
+    private Double price;
+
+    /**
+     * 状态
+     * TOBEPAID(503, "待付款"),PAID(504, "已付款"),MONEYRECEIVED(505, "已收款")
+     */
+    @Column(name = "ins_status")
+    private Integer status;
+
+    /**
+     * 当前期数
+     */
+    @Column(name = "ins_currentno")
+    private Short currentNo;
+
+    /**
+     * 总期数
+     */
+    @Column(name = "ins_count")
+    private Integer count;
+
+    /**
+     * 分期明细
+     */
+    @OneToMany(mappedBy = "installment", cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REMOVE }, fetch = FetchType.EAGER, orphanRemoval = true)
+    @OrderBy("detno")
+    private Set<InstallmentDetail> installmentDetails;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public Long getPurchaseId() {
+        return purchaseId;
+    }
+
+    public void setPurchaseId(Long purchaseId) {
+        this.purchaseId = purchaseId;
+    }
+
+    public Long getSellerenuu() {
+        return sellerenuu;
+    }
+
+    public void setSellerenuu(Long sellerenuu) {
+        this.sellerenuu = sellerenuu;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Short getCurrentNo() {
+        return currentNo;
+    }
+
+    public void setCurrentNo(Short currentNo) {
+        this.currentNo = currentNo;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public Set<InstallmentDetail> getInstallmentDetails() {
+        return installmentDetails;
+    }
+
+    public void setInstallmentDetails(Set<InstallmentDetail> installmentDetails) {
+        this.installmentDetails = installmentDetails;
+    }
+}

+ 175 - 0
src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentDetail.java

@@ -0,0 +1,175 @@
+package com.uas.platform.b2c.fa.payment.model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * 分期信息明细
+ * @author wangyc
+ *
+ * @version 2017/9/6 16:22 wangyc
+ */
+@Entity
+@Table(name = "trade$installment_detail")
+public class InstallmentDetail {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "insd_id")
+    private Long id;
+
+    /**
+     * 分期信息id
+     */
+    @Column(name = "insd_installmentid")
+    private Long installmentId;
+
+    /**
+     * 分期信息
+     */
+    @ManyToOne(cascade = {CascadeType.REFRESH})
+    @JoinColumn(name = "insd_installmentid", insertable = false, updatable = false)
+    private Installment installment;
+
+    /**
+     * 本期金额
+     */
+    @Column(name = "insd_price")
+    private Double price;
+
+    /**
+     * 第几期
+     */
+    @Column(name = "insd_detno")
+    private Short detno;
+
+    /**
+     * 本期状态
+     * TOBEPAID(503, "待付款"),PAID(504, "已付款"),MONEYRECEIVED(505, "已收款")
+     */
+    @Column(name = "insd_status")
+    private Integer status;
+
+    /**
+     * 本期截止日期
+     */
+    @Column(name = "insd_deadline")
+    private Date deadline;
+
+    /**
+     * 买家付款日期
+     */
+    @Column(name = "insd_paiddate")
+    private Date paidDate;
+
+    /**
+     * 卖家确认收款日期
+     */
+    @Column(name = "insd_ensuredate")
+    private Date ensureDate;
+
+    /**
+     * 上传水单图片,以“,”拼接,最多6张
+     */
+    @Column(name = "insd_imgs", length = 4000)
+    private String imgs;
+
+    /**
+     * 上传水单金额,以“,”拼接,最多6个
+     */
+    @Column(name = "insd_pricesarr", length = 4000)
+    private String pricesArr;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getInstallmentId() {
+        return installmentId;
+    }
+
+    public void setInstallmentId(Long installmentId) {
+        this.installmentId = installmentId;
+    }
+
+    @JsonIgnore
+    @JSONField(serialize = false)
+    public Installment getInstallment() {
+        return installment;
+    }
+
+    public void setInstallment(Installment installment) {
+        this.installment = installment;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public Short getDetno() {
+        return detno;
+    }
+
+    public void setDetno(Short detno) {
+        this.detno = detno;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getDeadline() {
+        return deadline;
+    }
+
+    public void setDeadline(Date deadline) {
+        this.deadline = deadline;
+    }
+
+    public Date getPaidDate() {
+        return paidDate;
+    }
+
+    public void setPaidDate(Date paidDate) {
+        this.paidDate = paidDate;
+    }
+
+    public Date getEnsureDate() {
+        return ensureDate;
+    }
+
+    public void setEnsureDate(Date ensureDate) {
+        this.ensureDate = ensureDate;
+    }
+
+    public String getImgs() {
+        return imgs;
+    }
+
+    public void setImgs(String imgs) {
+        this.imgs = imgs;
+    }
+
+    public String getPricesArr() {
+        return pricesArr;
+    }
+
+    public void setPricesArr(String pricesArr) {
+        this.pricesArr = pricesArr;
+    }
+}

+ 116 - 0
src/main/java/com/uas/platform/b2c/fa/payment/model/InstallmentStore.java

@@ -0,0 +1,116 @@
+package com.uas.platform.b2c.fa.payment.model;
+
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
+
+import javax.persistence.*;
+
+/**
+ * 分期权限店铺
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:12 wangyc
+ */
+@Entity
+@Table(name = "trade$installment_store")
+public class InstallmentStore {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(name = "inss_id")
+    private Long id;
+
+    /**
+     * 店铺uuid
+     */
+    @Column(name = "inss_storeuuid")
+    private String storeUuid;
+
+    /**
+     * 店铺id
+     */
+    @Column(name = "inss_storeid")
+    private Long storeId;
+
+    /**
+     * 店铺信息
+     */
+    @OneToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
+    @JoinColumn(name = "inss_storeid", insertable = false, updatable = false)
+    private StoreIn store;
+
+    /**
+     * 企业uu
+     */
+    @Column(name = "inss_enuu")
+    private Long enuu;
+
+    /**
+     * 企业信息
+     */
+    @OneToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
+    @JoinColumn(name = "inss_enuu", insertable = false, updatable = false)
+    private Enterprise enterprise;
+
+    /**
+     * 是否启用 启用:1,禁用:0
+     */
+    @Column(name = "inss_enable")
+    private Short enable;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getStoreUuid() {
+        return storeUuid;
+    }
+
+    public void setStoreUuid(String storeUuid) {
+        this.storeUuid = storeUuid;
+    }
+
+    public Long getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(Long storeId) {
+        this.storeId = storeId;
+    }
+
+    public StoreIn getStore() {
+        return store;
+    }
+
+    public void setStore(StoreIn store) {
+        this.store = store;
+    }
+
+    public Long getEnuu() {
+        return enuu;
+    }
+
+    public void setEnuu(Long enuu) {
+        this.enuu = enuu;
+    }
+
+    public Enterprise getEnterprise() {
+        return enterprise;
+    }
+
+    public void setEnterprise(Enterprise enterprise) {
+        this.enterprise = enterprise;
+    }
+
+    public Short getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Short enable) {
+        this.enable = enable;
+    }
+}

+ 57 - 0
src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentService.java

@@ -0,0 +1,57 @@
+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;
+
+/**
+ * 分期支付service
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:07 wangyc
+ */
+public interface InstallmentService {
+
+    /**
+     * 新增分期信息
+     * @param installment 分期信息
+     * @param purchaseId 采购单id
+     * @return
+     */
+    Installment createInstallment(Installment installment, Long purchaseId);
+
+    /**
+     * 更新分期信息
+     * @param installment 分期信息
+     * @param purchaseId 采购单id
+     * @return
+     */
+    Installment updateInstallment(Installment installment, Long purchaseId);
+
+    /**
+     * 支付单一分期
+     * @param bankTransfer 转账信息
+     * @param orderId 订单id
+     * @return
+     */
+    Installment paidInstallment(BankTransfer bankTransfer, Long orderId);
+
+    /**
+     * 删除分期信息
+     * @param purchaseId
+     */
+    void deleteInstallment(Long purchaseId);
+
+    /**
+     * 验证卖家是否能够设置分期信息
+     * @param purchaseId
+     * @return
+     */
+    String validationEnableInstallment(Long purchaseId);
+
+    /**
+     * 采购单改价后更新分期信息
+     * @param purchaseDetailId
+     * @return
+     */
+    Installment updateAfterModifyPurchasePrice(String purchaseDetailId);
+}

+ 46 - 0
src/main/java/com/uas/platform/b2c/fa/payment/service/InstallmentStoreService.java

@@ -0,0 +1,46 @@
+package com.uas.platform.b2c.fa.payment.service;
+
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+
+/**
+ * 分期权限店铺service
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:22 wangyc
+ */
+public interface InstallmentStoreService {
+
+    /**
+     * 分期权限店铺的保存功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    InstallmentStore saveStore(String storeUuid);
+
+    /**
+     * 分期权限店铺的删除功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    void deleteStore(String storeUuid);
+
+    /**
+     * 分期权限店铺的禁用功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    InstallmentStore capsOFF(String storeUuid);
+
+    /**
+     * 分期权限店铺的启用功能
+     *
+     * @param storeUuid 店铺uuid
+     */
+    InstallmentStore capsON(String storeUuid);
+
+    /**
+     * 验证分期权限店铺的是否开启功能
+     */
+    String capsOFFVerify();
+
+}

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

@@ -154,7 +154,6 @@ public class BankInfoServiceImpl implements BankInfoService {
 		}else {
 			return bankInfoDao.findByEnuuAndTypeAndStatusAndOpraterUserTypeOrderByNumAsc(enuu, (short)2, status, operatorUserType);
 		}
-
 	}
 
 	@Override

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

@@ -1,5 +1,7 @@
 package com.uas.platform.b2c.fa.payment.service.impl;
 
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.core.config.SysConf;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
@@ -11,6 +13,7 @@ import com.uas.platform.b2c.fa.payment.model.BankTransAssociate;
 import com.uas.platform.b2c.fa.payment.model.BankTransfer;
 import com.uas.platform.b2c.fa.payment.service.BankInfoService;
 import com.uas.platform.b2c.fa.payment.service.BankTransferService;
+import com.uas.platform.b2c.fa.payment.service.InstallmentService;
 import com.uas.platform.b2c.logistics.dao.ReceiptDao;
 import com.uas.platform.b2c.logistics.model.Receipt;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
@@ -90,10 +93,16 @@ public class BankTransferServiceImpl implements BankTransferService {
 
 	private final BankTransAssociateDao transAssociateDao;
 
+	private final EnterpriseDao enterpriseDao;
+
+	private final InstallmentService installmentService;
+
 	@Autowired
-	public BankTransferServiceImpl(BankInfoDao bankInfoDao, BankTransAssociateDao transAssociateDao) {
+	public BankTransferServiceImpl(BankInfoDao bankInfoDao, BankTransAssociateDao transAssociateDao, EnterpriseDao enterpriseDao, InstallmentService installmentService) {
 		this.bankInfoDao = bankInfoDao;
 		this.transAssociateDao = transAssociateDao;
+		this.enterpriseDao = enterpriseDao;
+		this.installmentService = installmentService;
 	}
 
 	@Override
@@ -255,34 +264,45 @@ public class BankTransferServiceImpl implements BankTransferService {
 	public BankTransfer save(BankTransfer bankTransfer, String order) {
 		// 将转账信息的ID保存到订单类型中
 		String[] orderIds = order.split("-");
+		BankTransfer saveBankTransfer = new BankTransfer();
 
-		bankTransfer.setPayUseruu(SystemSession.getUser().getUserUU());
-		bankTransfer.setPayenuu(SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null);
-		if (bankTransfer.getPayenuu() == null) {
-			bankTransfer.setDissociative(Type.PERSONAL.value());
-		} else {
-			bankTransfer.setDissociative(Type.ENTERPRISING.value());
-		}
-		bankTransfer.setCollectUseruu(sysConf.getAdminUU()); // 收款方 设置为应鹏账号
-		bankTransfer.setCollectenuu(sysConf.getEnUU()); // 收款方设置为B2C的uu
-		bankTransfer.setBanktranssn(EncodingRulesConstant.BANKTRANSFER.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$bank_transfer", 8)));
-		bankTransfer.setTranferCreateTime(new Date());
-		bankTransfer.setOperateType(Type.MALL.value());
-
-		BankTransfer saveBankTransfer = bankTransferDao.save(bankTransfer);
+		if (com.uas.platform.b2c.core.constant.Type.PAIDTOVENDOR.name().equals(bankTransfer.getType())) {// 付款类型为分期付款
+			if (orderIds.length > 1)
+				throw new IllegalOperatorException("多张订单合并付款只能向平台支付,如需直接支付给卖家,请前往 订单中心 进行单张支付");
 
-		for (String orderId : orderIds) {
-			Order orderN = orderService.findByOrId(orderId);
-			if (orderN == null) {
-				throw new IllegalOperatorException("您要操作的订单不存在:" + orderId);
+			Order orderN = orderService.findByOrId(orderIds[0]);
+			if (orderN == null)
+				throw new IllegalOperatorException("您要操作的订单不存在:" + orderIds[0]);
+			if (orderN.getStatus() != Status.TOBEPAID.value() && orderN.getStatus() != com.uas.platform.b2c.core.constant.Status.TOBEPAIDAGAGIN.value() && orderN.getStatus() != com.uas.platform.b2c.core.constant.Status.PAID.value()) {
+				throw new IllegalOperatorException("您操作的订单不在待付款状态:" + orderIds[0]);
 			}
 
-			if (orderN.getStatus() != Status.TOBEPAID.value()) {
-				throw new IllegalOperatorException("您操作的订单不在待付款状态:" + orderId);
+			bankTransfer.setPayUseruu(SystemSession.getUser().getUserUU());
+			bankTransfer.setPayenuu(SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null);
+			if (bankTransfer.getPayenuu() == null) {
+				bankTransfer.setDissociative(Type.PERSONAL.value());
+			} else {
+				bankTransfer.setDissociative(Type.ENTERPRISING.value());
 			}
 
+			List<BankInfo> bankInfos = bankInfoService.getEnterpriseBankInfoContainsStatus(Type.SUP.value(), Status.ALLOW.value(), orderN.getSellerenuu());
+			if (CollectionUtils.isEmpty(bankInfos))
+				throw new IllegalOperatorException("卖家收款账户不存在,请联系卖家");
+			Enterprise enterprise = enterpriseDao.findByUu(orderN.getSellerenuu());
+			if (enterprise == null)
+				throw new IllegalOperatorException("卖家企业不存在,请联系管理员");
+
+			bankTransfer.setCollectUseruu(enterprise.getEnAdminuu());
+			bankTransfer.setCollectenuu(orderN.getSellerenuu());
+
+			bankTransfer.setBanktranssn(EncodingRulesConstant.BANKTRANSFER.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$bank_transfer", 8)));
+			bankTransfer.setTranferCreateTime(new Date());
+			bankTransfer.setOperateType(Type.SUP.value());
+
+			saveBankTransfer = bankTransferDao.save(bankTransfer);
+
 			BankTransAssociate bankTransAssociate = new BankTransAssociate();
-			bankTransAssociate.setBtaTableserNum(orderId);
+			bankTransAssociate.setBtaTableserNum(orderIds[0]);
 			bankTransAssociate.setBtaBanktranssn(saveBankTransfer.getBanktranssn());
 			btaDao.save(bankTransAssociate);
 
@@ -316,7 +336,74 @@ public class BankTransferServiceImpl implements BankTransferService {
 			}
 			purchaseDao.save(purchases);
 			orderDao.save(orderN);
+			// 单期分期付款
+			installmentService.paidInstallment(bankTransfer, orderN.getId());
+		} else {
+			bankTransfer.setPayUseruu(SystemSession.getUser().getUserUU());
+			bankTransfer.setPayenuu(SystemSession.getUser().getEnterprise() != null ? SystemSession.getUser().getEnterprise().getUu() : null);
+			if (bankTransfer.getPayenuu() == null) {
+				bankTransfer.setDissociative(Type.PERSONAL.value());
+			} else {
+				bankTransfer.setDissociative(Type.ENTERPRISING.value());
+			}
+
+			bankTransfer.setCollectUseruu(sysConf.getAdminUU()); // 收款方 设置为应鹏账号
+			bankTransfer.setCollectenuu(sysConf.getEnUU()); // 收款方设置为B2C的uu
+
+			bankTransfer.setBanktranssn(EncodingRulesConstant.BANKTRANSFER.replace("_TIMESTAP_NUMBER", createNumberService.getTimeNumber("trade$bank_transfer", 8)));
+			bankTransfer.setTranferCreateTime(new Date());
+			bankTransfer.setOperateType(Type.MALL.value());
+
+			saveBankTransfer = bankTransferDao.save(bankTransfer);
+
+			for (String orderId : orderIds) {
+				Order orderN = orderService.findByOrId(orderId);
+				if (orderN == null) {
+					throw new IllegalOperatorException("您要操作的订单不存在:" + orderId);
+				}
+
+				if (orderN.getStatus() != Status.TOBEPAID.value()) {
+					throw new IllegalOperatorException("您操作的订单不在待付款状态:" + orderId);
+				}
+
+				BankTransAssociate bankTransAssociate = new BankTransAssociate();
+				bankTransAssociate.setBtaTableserNum(orderId);
+				bankTransAssociate.setBtaBanktranssn(saveBankTransfer.getBanktranssn());
+				btaDao.save(bankTransAssociate);
+
+				orderN.setBanktfid(saveBankTransfer.getId());
+				Long userUU = SystemSession.getUser().getUserUU();
+				orderN.setStatusPaid(userUU);
+				Set<OrderDetail> orderDetails = orderN.getOrderDetails();
+				for (OrderDetail orderDetail : orderDetails) {
+					if(orderDetail.getStatus().intValue() == Status.TOBEPAID.value()) {
+						orderDetail.setStatusPaid(userUU);
+					}
+
+				}
+				orderN.setBuyaccount(bankTransfer.getJsonPament());
+				orderN.setSelleraccount(bankTransfer.getJsonReceive());
+				orderN.setPaytime(new Date());
+				orderN.setPaytype(Type.Payment_CompanyTransfer_Code.value());
+
+				//修改采购单的状态
+				List<Purchase> purchases = purchaseDao.findByOrderid(orderN.getOrderid());
+				for (Purchase purchase : purchases) {
+					if(purchase.getStatus().intValue() == Status.TOBECONFIRMED.value()) {
+						Set<PurchaseDetail> purchaseDetails = purchase.getPurchaseDetails();
+						for (PurchaseDetail purchaseDetail : purchaseDetails) {
+							if(purchaseDetail.getStatus().intValue() == Status.TOBECONFIRMED.value()) {
+								purchaseDetail.setStatusPaid(userUU);
+							}
+						}
+						purchase.setStatusPaid(userUU);
+					}
+				}
+				purchaseDao.save(purchases);
+				orderDao.save(orderN);
+			}
 		}
+
 		return saveBankTransfer;
 	}
 

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

@@ -0,0 +1,365 @@
+package com.uas.platform.b2c.fa.payment.service.impl;
+
+import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
+import com.uas.platform.b2c.common.account.dao.UserBaseInfoDao;
+import com.uas.platform.b2c.common.account.model.Enterprise;
+import com.uas.platform.b2c.common.account.model.UserBaseInfo;
+import com.uas.platform.b2c.common.base.service.SendMessageService;
+import com.uas.platform.b2c.core.constant.Status;
+import com.uas.platform.b2c.core.constant.Type;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.core.utils.NumberUtil;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDao;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentDetailDao;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentStoreDao;
+import com.uas.platform.b2c.fa.payment.model.*;
+import com.uas.platform.b2c.fa.payment.service.BankInfoService;
+import com.uas.platform.b2c.fa.payment.service.InstallmentService;
+import com.uas.platform.b2c.trade.order.dao.OrderDao;
+import com.uas.platform.b2c.trade.order.dao.PurchaseDao;
+import com.uas.platform.b2c.trade.order.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.core.exception.IllegalOperatorException;
+import com.uas.platform.core.util.mq.MessageType;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 分期支付service实现类
+ * @author wangyc
+ *
+ * @version 2017/9/7 9:07 wangyc
+ */
+@Service
+public class InstallmentServiceImpl implements InstallmentService{
+
+    private final InstallmentStoreDao installmentStoreDao;
+
+    private final PurchaseDao purchaseDao;
+
+    private final OrderDao orderDao;
+
+    private final InstallmentDao installmentDao;
+
+    private final BankInfoService bankInfoService;
+
+    private final InstallmentDetailDao installmentDetailDao;
+
+    private final PurchaseDetailDao purchaseDetailDao;
+
+    private final SendMessageService sendMessageService;
+
+    private final EnterpriseDao enterpriseDao;
+
+    private final UserBaseInfoDao userBaseInfoDao;
+
+    @Autowired
+    public InstallmentServiceImpl(InstallmentStoreDao installmentStoreDao, PurchaseDao purchaseDao, OrderDao orderDao, InstallmentDao installmentDao, BankInfoService bankInfoService, InstallmentDetailDao installmentDetailDao, PurchaseDetailDao purchaseDetailDao, SendMessageService sendMessageService, EnterpriseDao enterpriseDao, UserBaseInfoDao userBaseInfoDao) {
+        this.installmentStoreDao = installmentStoreDao;
+        this.purchaseDao = purchaseDao;
+        this.orderDao = orderDao;
+        this.installmentDao = installmentDao;
+        this.bankInfoService = bankInfoService;
+        this.installmentDetailDao = installmentDetailDao;
+        this.purchaseDetailDao = purchaseDetailDao;
+        this.sendMessageService = sendMessageService;
+        this.enterpriseDao = enterpriseDao;
+        this.userBaseInfoDao = userBaseInfoDao;
+    }
+
+    @Override
+    public Installment createInstallment(Installment installment, Long purchaseId) {
+        // 基础验证
+        validationEnableInstallment(purchaseId);
+
+        Purchase purchase = purchaseDao.findOne(purchaseId);
+
+        // 如果之前具有分期信息,删除分期信息
+        if (purchase.getInstallmentId() != null) {
+            Installment oldInstallment = installmentDao.findOne(purchase.getInstallmentId());
+            if (oldInstallment != null)
+                installmentDao.delete(oldInstallment.getId());
+        }
+
+        Set<InstallmentDetail> installmentDetails = installment.getInstallmentDetails();
+        if (CollectionUtils.isEmpty(installmentDetails))
+            throw new IllegalOperatorException("分期详情为空,请您设置分期详情");
+
+        for(InstallmentDetail installmentDetail : installmentDetails) {
+            installmentDetail.setStatus(Status.TOBEPAID.value());
+        }
+
+        // 设置分期基本信息
+        installment.setSellerenuu(SystemSession.getUser().getEnterprise().getUu());
+        installment.setStatus(Status.TOBEPAID.value());
+        installment.setCount(installmentDetails.size());
+        installment.setCurrentNo((short) 1);
+        installment.setOrderNum(purchase.getOrderid());
+        installment.setPurchaseId(purchaseId);
+
+        Order order = orderDao.findOrderByOrderid(purchase.getOrderid());
+        if (order == null)
+            throw new IllegalOperatorException("此订单不存在,请重新确认信息");
+
+        installment.setOrderId(order.getId());
+        installment.setPrice(purchase.getPrice());
+        installment.setInstallmentDetails(installmentDetails);
+
+        // 保存分期信息
+        installment = installmentDao.save(installment);
+
+        for (InstallmentDetail installmentDetail : installmentDetails) {
+            installmentDetail.setInstallment(installment);
+            installmentDetail.setInstallmentId(installment.getId());
+        }
+
+        installmentDetailDao.save(installmentDetails);
+
+        // 订单、采购单保存分期id
+        purchase.setInstallmentId(installment.getId());
+        order.setInstallmentId(installment.getId());
+
+        purchaseDao.save(purchase);
+        orderDao.save(order);
+
+        return installment;
+    }
+
+    @Override
+    public Installment updateInstallment(Installment installment, Long purchaseId) {
+        // 基础验证
+        validationEnableInstallment(purchaseId);
+
+        Purchase purchase = purchaseDao.findOne(purchaseId);
+
+        Set<InstallmentDetail> installmentDetails = installment.getInstallmentDetails();
+        if (CollectionUtils.isEmpty(installmentDetails))
+            throw new IllegalOperatorException("分期详情为空,请您设置分期详情");
+
+        Installment oldInstallment = installmentDao.findByPurchaseId(purchaseId);
+        if (oldInstallment == null)
+            throw new IllegalOperatorException("此订单分期信息不存在,请重新确认信息");
+
+
+//        installmentDao.delete(oldInstallment.getId());
+
+        for(InstallmentDetail installmentDetail : installmentDetails) {
+            installmentDetail.setStatus(Status.TOBEPAID.value());
+        }
+
+        // 设置分期基本信息
+        installment.setSellerenuu(SystemSession.getUser().getEnterprise().getUu());
+        installment.setStatus(Status.TOBEPAID.value());
+        installment.setCount(installmentDetails.size());
+        installment.setCurrentNo((short) 1);
+        installment.setOrderNum(purchase.getOrderid());
+        installment.setPurchaseId(purchaseId);
+
+        Order order = orderDao.findByOrderid(purchase.getOrderid());
+        if (order == null)
+            throw new IllegalOperatorException("此订单不存在,请重新确认信息");
+
+        installment.setOrderId(order.getId());
+        installment.setPrice(purchase.getPrice());
+        installment.setInstallmentDetails(installmentDetails);
+
+        oldInstallment.getInstallmentDetails().clear();
+
+        // 保存分期信息
+        BeanUtils.copyProperties(installment, oldInstallment, "installmentDetails");
+        oldInstallment = installmentDao.save(oldInstallment);
+        for (InstallmentDetail installmentDetail : installment.getInstallmentDetails()) {
+            installmentDetail.setInstallmentId(oldInstallment.getId());
+        }
+        installmentDetailDao.save(installment.getInstallmentDetails());
+
+        return oldInstallment;
+    }
+
+    @Override
+    public Installment paidInstallment(BankTransfer bankTransfer, Long orderId) {
+        // 验证分期明细合法性
+        InstallmentDetail installmentDetail = installmentDetailDao.findOne(bankTransfer.getInstallmentDetailId());
+        if (installmentDetail == null)
+            throw new IllegalOperatorException("该订单分期信息不存在,请重新确认订单");
+        if (!orderId.equals(installmentDetail.getInstallment().getOrderId()))
+            throw new IllegalOperatorException("此分期信息与该订单不符,请重新确认分期信息");
+        if (Status.TOBEPAID.value() != installmentDetail.getStatus().intValue() && Status.PAID.value() != installmentDetail.getStatus().intValue())
+            throw new IllegalOperatorException("此次付款分期不为待付款状态,请重新确认分期信息");
+
+        // 更新分期信息状态为付款中
+        Installment installment = installmentDetail.getInstallment();
+        if (!installment.getCurrentNo().equals(installmentDetail.getDetno())) {
+            throw new IllegalOperatorException("此次付款分期与应付分期信息不符,请重新确认分期信息");
+        }
+        if ((Status.TOBEPAID.value() != installment.getStatus().intValue()) && (Status.PAID.value() != installment.getStatus().intValue())) {
+            throw new IllegalOperatorException("此分期不为待付款状态,请重新确认分期信息");
+        }
+
+        installment.setStatus(com.uas.platform.b2c.core.constant.Status.PAID.value());
+
+        installmentDetail.setPaidDate(new Date());
+        installmentDetail.setImgs(bankTransfer.getImgUrl());
+        installmentDetail.setPricesArr(bankTransfer.getPricesArr());
+        installmentDetail.setStatus(com.uas.platform.b2c.core.constant.Status.PAID.value());
+
+        installmentDetailDao.save(installmentDetail);
+
+        Order order = orderDao.findOne(orderId);
+
+        if (order == null)
+            throw new IllegalOperatorException("订单不存在,请重新确认订单信息");
+        List<Purchase> purchases = purchaseDao.findByOrderid(order.getOrderid());
+
+        if (CollectionUtils.isNotEmpty(purchases)) {
+            for (Purchase purchase : purchases) {
+                Enterprise enterprise = enterpriseDao.findByUu(purchase.getSellerenuu());
+                if (enterprise == null)
+                    throw new IllegalOperatorException("卖家企业不存在,请重新确认");
+                UserBaseInfo admin = userBaseInfoDao.findUserByUserUU(enterprise.getEnAdminuu());
+                if (admin == null)
+                    throw new IllegalOperatorException("卖家管理员不存在,请联系卖家");
+                // 发送信息
+                sendMessageService.sendMessageForInstallmentPay(purchase.getSellername(), purchase.getBuyername(), installmentDetail.getPrice(),
+                        admin.getUserTel(), MessageType.orderpay);
+            }
+        }
+
+        return installmentDao.save(installment);
+    }
+
+    @Override
+    public void deleteInstallment(Long purchaseId) {
+        validatePurchase(purchaseId);
+        Purchase purchase = purchaseDao.findOne(purchaseId);
+        Order order = orderDao.findByOrderid(purchase.getOrderid());
+
+        Installment installment = installmentDao.findByPurchaseId(purchaseId);
+        if (installment == null)
+            throw new IllegalOperatorException("分期信息不存在,请重新确认分期信息");
+
+        order.setInstallmentId(null);
+        purchase.setInstallmentId(null);
+
+        orderDao.save(order);
+        purchaseDao.save(purchase);
+
+        installmentDao.delete(installment.getId());
+    }
+
+    @Override
+    public Installment updateAfterModifyPurchasePrice(String purchaseDetailId) {
+        PurchaseDetail purchaseDetail = purchaseDetailDao.findByDetailid(purchaseDetailId);
+        if (purchaseDetail == null)
+            throw new IllegalOperatorException("订单改价明细数据不存在,请重新确认订单信息");
+        Purchase purchase = purchaseDetail.getPurchase();
+
+        if (purchase != null && purchase.getInstallmentId() != null)
+            validationEnableInstallment(purchase.getId());
+
+        Installment installment = installmentDao.findByPurchaseId(purchase.getId());
+
+        Double total = purchase.getPrice();
+        Double installTotal = installment.getPrice();
+        Double dvalue = 0d;
+
+        if (NumberUtil.compare(total, installTotal) == 1) {
+            InstallmentDetail installmentDetail = installmentDetailDao.findByInstallmentIdAndDetno(installment.getId(), installment.getCount().shortValue());
+            installmentDetail.setPrice(NumberUtil.pricesScaleTwo(total - installTotal + installmentDetail.getPrice()));
+            installmentDetailDao.save(installmentDetail);
+        }
+
+
+
+        if (NumberUtil.compare(total, installTotal) == -1) {
+            for (short i = 1; i < installment.getCount() + 1; i++) {
+                InstallmentDetail installmentDetail = installmentDetailDao.findByInstallmentIdAndDetno(installment.getId(), i);
+                if (installmentDetail == null) {
+                    break;
+                }
+
+                dvalue = total - installmentDetail.getPrice();
+
+                if (dvalue <= 0) {
+                    installmentDetail.setPrice(NumberUtil.pricesScaleTwo(total));
+                    installmentDetailDao.save(installmentDetail);
+                    installmentDetailDao.deleteGtDetno(installment.getId(), i);
+
+                    Iterator<InstallmentDetail> it = installment.getInstallmentDetails().iterator();
+                    if (it.hasNext()) {
+                        InstallmentDetail installmentDetail1 = it.next();
+                        if (installmentDetail.getDetno() > i) {
+                            it.remove();
+                        }
+                    }
+
+                    break;
+                } else {
+                    total = dvalue;
+                }
+            }
+        }
+
+        installment.setPrice(purchase.getPrice());
+        installment.setCount(installment.getInstallmentDetails().size());
+
+        return installmentDao.save(installment);
+    }
+
+    @Override
+    public String validationEnableInstallment(Long purchaseId) {
+        validatePurchase(purchaseId);// 验证采购单、订单信息
+        validateBankInfo(Type.SUP.value(), Status.ALLOW.value());// 验证银行账户信息
+        validateInstallmentStore();// 验证是否设置分期权限
+        return "success";
+    }
+
+    void validateInstallmentStore() {
+        InstallmentStore installmentStore = installmentStoreDao.findByEnuuAndEnable(SystemSession.getUser().getEnterprise().getUu(), (short) 1);
+        if (installmentStore == null)
+            throw new IllegalOperatorException("当前企业没有设置分期功能权限,如有需要请联系客服");
+    }
+
+    /**
+     * 验证是否有收款账户
+     * @param type
+     * @param status
+     */
+    void validateBankInfo(Integer type, Integer status) {
+        List<BankInfo> bankInfos = bankInfoService.getEnterpriseBankInfoContainsStatus(type, status);
+        if (CollectionUtils.isEmpty(bankInfos))
+            throw new IllegalOperatorException("当前企业没有设置收款账户,请在 结算中心--收款账户信息 管理您的收款账户信息");
+    }
+
+    /**
+     * 验证采购单、订单信息
+     * @param purchaseId
+     */
+    void validatePurchase(Long purchaseId) {
+        if (SystemSession.getUser().getEnterprise() == null)
+            throw new IllegalOperatorException("当前账户为个人账户,请选择企业后再执行此操作");
+
+        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("此订单状态不为待付款,不可修改分期信息");
+
+        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("此订单状态不为待付款,不可修改分期信息");
+    }
+}

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

@@ -0,0 +1,98 @@
+package com.uas.platform.b2c.fa.payment.service.impl;
+
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.fa.payment.dao.InstallmentStoreDao;
+import com.uas.platform.b2c.fa.payment.model.InstallmentStore;
+import com.uas.platform.b2c.fa.payment.service.InstallmentStoreService;
+import com.uas.platform.b2c.prod.store.dao.StoreInDao;
+import com.uas.platform.b2c.prod.store.model.StoreIn;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 分期权限店铺service实现类
+ * @author wangyc
+ *
+ * @version 2017/9/7 11:23 wangyc
+ */
+@Service
+public class InstallmentStoreServiceImpl implements InstallmentStoreService{
+
+    private final InstallmentStoreDao installmentStoreDao;
+
+    private final StoreInDao storeInDao;
+
+    @Autowired
+    public InstallmentStoreServiceImpl(InstallmentStoreDao installmentStoreDao, StoreInDao storeInDao) {
+        this.installmentStoreDao = installmentStoreDao;
+        this.storeInDao = storeInDao;
+    }
+
+    @Override
+    public InstallmentStore saveStore(String storeUuid) {
+        StoreIn storeIn = storeInDao.findByUuid(storeUuid);
+        if (storeIn == null)
+            throw new IllegalOperatorException("此店铺不存在,请重新确认店铺信息");
+
+        InstallmentStore installmentStore = installmentStoreDao.findByStoreUuid(storeUuid);
+        if (installmentStore != null) {
+            throw new IllegalOperatorException("店铺: " + storeIn.getStoreName() + " 已存在权限列表中,如需维护请找到该店铺进行维护");
+        } else {
+            installmentStore = new InstallmentStore();
+        }
+
+        installmentStore.setEnable((short) 1);
+        installmentStore.setEnuu(storeIn.getEnUU());
+        installmentStore.setStoreId(storeIn.getId());
+        installmentStore.setStoreUuid(storeUuid);
+
+        return installmentStoreDao.save(installmentStore);
+    }
+
+    @Override
+    public void deleteStore(String storeUuid) {
+        InstallmentStore installmentStore = installmentStoreDao.findByStoreUuid(storeUuid);
+        if (installmentStore == null)
+            throw new IllegalOperatorException("此店铺并不存在权限列表中,无需删除");
+        installmentStoreDao.delete(installmentStore.getId());
+    }
+
+    @Override
+    public InstallmentStore capsOFF(String storeUuid) {
+        return toggleStore(storeUuid, (short) 0);
+    }
+
+    @Override
+    public InstallmentStore capsON(String storeUuid) {
+        return toggleStore(storeUuid, (short) 1);
+    }
+
+    /**
+     * 启用/禁用店铺
+     * @param enable
+     * @return
+     */
+    public InstallmentStore toggleStore(String storeUuid, short enable) {
+        InstallmentStore installmentStore = installmentStoreDao.findByStoreUuid(storeUuid);
+        if (installmentStore == null)
+            throw new IllegalOperatorException("此店铺并不存在权限列表中,无需删除");
+
+        installmentStore.setEnable(enable);
+
+        return installmentStoreDao.save(installmentStore);
+    }
+
+    @Override
+    public String capsOFFVerify() {
+        if (SystemSession.getUser().getEnterprise() == null)
+            throw new IllegalOperatorException("当前用户为个人用户,请选择企业进行分期操作");
+
+        InstallmentStore installmentStore = installmentStoreDao.findByEnuuAndEnable(SystemSession.getUser().getEnterprise().getUu(), (short) 1);
+        if (installmentStore == null) {
+            return "fail";
+        } else {
+            return "success";
+        }
+    }
+}

+ 11 - 5
src/main/java/com/uas/platform/b2c/fa/payment/service/impl/PaymentServiceImpl.java

@@ -1,6 +1,7 @@
 package com.uas.platform.b2c.fa.payment.service.impl;
 
 import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.core.constant.EncodingRulesConstant;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
 import com.uas.platform.b2c.core.utils.NumberUtil;
@@ -19,7 +20,6 @@ import com.uas.platform.b2c.trade.order.dao.OrderDao;
 import com.uas.platform.b2c.trade.order.model.Order;
 import com.uas.platform.b2c.trade.order.service.OrderService;
 import com.uas.platform.core.exception.IllegalOperatorException;
-import com.uas.platform.core.model.EncodingRulesConstant;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.model.Type;
@@ -111,12 +111,12 @@ public class PaymentServiceImpl implements PaymentService {
 			set.add(paymentDetail);
 		}
 		String paymentid = null;
-		String numberUtil = EncodingRulesConstant.YSEPAY.replace("_TIMESTAP_NUMBER",
-				createNumberService.getTimeNumber("trade$payment", 8));
+		String numberUtil = EncodingRulesConstant.YSEPAY.replace("TIMESTAP_NUMBER",
+				createNumberService.getTimeNumber("trade$payment", 7));
 		Map<String, String> map = new HashMap<String, String>();
 		String referer = request.getHeader("Referer");
 		if("test".equals(sysConf.getPaymentPrice())){
-			paymentid = numberUtil + "test";
+			paymentid = numberUtil + "t";
 			StringBuilder buffer = new StringBuilder();
 			String returnUrl = null;
 			if(StringUtils.isEmpty(basePath)) {
@@ -127,7 +127,7 @@ public class PaymentServiceImpl implements PaymentService {
 			map.put("return_url", returnUrl);
 		}
 		if("prod".equals(sysConf.getPaymentPrice())){
-			paymentid = numberUtil + "prod";
+			paymentid = numberUtil + "p";
 			map.put("return_url", sysConf.getReturnUrl());
 		}
 		payment.setPaymentid(paymentid);
@@ -146,6 +146,8 @@ public class PaymentServiceImpl implements PaymentService {
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 		String timestamp = sdf.format(new Date());
 
+
+
 		// 待签名参数
 		map.put("out_trade_no", paymentid);
 		map.put("subject", subject);
@@ -165,6 +167,10 @@ public class PaymentServiceImpl implements PaymentService {
 		// 生成付款请求参数map(加上签名)
 		Map<String, String> sPara = ApipaySubmit.buildRequestPara(request, map);
 
+		// 银盛接口链接
+		String yesGateway = sysConf.getYesGateway();
+		sPara.put("action", yesGateway);
+
 		return sPara;
 	}
 

+ 15 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/model/Goods.java

@@ -475,6 +475,13 @@ public class Goods implements Serializable {
 	@Column(name= "go_perqty")
 	private Double perQty;
 
+	/**
+	 * 商品的点击次数
+	 */
+	@Column(name = "go_visit_count")
+	private Long visitCount;
+
+
 	@Transient
 	private String selfSale;
 
@@ -522,6 +529,14 @@ public class Goods implements Serializable {
 		this.id = id;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
 	public String getUuid() {
 		return uuid;
 	}

+ 55 - 10
src/main/java/com/uas/platform/b2c/prod/commodity/model/ReleaseProductByBatch.java

@@ -17,7 +17,7 @@ import java.util.List;
 
 /**
  * 批量上传商品建立临时表存储相关信息
- * 
+ *
  * @author hejq
  * @time 创建时间:2016年9月24日
  */
@@ -54,16 +54,28 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_branden")
 	private String brandNameEn;
 
+	/**
+	 * 商城品牌中文
+	 */
+	@Column(name = "rel_b2cbrandcn")
+	private String b2cBrandcn;
+
+	/**
+	 * 品牌品牌uuid
+	 */
+	@Column(name = "rel_b2cbranden")
+	private String b2cBranden;
+
 	/**
 	 * 品牌id
 	 */
-	@Column(name = "rel_brandid")
+	@Column(name = "rel_b2cbrandid")
 	private Long brandId;
 
 	/**
 	 * 品牌品牌uuid
 	 */
-	@Column(name = "br_name_uuid")
+	@Column(name = "rel_b2cbranduuid")
 	private String branduuid;
 
 	/**
@@ -72,10 +84,16 @@ public class ReleaseProductByBatch implements Serializable {
 	@Column(name = "rel_code")
 	private String code;
 
+	/**
+	 * 产品型号
+	 */
+	@Column(name = "rel_b2ccode")
+	private String b2cCode;
+
 	/**
 	 * 产品UUId
 	 */
-	@Column(name = "rel_uuid")
+	@Column(name = "rel_b2cuuid")
 	private String componentUuId;
 
 	/**
@@ -298,7 +316,7 @@ public class ReleaseProductByBatch implements Serializable {
 
 	/**
 	 * 发布状态
-	 * 
+	 *
 	 * @return
 	 */
 	@Column(name = "rel_releasestatus")
@@ -337,13 +355,13 @@ public class ReleaseProductByBatch implements Serializable {
 	/**
 	 * 类目名称,便于发布
 	 */
-	@Column(name = "rel_kindname")
+	@Column(name = "rel_b2ckindname")
 	private String kindName;
 
 	/**
 	 * 类目ID
 	 */
-	@Column(name = "rel_kind_uuid")
+	@Column(name = "rel_b2ckindid")
 	private Long kindUuid;
 
 	/**
@@ -809,7 +827,7 @@ public class ReleaseProductByBatch implements Serializable {
 
 	/**
 	 * 价格分段数据
-	 * 
+	 *
 	 * @return
 	 */
 	@Transient
@@ -957,7 +975,7 @@ public class ReleaseProductByBatch implements Serializable {
 
 	/**
 	 * 获取人民币分段报价列表
-	 * 
+	 *
 	 * @return
 	 */
 	@Transient
@@ -980,7 +998,7 @@ public class ReleaseProductByBatch implements Serializable {
 
 	/**
 	 * 获取美元分段报价列表
-	 * 
+	 *
 	 * @return
 	 */
 	@Transient
@@ -1036,6 +1054,33 @@ public class ReleaseProductByBatch implements Serializable {
 		return goods;
 	}
 
+	public String getB2cBrandcn() {
+		return b2cBrandcn;
+	}
+
+	public ReleaseProductByBatch setB2cBrandcn(String b2cBrandcn) {
+		this.b2cBrandcn = b2cBrandcn;
+		return this;
+	}
+
+	public String getB2cBranden() {
+		return b2cBranden;
+	}
+
+	public ReleaseProductByBatch setB2cBranden(String b2cBranden) {
+		this.b2cBranden = b2cBranden;
+		return this;
+	}
+
+	public String getB2cCode() {
+		return b2cCode;
+	}
+
+	public ReleaseProductByBatch setB2cCode(String b2cCode) {
+		this.b2cCode = b2cCode;
+		return this;
+	}
+
 	public String getStoreid() {
 		return storeid;
 	}

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

@@ -57,6 +57,7 @@ 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;
@@ -179,6 +180,8 @@ public class GoodsServiceImpl implements GoodsService {
 	@Autowired
 	private OrderDetailService detailService;
 
+	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;
@@ -1846,6 +1849,8 @@ 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(), "待下架批次号字符串不能为空");
 		}
@@ -1857,9 +1862,11 @@ 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());
@@ -1869,13 +1876,17 @@ 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) {
@@ -1892,6 +1903,8 @@ 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(), "待下架批次号不能为空");
 		}
@@ -1910,8 +1923,10 @@ 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);
 

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

@@ -27,6 +27,7 @@ import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.ReleaseStatus;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.ss.usermodel.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -326,7 +327,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 					}
 
 					// 最小包单价
-					Object priceMinPackQtyCellValue = readWorkBookCell(row.getCell(9), Cell.CELL_TYPE_STRING, r, 9);
+					Object priceMinPackQtyCellValue = readWorkBookCell(row.getCell(9), Cell.CELL_TYPE_NUMERIC, r, 9);
 					releaseProductByBatch.setMinPackPriceStr(StringUtilB2C.getStr(priceMinPackQtyCellValue));
 					if ((priceMinPackQtyCellValue != null)&&(isNumber(priceMinPackQtyCellValue.toString())) && (NumberUtil.compare(Double.valueOf(priceMinPackQtyCellValue.toString()), 0.0d) > 0)) {
 						Double price = Double.valueOf(priceMinPackQtyCellValue.toString());
@@ -573,7 +574,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 			if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
 				switch (cellType) {
 				case Cell.CELL_TYPE_STRING:
-					cell.setCellType(Cell.CELL_TYPE_STRING);
+					cell.setCellType(HSSFCell.CELL_TYPE_STRING);
 					String str = cell.getStringCellValue().trim();
 //					Object data = getCellData(cell);
 //					String str = data == null ? "" : data.toString();
@@ -586,6 +587,12 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 				case Cell.CELL_TYPE_NUMERIC:
 					cell.setCellType(Cell.CELL_TYPE_NUMERIC);
 					obj = cell.getNumericCellValue();
+					if(obj != null) {
+						if(obj.toString().indexOf("E") > 0) {
+							BigDecimal b = new BigDecimal(obj.toString());
+							obj = b.toPlainString();
+						}
+					}
 					break;
 				default:
 					if(cell.getCellType() == Cell.CELL_TYPE_STRING) {
@@ -688,7 +695,7 @@ public class ReleaseProductByBatchServiceImpl implements ReleaseProductByBatchSe
 		Object endQtyCellValue = readWorkBookCell(cellQty, Cell.CELL_TYPE_STRING, r, num);
 		releaseProductByBatch.setFragmentQty(StringUtilB2C.getStr(endQtyCellValue), i);
 
-		Object priceCellValue = readWorkBookCell(cellPrice, Cell.CELL_TYPE_STRING, r, num + 1);
+		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());

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

@@ -65,6 +65,17 @@ public class BrandController {
 		return brandService.getInitialSimpleInfo(keyword);
 	}
 
+	/**
+	 * 分页获取按字符串获取以此字符为首字母的品牌信息
+	 * @return map(首字母,超简易品牌信息)
+	 */
+	@RequestMapping(value = "/initial/first/{key}", method = RequestMethod.GET)
+	public Page<Brand> getInitialSimpleInfoByFirst(@PathVariable String key ,PageParams page , String keyword) {
+		if (StringUtils.isEmpty(key))
+			keyword = "A";
+		return brandService.getInitialSimpleInfoByFirst(key,page,keyword);
+	}
+
 	/**
 	 * 查找所有简单有效品牌信息
 	 * @param keyword 关键词
@@ -78,6 +89,19 @@ public class BrandController {
 		return brandService.getBrandInfoPage(info, keyword);
 	}
 
+	/**
+	 * 查找所有简单有效品牌信息,并按首字母过滤
+	 * @param keyword 关键词
+	 * @param params
+	 *            分页信息
+	 * @return 品牌简易信息
+	 */
+	@RequestMapping(value = "/page/initial", method = RequestMethod.GET)
+	public Page<BrandInfo> getBrankInfoPage(PageParams params, String keyword, String initial) {
+		PageInfo info = new PageInfo(params);
+		return brandService.getBrandInfoPage(info, keyword, initial);
+	}
+
 	/**
 	 * 根据uuid获取单个
 	 * 

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

@@ -0,0 +1,105 @@
+package com.uas.platform.b2c.prod.product.brand.controller;
+
+import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
+import com.uas.platform.b2c.core.support.view.JxlsExcelView;
+import com.uas.platform.b2c.prod.product.brand.modal.BrandMap;
+import com.uas.platform.b2c.prod.product.brand.service.BrandMapService;
+import com.uas.platform.b2c.prod.store.model.StoreType;
+import com.uas.platform.core.logging.BufferedLoggerManager;
+import com.uas.platform.core.model.PageParams;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.repository.query.Param;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 品牌映射Controller
+ *
+ * @author hulh
+ */
+@RestController
+@RequestMapping("/produce/brandMap")
+public class BrandMapController {
+
+	@Autowired
+	private BrandMapService mapService;
+
+	private static final UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
+
+	/**
+	 * 根据以下参数分页获取对应的品牌映射关系
+	 *
+	 * @param params
+	 * @param keyword
+	 * @param storeType
+	 * @param fromDate
+	 * @param toDate
+	 * @return
+	 */
+	@RequestMapping(value = "/page", method = RequestMethod.GET)
+	public Page<BrandMap> findBrandMap(PageParams params, String keyword, StoreType storeType, Long fromDate, Long toDate){
+		return mapService.findAllMap(params, keyword, storeType, fromDate, toDate);
+	}
+
+	/**
+	 * 新增一个品牌映射
+	 *
+	 * @return
+	 */
+	@RequestMapping(value = "/addOne", method = RequestMethod.POST)
+	public BrandMap addBrandMap(@RequestBody BrandMap map){
+		logger.log("品牌映射", "新增品牌映射记录");
+		return mapService.addOneMap(map);
+	}
+
+	@RequestMapping(value = "/export", method = RequestMethod.POST)
+	public ModelAndView exportDataToExcel(@RequestParam(required = false, value = "isAjax", defaultValue = "false") Boolean isAjax, HttpServletRequest request, @Param("keyword") String keyword,
+										  @Param("storeType") StoreType storeType, @Param("fromDate") Long fromDate, @Param("toDate") Long toDate) throws UnsupportedEncodingException {
+		HttpSession session = request.getSession();
+		ModelAndView modelAndView = new ModelAndView();
+		Object loading = session.getAttribute("loading");
+		if(isAjax) {
+			MappingJackson2JsonView view = new MappingJackson2JsonView();
+			Map<String, Boolean> attributes = new HashMap<>();
+			Boolean isLoading = loading == Boolean.TRUE;
+			attributes.put("loading", isLoading);
+			view.setAttributesMap(attributes);
+			modelAndView.setView(view);
+			return modelAndView;
+		}
+		session.setAttribute("loading", true);
+		List<BrandMap> data = new ArrayList<>();
+		data = mapService.getMapDataList(keyword, storeType, fromDate, toDate);
+		modelAndView.addObject("data", data);
+		modelAndView.setView(new JxlsExcelView("classpath:jxls-tpl/product/brand-map", "优软商城-品牌映射信息"));
+		session.setAttribute("loading", false);
+		return modelAndView;
+	}
+
+	/**
+	 * 根据id删除一个品牌映射
+	 *
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping(value = "/deleteOne/{id}", method = RequestMethod.PUT)
+	public Object deleteOne(@PathVariable Long id){
+		return mapService.deleteOneMap(id);
+	}
+
+	@RequestMapping(value = "/initMap", method = RequestMethod.POST)
+	public void initAllBrandMap(){
+		logger.log("品牌映射", "品牌映射初始化");
+		mapService.initBrandMap();
+	}
+}

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

@@ -2,6 +2,9 @@ package com.uas.platform.b2c.prod.product.brand.dao;
 
 import java.util.List;
 
+import com.uas.platform.b2c.prod.product.brand.modal.BrandMostSimpleInfo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
@@ -67,4 +70,12 @@ public interface BrandDao extends JpaSpecificationExecutor<Brand>, JpaRepository
 	 */
 	@Query("select b from Brand b where upper(b.nameCn)=upper(:nameCn)")
 	public List<Brand> findByUpperNameCn(@Param("nameCn") String nameCn);
+
+	/**
+	 * 分页根据首字母获取品牌信息
+	 * @param initals
+	 * @return
+	 */
+	@Query(value = "select b from Brand b  where b.inital in :initals and (b.nameEn like %:keyword% or b.nameCn like %:keyword%)")
+	public Page<Brand> findInInitalsPage(@Param("initals") String[] initals ,@Param("keyword") String keyword, Pageable pageable);
 }

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

@@ -0,0 +1,13 @@
+package com.uas.platform.b2c.prod.product.brand.dao;
+
+import com.uas.platform.b2c.prod.product.brand.modal.BrandMap;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+/**
+ * Created by hulh on 2017/10/23.
+ * 品牌映射接口
+ */
+public interface BrandMapDao extends JpaSpecificationExecutor<BrandMap>, JpaRepository<BrandMap, Long> {
+
+}

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

@@ -1,6 +1,8 @@
 package com.uas.platform.b2c.prod.product.brand.dao;
 
 import com.uas.platform.b2c.prod.product.brand.modal.BrandMostSimpleInfo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
@@ -25,6 +27,14 @@ public interface BrandMostSimpleInfoDao extends JpaSpecificationExecutor<BrandMo
     @Query(nativeQuery = true, value = "select * from product$brand where br_inital in :initals")
     public List<BrandMostSimpleInfo> findInInitals(@Param("initals") String[] initals);
 
+    /**
+     * 分页根据首字母获取品牌信息
+     * @param initals
+     * @return
+     */
+    @Query(value = "select b from BrandMostSimpleInfo b  where b.inital in :initals")
+    public Page<BrandMostSimpleInfo> findInInitalsPage(@Param("initals") String[] initals , Pageable pageable);
+
     /**
      * 根据批次号获取品牌信息
      * @param batchIds id批次号

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

@@ -0,0 +1,17 @@
+package com.uas.platform.b2c.prod.product.brand.dao;
+
+import com.uas.platform.b2c.prod.product.brand.modal.BrandTemp;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+/**
+ * 品牌映射临时表dao层
+ */
+public interface BrandTempDao extends JpaSpecificationExecutor<BrandTemp>, JpaRepository<BrandTemp, Long> {
+
+	@Query(value = "select b from BrandTemp b where b.nameSd is not null")
+	List<BrandTemp> getAllBySdNameNotNull();
+}

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

@@ -151,6 +151,18 @@ public class Brand implements Serializable {
 	@Column(name = "br_weight")
 	private Double weight;
 
+	/**
+	 * 品牌的点击次数
+	 */
+	@Column(name = "br_visit_count")
+	private Long visitCount;
+
+	/**
+	 * 品牌的搜索次数
+	 */
+	@Column(name = "br_search_count")
+	private Long searchCount;
+
 	public Long getId() {
 		return id;
 	}
@@ -319,6 +331,22 @@ public class Brand implements Serializable {
 		this.inital = inital;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
+	public Long getSearchCount() {
+		return searchCount;
+	}
+
+	public void setSearchCount(Long searchCount) {
+		this.searchCount = searchCount;
+	}
+
 	public Brand() {
 
 	}

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

@@ -0,0 +1,233 @@
+package com.uas.platform.b2c.prod.product.brand.modal;
+
+import com.uas.platform.b2c.prod.store.model.StoreType;
+
+import javax.persistence.*;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 品牌映射表
+ *
+ * @author hulh
+ */
+@Entity
+@Table(name = "product$brand_map")
+public class BrandMap {
+
+	private final static List<String> typeCn = Arrays.asList("代理商", "经销商", "原厂商", "寄售商");
+
+	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+	/**
+	 * 主键
+	 */
+	@Id
+	@GeneratedValue
+	@Column(name = "id")
+	private Long id;
+
+	/**
+	 * 映射企业enuu
+	 */
+	@Column(name = "map_enuu")
+	private Long enuu;
+
+	/**
+	 * 映射企业名称
+	 */
+	@Column(name = "map_name")
+	private String enName;
+
+	/**
+	 * 店铺类型
+	 */
+	@Column(name = "map_type")
+	@Enumerated(value = EnumType.STRING)
+	private StoreType type;
+
+	/**
+	 * 客户公司品牌英文名
+	 */
+	@Column(name = "map_name_cd_en")
+	private String nameChildEn;
+
+	/**
+	 * 客户公司品牌中文名
+	 */
+	@Column(name = "map_name_cd_cn")
+	private String nameChildCn;
+
+	/**
+	 * 商城标准品牌英文名
+	 */
+	@Column(name = "map_name_sd_en")
+	private String nameStandardEn;
+
+	/**
+	 * 商城标准品牌中文名
+	 */
+	@Column(name = "map_name_sd_cn")
+	private String nameStandardCn;
+
+	/**
+	 * 对应的品牌id
+	 */
+	@Column(name = "map_brand_id")
+	private Long brandid;
+
+	/**
+	 * 对应的品牌uuid
+	 */
+	@Column(name = "map_uuid")
+	private String uuid;
+
+	/**
+	 * 操作人uu
+	 */
+	@Column(name = "map_op_uu")
+	private Long userUU;
+
+	/**
+	 * 操作人名称
+	 */
+	@Column(name = "map_op_name")
+	private String operateName;
+
+	/**
+	 * 操作人时间
+	 */
+	@Column(name = "map_op_time")
+	private Date operateTime;
+
+	public BrandMap(){
+
+	}
+
+	public BrandMap(BrandTemp temp){
+		this.nameChildEn = temp.getNameCd();
+		this.nameStandardEn = temp.getNameSd();
+	}
+
+	public Long getEnuu() {
+		return enuu;
+	}
+
+	public void setEnuu(Long enuu) {
+		this.enuu = enuu;
+	}
+
+	public String getEnName() {
+		return enName;
+	}
+
+	public void setEnName(String enName) {
+		this.enName = enName;
+	}
+
+	public StoreType getType() {
+		return type;
+	}
+
+	public void setType(StoreType type) {
+		this.type = type;
+	}
+
+	public String getNameChildEn() {
+		return nameChildEn;
+	}
+
+	public void setNameChildEn(String nameChildEn) {
+		this.nameChildEn = nameChildEn;
+	}
+
+	public String getNameChildCn() {
+		return nameChildCn;
+	}
+
+	public void setNameChildCn(String nameChildCn) {
+		this.nameChildCn = nameChildCn;
+	}
+
+	public String getUuid() {
+		return uuid;
+	}
+
+	public void setUuid(String uuid) {
+		this.uuid = uuid;
+	}
+
+	public String getNameStandardEn() {
+		return nameStandardEn;
+	}
+
+	public void setNameStandardEn(String nameStandardEn) {
+		this.nameStandardEn = nameStandardEn;
+	}
+
+	public String getNameStandardCn() {
+		return nameStandardCn;
+	}
+
+	public void setNameStandardCn(String nameStandardCn) {
+		this.nameStandardCn = nameStandardCn;
+	}
+
+	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 String getOperateName() {
+		return operateName;
+	}
+
+	public void setOperateName(String operateName) {
+		this.operateName = operateName;
+	}
+
+	public Date getOperateTime() {
+		return operateTime;
+	}
+
+	public void setOperateTime(Date operateTime) {
+		this.operateTime = operateTime;
+	}
+
+	public Long getBrandid() {
+		return brandid;
+	}
+
+	public void setBrandid(Long brandid) {
+		this.brandid = brandid;
+	}
+
+	/**
+	 * 将店铺类型转化为中文形式
+	 * @return
+	 */
+	public String convertType(){
+		return typeCn.get(type.ordinal());
+	}
+
+	/**
+	 * 将时间转化为日期格式  yyyy-MM-dd HH:mm:ss
+	 * @return
+	 */
+	public String formatTime(){
+		return sdf.format(operateTime);
+	}
+}

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

@@ -0,0 +1,55 @@
+package com.uas.platform.b2c.prod.product.brand.modal;
+
+import javax.persistence.*;
+
+/**
+ * 品牌映射临时表 --用于保存映射关系
+ */
+@Entity
+@Table(name = "product$brand_temp")
+public class BrandTemp {
+
+	/**
+	 * 主键
+	 */
+	@Id
+	@GeneratedValue
+	@Column(name = "id")
+	private Long id;
+
+	/**
+	 * 客户品牌名称
+	 */
+	@Column(name = "name_cd")
+	private String nameCd;
+
+	/**
+	 * 商城品牌名称
+	 */
+	@Column(name = "name_sd")
+	private String nameSd;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getNameCd() {
+		return nameCd;
+	}
+
+	public void setNameCd(String nameCd) {
+		this.nameCd = nameCd;
+	}
+
+	public String getNameSd() {
+		return nameSd;
+	}
+
+	public void setNameSd(String nameSd) {
+		this.nameSd = nameSd;
+	}
+}

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

@@ -0,0 +1,75 @@
+package com.uas.platform.b2c.prod.product.brand.modal;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * 品牌映射操作人表
+ *
+ * @author hulh
+ */
+@Entity
+@Table(name = "product$brand_operator")
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class MapOperator {
+
+	/**
+	 * 主键
+	 */
+	@Id
+	@GeneratedValue
+	@Column(name = "id")
+	private Long id;
+
+	/**
+	 * 操作人uu
+	 */
+	@Column(name = "op_uu")
+	private Long userUU;
+
+	/**
+	 * 操作人名称
+	 */
+	@Column(name = "op_name")
+	private String operateName;
+
+	/**
+	 * 操作人时间
+	 */
+	@Column(name = "op_time")
+	private Date operateTime;
+
+	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 String getOperateName() {
+		return operateName;
+	}
+
+	public void setOperateName(String operateName) {
+		this.operateName = operateName;
+	}
+
+	public Date getOperateTime() {
+		return operateTime;
+	}
+
+	public void setOperateTime(Date operateTime) {
+		this.operateTime = operateTime;
+	}
+}

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

@@ -0,0 +1,41 @@
+package com.uas.platform.b2c.prod.product.brand.service;
+
+import com.uas.platform.b2c.prod.product.brand.modal.BrandMap;
+import com.uas.platform.b2c.prod.store.model.StoreType;
+import com.uas.platform.core.model.PageParams;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+
+/**
+ * 品牌映射Service
+ *
+ * @author hulh
+ */
+public interface BrandMapService {
+
+	/**
+	 * 获取所有设置好的品牌映射
+	 *
+	 * @return
+	 */
+	Page<BrandMap> findAllMap(PageParams params, String keyword, StoreType type, Long fromDate, Long toDate);
+
+	/**
+	 * 添加一个品牌映射
+	 *
+	 * @return
+	 */
+	BrandMap addOneMap(BrandMap map);
+
+	List<BrandMap> getMapDataList(String keyword, StoreType type, Long fromDate, Long toDate);
+
+	/**
+	 * 删除一个品牌映射
+	 *
+	 * @return
+	 */
+	Object deleteOneMap(Long id);
+
+	void initBrandMap();
+}

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

@@ -5,6 +5,7 @@ import com.uas.platform.b2c.prod.product.brand.modal.BrandInfo;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandMostSimpleInfo;
 import com.uas.platform.b2c.prod.product.brand.modal.BrandVersion;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 
 import java.util.List;
@@ -54,6 +55,13 @@ public interface BrandService {
 	 */
 	public Map<String, List<BrandMostSimpleInfo>> getInitialSimpleInfo(String keyword);
 
+	/**
+	 * 获取按字符串获取以此字符串为首字母的品牌信息
+	 * @param keyword 关键词
+	 * @return 品牌简易信息
+	 */
+	public Page<Brand> getInitialSimpleInfoByFirst(String key , PageParams params, String keyword);
+
 	/**
 	 * 获取BrandInfo分页数据
 	 * @param keyword 关键词
@@ -62,6 +70,15 @@ public interface BrandService {
 	 */
 	public Page<BrandInfo> getBrandInfoPage(PageInfo pageInfo, String keyword);
 
+	/**
+	 * 获取BrandInfo分页数据
+	 * @param keyword 关键词
+	 * @param pageInfo 分页信息
+	 * @param initial 首字母
+	 * @return 品牌简易信息
+	 */
+	public Page<BrandInfo> getBrandInfoPage(PageInfo pageInfo, String keyword, String initial);
+
 	/**
 	 * 根据uuid获取单个品牌信息
 	 * @param uuid

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

@@ -0,0 +1,184 @@
+package com.uas.platform.b2c.prod.product.brand.service.impl;
+
+import com.uas.platform.b2c.common.account.model.User;
+import com.uas.platform.b2c.core.support.SystemSession;
+import com.uas.platform.b2c.prod.product.brand.dao.BrandDao;
+import com.uas.platform.b2c.prod.product.brand.dao.BrandMapDao;
+import com.uas.platform.b2c.prod.product.brand.dao.BrandTempDao;
+import com.uas.platform.b2c.prod.product.brand.modal.Brand;
+import com.uas.platform.b2c.prod.product.brand.modal.BrandMap;
+import com.uas.platform.b2c.prod.product.brand.modal.BrandTemp;
+import com.uas.platform.b2c.prod.product.brand.modal.MapOperator;
+import com.uas.platform.b2c.prod.product.brand.service.BrandMapService;
+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.StoreType;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
+import com.uas.platform.core.persistence.criteria.CriterionExpression;
+import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.platform.core.persistence.criteria.SimpleExpression;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 品牌映射服务的实现类
+ */
+@Service
+public class BrandMapServiceImpl implements BrandMapService{
+
+	@Autowired
+	private BrandTempDao brandTempDao;
+
+	@Autowired
+	private BrandMapDao brandMapDao;
+
+	@Autowired
+	private BrandDao brandDao;
+
+	@Autowired
+	private StoreInDao storeInDao;
+
+	//10041230L--10000666L--10030744L--10042176L--10005919L--10043358L--10044036L--10041191L--10042901L
+//	private final static List<Long> uuList = Arrays.asList(10041230L, 10000666L,
+//			10030744L, 10042176L, 10005919L, 10043358L, 10044036L, 10041191L, 10042901L);
+
+	//暂时测试happy和豆腐公司
+	private final static List<Long> uuList = Arrays.asList(10043457L, 10043516L);
+
+	public PageInfo convertPageInfo(PageInfo info, String keyword, StoreType type, Long fromDate, Long toDate){
+		if (type != null){
+			info.expression(PredicateUtils.eq("type", type, false));
+		}
+		if (StringUtils.hasText(keyword)){
+			SimpleExpression expression1 = new SimpleExpression("nameStandardEn", keyword, CriterionExpression.Operator.LIKE, true);
+			SimpleExpression expression2 = new SimpleExpression("nameStandardCn", keyword, CriterionExpression.Operator.LIKE, true);
+			SimpleExpression expression3 = new SimpleExpression("enName", keyword, CriterionExpression.Operator.LIKE);
+			SimpleExpression[] expressions = new SimpleExpression[]{expression1, expression2, expression3};
+			info.expression(PredicateUtils.or(expressions));
+		}
+		if (fromDate != null){
+			info.expression(PredicateUtils.gte("operateTime", new Date(fromDate), false));
+		}
+		if (toDate != null){
+			info.expression(PredicateUtils.lte("operateTime", new Date(toDate), false));
+		}
+		return info;
+	}
+
+	@Override
+	public Page<BrandMap> findAllMap(PageParams params, String keyword, StoreType type, Long fromDate, Long toDate) {
+		final PageInfo pageInfo = new PageInfo(params);
+		convertPageInfo(pageInfo, keyword, type, fromDate, toDate);
+		return brandMapDao.findAll(new Specification<BrandMap>() {
+			@Override
+			public Predicate toPredicate(Root<BrandMap> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+				criteriaQuery.where(pageInfo.getPredicates(root, criteriaQuery, criteriaBuilder));
+				return null;
+			}
+		}, pageInfo);
+	}
+
+	@Override
+	public List<BrandMap> getMapDataList(String keyword, StoreType type, Long fromDate, Long toDate) {
+		final PageInfo pageInfo = new PageInfo();
+		convertPageInfo(pageInfo, keyword, type, fromDate, toDate);
+		List<BrandMap> mapList = brandMapDao.findAll(new Specification<BrandMap>() {
+			@Override
+			public Predicate toPredicate(Root<BrandMap> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				query.where(pageInfo.getPredicates(root, query, builder));
+				return null;
+			}
+		});
+		return mapList;
+	}
+
+	@Override
+	public BrandMap addOneMap(BrandMap map) {
+		validateMap(map);
+		User user = SystemSession.getUser();
+		map.setUserUU(user.getUserUU());
+		map.setOperateName(user.getUserName());
+		map.setOperateTime(new Date());
+
+		return brandMapDao.save(map);
+	}
+
+	public void validateMap(BrandMap map){
+		if (StringUtils.isEmpty(map.getEnName())){
+			throw new IllegalOperatorException("请选择店铺信息");
+		}
+		if (StringUtils.isEmpty(map.getNameChildEn())){
+			throw new IllegalOperatorException("请完善要对应的品牌英文名");
+		}
+		if (StringUtils.isEmpty(map.getNameStandardCn()) || StringUtils.isEmpty(map.getNameStandardEn())){
+			throw new IllegalOperatorException("请选择对应标准库的品牌");
+		}
+	}
+
+	@Override
+	public Object deleteOneMap(Long id) {
+		return null;
+	}
+
+	@Override
+	public void initBrandMap() {
+		List<BrandTemp> originalList = brandTempDao.getAllBySdNameNotNull();
+		List<BrandTemp> convertList = new ArrayList<>();
+		for (BrandTemp temp : originalList){
+			if (!temp.getNameCd().equals(temp.getNameSd())) { //相同的不记录
+				convertList.add(temp);
+			}
+		}
+		List<BrandMap> resultList = new ArrayList<>();
+		for (Long enuu : uuList){
+			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);
+			}
+		}
+	}
+}

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

@@ -12,6 +12,7 @@ import com.uas.platform.b2c.prod.product.brand.service.BrandService;
 import com.uas.platform.b2c.prod.product.component.dao.ComponentDao;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.PageInfo;
+import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.persistence.criteria.CriterionExpression;
 import com.uas.platform.core.persistence.criteria.CriterionExpression.Operator;
 import com.uas.platform.core.persistence.criteria.LogicalExpression;
@@ -20,6 +21,8 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
@@ -117,6 +120,12 @@ public class BrandServiceImpl implements BrandService {
 		return map;
 	}
 
+	@Override
+	public Page<Brand> getInitialSimpleInfoByFirst(String key , PageParams params ,String keyword) {
+		Pageable pageable = new PageInfo(params);
+		return brandDao.findInInitalsPage(new String[]{key},keyword, pageable);
+	}
+
 	// 判断一个字符串是否含有中文
 	public static boolean isChinese(String str) {
 		if (str == null) return false;
@@ -146,6 +155,37 @@ public class BrandServiceImpl implements BrandService {
 		}, pageInfo);
 	}
 
+	public Page<BrandInfo> getBrandInfoPage(final PageInfo pageInfo, String keyword, String inital){
+		if (StringUtils.hasText(keyword)) {
+			SimpleExpression[] simpleArrs = new SimpleExpression[2];
+			simpleArrs[0] = new SimpleExpression("nameCn", keyword, Operator.LIKE, true);
+			simpleArrs[1] = new SimpleExpression("nameEn", keyword, Operator.LIKE, true);
+			LogicalExpression logical1 = new LogicalExpression(simpleArrs, Operator.OR);
+			pageInfo.expression(logical1);
+		}
+		if (StringUtils.hasText(inital)){
+			if ("0~9".equals(inital)) {
+				String[] initals = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
+				SimpleExpression[] numEx = new SimpleExpression[10];
+				for (int i = 0; i < 10; i++){
+					numEx[i] = new SimpleExpression("inital", initals[i], Operator.EQ, true);
+				}
+				LogicalExpression logical2 = new LogicalExpression(numEx, Operator.OR);
+				pageInfo.expression(logical2);
+			} else {
+				pageInfo.filter("inital", inital);
+			}
+		}
+		pageInfo.sorting(Sort.Direction.ASC, "nameEn");
+		return brandInfoDao.findAll(new Specification<BrandInfo>() {
+			@Override
+			public Predicate toPredicate(Root<BrandInfo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
+				query.where(pageInfo.getPredicates(root, query, builder));
+				return null;
+			}
+		}, pageInfo);
+	}
+
 	@Override
 	public Brand findByUuid(String uuid) {
 		// 这个因为是接口错误的话直接返回

+ 12 - 8
src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandSubmitServiceImpl.java

@@ -267,15 +267,19 @@ public class BrandSubmitServiceImpl implements BrandSubmitService {
 			throw new IllegalOperatorException("此品牌申请已被处理");
 		}
 		// 检查简介数据正确性
-		if (brandSubmit.getBrief() != null) {
-			if (brandSubmit.getBrief().length() > 4000) {
-				throw new IllegalOperatorException("产品简介请不要超过4000字");
-			}
+		if ((brandSubmit.getBrief() != null) && (brandSubmit.getBrief().length() > 4000)) {
+			throw new IllegalOperatorException("产品简介请不要超过4000字");
 		}
-		if (brandSubmit.getAchievement() != null) {
-			if (brandSubmit.getAchievement().length() > 4000) {
-				throw new IllegalOperatorException("主要成就请不要超过4000字");
-			}
+		if ((brandSubmit.getAchievement() != null) && (brandSubmit.getAchievement().length() > 4000)) {
+			throw new IllegalOperatorException("主要成就请不要超过4000字");
+		}
+
+		if (brandSubmit.getNameEn() == null) {
+			throw new IllegalOperatorException("品牌英文名不可为空");
+		}
+
+		if (brandSubmit.getNameCn() == null) {// 若中文品牌名为空将英文品牌名赋予中文品牌名
+			brandSubmit.setNameCn(brandSubmit.getNameEn());
 		}
 		// 检查新增还是更新
 		if (brandSubmit.getUuid() == null) {

+ 35 - 2
src/main/java/com/uas/platform/b2c/prod/product/common/api/CommonCountController.java

@@ -3,6 +3,9 @@ package com.uas.platform.b2c.prod.product.common.api;
 import com.uas.platform.b2c.prod.product.common.model.CommonCount;
 import com.uas.platform.b2c.prod.product.common.service.CommonCountService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.repository.query.Param;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
@@ -26,7 +29,37 @@ public class CommonCountController {
      * @return
      */
     @RequestMapping(method = RequestMethod.GET, params = "_status=actived")
-    public List<CommonCount> findActived() {
-        return commonCountService.findByStatus((short) 1, "b2c_index");
+    public List<CommonCount> findActived(@Param("userFor") String usedFor) {
+        usedFor = StringUtils.isEmpty(usedFor) ? "b2c_index" : usedFor;
+        return commonCountService.findByStatus((short) 1, usedFor);
     }
+
+    /**
+     * 根据ID获取计数器
+     * @author suntg
+     * @date 2017年11月7日17:03:28
+     * @return
+     */
+    @RequestMapping(value ="/{id}", method = RequestMethod.GET)
+    public CommonCount findById(@PathVariable("id") Long id) {
+        CommonCount commonCount = commonCountService.findById(id);
+        if(commonCount == null)
+            throw new IllegalArgumentException("参数ID错误,数据不存在");
+        return commonCount;
+    }
+
+    /**
+     * 根据ID获取计数器的结果
+     * @author suntg
+     * @date 2017年11月7日17:03:34
+     * @return
+     */
+    @RequestMapping(value ="/{id}/count", method = RequestMethod.GET)
+    public Long findCountById(@PathVariable("id") Long id) {
+        CommonCount commonCount = commonCountService.findById(id);
+        if(commonCount == null)
+            throw new IllegalArgumentException("参数ID错误,数据不存在");
+        return commonCount.getCount();
+    }
+
 }

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

@@ -15,4 +15,11 @@ public interface CommonCountService {
      * @return
      */
     List<CommonCount> findByStatus(Short status, String usedFor);
+
+    /**
+     * 根据ID获取计数器内容
+     * @param id
+     * @return
+     */
+    CommonCount findById(Long id);
 }

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

@@ -25,4 +25,9 @@ public class CommonCountServiceImpl implements CommonCountService{
         }
         return commonCounts;
     }
+
+    @Override
+    public CommonCount findById(Long id) {
+        return commonCountDao.findOne(id);
+    }
 }

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

@@ -247,8 +247,8 @@ public class ComponentController {
 	 * 搜索关键字的型号,插入库存
 	 */
 	@RequestMapping(value = "/search/compGoods", method = RequestMethod.GET)
-	public ModelMap getCompGoodsBySearch(PageParams params, String keyword) {
-		return componentService.getCompGoodsBySearch(params, keyword);
+	public ModelMap getCompGoodsBySearch(PageParams params, String keyword, HttpServletRequest request) {
+		return componentService.getCompGoodsBySearch(params, keyword, request);
 	}
 
 	/**

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

@@ -0,0 +1,62 @@
+package com.uas.platform.b2c.prod.product.component.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.core.utils.FastjsonUtils;
+import com.uas.platform.b2c.prod.product.component.service.ComponentCrawlService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用于操作爬虫表
+ *
+ * @version 2017/11/17 16:06 wangyc
+ */
+@RestController("api.ComponentCrawlController")
+@RequestMapping("/api/product/componentCrawl")
+public class ComponentCrawlController {
+
+    @Autowired
+    private ComponentCrawlService componentCrawlService;
+
+    /**
+     * 通过taskid获取下载图片路径
+     * @param taskId
+     * @return
+     */
+    @RequestMapping(value = "/download/img/{taskId}", method = RequestMethod.GET)
+    public List<String> downloadImg(@PathVariable("taskId") String taskId) {
+        return componentCrawlService.downloadImg(taskId);
+    }
+
+    /**
+     * 通过taskid获取下载规格书路径
+     * @param taskId
+     * @return
+     */
+    @RequestMapping(value = "/download/attach/{taskId}", method = RequestMethod.GET)
+    public List<String> downloadAttach(@PathVariable("taskId") String taskId) {
+        return componentCrawlService.downloadAttach(taskId);
+    }
+
+    /**
+     * 上传图片
+     * @param json
+     */
+    @RequestMapping(value = "/upload/img", method = RequestMethod.POST)
+    public String uploadImg(@RequestBody String json) {
+        JSONObject jsonObject = FastjsonUtils.parseObject(json);
+        return componentCrawlService.uploadImg(jsonObject);
+    }
+
+    /**
+     * 上传pdf
+     * @param json
+     */
+    @RequestMapping(value = "/upload/attach", method = RequestMethod.POST)
+    public String uploadAttach(@RequestBody String json) {
+        JSONObject jsonObject = FastjsonUtils.parseObject(json);
+        return componentCrawlService.uploadAttach(jsonObject);
+    }
+}

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

@@ -29,4 +29,20 @@ public interface ComponentCrawlDao extends JpaSpecificationExecutor<ComponentCra
 	 * @return 爬虫库器件
 	 */
 	public List<ComponentCrawl> findByTask(Long task);
+
+	/**
+	 * 通过任务id获取去重后的爬取图片路径
+	 * @param task
+	 * @return
+	 */
+	@Query("select distinct c.img from ComponentCrawl c where c.task = :taskId and c.img is not null and c.b2cImg is null")
+	public List<String> findImgByTask(@Param("taskId") Long task);
+
+	/**
+	 * 通过任务id获取去重后的爬取图片路径
+	 * @param task
+	 * @return
+	 */
+	@Query("select distinct c.attach from ComponentCrawl c where c.task = :taskId and c.attach is not null and c.b2cAttach is null")
+	public List<String> findAttachByTask(@Param("taskId") Long task);
 }

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

@@ -109,6 +109,16 @@ public class Component implements Serializable {
 	@Column(name = "cmp_description", length = 4000)
 	private String description;
 
+	/**
+	 * 器件所处生命周期
+	 * ACTIVE 815 正常
+	 * DISCONTINUED 816 即将停产
+	 * OBSOLETE 817 停产
+	 * PRELIMINARY 818 新品
+	 */
+	@Column(name = "cmp_lifecycle")
+	private Integer lifecycle;
+
 	/**
 	 * 所属公司
 	 */
@@ -291,6 +301,18 @@ public class Component implements Serializable {
 	@Column(name = "cmp_inastockqty")
 	private Double inactionStockQty;
 
+	/**
+	 * 器件的点击次数
+	 */
+	@Column(name = "cmp_visit_count")
+	private Long visitCount;
+
+	/**
+	 * 器件的搜索次数
+	 */
+	@Column(name = "cmp_search_count")
+	private Long searchCount;
+
 	/**
 	 * 废料数量
 	 */
@@ -305,6 +327,22 @@ public class Component implements Serializable {
 		this.id = id;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
+	public Long getSearchCount() {
+		return searchCount;
+	}
+
+	public void setSearchCount(Long searchCount) {
+		this.searchCount = searchCount;
+	}
+
 	public String getUuid() {
 		return uuid;
 	}

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

@@ -59,6 +59,12 @@ public class ComponentCrawl implements Serializable {
 	@Column(name = "cc_uuid")
 	private String uuid;
 
+	/**
+	 * 器件描述
+	 */
+	@Column(name = "cc_description", length = 4000)
+	private String description;
+
 	/**
 	 * 正式入库后版本号
 	 */
@@ -119,6 +125,16 @@ public class ComponentCrawl implements Serializable {
 	@Column(name = "cc_task")
 	private Long task;
 
+	/**
+	 * 器件所处生命周期
+	 * ACTIVE 815 正常
+	 * DISCONTINUED 816 即将停产
+	 * OBSOLETE 817 停产
+	 * PRELIMINARY 818 新品
+	 */
+	@Column(name = "cc_lifecycle")
+	private Integer lifecycle;
+
 	/**
 	 * 属性
 	 */
@@ -182,6 +198,14 @@ public class ComponentCrawl implements Serializable {
 		this.uuid = uuid;
 	}
 
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
 	public Short getVersion() {
 		return version;
 	}
@@ -262,6 +286,14 @@ public class ComponentCrawl implements Serializable {
 		this.task = task;
 	}
 
+	public Integer getLifecycle() {
+		return lifecycle;
+	}
+
+	public void setLifecycle(Integer lifecycle) {
+		this.lifecycle = lifecycle;
+	}
+
 	public Set<PropertyValueCrawl> getProperties() {
 		return properties;
 	}

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

@@ -0,0 +1,40 @@
+package com.uas.platform.b2c.prod.product.component.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+
+/**
+ * Created by wangyc on 2017/11/17.
+ *
+ * @version 2017/11/17 16:08 wangyc
+ */
+public interface ComponentCrawlService {
+
+    /**
+     * 通过任务号下载爬虫表图片地址
+     * @param taskId
+     * @return
+     */
+    List<String> downloadImg(String taskId);
+
+    /**
+     * 通过任务号下载爬虫表规格书地址
+     * @param taskId
+     * @return
+     */
+    List<String> downloadAttach(String taskId);
+
+    /**
+     * 上传更新图片
+     * @param jsonObject
+     */
+    String uploadImg(JSONObject jsonObject);
+
+    /**
+     * 上传更新pdf
+     *
+     * @param jsonObject
+     */
+    String uploadAttach(JSONObject jsonObject);
+}

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

@@ -10,6 +10,7 @@ import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 import org.springframework.ui.ModelMap;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 
@@ -186,7 +187,7 @@ public interface ComponentService {
 	 * @param keyword 关键词
 	 * @return 器件信息
 	 */
-	public ModelMap getCompGoodsBySearch(PageParams params, String keyword);
+	public ModelMap getCompGoodsBySearch(PageParams params, String keyword, HttpServletRequest request);
 
 	/**
 	 * 批量修改器件类目

+ 77 - 0
src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentCrawlServiceImpl.java

@@ -0,0 +1,77 @@
+package com.uas.platform.b2c.prod.product.component.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.uas.platform.b2c.prod.product.component.dao.ComponentCrawlDao;
+import com.uas.platform.b2c.prod.product.component.dao.ComponentCrawlTaskDao;
+import com.uas.platform.b2c.prod.product.component.modal.ComponentCrawlTask;
+import com.uas.platform.b2c.prod.product.component.service.ComponentCrawlService;
+import com.uas.platform.core.exception.IllegalOperatorException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by wangyc on 2017/11/17.
+ *
+ * @version 2017/11/17 16:10 wangyc
+ */
+@Service
+public class ComponentCrawlServiceImpl implements ComponentCrawlService {
+
+    @Autowired
+    private ComponentCrawlTaskDao componentCrawlTaskDao;
+
+    @Autowired
+    private ComponentCrawlDao componentCrawlDao;
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Override
+    public List<String> downloadImg(String taskId) {
+        ComponentCrawlTask task = componentCrawlTaskDao.findByTaskId(taskId);
+        if (task == null) {
+            throw new IllegalOperatorException("任务不存在");
+        }
+        List<String> imgs = componentCrawlDao.findImgByTask(task.getId());
+        return imgs;
+    }
+
+    @Override
+    public List<String> downloadAttach(String taskId) {
+        ComponentCrawlTask task = componentCrawlTaskDao.findByTaskId(taskId);
+        if (task == null) {
+            throw new IllegalOperatorException("任务不存在");
+        }
+        List<String> attachs = componentCrawlDao.findAttachByTask(task.getId());
+        return attachs;
+    }
+
+    @Override
+    public String uploadImg(JSONObject jsonObject) {
+        String taskId = jsonObject.getString("taskId");
+        String oldUrl = jsonObject.getString("oldUrl");
+        String newUrl = jsonObject.getString("newUrl");
+        ComponentCrawlTask task = componentCrawlTaskDao.findByTaskId(taskId);
+        if (task == null) {
+            throw new IllegalOperatorException("任务不存在");
+        }
+        jdbcTemplate.update("update product$component_crawl set cc_b2c_img = \'" + newUrl + "\' where cc_task = " + task.getId() + " and cc_img = \'" + oldUrl + "' and cc_b2c_img is null" );
+        return "success";
+    }
+
+    @Override
+    public String uploadAttach(JSONObject jsonObject) {
+        String taskId = jsonObject.getString("taskId");
+        String oldUrl = jsonObject.getString("oldUrl");
+        String newUrl = jsonObject.getString("newUrl");
+        ComponentCrawlTask task = componentCrawlTaskDao.findByTaskId(taskId);
+        if (task == null) {
+            throw new IllegalOperatorException("任务不存在");
+        }
+        jdbcTemplate.update("update product$component_crawl set cc_b2c_attach = \'" + newUrl + "\' where cc_task = " + task.getId() + " and cc_attach = \'" + oldUrl + "' and cc_b2c_attach is null" );
+        return "success";
+    }
+}

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

@@ -48,6 +48,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 
 @Service
@@ -447,14 +448,14 @@ public class ComponentServiceImpl implements ComponentService {
 	}
 
 	@Override
-	public ModelMap getCompGoodsBySearch(com.uas.platform.core.model.PageParams params, String keyword) {
+	public ModelMap getCompGoodsBySearch(com.uas.platform.core.model.PageParams params, String keyword , HttpServletRequest request) {
 		int page = params.getPage();
 		if (page > 100) {
 			page = 100;
 		}
 		params.setPage(page);
 
-		ModelMap map = searchServiceMap.searchComponentGoods(keyword, params);//.searchComponent(keyword, params);
+		ModelMap map = searchServiceMap.searchComponentGoods(keyword, params, request);//.searchComponent(keyword, params);
 		// 能让用户查看的只能是Constant.PAGEMAX * params.getCount(),防止爬虫
 		int total = ((Integer)map.get("total")).intValue();
 		int expose = total;

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

@@ -91,6 +91,18 @@ public class Kind implements Serializable {
 	@Column(name = "ki_cmpsuffix")
 	private Long componentsuffix;
 
+	/**
+	 * 类目的点击次数
+	 */
+	@Column(name = "ki_visit_count")
+	private Long visitCount;
+
+	/**
+	 * 类目的搜索次数
+	 */
+	@Column(name = "ki_search_count")
+	private Long searchCount;
+
 	/**
 	 * 包含的属性
 	 */
@@ -232,6 +244,22 @@ public class Kind implements Serializable {
 		this.componentsuffix = componentsuffix;
 	}
 
+	public Long getVisitCount() {
+		return visitCount;
+	}
+
+	public void setVisitCount(Long visitCount) {
+		this.visitCount = visitCount;
+	}
+
+	public Long getSearchCount() {
+		return searchCount;
+	}
+
+	public void setSearchCount(Long searchCount) {
+		this.searchCount = searchCount;
+	}
+
 	/*
 	 * public KindUas converUas(Kind kind){ KindUas uas = new KindUas();
 	 * uas.setComponentPrefix(kind.getComponentPrefix());

+ 14 - 0
src/main/java/com/uas/platform/b2c/prod/store/controller/StoreInController.java

@@ -157,6 +157,20 @@ public class StoreInController {
 		return	storeService.pageStoreInfoWhenAdminQuery(pageInfo, type, status, keyword);
 	}
 
+	/**
+	 * 分页获取店铺信息,根据店铺名过滤
+	 *
+	 * @param params
+	 * @param keyword
+	 * @param storeType
+	 * @return
+	 */
+	@RequestMapping(value = "/stores/page", method = RequestMethod.GET)
+	public Page<StoreIn> pageAllStore(PageParams params, String keyword, StoreType storeType){
+		PageInfo pageInfo = new PageInfo(params);
+		return storeService.getStorePage(pageInfo, keyword, storeType);
+	}
+
 
 	/**
 	 * 获取店铺的联系信息(电话,邮箱,地址信息)

+ 1 - 1
src/main/java/com/uas/platform/b2c/prod/store/model/StoreIn.java

@@ -158,7 +158,7 @@ public class StoreIn implements Serializable {
 	 * 资质证明信息集合
 	 */
 	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = Qualification.class)
-	@JoinColumn(name = "qu_store_uuid", referencedColumnName = "st_uuid")
+	@JoinColumn(name = "qu_store_id")
 	private Set<Qualification> qualifications = new HashSet<>();
 
 	/**

+ 10 - 0
src/main/java/com/uas/platform/b2c/prod/store/service/StoreInService.java

@@ -147,6 +147,16 @@ public interface StoreInService {
 	 */
 	Page<StoreIn> pageStoreInfoWhenAdminQuery(PageInfo pageInfo, StoreType type, StoreStatus status, String keyword);
 
+	/**
+	 * 分页获取店铺信息,根据店铺名过滤
+	 *
+	 * @param pageInfo
+	 * @param keyword
+	 * @param storeType
+	 * @return
+	 */
+	Page<StoreIn> getStorePage(PageInfo pageInfo, String keyword, StoreType storeType);
+
 	/**
 	 * 当管理员推荐店铺的时候,保存店铺的广告信息
 	 *

+ 19 - 0
src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreInServiceImpl.java

@@ -531,6 +531,25 @@ public class StoreInServiceImpl implements StoreInService {
 		return storeDao.findFiveStoresByType(num, typeList);
 	}
 
+	@Override
+	public Page<StoreIn> getStorePage(final PageInfo pageInfo, String keyword, StoreType storeType) {
+
+		if (StringUtils.hasText(keyword)){
+			pageInfo.expression(PredicateUtils.like("storeName", keyword, false));
+		}
+		if (storeType != null){
+			pageInfo.expression(PredicateUtils.eq("type", storeType, false));
+		}
+
+		return storeDao.findAll(new Specification<StoreIn>() {
+			@Override
+			public Predicate toPredicate(Root<StoreIn> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
+				criteriaQuery.where(pageInfo.getPredicates(root, criteriaQuery, criteriaBuilder));
+				return null;
+			}
+		}, pageInfo);
+	}
+
 	/**
 	 * 获取店铺的联系信息
 	 *

+ 0 - 4
src/main/java/com/uas/platform/b2c/prod/store/task/ViolationsAutoFinish.java

@@ -39,10 +39,6 @@ public class ViolationsAutoFinish {
 	@Scheduled(cron = "0 */1 * * * ?")
 	public void execute() {
 		try {
-			Date startTime = new Date();
-			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-			logger.info(String.format("%s 店铺违规处置自动完成任务开始", dateFormat.format(startTime)));
-
 			violationsService.autoFinishViolationsWhenDisposeTimeIsInvalid();
 		} catch (Exception e) {
 			e.printStackTrace();

+ 22 - 0
src/main/java/com/uas/platform/b2c/trade/order/controller/OrderController.java

@@ -576,6 +576,28 @@ public class OrderController {
 		return orderService.releaseOrder(orderid, reason);
 	}
 
+	/**
+	 * 买家同意卖家发起的取消订单申请
+	 * @param orderid
+	 * @return
+	 */
+	@RequestMapping(value = "simpleinfo/ones/{orderid}/release/audit", method = RequestMethod.PUT)
+	public String aduitReleaseOrder(@PathVariable String orderid) {
+		logger.log("买家订单管理", "同意取消订单申请", "根据订单号: " + orderid + "取消订单,释放库存");
+		return orderService.aduitReleaseOrder(orderid);
+	}
+
+	/**
+	 * 买家不同意卖家发起的取消订单申请
+	 * @param orderid
+	 * @return
+	 */
+	@RequestMapping(value = "simpleinfo/ones/{orderid}/release/unaudit", method = RequestMethod.PUT)
+	public String unaduitReleaseOrder(@PathVariable String orderid) {
+		logger.log("买家订单管理", "不同意取消订单申请");
+		return orderService.unaduitReleaseOrder(orderid);
+	}
+
 	/**
 	 * 失效订单 (因确认是订单批次库存不足)
 	 *

+ 15 - 2
src/main/java/com/uas/platform/b2c/trade/order/controller/PurchaseController.java

@@ -278,10 +278,10 @@ public class PurchaseController {
 	 * @return the purchase
 	 */
 	@RequestMapping(value = "/{id}/ensurePaid", method = RequestMethod.PUT)
-	public Purchase ensurePaid(@PathVariable Long id) {
+	public Purchase ensurePaid(@PathVariable Long id, Long installmentDetailId) {
 		assert logger != null;
 		logger.log("采购单管理", "确认付款,采购单id: " + id);
-		return purchaseService.ensurePaid(id);
+		return purchaseService.ensurePaid(id, installmentDetailId);
 	}
 
 	/**
@@ -600,6 +600,19 @@ public class PurchaseController {
 		return purchaseService.findOrderIdByPuId(purchaseId);
 	}
 
+	/**
+	 * 卖家取消订单 释放库存
+	 *
+	 * @param purchaseId the purchaseId
+	 * @param reason  the reason
+	 * @return the string
+	 */
+	@RequestMapping(value = "simpleinfo/ones/{purchaseId}/release", method = RequestMethod.PUT)
+	public String release(@PathVariable String purchaseId, String reason) {
+		logger.log("卖家订单管理", "取消订单", "根据订单号: " + purchaseId + "取消订单,释放库存");
+		return purchaseService.release(purchaseId, reason);
+	}
+
 //	@RequestMapping(value = "/logistics")
 //	public Logistics findOneLogistics(){
 //		return null;

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

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

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