فهرست منبع

Merge branch 'dev-mysql' into feature/yc-payCenter-1031

hulh 8 سال پیش
والد
کامیت
6688f7c589
100فایلهای تغییر یافته به همراه3357 افزوده شده و 182 حذف شده
  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. 40 6
      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. 9 2
      src/main/java/com/uas/platform/b2c/common/base/service/impl/FileClientImpl.java
  9. 7 5
      src/main/java/com/uas/platform/b2c/common/base/service/impl/RestMailServiceImpl.java
  10. 7 5
      src/main/java/com/uas/platform/b2c/common/base/service/impl/RestSmsServiceImpl.java
  11. 19 0
      src/main/java/com/uas/platform/b2c/common/keyword/Readme.md
  12. 101 0
      src/main/java/com/uas/platform/b2c/common/keyword/controller/KeyWordController.java
  13. 18 0
      src/main/java/com/uas/platform/b2c/common/keyword/dao/KeyWordDao.java
  14. 49 0
      src/main/java/com/uas/platform/b2c/common/keyword/model/KeyWord.java
  15. 42 0
      src/main/java/com/uas/platform/b2c/common/keyword/service/KeyWordService.java
  16. 69 0
      src/main/java/com/uas/platform/b2c/common/keyword/service/impl/KeyWordServiceImpl.java
  17. 16 1
      src/main/java/com/uas/platform/b2c/common/search/controller/SearcherController.java
  18. 19 0
      src/main/java/com/uas/platform/b2c/common/search/dao/SearchHistoryDao.java
  19. 86 0
      src/main/java/com/uas/platform/b2c/common/search/model/SearchHistory.java
  20. 16 5
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/Impl/SearchServiceImpl.java
  21. 1 1
      src/main/java/com/uas/platform/b2c/common/search/rpc/service/SearchService.java
  22. 2 2
      src/main/java/com/uas/platform/b2c/common/search/service/SearcherService.java
  23. 35 5
      src/main/java/com/uas/platform/b2c/common/search/service/impl/SearcherServiceImpl.java
  24. 28 0
      src/main/java/com/uas/platform/b2c/core/config/SysConf.java
  25. 1 1
      src/main/java/com/uas/platform/b2c/core/constant/EncodingRulesConstant.java
  26. 20 0
      src/main/java/com/uas/platform/b2c/core/constant/Status.java
  27. 68 0
      src/main/java/com/uas/platform/b2c/core/filter/KeyWordFilter.java
  28. 23 3
      src/main/java/com/uas/platform/b2c/core/filter/SSOInterceptor.java
  29. 79 0
      src/main/java/com/uas/platform/b2c/core/support/BodyReaderHttpServletRequestWrapper.java
  30. 61 0
      src/main/java/com/uas/platform/b2c/core/support/HttpHelper.java
  31. 99 0
      src/main/java/com/uas/platform/b2c/core/utils/KeyWordFilterUtil.java
  32. 1 1
      src/main/java/com/uas/platform/b2c/fa/payment/controller/YseReturnController.java
  33. 11 5
      src/main/java/com/uas/platform/b2c/fa/payment/service/impl/PaymentServiceImpl.java
  34. 16 1
      src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/GoodsServiceImpl.java
  35. 17 4
      src/main/java/com/uas/platform/b2c/prod/product/brand/api/BrandController.java
  36. 105 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/controller/BrandMapController.java
  37. 11 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandDao.java
  38. 13 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandMapDao.java
  39. 17 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/dao/BrandTempDao.java
  40. 233 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/BrandMap.java
  41. 55 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/BrandTemp.java
  42. 75 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/modal/MapOperator.java
  43. 41 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandMapService.java
  44. 10 1
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/BrandService.java
  45. 184 0
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandMapServiceImpl.java
  46. 34 2
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandServiceImpl.java
  47. 12 8
      src/main/java/com/uas/platform/b2c/prod/product/brand/service/impl/BrandSubmitServiceImpl.java
  48. 35 2
      src/main/java/com/uas/platform/b2c/prod/product/common/api/CommonCountController.java
  49. 7 0
      src/main/java/com/uas/platform/b2c/prod/product/common/service/CommonCountService.java
  50. 5 0
      src/main/java/com/uas/platform/b2c/prod/product/common/service/impl/CommonCountServiceImpl.java
  51. 2 2
      src/main/java/com/uas/platform/b2c/prod/product/component/api/ComponentController.java
  52. 10 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/Component.java
  53. 32 0
      src/main/java/com/uas/platform/b2c/prod/product/component/modal/ComponentCrawl.java
  54. 2 1
      src/main/java/com/uas/platform/b2c/prod/product/component/service/ComponentService.java
  55. 3 2
      src/main/java/com/uas/platform/b2c/prod/product/component/service/impl/ComponentServiceImpl.java
  56. 14 0
      src/main/java/com/uas/platform/b2c/prod/store/controller/StoreInController.java
  57. 1 1
      src/main/java/com/uas/platform/b2c/prod/store/model/StoreIn.java
  58. 10 0
      src/main/java/com/uas/platform/b2c/prod/store/service/StoreInService.java
  59. 19 0
      src/main/java/com/uas/platform/b2c/prod/store/service/impl/StoreInServiceImpl.java
  60. 0 4
      src/main/java/com/uas/platform/b2c/prod/store/task/ViolationsAutoFinish.java
  61. 33 12
      src/main/java/com/uas/platform/b2c/trade/order/task/OrderTask.java
  62. 1 1
      src/main/resources/dev/account.properties
  63. 6 1
      src/main/resources/dev/sys.properties
  64. BIN
      src/main/resources/jxls-tpl/product/brand-map.xls
  65. 2 1
      src/main/resources/log4j.properties
  66. 3 1
      src/main/resources/prod/account.properties
  67. 8 1
      src/main/resources/prod/sys.properties
  68. 2 1
      src/main/resources/test/account.properties
  69. 6 0
      src/main/resources/test/sys.properties
  70. 6 0
      src/main/webapp/WEB-INF/views/normal/adminWithNav.html
  71. 11 1
      src/main/webapp/WEB-INF/web.xml
  72. 7 0
      src/main/webapp/resources/css/common.css
  73. 7 0
      src/main/webapp/resources/css/common/common.css
  74. BIN
      src/main/webapp/resources/img/product/cart/up-map.png
  75. 22 3
      src/main/webapp/resources/js/admin/app.js
  76. 118 0
      src/main/webapp/resources/js/admin/controllers/KeyWordCtrl.js
  77. 44 0
      src/main/webapp/resources/js/admin/controllers/LogUsageCtrl.js
  78. 379 0
      src/main/webapp/resources/js/admin/controllers/product/brandMapCtrl.js
  79. 16 5
      src/main/webapp/resources/js/common/controllers/commonCtrls.js
  80. 18 0
      src/main/webapp/resources/js/common/query/brand.js
  81. 27 0
      src/main/webapp/resources/js/common/query/keyWord.js
  82. 11 0
      src/main/webapp/resources/js/common/query/logUsage.js
  83. 5 0
      src/main/webapp/resources/js/common/query/storeInfo.js
  84. 9 2
      src/main/webapp/resources/js/common/services.js
  85. 1 1
      src/main/webapp/resources/js/usercenter/controllers/forstore/order_pay_ctrl.js
  86. 1 0
      src/main/webapp/resources/js/vendor/controllers/forstore/vendor_logistics_ctrl.js
  87. 59 0
      src/main/webapp/resources/view/admin/keyword.html
  88. 69 0
      src/main/webapp/resources/view/admin/logUsage.html
  89. 19 0
      src/main/webapp/resources/view/admin/modal/keyWord_modal.html
  90. 316 0
      src/main/webapp/resources/view/admin/product/brand_map.html
  91. 33 30
      src/main/webapp/resources/view/common/modal/messageBoard.html
  92. 3 3
      src/main/webapp/resources/view/usercenter/forstore/buyer_invoice.html
  93. 2 2
      src/main/webapp/resources/view/usercenter/forstore/buyer_order.html
  94. 1 1
      src/main/webapp/resources/view/usercenter/forstore/home_center.html
  95. 2 2
      src/main/webapp/resources/view/usercenter/forstore/order_detail.html
  96. 1 1
      src/main/webapp/resources/view/vendor/forstore/vendor_order.html
  97. 39 0
      src/test/java/com/uas/platform/b2c/BaseJunitTest.java
  98. 0 35
      src/test/java/com/uas/platform/b2c/RegistForMall.java
  99. 27 0
      src/test/java/com/uas/platform/b2c/common/account/UsageLogController.java
  100. 54 0
      src/test/java/com/uas/platform/b2c/common/base/FileServiceTest.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

+ 40 - 6
src/main/java/com/uas/platform/b2c/common/account/controller/SecurityController.java

@@ -68,12 +68,12 @@ public class SecurityController {
 		if (StringUtils.isEmpty(returnUrl)) {
 			returnUrl = request.getHeader("Referer");
 		}
-		boolean cross = SSOHelper.isCrossDomain(request);
+		/*boolean cross = SSOHelper.isCrossDomain(request);
 		if (cross) {
 			request.getSession().setAttribute(SSOConfig.SSOReferer, returnUrl);
 			// 跨域情况,需要再次询问账户中心
-			returnUrl = "/logout/proxy";
-		}
+			returnUrl = request.getContextPath() + "/logout/proxy";
+		}*/
 		return new ModelMap("content", returnUrl);
 	}
 
@@ -96,12 +96,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 +169,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 +185,42 @@ 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, String uid, long time , String data) {
+		String callback =request.getParameter("jsoncallback");
+		response.setContentType("text/html;charset=UTF-8");
+		if (uid != null && data != null) {
+ 				SSOToken tk = new SSOToken();
+				tk.setUid(uid);
+				tk.setTime(time);
+				tk.setData(data);
+				SSOHelper.setSSOCookie(request, response, tk, true);
+				User user = getUserByToken(tk);
+				if (user != null) {
+					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 +247,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);
+	}
+}

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

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

+ 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 位编码

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

@@ -377,6 +377,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>}
 	 */

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

@@ -0,0 +1,68 @@
+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.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;
+
+    @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();
+        // POST请求 或 PUT请求,并且不是附件上传请求
+        if(("POST".equals(method) || "PUT".equals(method)) && (StringUtils.isEmpty(contentType) || !contentType.contains("multipart"))){
+            //注入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.getRequestURL().toString()));
+			}
+		} 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;
+    }
+}

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

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

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

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

@@ -69,11 +69,11 @@ public class BrandController {
 	 * 分页获取按字符串获取以此字符为首字母的品牌信息
 	 * @return map(首字母,超简易品牌信息)
 	 */
-	@RequestMapping(value = "/initial/first/{keyword}", method = RequestMethod.GET)
-	public Page<BrandMostSimpleInfo> getInitialSimpleInfoByFirst(@PathVariable String keyword ,PageParams page) {
-		if (StringUtils.isEmpty(keyword))
+	@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(keyword,page);
+		return brandService.getInitialSimpleInfoByFirst(key,page,keyword);
 	}
 
 	/**
@@ -89,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("/product/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> {
+
+}

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

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

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

@@ -60,7 +60,7 @@ public interface BrandService {
 	 * @param keyword 关键词
 	 * @return 品牌简易信息
 	 */
-	public Page<BrandMostSimpleInfo> getInitialSimpleInfoByFirst(String keyword , PageParams params);
+	public Page<Brand> getInitialSimpleInfoByFirst(String key , PageParams params, String keyword);
 
 	/**
 	 * 获取BrandInfo分页数据
@@ -70,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);
+			}
+		}
+	}
+}

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

@@ -22,6 +22,7 @@ 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;
@@ -120,9 +121,9 @@ public class BrandServiceImpl implements BrandService {
 	}
 
 	@Override
-	public Page<BrandMostSimpleInfo> getInitialSimpleInfoByFirst(String keyword , PageParams params) {
+	public Page<Brand> getInitialSimpleInfoByFirst(String key , PageParams params ,String keyword) {
 		Pageable pageable = new PageInfo(params);
-		return brandMostSimpleInfoDao.findInInitalsPage(new String[]{keyword},pageable);
+		return brandDao.findInInitalsPage(new String[]{key},keyword, pageable);
 	}
 
 	// 判断一个字符串是否含有中文
@@ -154,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);
 	}
 
 	/**

+ 10 - 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;
+
 	/**
 	 * 所属公司
 	 */

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

+ 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);
 
 	/**
 	 * 批量修改器件类目

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

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

+ 33 - 12
src/main/java/com/uas/platform/b2c/trade/order/task/OrderTask.java

@@ -1,11 +1,13 @@
 package com.uas.platform.b2c.trade.order.task;
 
+import com.uas.message.mail.service.MailService;
 import com.uas.message.sms.service.SmsService;
 import com.uas.platform.b2c.common.account.dao.EnterpriseDao;
 import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.core.config.SysConf;
+import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.b2c.core.utils.FastjsonUtils;
@@ -18,15 +20,16 @@ import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.logging.BufferedLoggerManager;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.model.Type;
+import org.apache.commons.collections.map.HashedMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 订单的一些自动任务
@@ -51,21 +54,23 @@ public class OrderTask {
 
     private final SmsService smsService;
 
+    private final MailService mailService;
+
     private static final UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
 
 	/**
 	 * Instantiates a new Order task.
-	 *
-	 * @param orderDao                the order dao
+	 *  @param orderDao                the order dao
 	 * @param orderService            the order service
-	 * @param tradeBasicPropertiesDao the trade basic properties dao
-	 * @param userDao                 the user dao
-	 * @param sysConf                 the sys conf
-	 * @param enterpriseDao           the enterprise dao
-	 * @param smsService              the sms service
-	 */
+     * @param tradeBasicPropertiesDao the trade basic properties dao
+     * @param userDao                 the user dao
+     * @param sysConf                 the sys conf
+     * @param enterpriseDao           the enterprise dao
+     * @param smsService              the sms service
+     * @param mailService
+     */
 	@Autowired
-    public OrderTask(OrderDao orderDao, OrderService orderService, TradeBasicPropertiesDao tradeBasicPropertiesDao, UserDao userDao, SysConf sysConf, EnterpriseDao enterpriseDao, SmsService smsService) {
+    public OrderTask(OrderDao orderDao, OrderService orderService, TradeBasicPropertiesDao tradeBasicPropertiesDao, UserDao userDao, SysConf sysConf, EnterpriseDao enterpriseDao, SmsService smsService, MailService mailService) {
         this.orderDao = orderDao;
         this.orderService = orderService;
         this.tradeBasicPropertiesDao = tradeBasicPropertiesDao;
@@ -73,12 +78,12 @@ public class OrderTask {
         this.sysConf = sysConf;
         this.enterpriseDao = enterpriseDao;
         this.smsService = smsService;
+        this.mailService = mailService;
     }
 
 	/**
 	 * 对超过收货时间的订单,自动确认收货
 	 */
-	@Transactional
     public void autoConfirmOrderRevice() {
         try {
             User user = null;
@@ -129,10 +134,26 @@ public class OrderTask {
             }
             if(ids.length() > 1) {
                 ids = ids.substring(1, ids.length() - 1);
-                orderService.ensureOrderAccept(ids);
+                String[] split = ids.split(SplitChar.HYPHEN);
+                for (String id : split) {
+                    try {
+                        orderService.ensureOrderAccept(id);
+                    }catch (Exception e) {
+                        Map<String, Object> map  = new HashedMap();
+                        map.put("title", "自动确认收货");
+                        map.put("error", e.toString());
+                        mailService.send("f7be38ea-8653-4d7c-9a3d-34c3cdd089a0", "yuj@usoftchina.com", map);
+                    }
+
+                }
+
             }
             logger.log("自动收货", "买家自动收货订单:" + ids);
         }catch (Exception e) {
+            Map<String, Object> map  = new HashedMap();
+            map.put("title", "自动确认收货");
+            map.put("error", e.toString());
+            mailService.send("f7be38ea-8653-4d7c-9a3d-34c3cdd089a0", "yuj@usoftchina.com", map);
         } finally {
         }
     }

+ 1 - 1
src/main/resources/dev/account.properties

@@ -14,7 +14,7 @@ sso.register.url=http://113.105.74.135:8001/sso/register
 #cross domain
 sso.ask.url=http://113.105.74.135:8001/sso/login/ask
 sso.askout.url=http://113.105.74.135:8001/sso/logout/ask
-sso.proxy.uri=login/proxy
+
 sso.authcookie.secretkey=Z318866alN6gA0piuO
 sso.client.private_key=MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIquTH9rOygR1iyMzU1CSQDXG+lJpMQgWkRWMwO3lzS+UJ3GRq1yxxD8mPFZCuItMRxP4Mvu3nvxDvsJx8lfRXk4MGswROIBPcdBAnasphN7wS5mDvDe/VBIKv+fg4j4VEnak9VUAQhS1gDtp+ZmQpCc9/gz8vueF1ueIXspAoUhAgMBAAECgYBfMP8PY1KK0Zt6nvd5NauYqQ7elg9EFJUBXU3NGmLu8Eez1NrEygk8braoy57921lffrDmKsOKvc+zn2YEoqGzbHCOuYsTDBXFCGLkj8oPeHyrs02+XuJe9j2ejhq2N04oP/TMxerFeyWnHdRCNXECrthqhwTRmGitnj2/+FLVAQJBAM93HY/5HoFlfRv9zjFy72ft/ZC60jHERXwyumbFs8z/x8sHCY1GWfgGhm1ShE1bDWAPY3W9WCFsx6nOETsHajECQQCrH8Dl7IIIHJ5D0TDisFkePnYELxpmOGlPwPOQ7hyLAdW4aB1fVIpjsWmgGOyPvmhK+b99XeLUbwpxVU7AAB3xAkAJNxJCFd+sAbUH7EMfYSqPJDwSFKpHeZ9Yf+xVqkxtO6NFOl/LPae7Y5bO/k5QHU4/yQ8y6KEkgu9vdG7Bf3fRAkEAiDlX6vDytphpmN0PyHXQC9Z3Rm9k2ZjwpM+aVXZn/HSyeQFQ2JHJNQGHby5IK0nNZloYiSlTJ/9ZVc0uSoQNUQJBAJFix2tD7b0Zq82xpeGt81rhXsofuerq1x9WM5UyYILCKJMHZw5lt58snINVzA7JxV+l60dbIgJjmRYm0yxQIAY=
 sso.client.public_key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKrkx/azsoEdYsjM1NQkkA1xvpSaTEIFpEVjMDt5c0vlCdxkatcscQ/JjxWQriLTEcT+DL7t578Q77CcfJX0V5ODBrMETiAT3HQQJ2rKYTe8EuZg7w3v1QSCr/n4OI+FRJ2pPVVAEIUtYA7afmZkKQnPf4M/L7nhdbniF7KQKFIQIDAQAB

+ 6 - 1
src/main/resources/dev/sys.properties

@@ -14,8 +14,11 @@ adminUU=1000001962
 adminName=\u5218\u840C\u51B0
 enName=\u4F18\u8F6F\u6D4B\u8BD5\u4E8C
 storeid = 33069557578d44e69bd91ad12d28a8d4
+
+# YesPay config
+yes_gateway=https://mertest.ysepay.com/openapi_gateway/gateway.do
 notifyURL=http://218.17.158.219:9090/platform-b2c/api/payment/ysepayNotify
-returnUrl =/api/yesreturn
+returnUrl=/api/yesreturn
 paymentPrice=test
 orderProxyUrl=http://192.168.253.12:23400/order/proxy
 #report url
@@ -34,6 +37,8 @@ recommendPort=20102
 uploadFileUrl = http://10.10.100.200:9999
 # search file
 searchUrl = http://10.10.100.191:8092
+# message ip
+messageServiceIp=http://message.ubtob.com/
 
 # Kafka
 kafka-bootstrap-servers=10.10.100.11:9292,10.10.100.12:9292,10.10.100.13:9292,10.10.100.14:9292,10.10.100.15:9292,10.10.100.16:9292

BIN
src/main/resources/jxls-tpl/product/brand-map.xls


+ 2 - 1
src/main/resources/log4j.properties

@@ -21,4 +21,5 @@ log4j.logger.com.uas = info, stdout, logfile
 #=========================================
 #=   spring framework log configuration  =
 #=========================================
-log4j.logger.org.springframework = error
+log4j.logger.org.springframework = error
+log4j.additivity.com.uas = false

+ 3 - 1
src/main/resources/prod/account.properties

@@ -4,6 +4,7 @@ account.user.save.url=https://account.ubtob.com/api/user
 
 ### sso config
 sso.app=mall
+sso.cookie.domain=usoftmall.com
 # token secretkey
 sso.secretkey=0taQcW073Z7G628g5H
 sso.cookie.secure=false
@@ -14,7 +15,8 @@ sso.register.url=http://account.ubtob.com/sso/register
 #cross domain
 sso.ask.url=https://account.ubtob.com/sso/login/ask
 sso.askout.url=https://account.ubtob.com/sso/logout/ask
-sso.proxy.uri=login/proxy
+sso.return.url=https://www.usoftmall.com
+
 sso.authcookie.secretkey=Z318866alN6gA0piuO
 sso.client.private_key=MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIquTH9rOygR1iyMzU1CSQDXG+lJpMQgWkRWMwO3lzS+UJ3GRq1yxxD8mPFZCuItMRxP4Mvu3nvxDvsJx8lfRXk4MGswROIBPcdBAnasphN7wS5mDvDe/VBIKv+fg4j4VEnak9VUAQhS1gDtp+ZmQpCc9/gz8vueF1ueIXspAoUhAgMBAAECgYBfMP8PY1KK0Zt6nvd5NauYqQ7elg9EFJUBXU3NGmLu8Eez1NrEygk8braoy57921lffrDmKsOKvc+zn2YEoqGzbHCOuYsTDBXFCGLkj8oPeHyrs02+XuJe9j2ejhq2N04oP/TMxerFeyWnHdRCNXECrthqhwTRmGitnj2/+FLVAQJBAM93HY/5HoFlfRv9zjFy72ft/ZC60jHERXwyumbFs8z/x8sHCY1GWfgGhm1ShE1bDWAPY3W9WCFsx6nOETsHajECQQCrH8Dl7IIIHJ5D0TDisFkePnYELxpmOGlPwPOQ7hyLAdW4aB1fVIpjsWmgGOyPvmhK+b99XeLUbwpxVU7AAB3xAkAJNxJCFd+sAbUH7EMfYSqPJDwSFKpHeZ9Yf+xVqkxtO6NFOl/LPae7Y5bO/k5QHU4/yQ8y6KEkgu9vdG7Bf3fRAkEAiDlX6vDytphpmN0PyHXQC9Z3Rm9k2ZjwpM+aVXZn/HSyeQFQ2JHJNQGHby5IK0nNZloYiSlTJ/9ZVc0uSoQNUQJBAJFix2tD7b0Zq82xpeGt81rhXsofuerq1x9WM5UyYILCKJMHZw5lt58snINVzA7JxV+l60dbIgJjmRYm0yxQIAY=
 sso.client.public_key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKrkx/azsoEdYsjM1NQkkA1xvpSaTEIFpEVjMDt5c0vlCdxkatcscQ/JjxWQriLTEcT+DL7t578Q77CcfJX0V5ODBrMETiAT3HQQJ2rKYTe8EuZg7w3v1QSCr/n4OI+FRJ2pPVVAEIUtYA7afmZkKQnPf4M/L7nhdbniF7KQKFIQIDAQAB

+ 8 - 1
src/main/resources/prod/sys.properties

@@ -15,6 +15,9 @@ adminUU=1000002821
 adminName=\u5218\u840C\u51B0
 storeid = 33069557578d44e69bd91ad12d28a8d4
 enName=\u6DF1\u5733\u5E02\u4F18\u8F6F\u5546\u57CE\u79D1\u6280\u6709\u9650\u516C\u53F8
+
+# YesPay config
+yes_gateway=https://openapi.ysepay.com/gateway.do
 notifyURL=http://www.usoftmall.com/api/payment/ysepayNotify
 returnUrl=http://www.usoftmall.com/api/yesreturn
 paymentPrice=prod
@@ -32,8 +35,12 @@ storecmsMicroServiceIp=10.10.0.30
 endpointUri=10.10.100.23
 recommendPort=20100
 # upload file
-uploadFileUrl=http://10.10.0.254:20290
+uploadFileUrl=http://dfs-api.ubtob.com
 # search file
 searchUrl=http://10.10.0.76:8081
+
+# message ip
+messageServiceIp=http://message.ubtob.com/
+
 # Kafka
 kafka-bootstrap-servers=10.10.100.11:9292,10.10.100.12:9292,10.10.100.13:9292,10.10.100.14:9292,10.10.100.15:9292,10.10.100.16:9292

+ 2 - 1
src/main/resources/test/account.properties

@@ -14,7 +14,8 @@ sso.register.url=http://113.105.74.135:8001/sso/register
 #cross domain
 sso.ask.url=http://113.105.74.135:8001/sso/login/ask
 sso.askout.url=http://113.105.74.135:8001/sso/logout/ask
-sso.proxy.uri=login/proxy
+sso.return.url=http://192.168.253.12:23400
+
 sso.authcookie.secretkey=Z318866alN6gA0piuO
 sso.client.private_key=MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIquTH9rOygR1iyMzU1CSQDXG+lJpMQgWkRWMwO3lzS+UJ3GRq1yxxD8mPFZCuItMRxP4Mvu3nvxDvsJx8lfRXk4MGswROIBPcdBAnasphN7wS5mDvDe/VBIKv+fg4j4VEnak9VUAQhS1gDtp+ZmQpCc9/gz8vueF1ueIXspAoUhAgMBAAECgYBfMP8PY1KK0Zt6nvd5NauYqQ7elg9EFJUBXU3NGmLu8Eez1NrEygk8braoy57921lffrDmKsOKvc+zn2YEoqGzbHCOuYsTDBXFCGLkj8oPeHyrs02+XuJe9j2ejhq2N04oP/TMxerFeyWnHdRCNXECrthqhwTRmGitnj2/+FLVAQJBAM93HY/5HoFlfRv9zjFy72ft/ZC60jHERXwyumbFs8z/x8sHCY1GWfgGhm1ShE1bDWAPY3W9WCFsx6nOETsHajECQQCrH8Dl7IIIHJ5D0TDisFkePnYELxpmOGlPwPOQ7hyLAdW4aB1fVIpjsWmgGOyPvmhK+b99XeLUbwpxVU7AAB3xAkAJNxJCFd+sAbUH7EMfYSqPJDwSFKpHeZ9Yf+xVqkxtO6NFOl/LPae7Y5bO/k5QHU4/yQ8y6KEkgu9vdG7Bf3fRAkEAiDlX6vDytphpmN0PyHXQC9Z3Rm9k2ZjwpM+aVXZn/HSyeQFQ2JHJNQGHby5IK0nNZloYiSlTJ/9ZVc0uSoQNUQJBAJFix2tD7b0Zq82xpeGt81rhXsofuerq1x9WM5UyYILCKJMHZw5lt58snINVzA7JxV+l60dbIgJjmRYm0yxQIAY=
 sso.client.public_key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKrkx/azsoEdYsjM1NQkkA1xvpSaTEIFpEVjMDt5c0vlCdxkatcscQ/JjxWQriLTEcT+DL7t578Q77CcfJX0V5ODBrMETiAT3HQQJ2rKYTe8EuZg7w3v1QSCr/n4OI+FRJ2pPVVAEIUtYA7afmZkKQnPf4M/L7nhdbniF7KQKFIQIDAQAB

+ 6 - 0
src/main/resources/test/sys.properties

@@ -14,6 +14,9 @@ adminUU=1000001962
 storeid = 33069557578d44e69bd91ad12d28a8d4
 adminName=\u5218\u840C\u51B0
 enName=\u4F18\u8F6F\u6D4B\u8BD5\u4E8C
+
+# YesPay config
+yes_gateway=https://mertest.ysepay.com/openapi_gateway/gateway.do
 notifyURL=http://218.17.158.219:9090/platform-b2c/api/payment/ysepayNotify
 returnUrl=/api/yesreturn
 paymentPrice=test
@@ -35,5 +38,8 @@ uploadFileUrl = http://10.10.100.200:9999
 # search file
 searchUrl = http://10.10.100.191:8092
 
+# message ip
+messageServiceIp=http://message.ubtob.com/
+
 # Kafka
 kafka-bootstrap-servers=10.10.100.11:9292,10.10.100.12:9292,10.10.100.13:9292,10.10.100.14:9292,10.10.100.15:9292,10.10.100.16:9292

+ 6 - 0
src/main/webapp/WEB-INF/views/normal/adminWithNav.html

@@ -148,6 +148,8 @@
 			<li class="nav-node"><a href="#audit/bankinfo"><i class="fa fa-bank"></i><span> 银行账户信息</span></a></li>
 
 			<li class="nav-header">维护</li>
+			<!--<li class="nav-node"><a href="#/brand/map"><i-->
+					<!--class="fa fa-flag"></i><span> 品牌映射维护</span></a></li>-->
 			<li class="nav-node"><a href="#/store/company"><i
 					class="fa fa-flag"></i><span> 寄售管理</span></a></li>
 			<li class="nav-node"><a href="#/store/list"><i
@@ -164,6 +166,10 @@
 					class="fa fa-flag"></i><span> 批量修改器件类目</span></a></li>
 			<li class="nav-node"><a href="#/kindAdvice"><i
 					class="fa fa-flag"></i><span> 用户类目维护建议</span></a></li>
+			<li class="nav-node"><a href="#/keyWord"><i
+					class="fa fa-flag"></i><span> 非法关键词维护</span></a></li>
+			<li class="nav-node"><a href="#/logUsage"><i
+					class="fa fa-flag"></i><span>用户操作日志</span></a></li>
 
 			<li class="nav-header">禁用信息</li>
 			<li class="nav-node"><a href="#/disable/brand"><i

+ 11 - 1
src/main/webapp/WEB-INF/web.xml

@@ -113,7 +113,17 @@
 		<filter-name>deviceResolverRequestFilter</filter-name>
 		<url-pattern>/*</url-pattern>
 	</filter-mapping>
-	
+
+	<filter>
+		<filter-name>keyWordFilter</filter-name>
+		<filter-class>com.uas.platform.b2c.core.filter.KeyWordFilter</filter-class>
+	</filter>
+
+	<filter-mapping>
+		<filter-name>keyWordFilter</filter-name>
+		<url-pattern>/*</url-pattern>
+	</filter-mapping>
+
 	<error-page>  
         <error-code>404</error-code>  
         <location>/WEB-INF/views/normal/default/404.html</location>  

+ 7 - 0
src/main/webapp/resources/css/common.css

@@ -935,4 +935,11 @@ input:required:invalid, input:focus:invalid, textarea:required:invalid, textarea
 .edit-icon button.up:hover{
 	background: #5078cb;
 	color: #fff;
+}
+
+/* 去除数字输入框的上下箭头 */
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+	-webkit-appearance: none !important;
+	margin: 0;
 }

+ 7 - 0
src/main/webapp/resources/css/common/common.css

@@ -99,4 +99,11 @@ img {
 }
 .ng-table-pagination .page-a:hover{
     background: #5078cb !important;
+}
+
+/* 去除数字输入框的上下箭头 */
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+    -webkit-appearance: none !important;
+    margin: 0;
 }

BIN
src/main/webapp/resources/img/product/cart/up-map.png


+ 22 - 3
src/main/webapp/resources/js/admin/app.js

@@ -1,4 +1,4 @@
- define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ui-form', 'ngLocal', 'ngTable', 'ngSanitize', 'ngDraggable', 'common/services', 'common/directives', 'common/query/brand', 'common/query/address', 'common/query/return' , 'common/query/change' ,'common/query/component', 'common/query/order', 'common/query/purchase', 'common/query/invoice', 'common/query/property', 'common/query/kind', 'common/query/property', 'common/query/receipt', 'common/query/logistics' ,'angular-toaster', 'ui-jquery', 'jquery-uploadify','common/query/dateParse' , 'common/query/bankTransfer' ,'common/query/bankInfo', 'common/query/urlencryption', 'common/query/bill', 'common/query/makerDemand', 'common/query/goods', 'common/query/validtime', 'file-upload','file-upload-shim', 'common/query/slideImage', 'common/query/kindAdvice', 'common/query/responseLogistics', 'common/query/search','common/directives/dynamicInput', 'common/query/auditorMail', 'common/query/tradeBasicProperties', 'common/query/exchangeRate', 'common/query/tradeDeliveryDelayTime', 'common/query/payment', 'common/query/kindContrast', 'common/query/crawlTask', 'common/query/afterSale', 'common/query/refund', 'common/query/messageBoard', 'common/query/logisticsPort', 'common/query/storeInfo', 'common/query/cms', 'common/query/help', 'common/query/commonCount', 'common/module/store_admin_violations_module', 'common/query/internalMessage'], function(angularAMD) {
+ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ui-form', 'ngLocal', 'ngTable', 'ngSanitize', 'ngDraggable', 'common/services', 'common/directives', 'common/query/brand', 'common/query/address', 'common/query/return' , 'common/query/change' ,'common/query/component', 'common/query/order', 'common/query/purchase', 'common/query/invoice', 'common/query/property', 'common/query/kind', 'common/query/property', 'common/query/receipt', 'common/query/logistics' ,'angular-toaster', 'ui-jquery', 'jquery-uploadify','common/query/dateParse' , 'common/query/bankTransfer' ,'common/query/bankInfo', 'common/query/urlencryption', 'common/query/bill', 'common/query/makerDemand', 'common/query/goods', 'common/query/validtime', 'file-upload','file-upload-shim', 'common/query/slideImage', 'common/query/kindAdvice', 'common/query/responseLogistics', 'common/query/search','common/directives/dynamicInput', 'common/query/auditorMail', 'common/query/tradeBasicProperties', 'common/query/exchangeRate', 'common/query/tradeDeliveryDelayTime', 'common/query/payment', 'common/query/kindContrast', 'common/query/crawlTask', 'common/query/afterSale', 'common/query/refund', 'common/query/messageBoard', 'common/query/logisticsPort', 'common/query/storeInfo', 'common/query/cms', 'common/query/help', 'common/query/commonCount', 'common/module/store_admin_violations_module', 'common/query/internalMessage','common/query/keyWord','common/query/logUsage'], function(angularAMD) {
 	'use strict';
 
 	 /**
@@ -8,7 +8,7 @@
 		 return this.length > 0 ? this[this.length - 1] : null;
 	 };
 
-	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ui.form', 'ng.local', 'ngTable', 'ngSanitize', 'ngDraggable', 'common.services', 'common.directives', 'brandServices', 'addressServices', 'returnServices', 'changeServices', 'componentServices', 'orderServices', 'purchaseServices', 'invoiceServices', 'propertyServices', 'receiptServices', 'logisticsServices', 'common.query.kind', 'toaster','ui.jquery' ,'dateparseServices', 'bankInfo' , 'bankTransfer', 'urlencryptionServices', 'billServices', 'makerDemand', 'goodsServices', 'validtimeServices', 'angularFileUpload', 'slideImageService', 'common.query.kindAdvice', 'responseLogisticsService', 'searchService', 'ngDynamicInput', 'ReviewerEmailInfoService', 'tradeBasicPropertiesServices', 'exchangeRateModule', 'tradeDeliveryDelayTimeModule', 'PaymentService', 'kindContrastServices', 'crawlTaskServices', 'afterSaleService', 'refundModule', 'messageBoardServices', 'logisticsPortService', 'storeInfoServices', 'cmsService', 'helpServices', 'commonCountServices', 'tool.directives', 'StoreAdminViolationsModule', 'internalMessageServices']);
+	var app = angular.module('myApp', [ 'ui.router', 'ui.bootstrap', 'ui.form', 'ng.local', 'ngTable', 'ngSanitize', 'ngDraggable', 'common.services', 'common.directives', 'brandServices', 'addressServices', 'returnServices', 'changeServices', 'componentServices', 'orderServices', 'purchaseServices', 'invoiceServices', 'propertyServices', 'receiptServices', 'logisticsServices', 'common.query.kind', 'toaster','ui.jquery' ,'dateparseServices', 'bankInfo' , 'bankTransfer', 'urlencryptionServices', 'billServices', 'makerDemand', 'goodsServices', 'validtimeServices', 'angularFileUpload', 'slideImageService', 'common.query.kindAdvice', 'responseLogisticsService', 'searchService', 'ngDynamicInput', 'ReviewerEmailInfoService', 'tradeBasicPropertiesServices', 'exchangeRateModule', 'tradeDeliveryDelayTimeModule', 'PaymentService', 'kindContrastServices', 'crawlTaskServices', 'afterSaleService', 'refundModule', 'messageBoardServices', 'logisticsPortService', 'storeInfoServices', 'cmsService', 'helpServices', 'commonCountServices', 'tool.directives', 'StoreAdminViolationsModule', 'internalMessageServices','keyWordServices','logUsageServices']);
 	app.init = function() {
 		angularAMD.bootstrap(app);
 	};
@@ -262,6 +262,12 @@
 			templateUrl : 'static/view/admin/brand_maintenance.html',
 			controller : 'BrandMaintenanceCtrl',
 			controllerUrl : 'app/controllers/BrandMaintenanceCtrl'
+		})).state('brand_map', angularAMD.route({
+			// 品牌映射维护
+			url: '/brand/map',
+			templateUrl : 'static/view/admin/product/brand_map.html',
+			controller : 'BrandMapCtrl',
+			controllerUrl : 'app/controllers/product/brandMapCtrl'
 		})).state('store_company_list', angularAMD.route({
 			// 寄售管理
 			url: '/store/company',
@@ -584,7 +590,20 @@
 			controller: 'KindAdviceCtrl',
 			controllerUrl: 'app/controllers/product/KindAdviceCtrl',
 			title: '轮播图片管理'
-		})).state('slideImage', angularAMD.route({
+		})).state('logUsage', angularAMD.route({
+      //用户操作日志
+      url: '/logUsage',
+      templateUrl: 'static/view/admin/logUsage.html',
+      controller: 'LogUsageCtrl',
+      controllerUrl: 'app/controllers/LogUsageCtrl',
+      title: '用户操作日志'
+    })).state('keyWord', angularAMD.route({
+      url: '/keyWord',
+      templateUrl: 'static/view/admin/keyword.html',
+      controller: 'KeyWordCtrl',
+      controllerUrl: 'app/controllers/KeyWordCtrl',
+      title: '非法关键词维护'
+    })).state('slideImage', angularAMD.route({
 			// 首页展示(轮播图片管理)
 			url: '/operation/slideImage',
 			templateUrl: 'static/view/admin/operation/slideImage.html',

+ 118 - 0
src/main/webapp/resources/js/admin/controllers/KeyWordCtrl.js

@@ -0,0 +1,118 @@
+define(['app/app'], function (app) {
+  'use strict';
+  app.register.controller('KeyWordCtrl', ['$scope', 'ngTableParams', 'KeyWord', 'toaster', 'BaseService','$modal', function ($scope, ngTableParams, KeyWord, toaster, BaseService,$modal) {
+    $scope.keyword = '';
+    //分页获取关键词
+    $scope.keyWordTableParams = new ngTableParams({
+      page : 1,
+      count : 10
+    }, {
+      total : 0,
+      getData : function ($defer, params) {
+        $scope.paginationParams = params;
+        const param = BaseService.parseParams(params.url());
+        //param.status = $scope.status;
+        param.keyword = $scope.keyword;
+        KeyWord.getKeyWordPageInfo(param, function (data) {
+          params.total(data.totalElements);
+          $defer.resolve(data.content);
+        }, function (response) {
+          toaster.pop('error', '获取关键词失败');
+        });
+      }
+    });
+    //关键词搜索
+    $scope.onSearch = function(){
+      $scope.keyWordTableParams.reload();
+    }
+
+    //添加关键词
+    $scope.addKeyWord = function(){
+      openKeyWordModal(null) ;
+    }
+    //编辑关键词
+    $scope.editKeyWord = function(id){
+      openKeyWordModal(id) ;
+    }
+    //批量添加关键词
+    $scope.addKeyWords = function (){
+      openKeyWordModal(-1) ;
+    }
+    //删除关键词
+    $scope.deleteKeyWord = function(id){
+      KeyWord.deleteKeyWord({id : id}, function(data) {
+        toaster.pop('success', '提示', '关键词删除成功');
+        location.reload();
+      }, function(res) {
+        toaster.pop('error', '提示', '获取密保问题失败,请刷新页面');
+      });
+    }
+
+    //关键词模态框
+    var openKeyWordModal = function(id) {
+      var modalInstance = $modal.open({
+        templateUrl : 'static/view/admin/modal/keyWord_modal.html',  //指向上面创建的视图
+        controller : 'KeyWordModalCtrl',// 初始化模态范围
+        size : 'sm', // 大小配置
+        resolve: {
+          id: function() {
+            return id;
+          }
+        }
+      });
+      modalInstance.opened.then(function(){// 模态窗口打开之后执行的函数
+
+      });
+      modalInstance.result.then(function(updatedProperty){
+        $scope.propertiesTableParams.reload();
+      }, function(res){
+      });
+    }
+  }]);
+
+  app.register.controller('KeyWordModalCtrl', ['$scope','id', '$modalInstance','ngTableParams', 'KeyWord', 'toaster', 'BaseService', function ($scope, id,$modalInstance,ngTableParams, KeyWord, toaster, BaseService) {
+    $scope.addKeyWordModal = true;
+    $scope.updateKeyWordModal = false;
+    $scope.addKeyWordsModal =false;
+    if (id && id!=-1) {
+      KeyWord.getOneKeyWord({id : id}, function(data) {
+        $scope.keyWord = data;
+        $scope.addKeyWordModal = false;
+        $scope.addKeyWordsModal =false;
+        $scope.updateKeyWordModal = true;
+      }, function(res) {
+        toaster.pop('error', '提示', '获取密保问题失败,请刷新页面');
+      });
+    }
+    if(id==-1){
+      $scope.addKeyWordModal = false;
+      $scope.updateKeyWordModal = false;
+      $scope.addKeyWordsModal =true;
+    }
+    // 确认
+    $scope.confirm = function() {
+      if($scope.keywords!=null){
+        var param = {keywords:$scope.keywords};
+        KeyWord.batchAddKeyWord(param,function(data){
+          toaster.pop('success', '提示', '关键词保存成功');
+          $modalInstance.close();
+          location.reload();
+        }, function(res) {
+          toaster.pop('error', '提示', res.data);
+        });
+      }else{
+        KeyWord.saveKeyWord({}, $scope.keyWord, function(data) {
+          toaster.pop('success', '提示', '关键词保存成功');
+          $modalInstance.close();
+          location.reload();
+        }, function(res) {
+          toaster.pop('error', '提示', res.data);
+        });
+      }
+    };
+
+    $scope.cancel = function() {
+      $modalInstance.dismiss();
+    }
+  }]);
+});

+ 44 - 0
src/main/webapp/resources/js/admin/controllers/LogUsageCtrl.js

@@ -0,0 +1,44 @@
+define(['app/app'], function (app) {
+  'use strict';
+  app.register.controller('LogUsageCtrl', ['$scope', 'ngTableParams', 'logUsage', 'toaster', 'BaseService','$modal', function ($scope, ngTableParams, logUsage, toaster, BaseService,$modal) {
+    //table设置
+    $scope.logUsageTableParams = new ngTableParams({
+      page : 1,
+      count : 20
+    }, {
+      total : 0,
+      getData : function ($defer, params) {
+        $scope.paginationParams = params;
+        const param = BaseService.parseParams(params.url());
+        //param.status = $scope.status;
+        if($scope.search !=null){
+          if($scope.search == 1){
+            param.userUu = $scope.searchContent;
+          }
+          if($scope.search == 2){
+            param.userName = $scope.searchContent;
+          }
+        }
+        logUsage.getAllByPage(param, function (data) {
+          params.total(data.totalElements);
+          $defer.resolve(data.content);
+        }, function (response) {
+          toaster.pop('error', '获取用户操作日志失败');
+        });
+      }
+    });
+
+    //搜索
+    $scope.onSearch = function(){
+      if(!$scope.search){
+        toaster.pop('error', '请选择搜索条件');
+        return;
+      }
+      if($scope.searchContent==null){
+        toaster.pop('error', '请输入搜索内容');
+        return;
+      }
+      $scope.logUsageTableParams.reload();
+    }
+  }]);
+});

+ 379 - 0
src/main/webapp/resources/js/admin/controllers/product/brandMapCtrl.js

@@ -0,0 +1,379 @@
+define(['app/app'], function(app) {
+	'use strict';
+	app.register.controller('BrandMapCtrl', ['$scope', 'ngTableParams', 'BaseService', 'BrandMap', 'toaster', 'BrandActive', 'StoreInfo', 'Loading', function($scope, ngTableParams, BaseService, BrandMap, toaster, BrandActive, StoreInfo, Loading) {
+		$scope.$$map = {};
+		$scope.keyword = '';
+		$scope.storeType = 'ALL';
+		$scope.typeCn = '全部';
+		$scope.brandMap = {};
+
+		$scope.startDate = null;
+		$scope.endDate = null;
+
+		$scope.onSearch = function () {
+			reloadData();
+		};
+
+		$scope.showType = function () {
+			$scope.typeFrame = !$scope.typeFrame;
+		};
+
+		var reloadData = function () {
+			$scope.brandMapTableParams.page(1);
+			$scope.brandMapTableParams.reload();
+		};
+
+		$scope.exportExcel = function () {
+			if ($scope.$$map.totalElements == 0) {
+				toaster.pop('info', '当前品牌映射列表为空,无法下载');
+				return ;
+			}
+			exportByAjax();
+		};
+
+		var exportByAjax = function () {
+			var url = 'product/brandMap/export';
+			var strArray = [];
+			if ($scope.keyword && $scope.keyword.length > 0){
+				var wordStr = "keyword=" + $scope.keyword;
+				strArray.push(wordStr);
+			}
+			if ($scope.storeType && $scope.storeType != 'ALL'){
+				var typeStr = "storeType=" + $scope.storeType;
+				strArray.push(typeStr);
+			}
+			if ($scope.startDate){
+				var fromDate = "fromDate=" + $scope.startDate.getTime();
+				strArray.push(fromDate);
+			}
+			if ($scope.endDate){
+				var toDate = "toDate=" + $scope.endDate.getTime();
+				strArray.push(toDate);
+			}
+			if (strArray.length != 0){
+				var str = strArray.join("&");
+				url = url + "?" + str;
+			}
+			var form = $("<form>");   //定义一个form表单
+			form.attr('style', 'display:none');   //在form表单中添加查询参数
+			form.attr('target', '');
+			form.attr('method', 'POST');
+			form.attr('action', url);
+			console.log(url);
+			$('body').append(form);  //将表单放置在web中
+			form.submit();
+
+			$scope.$$map.clockID = setInterval(function() {
+				getDownLoadStatus();
+			}, 500);
+		};
+
+		var getDownLoadStatus = function () {
+			Loading.show();
+			$.ajax({
+				url : 'product/brandMap/export',
+				data : {isAjax : true},
+				method : 'POST',
+				dataType : 'json',
+				success : function (data) {
+					if(!data.loading){
+						$scope.$apply(function () {
+							toaster.pop('info', '数据处理完毕,正在下载文件,请稍等。');
+							Loading.hide();
+						});
+						if($scope.$$map.clockID) {
+							clearInterval($scope.$$map.clockID);
+						}
+					}
+				},
+				error : function () {
+					Loading.hide();
+					if($scope.$$map.clockID) {
+						clearInterval($scope.$$map.clockID);
+					}
+				}
+			});
+		};
+
+		$scope.condition = {
+			startDateOpen: false,
+			endDateOpen: false
+		};
+
+		// 打开日期选择框
+		$scope.openDatePicker = function($event, item, openParam) {
+			if (!$scope.endDate){ //如果为空,则需要加入23:59:59的毫秒数
+				$scope.isAdd = false;
+			}
+			$event.preventDefault();
+			$event.stopPropagation();
+			item[openParam] = !item[openParam];
+		};
+
+		var constMs = 86399000; // 23:59:59的毫秒数
+
+		$scope.onDateCondition = function () {
+			if ($scope.endDate && !$scope.isAdd){
+				var ms = $scope.endDate.getTime() + constMs;
+				$scope.endDate = new Date(ms);
+				$scope.isAdd = !$scope.isAdd;
+			}
+			reloadData();
+		};
+
+		$scope.convertType = {
+			'ALL' : '全部',
+			'AGENCY' : '代理商',
+			'DISTRIBUTION' : '经销商',
+			'ORIGINAL_FACTORY' : '原厂商',
+			'CONSIGNMENT' : '寄售商'
+		};
+
+		$scope.changeDateZone = function (item) {
+			$scope.typeFrame = false;
+			if ($scope.storeType != item){
+				$scope.storeType = item;
+				$scope.typeCn = $scope.convertType[item];
+				reloadData();
+			}
+		};
+
+		$scope.addOneMap = function () {
+			$scope.addFrame = !$scope.addFrame;
+			$scope.showStore = false;
+			$scope.showBrand = false;
+		};
+
+		$scope.cancelAdd = function () {
+			$scope.brandMap = {};
+			$scope.typeInStore = 'ALL';
+			if ($scope.storeInfo){
+				$scope.storeInfo = null;
+			}
+			if ($scope.brandInfo){
+				$scope.brandInfo = null;
+			}
+			if ($scope.ensureBrand){
+				$scope.ensureBrand = null;
+			}
+			$scope.wordInStore = '';
+			$scope.wordInBrand = '';
+			$scope.initialInBrand = '';
+			$scope.addFrame = false;
+		};
+
+		$scope.ensureAdd = function () {
+			if (!$scope.brandMap.enName){
+				toaster.pop("info", "请选择店铺信息");
+				return ;
+			}
+			if (!$scope.brandMap.nameChildEn){
+				toaster.pop("info", "请完善要对应的品牌英文名");
+				return ;
+			}
+			if (!$scope.brandMap.nameStandardEn || !$scope.brandMap.nameStandardCn){
+				toaster.pop("info", "请选择对应标准库的品牌");
+				return ;
+			}
+			BrandMap.addOneBrandMap({}, $scope.brandMap, function (data) {
+				if (data){
+					$scope.brandMap = {};
+					$scope.addFrame = false;
+					reloadData();
+				}
+			}, function (error) {
+				toaster.pop("error", error.data);
+			})
+		};
+
+		$scope.brandMapTableParams = new ngTableParams({
+			page : 1,
+			count : 10,
+			sorting : {
+				operateTime : 'DESC'
+			}
+		},{
+			total : 0,
+			getData : function ($defer, params) {
+				var param = BaseService.parseParams(params.url());
+				if ($scope.keyword && $scope.keyword.length > 0){
+					param.keyword = $scope.keyword;
+				}
+				if ($scope.storeType && $scope.storeType != 'ALL'){
+					param.storeType = $scope.storeType;
+				}
+				if ($scope.startDate){
+					param.fromDate = $scope.startDate.getTime();
+				}
+				if ($scope.endDate){
+					param.toDate = $scope.endDate.getTime();
+				}
+				BrandMap.getPageOfBrandMap(param, function (page){
+					$scope.$$map.totalElements = page.totalElements;
+					params.total(page.totalElements);
+					$defer.resolve(page.content);
+				},function () {
+					toaster.pop('error', '获取品牌映射关系失败');
+				} )
+			}
+		});
+
+		$scope.showBrandFrame = function () {
+			$scope.showBrand = !$scope.showBrand;
+		};
+
+		$scope.changeTextInBrand = function (item) {
+			$scope.wordInBrand = item;
+		};
+
+		$scope.fitBrandObj = function (item) {
+			$scope.brandInfo = item;
+		};
+
+		$scope.cancelFitBrand = function () {
+			if ($scope.ensureBrand){
+				$scope.brandInfo = $scope.ensureBrand;
+			}else{
+				$scope.brandInfo = null;
+			}
+			$scope.wordInBrand = '';
+			$scope.showBrand = false;
+		};
+
+		$scope.fitBrandInMap = function () {
+			if (!$scope.brandInfo){
+				toaster.pop("info", "请选择对应标准库的品牌");
+				return ;
+			}
+			$scope.ensureBrand = $scope.brandInfo;
+			$scope.brandMap.brandid = $scope.ensureBrand.id;
+			$scope.brandMap.uuid = $scope.ensureBrand.uuid;
+			$scope.brandMap.nameStandardEn = $scope.ensureBrand.nameEn;
+			$scope.brandMap.nameStandardCn = $scope.ensureBrand.nameCn;
+			$scope.showBrand = false;
+		};
+
+		$scope.brandInfoTableParams = new ngTableParams({
+			page : 1,
+			count : 12
+		},{
+			total : 0,
+			getData : function ($defer, params) {
+				var param = BaseService.parseParams(params.url());
+				if ($scope.wordInBrand && $scope.wordInBrand.length > 0){
+					param.keyword = $scope.wordInBrand;
+				}
+				if ($scope.initialInBrand && $scope.initialInBrand.length > 0){
+					param.initial = $scope.initialInBrand;
+				}
+				BrandActive.getInfoPageWithInitial(param, function (page){
+					$scope.pageList = page.content;
+					params.total(page.totalElements);
+					$defer.resolve(page.content);
+					//划分数据
+					var row = Math.ceil(page.numberOfElements/3.0);
+					$scope.showList = [];
+					var count = 0;
+					for (var i = 0; i < row; i++){
+						$scope.showList[i] = [];
+						for (var j = 0; j < 3; j++){
+							$scope.showList[i].push($scope.pageList[count]);
+							count++;
+							if (count == page.numberOfElements){
+								return;
+							}
+						}
+					}
+				},function () {
+					toaster.pop('error', '获取标准品牌错误');
+				} )
+			}
+		});
+
+		var reloadBrandData = function () {
+			$scope.brandInfoTableParams.page(1);
+			$scope.brandInfoTableParams.reload();
+		};
+
+		$scope.clickChar = function (item) {
+			$scope.initialInBrand = item;
+			reloadBrandData();
+		};
+
+		$scope.searchBrand = function () {
+			reloadBrandData();
+		};
+
+		$scope.wordInStore = "";
+		$scope.typeInStore = 'ALL';
+
+		$scope.showStoreFrame = function () {
+			$scope.showStore = !$scope.showStore;
+		};
+
+		$scope.storeInfoTableParams = new ngTableParams({
+			page : 1,
+			count : 5
+		},{
+			total : 0,
+			getData : function ($defer, params) {
+				var param = BaseService.parseParams(params.url());
+				if ($scope.wordInStore && $scope.wordInStore.length > 0){
+					param.keyword = $scope.wordInStore;
+				}
+				if ($scope.typeInStore && $scope.typeInStore != 'ALL'){
+					param.storeType = $scope.typeInStore;
+				}
+				StoreInfo.findStoresPageByKeyword(param, function (page){
+					$scope.storeList = page.content;
+					params.total(page.totalElements);
+					$defer.resolve(page.content);
+				},function () {
+					toaster.pop('error', '获取标准品牌错误');
+				} )
+			}
+		});
+
+		$scope.searchStore = function () {
+			$scope.reloadStoreData();
+		};
+
+		$scope.fitStoreObj = function (item) {
+			$scope.storeInfo = item;
+		};
+
+		$scope.fitStoreInMap = function () {
+			if (!$scope.storeInfo){
+				toaster.pop("info", "请选择店铺信息");
+				return ;
+			}
+			$scope.brandMap.enName = $scope.storeInfo.storeName;
+			$scope.brandMap.enuu = $scope.storeInfo.enuu;
+			$scope.brandMap.type= $scope.storeInfo.type;
+			$scope.showStore = false;
+		};
+
+		$scope.cancelFitStore = function () {
+			$scope.storeInfo = null;
+			$scope.showStore = false;
+			$scope.wordInStore = '';
+		};
+
+		$scope.reloadStoreData =function () {
+			$scope.storeInfoTableParams.page(1);
+			$scope.storeInfoTableParams.reload();
+		};
+
+		$scope.chooseTypeInStore = function (item) {
+			if ($scope.typeInStore != item){
+				$scope.typeInStore = item;
+				$scope.reloadStoreData();
+			}
+		};
+
+		$scope.changeTextInStore = function (item) {
+			$scope.wordInStore = item;
+		}
+
+	}]);
+});

+ 16 - 5
src/main/webapp/resources/js/common/controllers/commonCtrls.js

@@ -78,9 +78,10 @@ define([ 'app/app' ], function(app) {
 
 			// 退出
 			$scope.logout = function() {
-				AuthenticationService.logout().success(function() {
+				/*AuthenticationService.logout().success(function() {
 					SessionService.removeCookie($rootScope.userInfo.userUU);
-				});
+				});*/
+                AuthenticationService.logoutWithoutProxy();
 			};
 
 			// 企业换企业开关
@@ -1200,7 +1201,12 @@ define([ 'app/app' ], function(app) {
 		//输入框监听Enter事件
 		$scope.listenEnter = function () {
 			if(event.keyCode == 13) {
-				$scope.setPage("page", $scope.params.currentPage);
+				var rnum = /^\d*$/;
+				if (rnum.test($scope.params.currentPage)) {
+					$scope.setPage("page", $scope.params.currentPage);
+				} else {
+					toaster.pop('info', '请输入合法数字');
+				}
 			}
 		};
 
@@ -1244,8 +1250,13 @@ define([ 'app/app' ], function(app) {
 				$scope.params.currentPage = $scope.params.page;
 				return ;
 			}
-			$scope.params.page = page;
-			loadData();
+			var rnum = /^\d*$/;
+			if (rnum.test(page)) {
+				$scope.params.page = page;
+				loadData();
+			} else {
+				toaster.pop('info', '请输入合法数字');
+			}
 		};
 
 		//计算页数的方式。

+ 18 - 0
src/main/webapp/resources/js/common/query/brand.js

@@ -94,6 +94,11 @@ define([ 'ngResource' ], function() {
 				url: 'api/product/brand/Info/ByPage',
 				method: 'GET'
 			},
+			// 分页获取简要信息
+			getInfoPageWithInitial: {
+				url: 'api/product/brand/page/initial',
+				method: 'GET'
+			},
 			// 验证品牌名是否存在
 			nameExist : {
 				url: 'produce/brand/nameExist',
@@ -201,5 +206,18 @@ define([ 'ngResource' ], function() {
 				method: 'GET'
 			}
 		});
+	}]).factory('BrandMap', ['$resource', function ($resource) {
+		//品牌映射关系相关操作
+		return $resource('product/brandMap', {}, {
+			//分页获取品牌映射关系
+			getPageOfBrandMap : {
+				url: 'product/brandMap/page',
+				method: 'GET'
+			},
+			addOneBrandMap : {
+				url: 'product/brandMap/addOne',
+				method: 'POST'
+			}
+		});
 	}]);
 });

+ 27 - 0
src/main/webapp/resources/js/common/query/keyWord.js

@@ -0,0 +1,27 @@
+define([ 'ngResource' ], function() {
+  angular.module('keyWordServices', [ 'ngResource' ]).factory('KeyWord', ['$resource', 'BaseService', function($resource, BaseService) {
+    const rootPath = BaseService.getRootPath();
+    return $resource('keyword', {}, {
+      getOneKeyWord:{
+        url : 'keyword/getOneKeyWord/:id',
+        method : 'GET'
+      },
+      getKeyWordPageInfo:{
+        url : 'keyword/getKeyWordPageInfo',
+        method : 'GET'
+      },
+      deleteKeyWord:{
+        url : 'keyword/deleteKeyWord/:id',
+        method : 'DELETE'
+      },
+      saveKeyWord:{
+        url : 'keyword/saveKeyWord',
+        method : 'PUT'
+      },
+      batchAddKeyWord:{
+        url : 'keyword/batchAddKeyWord',
+        method : 'PUT'
+      }
+    });
+  }])
+});

+ 11 - 0
src/main/webapp/resources/js/common/query/logUsage.js

@@ -0,0 +1,11 @@
+define([ 'ngResource' ], function() {
+	angular.module('logUsageServices', [ 'ngResource' ]).factory('logUsage', ['$resource', 'BaseService', function($resource, BaseService) {
+		const rootPath = BaseService.getRootPath();
+		return $resource('log/usage', {}, {
+      getAllByPage:{
+      	url:'log/usage/:userUu',
+				method:'GET'
+			}
+		});
+}])
+});

+ 5 - 0
src/main/webapp/resources/js/common/query/storeInfo.js

@@ -96,6 +96,11 @@ define([ 'ngResource' ], function() {
                     op : 'page'
                 }
             },
+			// 分页获取店铺信息,根据店铺名称过滤
+			findStoresPageByKeyword : {
+				url : 'store-service/stores/page',
+				method : 'GET'
+			},
             // 检测当前企业是否已开店铺
             existStore : {
                 url : 'store-service/stores',

+ 9 - 2
src/main/webapp/resources/js/common/services.js

@@ -161,6 +161,12 @@ define([ 'angular', 'common/utils', 'big'], function(angular, utils, Big) {
 				login.success(cacheSession);
 				return login;
 			},*/
+			logoutWithoutProxy : function(){
+                var logout = $http.get(rootPath+'/logout/crossBefore');
+                logout.success(function(data){
+                    window.location.href =  data.logoutUrl +'&baseUrl='+ encodeURIComponent( rootPath+ data.baseUrl);
+                });
+			},
 			logout : function() {
 				var config = {
 					cache: false,
@@ -203,14 +209,15 @@ define([ 'angular', 'common/utils', 'big'], function(angular, utils, Big) {
 				return logout;
 			},
             redirectSignin: function() {
-            	// 获取跳转登录的url
+				// window.location.href = '/SSRProxy/loginProxy';
+                // 获取跳转登录的url
             	$http.get(rootPath + '/login/page', {
             		params: {
             			returnUrl: window.location.href
             		}
             	}).success(function(data) {
                     if (data.content) {
-                    	window.location.href = data.content;
+                    	window.location.href = data.content+'&baseUrl='+  encodeURIComponent( rootPath+ data.baseUrl);
                     } else {
                         alert('系统错误');
                     }

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

@@ -629,7 +629,7 @@ define(['app/app'], function(app) {
 				$scope.ysepayRequest = data;
 				$scope.$apply();
 				var form = document.getElementById('paymentForm');
-				form.action = "https://openapi.ysepay.com/gateway.do";
+				form.action = data.action;
 				form.method = "POST";
 				var submit = form.submit();
 			},function(res){

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

@@ -30,6 +30,7 @@ define(['app/app', 'calendar'], function (app) {
 			height: 220
 		});
 
+
 		/**********************************************************************
 		 * 初始化
 		 **********************************************************************/

+ 59 - 0
src/main/webapp/resources/view/admin/keyword.html

@@ -0,0 +1,59 @@
+<style>
+	.row {
+		margin-bottom: 10px;
+	}
+</style>
+<div>
+	<div class="box-header well">
+		非法关键词维护
+	</div>
+	<div  class="box-content">
+		<div class="row">
+			<div class="col-xs-1">
+				<p style="margin-top: 8px; font-weight: bold;">
+					共<span class="totalNum">{{paginationParams.total()}}</span>条
+				</p>
+			</div>
+			<div class="col-xs-offset-4 col-xs-7">
+				<div class="input-group">
+					<input type="search" class="form-control" ng-model="keyword"
+								 ng-search="onSearch()" placeholder="请输入关键词">
+					<span class="input-group-btn">
+					<button ng-click="onSearch()" class="btn btn-primary" type="button">搜索</button>
+				</span>
+				</div>
+			</div>
+		</div>
+		<div class="row">
+			<div class="col-xs-offset-9 col-xs-4">
+				<a class="btn btn-primary" ng-click="addKeyWord()"><i class="fa fa-plus"></i>添加关键词</a>
+				<a class="btn btn-primary" ng-click="addKeyWords()"><i class="fa fa-plus"></i>批量添加关键词</a>
+			</div>
+		</div>
+		<p ng-model="test"></p>
+		<table ng-table="keyWordTableParams"
+					 class="table table-bordered table-striped table-hover">
+			<thead>
+			<tr class="tr-default">
+				<th width="20" class="text-center">
+					<div>序号</div>
+				</th>
+				<th width="150" class="text-center">关键词</th>
+				<th width="50" class="text-center">操作</th>
+			</tr>
+			</thead>
+			<tbody ng-repeat="keyWord in $data">
+			<tr class="text-center">
+				<td class="tdcenter">
+					<div ng-bind="keyWord.id"></div>
+				</td>
+				<td><span ng-bind="keyWord.content"></span></td>
+				<td>
+					<button class="btn btn-primary" ng-click="editKeyWord(keyWord.id)">编辑</button>
+					<button class="btn btn-primary" ng-click="deleteKeyWord(keyWord.id)">删除</button>
+				</td>
+			</tr>
+			</tbody>
+		</table>
+	</div>
+</div>

+ 69 - 0
src/main/webapp/resources/view/admin/logUsage.html

@@ -0,0 +1,69 @@
+<style>
+.row {
+	margin-bottom: 10px;
+}
+</style>
+<div>
+	<div class="box-header well">
+		用户操作日志
+	</div>
+	<div  class="box-content">
+		<div class="row">
+			<div class="col-xs-1">
+				<p style="margin-top: 8px; font-weight: bold;">
+					共<span class="totalNum">{{paginationParams.total()}}</span>条
+				</p>
+			</div>
+			<div class="col-xs-offset-4 col-xs-7">
+				<div class="input-group">
+					<select ng-model="search" style="width:20%;" class="form-control">
+						<option value="">请选择查询条件</option>
+						<option value="1">UU号</option>
+						<option value="2">用户名</option>
+					</select>
+				<input type="search" style="width:80%;" class="form-control" ng-model="searchContent"
+					ng-search="onSearch()" placeholder="请输入搜索内容">
+				<span class="input-group-btn">
+					<button ng-click="onSearch()" class="btn btn-primary" type="button">搜索</button>
+				</span>
+			</div>
+			</div>
+		</div>
+	<!--
+		<div class="row">
+			<div class="col-xs-offset-9 col-xs-4">
+				<a class="btn btn-primary" ng-click="addKeyWord()"><i class="fa fa-plus"></i>添加关键词</a>
+				<a class="btn btn-primary" ng-click="addKeyWords()"><i class="fa fa-plus"></i>批量添加关键词</a>
+			</div>
+		</div>
+		-->
+		<p ng-model="test"></p>
+		<table ng-table="logUsageTableParams"
+			class="table table-bordered table-striped table-hover" style="word-break:break-all; word-wrap:break-all;">
+			<thead>
+				<tr class="tr-default">
+					<th width="10%;" class="text-center">用户UU号</th>
+					<th width="7%;" class="text-center">用户名</th>
+					<th width="10%" class="text-center">标题</th>
+					<th width="30%" class="text-center">具体操作信息</th>
+					<th width="8%%" class="text-center">时间</th>
+					<th width="10%" class="text-center">ip</th>
+					<th width="10%" class="text-center">手机号</th>
+					<th width="15%" class="text-center">邮箱</th>
+				</tr>
+			</thead>
+			<tbody ng-repeat="logUsage in $data">
+				<tr class="text-center">
+					<td><span ng-bind="logUsage.userUU"></span></td>
+					<td><span ng-bind="logUsage.user.userName"></span></td>
+					<td><span ng-bind="logUsage.title"></span></td>
+					<td><span ng-bind="logUsage.message+logUsage.detail"></span></td>
+					<td><span ng-bind="logUsage.time | date:'yyyy-MM-dd HH:mm:ss'"></span></td>
+					<td><span ng-bind="logUsage.ip"></span></td>
+					<td><span ng-bind="logUsage.user.userTel"></span></td>
+					<td><span ng-bind="logUsage.user.userEmail"></span></td>
+				</tr>
+			</tbody>
+		</table>
+	</div>
+</div>

+ 19 - 0
src/main/webapp/resources/view/admin/modal/keyWord_modal.html

@@ -0,0 +1,19 @@
+<div class="modal-header">
+	<h3 class="modal-title" ng-hide="!addKeyWordModal">添加关键词</h3>
+	<h3 class="modal-title" ng-hide="!updateKeyWordModal">编辑关键词</h3>
+	<h3 class="modal-title" ng-hide="!addKeyWordsModal">批量添加关键词</h3>
+</div>
+<div class="modal-body">
+	<div class="form-group" ng-show="addKeyWordModal || updateKeyWordModal">
+		<sapn>关键词:</sapn>
+		<input type="text" ng-model="keyWord.content"/>
+	</div>
+	<div class="form-group" ng-show="addKeyWordsModal">
+		<sapn>关键词列表(以,隔开):</sapn>
+		<textarea ng-model="keywords" rows="10" cols="35"/>
+	</div>
+</div>
+<div class="modal-footer">
+	<button  class="btn btn-success" ng-click="confirm()">确认</button>
+	<button class="btn btn-default" ng-click="cancel()">取消</button>
+</div>

+ 316 - 0
src/main/webapp/resources/view/admin/product/brand_map.html

@@ -0,0 +1,316 @@
+<style>
+    .row {
+        margin-bottom: 10px;
+    }
+    .btn-select{
+        min-height: 80px;
+        width:88px;
+        list-style: none;
+        text-align: left;
+        border:1px solid #2fa4e7;
+        float: left;
+        background: #fff;
+    }
+    .btn-select li{
+        padding-left:5px;
+        line-height: 22px;
+        color:#000;
+    }
+    .btn-select li:hover{
+        background: #2fa4e7;
+        color:#fff;
+        cursor:pointer;
+    }
+
+    .mobile-select{
+        position:absolute;
+        top:29px;
+        z-index:1000;
+        width:550px;
+        min-height:210px;
+        border:1px solid #2fa4e7;
+        padding:10px 0;
+        background: #fff
+    }
+    .mobile-select>ul{
+        display:inline-flex;
+        justify-content:space-around;
+        list-style: none;
+        padding:5px 10px;
+        background: #e9e9e9;
+        width:100%;
+    }
+    .mobile-select>ul>li{
+        padding:0 1px;
+        height:13px;
+        line-height: 13px;
+    }
+    .mobile-select>ul>li>a{
+        color:#666;
+    }
+    .mobile-select>ul>li:hover>a{
+        color:#2fa4e7;
+        text-decoration: none;
+    }
+    .mobile-select .pagination>li>a{
+        padding:3px 8px;
+    }
+    .mobile-select .ng-table-pagination .page-number {
+        height: 24px!important;
+    }
+    .mobile-select .ng-table-pager a.page-a {
+        color: #fff;
+        border-color: #4574e8;
+        font-size: 12px;
+        border-top-right-radius: 4px;
+        border-bottom-right-radius: 4px;
+        text-decoration: none;
+        height: 24px!important;
+        display: inline-block;
+        width: 30px;
+        padding: 0;
+        text-align: center;
+        line-height: 24px;
+    }
+    .mobile-select .ng-table-pager input.page-number {
+        width: 28px;
+        height: 30px;
+        padding: 0!important;
+        line-height: 28px;
+    }
+    .mobile-select .ng-table-pager {
+        margin-right: 20px!important;
+        background: #fff;
+    }
+
+</style>
+
+<div class="box-center">
+    <div class="container-fluid">
+        <div class="row">
+            <div class="col-sm-2">
+                <p style="margin-top: 8px; font-weight: bold;width:126px;">
+                    全部共计:<span class="totalNum ng-binding" style="color:#2fa4e7">{{$$map.totalElements}}条</span>
+                </p>
+            </div>
+            <div class=" col-sm-5">
+                <div class="input-group">
+                    <input type="search" class="form-control ng-pristine ng-untouched ng-valid" ng-model="keyword" ng-search="onSearch()" placeholder="输入标准库品牌名称/企业名">
+                    <span class="input-group-btn">
+					<button ng-click="onSearch()" class="btn btn-primary" type="button">搜索</button>
+				</span>
+                </div>
+            </div>
+            <div class="col-sm-5">
+                <p style="margin-top: 8px; font-weight: bold" ng-if="$$map.totalElements == 0">您输入的内容暂无匹配结果,请重新输入</p>
+            </div>
+        </div>
+
+        <div class="row">
+            <div class="col-sm-11 text-right">
+                <div class="more">
+                    <form class="form-inline ng-pristine ng-invalid ng-invalid-required ng-valid-date ng-valid-date-disabled">
+                        <div class="form-group" style="margin-right:20px">
+                            <label style="color:#2fa4e7">企业类型:</label>
+                            <div class="btn-group btn-menu" style="position:relative">
+                                <input type="text" ng-model="typeCn" ng-click="showType()" style="padding-left:3px;width:88px;background: url('static/img/product/cart/up-map.png')no-repeat 75px 6px;" readonly="readonly">
+                                <ul class="btn-select" ng-if="typeFrame" style="position:absolute;top:22px;">
+                                    <li ng-click="changeDateZone('ALL')">全部</li>
+                                    <li ng-click="changeDateZone('ORIGINAL_FACTORY')">原厂商</li>
+                                    <li ng-click="changeDateZone('AGENCY')">代理商</li>
+                                    <li ng-click="changeDateZone('DISTRIBUTION')">经销商</li>
+                                </ul>
+                            </div>
+                        </div>
+                        <div class="form-group ">
+                            <span style="color:#2fa4e7;font-weight: bold">操作日期:</span>
+                            <div class="form-group input-group input-group-xs input-trigger">
+                                <input type="text" ng-model="startDate"
+                                       class="form-control dateinput" placeholder="开始时间"
+                                       readonly="readonly" datepicker-popup="yyyy-MM-dd HH-mm-ss"
+                                       is-open="condition.startDateOpen" max-date="endDate" current-text="今天"
+                                       clear-text="清除" close-text="关闭"
+                                       datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                       ng-click="openDatePicker($event, condition, 'startDateOpen')"
+                                       ng-change="onDateCondition()">
+                                <span class="input-group-btn dateinput">
+                                    <button type="button" class="btn btn-default dateinput"
+                                        ng-click="openDatePicker($event, condition, 'startDateOpen')">
+                                        <i class="fa fa-calendar"></i>
+                                    </button>
+                                </span>
+                            </div>
+                            ——
+                            <div class="form-group input-group input-group-xs input-trigger">
+                                <input type="text" ng-model="endDate"
+                                       class="form-control dateinput" placeholder="结束时间"
+                                       readonly="readonly" datepicker-popup="yyyy-MM-dd HH-mm-ss"
+                                       is-open="condition.endDateOpen" min-date="startDate" current-text="今天"
+                                       clear-text="清除" close-text="关闭"
+                                       datepicker-options="{formatDayTitle: 'yyyy年M月', formatMonth: 'M月', showWeeks: false}"
+                                       ng-click="openDatePicker($event, condition, 'endDateOpen')"
+                                       ng-change="onDateCondition()">
+                                <span class="input-group-btn dateinput">
+									<button type="button" class="btn btn-default dateinput"
+                                            ng-click="openDatePicker($event, condition, 'endDateOpen')">
+										<i class="fa fa-calendar"></i>
+									</button>
+                                </span>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+            <div class="col-sm-1">
+                <button ng-click="exportExcel()" class="btn btn-primary" type="button">导出结果</button>
+            </div>
+        </div>
+
+        <div class="row">
+            <div class="col-sm-1">
+                <a ng-click="addOneMap()" class="btn btn-primary"><i class="fa fa-plus" style="color:#2fa4e7;border-radius:50%;background: #fff;display:inline-block;padding:0 2px;margin-right:4px;"></i>新增映射关系</a>
+            </div>
+        </div>
+
+        <table class="table table-hover " ng-table="brandMapTableParams" id="table" style="table-layout: fixed">
+            <thead>
+            <tr style="background:#7bb4e1;color:#fff;">
+                <th class="text-center" width="40">序号</th>
+                <th class="text-center" width="270">企业名称</th>
+                <th class="text-center" width="100">类型</th>
+                <th class="text-center" width="150">非标品牌中文名</th>
+                <th class="text-center" width="150">非标品牌英文名</th>
+                <th class="text-center" width="150">标准库品牌中文名</th>
+                <th class="text-center" width="150">标准库品牌英文名</th>
+                <th class="text-center" width="150">操作员</th>
+                <th class="text-center" width="210">操作时间</th>
+            </tr>
+            </thead>
+            <!-- ngRepeat: property in $data -->
+            <tbody>
+            <tr class="text-center" ng-if="addFrame">
+                <td></td>
+                <td class="tdcenter">
+                    <div style="position:relative;display: inline-flex;align-items: center">
+                        <input type="text" ng-click="showStoreFrame()" style="width:248px;height:29px;background:url('static/img/product/cart/up-map.png')no-repeat 230px 10px;padding-right:20px;" ng-model="brandMap.enName" readonly="readonly">
+                        <div class="mobile-select" ng-if="showStore">
+                            <form style="display: inline-flex; align-items:center;padding-bottom:10px;">
+                                <span style="margin-left:2px;margin-right:2px;color:#2fa4e7;font-weight: bold">类型选择</span>
+                                <label class="radio-inline" ng-click="chooseTypeInStore('ORIGINAL_FACTORY')">
+                                    <input type="radio" name="type_radio">原厂商
+                                </label>
+                                <label class="radio-inline" ng-click="chooseTypeInStore('AGENCY')">
+                                    <input type="radio" name="type_radio">代理商
+                                </label>
+                                <label class="radio-inline" ng-click="chooseTypeInStore('DISTRIBUTION')">
+                                    <input type="radio" name="type_radio">经销商
+                                </label>
+                                <div style="display: inline-flex;align-items: center;margin-left:5px;width:170px;height:21px;">
+                                    <input type="search" style="padding:0 20px 0 3px;" ng-model="wordInStore" ng-search="reloadStoreData()" ng-change="changeTextInStore(wordInStore)">
+                                    <i class="fa fa-search" style="color:#fff;width:20px;height:20px;display:inline-block;margin-left:-20px;background: #2fa4e7;padding:3px;" ng-click="reloadStoreData()"></i>
+                                </div>
+                                <button ng-click="fitStoreInMap()" style="border:1px solid #2fa4e7;background: #2fa4e7;color:#fff;font-size: 12px;width:34px;height:24px;line-height: 24px;border-radius: 3px;margin:0 5px;">确定</button>
+                                <button ng-click="cancelFitStore()" style="border:1px solid #2fa4e7;background: #2fa4e7;color:#fff;font-size: 12px;width:34px;height:24px;line-height: 24px;border-radius: 3px;margin:0 5px;">取消</button>
+                            </form>
+                            <table class="table table-striped table-condensed table-hover" ng-table="storeInfoTableParams">
+                                <thead>
+                                <tr style="background:#e9e9e9;">
+                                    <th></th>
+                                    <th>店铺型号</th>
+                                    <th>公司名称</th>
+                                    <th>类型</th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                    <tr ng-repeat="store in storeList" ng-click="fitStoreObj(store)">
+                                        <td><input type="radio" value="store.id" ng-checked="store.id == storeInfo.id" name="item_radio"></td>
+                                        <td><span ng-bind="store.id | storeId">00100021</span></td>
+                                        <td><span ng-bind="store.storeName">深圳中国移动公司</span></td>
+                                        <td><span ng-bind="convertType[store.type]">代码商</span></td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                </td>
+                <td>{{convertType[brandMap.type]}}</td>
+                <td><input type="text" style="width:115px;height:29px;" ng-model="brandMap.nameChildCn"/></td>
+                <td><input type="text" style="width:115px;height:29px;" ng-model="brandMap.nameChildEn"/></td>
+                <td class="tdcenter">
+                    <div style="position:relative;display: inline-flex;align-items: center">
+                        <input type="text" ng-click="showBrandFrame()" style="width:96px;height:29px;background:url('static/img/product/cart/up-map.png')no-repeat 80px 10px;padding-right:20px;" ng-model="brandMap.nameStandardCn" readonly="readonly">
+                        <div class="mobile-select" ng-if="showBrand">
+                            <div style="margin-bottom:10px;display: inline-flex;align-items: center">
+                                <input type="search" ng-model="wordInBrand" ng-search="searchBrand()" ng-change="changeTextInBrand(wordInBrand)" style="width:395px;height:20px;line-height:20px;padding:0 20px 0 10px;border:1px solid #2fa4e7;" placeholder="输入品牌中文/英文名称">
+                                <i ng-click="searchBrand()" class="fa fa-search" style="color:#fff;width:20px;height:20px;display:inline-block;margin-left:-20px;background: #2fa4e7;padding:3px;"></i>
+                                <button ng-click="fitBrandInMap()" style="border:1px solid #2fa4e7;background: #2fa4e7;color:#fff;font-size: 12px;width:34px;height:24px;line-height: 24px;border-radius: 3px;margin:0 5px 0 10px;">确定</button>
+                                <button ng-click="cancelFitBrand()" style="border:1px solid #2fa4e7;background: #2fa4e7;color:#fff;font-size: 12px;width:34px;height:24px;line-height: 24px;border-radius: 3px;margin:0 5px;">取消</button>
+                            </div>
+                            <ul>
+                                <li>字母索引:</li>
+                                <li><a ng-click="clickChar('A')">A</a></li>
+                                <li><a ng-click="clickChar('B')">B</a></li>
+                                <li><a ng-click="clickChar('C')">C</a></li>
+                                <li><a ng-click="clickChar('D')">D</a></li>
+                                <li><a ng-click="clickChar('E')">E</a></li>
+                                <li><a ng-click="clickChar('F')">F</a></li>
+                                <li><a ng-click="clickChar('G')">G</a></li>
+                                <li><a ng-click="clickChar('H')">H</a></li>
+                                <li><a ng-click="clickChar('I')">I</a></li>
+                                <li><a ng-click="clickChar('J')">J</a></li>
+                                <li><a ng-click="clickChar('K')">K</a></li>
+                                <li><a ng-click="clickChar('L')">L</a></li>
+                                <li><a ng-click="clickChar('M')">M</a></li>
+                                <li><a ng-click="clickChar('N')">N</a></li>
+                                <li><a ng-click="clickChar('O')">O</a></li>
+                                <li><a ng-click="clickChar('P')">P</a></li>
+                                <li><a ng-click="clickChar('Q')">Q</a></li>
+                                <li><a ng-click="clickChar('R')">R</a></li>
+                                <li><a ng-click="clickChar('S')">S</a></li>
+                                <li><a ng-click="clickChar('T')">T</a></li>
+                                <li><a ng-click="clickChar('U')">U</a></li>
+                                <li><a ng-click="clickChar('V')">V</a></li>
+                                <li><a ng-click="clickChar('W')">W</a></li>
+                                <li><a ng-click="clickChar('X')">X</a></li>
+                                <li><a ng-click="clickChar('Y')">Y</a></li>
+                                <li><a ng-click="clickChar('Z')">Z</a></li>
+                                <li><a ng-click="clickChar('0~9')">0-9</a></li>
+                            </ul>
+                            <table class="table table-condensed" ng-table="brandInfoTableParams">
+                                <tr ng-repeat="value in showList">
+                                    <td ng-repeat="item in value" style="width:33%;padding-left:5px;text-align: left;">
+                                        <label>
+                                            <input type="radio" value="item.id" ng-checked="item.id == brandInfo.id" name="radio-type" ng-click="fitBrandObj(item)">
+                                            <span style="width:110px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;display: inline-block;">{{item.nameEn}}/{{item.nameCn}}</span>
+                                        </label>
+                                    </td>
+                                </tr>
+                            </table>
+                        </div>
+                    </div>
+                </td>
+                <td>{{brandMap.nameStandardEn}}</td>
+                <td>
+                    <button style="width:43px;color:#fff;background: #50b2eb;border:0;margin-right:20px;" ng-click="ensureAdd()">保存</button>
+                    <button style="width:43px;color:#fff;background: #50b2eb;border:0;" ng-click="cancelAdd()">取消</button>
+                </td>
+            </tr >
+
+            <tr class="text-center" ng-repeat="item in $data">
+                <td class="tdcenter">
+                    <div class="ng-binding" ng-bind="$index + 1"></div>
+                </td>
+                <td><span ng-bind="item.enName">深圳市华商龙商务互联科技有限公司</span></td>
+                <td><span ng-bind="convertType[item.type]">代理商</span></td>
+                <td><span ng-bind="item.nameChildCn">133牌子</span></td>
+                <td><span ng-bind="item.nameChildEn">FADFSF</span></td>
+                <td><span ng-bind="item.nameStandardCn">松下</span></td>
+                <td><span ng-bind="item.nameStandardEn">panasonic</span></td>
+                <td><span ng-bind="item.operateName">张三</span></td>
+                <td><span ng-bind="item.operateTime | date : 'yyyy-MM-dd HH:mm:ss'">2017/10/26 15:15:15</span></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+
+</div>

+ 33 - 30
src/main/webapp/resources/view/common/modal/messageBoard.html

@@ -92,15 +92,12 @@
 		color: #333;
 	}
     .messageBoard .modal-body .ng-table-pager{
+        padding: 0 85px;
         position: absolute;
         bottom: 0;
-        text-align: center;
-        left: 55%;
-        margin-left: -279px;
-    }
-    .messageBoard .modal-body .page-go-block{
-        margin-left: 140px;
-        margin-right: 0;
+        left: 0;
+        right: 0;
+        margin: auto;
     }
     .messageBoard .modal-body p.radioCheck{
         padding-left: 65px;
@@ -210,9 +207,11 @@
         border-bottom: 1px dashed #c5c5c5;
 	}
     .messageBoard .modal-body .msg-table{
+        position: relative;
         overflow: auto;
         height: 372px;
-        width: 670px;
+        /* width: 670px; */
+        width: 100%;
         margin-top: 10px;
     }
     .messageBoard .modal-body .msg-table .form-group{
@@ -396,11 +395,10 @@
     }
 
     .messageBoard div.ng-table-pager  input.page-number {
-        vertical-align: inherit;
         display: inline-block;
+        margin-bottom: 10px;
         width: 37px;
-        height: 28px;
-        padding: 6px 6px;
+        height: 30px;
         font-size: 12px;
         line-height: 1.42857143;
         color: #9B9792;
@@ -419,22 +417,20 @@
         cursor: pointer;
         background-color: #4574E8;
         border-color: #4574E8;
-        padding: 5.55px 6px;
         font-size: 12px;
         border-top-right-radius: 4px;
         border-bottom-right-radius: 4px;
         text-decoration: none;
-        height: 31px;
     }
 
     .messageBoard div.ng-table-pager div.page-go-block {
         float: right;
-        font-size: 0px;
+        font-size: 0;
         height: 31px;
-        margin-top: 20px;
         line-height: 31px;
     }
     .messageBoard .ng-table-pager .ng-table-pagination{
+        float: left;
         text-align: center;
         max-width: 460px;
     }
@@ -454,6 +450,12 @@
     .messageBoard .modal-body .history:nth-of-type(3){
         border-bottom: none;
     }
+    .modal.in .modal-dialog{
+        width: 680px;
+    }
+    .modal.in .modal-dialog .modal-content{
+        width: 100%;
+    }
 </style>
 <!--游客状态-->
 <div class="messageBoard">
@@ -559,24 +561,25 @@
             <div ng-if="messageBoardCurrent.length == 0" class="text-center">
                 <div>无留言记录</div>
             </div>
+        </div>
 
-            <div class="ng-cloak ng-table-pager text-center" ng-if="pages.length">
-                <ul class="pagination ng-table-pagination">
-                    <li ng-class="{'disabled': !page.active && !page.current, 'active': page.current}" ng-repeat="page in pages" ng-switch="page.type">
-                        <a ng-switch-when="prev" ng-click="setPage(page.type, -1)">&laquo;</a>
-                        <a ng-switch-when="first" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
-                        <a ng-switch-when="page" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
-                        <a ng-switch-when="more" ng-click="setPage(page.type, -1)">&#8230;</a>
-                        <a ng-switch-when="last" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
-                        <a ng-switch-when="next" ng-click="setPage(page.type, -1)">&raquo;</a>
-                    </li>
-                </ul>
-                <div class="page-go-block">
-                    <input class="page-number" type="text" ng-model="params.currentPage" ng-keydown="listenEnter()"/>
-                    <a class="page-a" ng-click="setPage('page', params.currentPage)">GO</a>
-                </div>
+        <div class="ng-cloak ng-table-pager text-center" ng-show="user.userUU && showHistory" ng-if="pages.length">
+            <ul class="pagination ng-table-pagination">
+                <li ng-class="{'disabled': !page.active && !page.current, 'active': page.current}" ng-repeat="page in pages" ng-switch="page.type">
+                    <a ng-switch-when="prev" ng-click="setPage(page.type, -1)">&laquo;</a>
+                    <a ng-switch-when="first" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
+                    <a ng-switch-when="page" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
+                    <a ng-switch-when="more" ng-click="setPage(page.type, -1)">&#8230;</a>
+                    <a ng-switch-when="last" ng-click="setPage(page.type, page.number)"><span ng-bind="page.number"></span></a>
+                    <a ng-switch-when="next" ng-click="setPage(page.type, -1)">&raquo;</a>
+                </li>
+            </ul>
+            <div class="page-go-block">
+                <input class="page-number" type="text" ng-model="params.currentPage" ng-keydown="listenEnter()"/>
+                <a class="page-a" ng-click="setPage('page', params.currentPage)">GO</a>
             </div>
         </div>
+
         <div ng-if="user.userUU && !showHistory" class="msg-slide1" ng-click="openHistory()">
             <i class="fa fa-angle-left"></i><span>留言记录</span>
         </div>

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

@@ -553,14 +553,14 @@
                     <div class="form-group"  ng-if="billType == 1205">
                         <label class="col-md-2 control-label"><b class="text-inverse">*</b>单位电话:</label>
                         <div class="form-input-line">
-                            <input type="text" class="form-control" ng-class="{'bg-fff8ee':!initFlag.initCompanyPhone&&form.companyPhone.$error.required, 'bg-fff':!form.companyPhone.$invalid}" ng-focus="form.companyPhone.$touched = false" ng-blur="form.companyPhone.$touched = true;initFlag.initCompanyPhone=false;" placeholder="区号和号码使用 '-' 隔开" name="companyPhone" ng-model="bill.companyPhone" ng-pattern="/^0\d{2,3}-[1-9]\d{6,7}$/" ng-maxlength="20" required="required">
+                            <input type="text" class="form-control" ng-class="{'bg-fff8ee':!initFlag.initCompanyPhone&&form.companyPhone.$error.required, 'bg-fff':!initFlag.initCompanyPhone&&!form.companyPhone.$invalid}" ng-focus="form.companyPhone.$touched = false" ng-blur="form.companyPhone.$touched = true;initFlag.initCompanyPhone=false;" placeholder="区号和号码使用 '-' 隔开" name="companyPhone" ng-model="bill.companyPhone" ng-pattern="/^0\d{2,3}-[1-9]\d{6,7}$/" ng-maxlength="20" required="required">
                         </div>
                         <div class="text-inverse error col-md-3" ng-show="form.companyPhone.$touched&&form.companyPhone.$invalid" ng-bind="form.companyPhone.$error.required?'请填写单位电话':form.companyPhone.$error.maxlength?'请勿超过20个字符':'请填写正确的电话号码,用-隔开'"></div>
                     </div>
                     <div class="form-group"  ng-if="billType == 1205">
                         <label class="col-md-2 control-label"><b class="text-inverse">*</b>税务登记号:</label>
                         <div class="form-input-line">
-                            <input type="text" class="form-control" ng-class="{'bg-fff8ee':!initFlag.initCompanyTaxNum&&form.companyTaxNum.$error.required, 'bg-fff':!form.companyTaxNum.$invalid}" ng-model="bill.companyTaxNumber" ng-focus="form.companyTaxNum.$touched = false" ng-blur="form.companyTaxNum.$touched = true; initFlag.initCompanyTaxNum = false;" name="companyTaxNum" required="true" ng-maxlength="20" ng-minlength="15" ng-pattern="/^[0-9a-zA-Z]+$/" placeholder="请输入税务登记号">
+                            <input type="text" class="form-control" ng-class="{'bg-fff8ee':!initFlag.initCompanyTaxNum&&form.companyTaxNum.$error.required, 'bg-fff':!initFlag.initCompanyTaxNum&&!form.companyTaxNum.$invalid}" ng-model="bill.companyTaxNumber" ng-focus="form.companyTaxNum.$touched = false" ng-blur="form.companyTaxNum.$touched = true; initFlag.initCompanyTaxNum = false;" name="companyTaxNum" required="true" ng-maxlength="20" ng-minlength="15" ng-pattern="/^[0-9a-zA-Z]+$/" placeholder="请输入税务登记号">
                         </div>
                         <div class="text-inverse error col-md-3" ng-show="form.companyTaxNum.$touched&&(form.companyTaxNum.$invalid)" ng-bind="form.companyTaxNum.$error.required?'请填写税务登记号':'请填写15-20位数字或字母'"></div>
                     </div>
@@ -600,7 +600,7 @@
                     <div class="form-group">
                         <label class="col-md-2 control-label"><b class="text-inverse">*</b>联系电话:</label>
                         <div class="form-input-line">
-                            <input type="text" class="form-control" ng-class="{'bg-fff8ee':!initFlag.initTelephone&&form.billTel.$error.required, 'bg-fff':!form.billTel.$invalid||!form.billTel.$touched}" ng-model="bill.telephone" ng-focus="form.billTel.$touched = false" ng-blur="form.billTel.$touched = true; initFlag.initTelephone=false;" name="billTel"
+                            <input type="text" class="form-control" ng-class="{'bg-fff8ee':!initFlag.initTelephone&&form.billTel.$error.required, 'bg-fff':!initFlag.initTelephone&&(!form.billTel.$invalid||!form.billTel.$touched)}" ng-model="bill.telephone" ng-focus="form.billTel.$touched = false" ng-blur="form.billTel.$touched = true; initFlag.initTelephone=false;" name="billTel"
                                    ng-pattern="/^[0-9]*$/" ng-minlength="8" ng-maxlength="11" required="required" placeholder="请输入联系电话">
                         </div>
                         <div class="text-inverse error col-md-3" ng-show="form.billTel.$touched&&form.billTel.$invalid" ng-bind="form.billTel.$error.required?'请填写联系电话':'请输入8-11位数字'"></div>

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

@@ -664,7 +664,7 @@
 							<a ng-if="status == 'success' || status == 'all' || status == 'tobecomment'" ng-click="setChildStatus('520','交易完成')" title="">交易完成</a>
 							<a ng-if="status == 'success' || status == 'all'" ng-click="setChildStatus('405','交易关闭')" title="">交易关闭</a>
 							<a ng-if="status == 'all'" ng-click="setChildStatus('602-603-315-604-605-606','已取消')" title="">已取消</a>
-							<a ng-if="status == 'success' || status == 'all'" ng-click="setChildStatus('521','待评价')" title="">待评价</a>
+							<a ng-if="status == 'success' || status == 'all'" ng-click="toggleStatus('tobecomment')" title="">待评价</a>
 						</div>
 					</span>
 					<span>交易操作</span>
@@ -828,7 +828,7 @@
 						</li>
 					</ul>
 					<div class="page-go-block">
-						<input class="page-number" type="text" ng-model="param.currentPage" ng-keydown="listenEnter()"/>
+						<input class="page-number" type="number" ng-model="param.currentPage" ng-keydown="listenEnter()"/>
 						<a class="page-a" ng-click="setPage('page', param.currentPage)" href="">GO</a>
 					</div>
 				</div>

+ 1 - 1
src/main/webapp/resources/view/usercenter/forstore/home_center.html

@@ -96,7 +96,7 @@
                 <div class="rt_menu"><span>今日新店</span></div>
                 <dl>
                     <dt class="border">
-                        <img style="max-height: 100%;max-width: 100%;" src="http://dfs.ubtob.com/group1/M00/17/F7/CgpkyFjbJEKAVMbMAAAmpGFAdUM616.png"/>
+                        <img style="max-height: 100%;max-width: 100%;" ng-src="{{store.logoUrl}}"/>
                     </dt>
                     <dd>
                         <p title="{{store.storeName}}">店铺名称:{{store.storeName}} </p>

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

@@ -569,13 +569,13 @@
 					<b>发票抬头:</b>
 					<span ng-bind="order.invoiceInfo.head || '空'"></span>
 				</p>
-				<p>
+				<p ng-if="order.invoicetype == 1205">
 					<b>单位地址:</b>
 					<span ng-bind="order.invoiceInfo.companyAddress || '空'"></span>
 				</p>
 				<p ng-if="order.invoicetype == 1205">
 					<b>单位电话:</b>
-					<span ng-bind="order.invoiceInfo.landlineNumber || '空'">0755-58956655</span>
+					<span ng-bind="order.invoiceInfo.companyPhone || '空'">0755-58956655</span>
 				</p>
 				<p ng-if="order.invoicetype == 1205">
 					<b>税务登记号:</b>

+ 1 - 1
src/main/webapp/resources/view/vendor/forstore/vendor_order.html

@@ -1247,7 +1247,7 @@
 						</li>
 					</ul>
 					<div class="page-go-block">
-						<input class="page-number" type="text" ng-model="param.currentPage" ng-keydown="listenEnter()"/>
+						<input class="page-number" type="number" ng-model="param.currentPage" ng-keydown="listenEnter()"/>
 						<a class="page-a" ng-click="setPage('page', param.currentPage)" href="">GO</a>
 					</div>
 				</div>

+ 39 - 0
src/test/java/com/uas/platform/b2c/BaseJunitTest.java

@@ -0,0 +1,39 @@
+package com.uas.platform.b2c;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.transaction.TransactionConfiguration;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.WebApplicationContext;
+
+/**
+ * Spring MVC 测试基类,所有测试类继承自这个类就可以直接写单元测试
+ * @author stg
+ * @date 2017年11月8日16:48:18
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("classpath:spring/context.xml")
+@WebAppConfiguration("")
+@Transactional
+@TransactionConfiguration(defaultRollback = true)
+public class BaseJunitTest {
+
+    @Autowired
+    protected WebApplicationContext wac;
+
+    protected MockMvc mockMvc;
+
+    /**
+     * 前置防范,配置MVCMock
+     */
+    @Before
+    public void setup() {
+        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+    }
+}

+ 0 - 35
src/test/java/com/uas/platform/b2c/RegistForMall.java

@@ -1,35 +0,0 @@
-package com.uas.platform.b2c;
-
-import com.uas.platform.b2c.core.utils.FastjsonUtils;
-import org.apache.commons.collections.map.HashedMap;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-public class RegistForMall {
-
-	public static void main(String args[]) throws Exception {
-//		UserSpaceDetail detail = new UserSpaceDetail();
-//		detail.setName("B2B公司研发测试数据-不要购买-wangyuchao");
-//		detail.setShortName("B2B公司");
-//		detail.setAdminName("余佳");
-//		detail.setAdminTel("15989329613");
-//		detail.setAdminEmail("yuj@usoftchina.com");
-//		detail.setBusinessCode("11122233344456789");
-//		detail.setRegisterDate(new Date().getTime());
-//		detail.setTel("15989329613");
-//		detail.setFax("11-2222222");
-//		String url = "http://113.105.74.135:8001/api/userspace";
-//		if (!StringUtils.isEmpty(url)) {
-//			ResponseWrap res = HttpUtil.doPost(url,
-//					new ModelMap("_operate", "registForMall").addAttribute("detail", JSON.toJSON(detail)));
-//			System.out.println(res.getContent());
-//			if (!res.isSuccess())
-//				throw new Exception(res.getContent());
-//		}
-		Map<String ,Object> map = new HashedMap();
-		map.put("OK", new Object());
-		System.out.println(FastjsonUtils.toJson(map));
-		System.out.println(new ArrayList<>());
-	}
-}

+ 27 - 0
src/test/java/com/uas/platform/b2c/common/account/UsageLogController.java

@@ -0,0 +1,27 @@
+package com.uas.platform.b2c.common.account;
+
+import com.uas.platform.b2c.BaseJunitTest;
+import org.junit.Test;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+public class UsageLogController extends BaseJunitTest {
+
+
+    @Test
+    public void testGetByPage() throws Exception {
+        String result = mockMvc.perform((get("/log/usage"))).andExpect(status().isOk())
+                .andDo(print()).andReturn().getResponse().getContentAsString();
+        System.out.println("result: " + result);
+    }
+
+    @Test
+    public void testGetByUUAndPage() throws Exception {
+        String result = mockMvc.perform((get("/log/usage/1000001202"))).andExpect(status().isOk())
+                .andDo(print()).andReturn().getResponse().getContentAsString();
+        System.out.println("result: " + result);
+    }
+
+}

+ 54 - 0
src/test/java/com/uas/platform/b2c/common/base/FileServiceTest.java

@@ -0,0 +1,54 @@
+package com.uas.platform.b2c.common.base;
+
+import com.uas.platform.b2c.BaseJunitTest;
+import com.uas.platform.b2c.common.base.service.FileService;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.*;
+
+public class FileServiceTest extends BaseJunitTest {
+
+    @Autowired
+    private FileService fileService;
+
+    @Test
+    public void testUpload() {
+        String filePath = "C:\\Users\\Administrator\\Desktop\\kaifa.jpg";
+        File file = new File(filePath);
+        String fileName = file.getName();
+        byte[] bytes = file2byte(file);
+        String returnPath = fileService.save(fileName, bytes);
+        System.out.println(returnPath);
+    }
+
+    public static byte[] file2byte(String filePath) {
+        byte[] buffer = null;
+        File file = new File(filePath);
+        return file2byte(file);
+    }
+
+    public static byte[] file2byte(File file) {
+        byte[] buffer = null;
+        try {
+            FileInputStream fis = new FileInputStream(file);
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            byte[] b = new byte[1024];
+            int n;
+            while ((n = fis.read(b)) != -1) {
+                bos.write(b, 0, n);
+            }
+            fis.close();
+            bos.close();
+            buffer = bos.toByteArray();
+        }
+        catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
+        return buffer;
+    }
+
+}

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است